From 9f79d9f441282a43e0f890cfa9351bd3ebc406e1 Mon Sep 17 00:00:00 2001 From: Glen Cheney Date: Sat, 29 May 2021 18:56:06 -0700 Subject: [PATCH] Add sortedItems prop, fix Chrome bug (#351) --- .eslintrc.js | 2 +- dist/shuffle.js | 20 ++- dist/shuffle.js.map | 2 +- dist/shuffle.min.js | 2 +- dist/shuffle.min.js.map | 2 +- docs/_includes/changelog.html | 90 ++++++++++--- docs/css/shuffle-styles.css | 2 +- docs/css/style.css | 2 +- docs/dist/shuffle.js | 20 ++- docs/dist/shuffle.js.map | 2 +- docs/dist/shuffle.min.js | 2 +- docs/dist/shuffle.min.js.map | 2 +- index.d.ts | 12 +- package.json | 1 + src/computed-size.js | 6 +- src/shuffle.js | 44 +++---- test/fixtures.js | 2 +- test/test.js | 234 +++++++++++++++++++++------------- test/types/types.ts | 8 +- 19 files changed, 289 insertions(+), 166 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3bc79b7..e3490ee 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = { - extends: 'airbnb-base', + extends: ['airbnb-base', 'prettier'], env: { node: true, browser: true, diff --git a/dist/shuffle.js b/dist/shuffle.js index d429463..9238970 100644 --- a/dist/shuffle.js +++ b/dist/shuffle.js @@ -105,6 +105,8 @@ }; } + var tinyEmitter = {exports: {}}; + function E () { // Keep this empty so it's easier to inherit from // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) @@ -169,9 +171,10 @@ } }; - var tinyEmitter = E; - var TinyEmitter = E; - tinyEmitter.TinyEmitter = TinyEmitter; + tinyEmitter.exports = E; + tinyEmitter.exports.TinyEmitter = E; + + var TinyEmitter = tinyEmitter.exports; var proto = typeof Element !== 'undefined' ? Element.prototype : {}; var vendor = proto.matches @@ -510,7 +513,12 @@ var e = document.createElement('div'); e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;'; element.appendChild(e); - value = window.getComputedStyle(e, null).width === '10px'; + + var _window$getComputedSt = window.getComputedStyle(e, null), + width = _window$getComputedSt.width; // Fix for issue #314 + + + value = Math.round(getNumber(width)) === 10; element.removeChild(e); return value; }); @@ -973,6 +981,7 @@ key: "_init", value: function _init() { this.items = this._getItems(); + this.sortedItems = this.items; this.options.sizer = this._getElementOption(this.options.sizer); // Add class and invalidate styles this.element.classList.add(Shuffle.Classes.BASE); // Set initial css for each item @@ -1815,6 +1824,7 @@ this._resetCols(); var items = sorter(this._getFilteredItems(), sortOptions); + this.sortedItems = items; this._layout(items); // `_layout` always happens after `_shrink`, so it's safe to process the style // queue here with styles from the shrink method. @@ -2151,7 +2161,7 @@ }]); return Shuffle; - }(tinyEmitter); + }(TinyEmitter); Shuffle.ShuffleItem = ShuffleItem; Shuffle.ALL_ITEMS = 'all'; diff --git a/dist/shuffle.js.map b/dist/shuffle.js.map index 1ded37c..9130afa 100644 --- a/dist/shuffle.js.map +++ b/dist/shuffle.js.map @@ -1 +1 @@ -{"version":3,"file":"shuffle.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/array-min.js","../src/layout.js","../src/hyphenate.js","../src/shuffle.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","let value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n value = window.getComputedStyle(e, null).width === '10px';\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\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 // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n"],"names":["getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","obj","Object","keys","key","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","e","createElement","cssText","appendChild","window","getComputedStyle","removeChild","getNumberStyle","styles","testComputedSize","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","randomize","array","n","length","i","Math","floor","random","temp","defaults","reverse","by","compare","sorter","arr","options","opts","assign","original","Array","from","revert","sort","valA","valB","undefined","transitions","eventName","count","uniqueId","cancelTransitionEnd","removeEventListener","listener","onTransitionEnd","callback","evt","currentTarget","target","addEventListener","arrayMax","max","apply","arrayMin","min","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","round","ceil","getAvailablePositions","positions","available","push","slice","getShortColumn","buffer","minPosition","len","getItemPosition","itemSize","gridSize","total","span","setY","shortColumnIndex","setHeight","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","intersectingRect","hasOverlap","rowIndex","findIndex","items","includes","splice","concat","map","hyphenate","str","replace","m1","toLowerCase","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","el","_getElementOption","TypeError","_init","_getItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","nodeType","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","call","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","matches","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","name","data","shuffle","emit","itemPositions","_getNextPositions","equals","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","_getItemPosition","getTransformedPositions","_getConcealedItems","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","callbacks","_getTransitionFunction","parallel","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","allItems","_mergeNewItems","sortedItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","getItemByElement","handleLayout","_disposeItems","parentNode","REMOVED","once","find","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"shuffle.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/array-min.js","../src/layout.js","../src/hyphenate.js","../src/shuffle.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","import getNumber from './get-number';\n\nlet value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n const { width } = window.getComputedStyle(e, null);\n // Fix for issue #314\n value = Math.round(getNumber(width)) === 10;\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n this.sortedItems = this.items;\n\n this.options.sizer = this._getElementOption(this.options.sizer);\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(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\n this.sortedItems = items;\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n"],"names":["tinyEmitterModule","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","obj","Object","keys","key","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","e","createElement","cssText","appendChild","window","getComputedStyle","Math","round","removeChild","getNumberStyle","styles","testComputedSize","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","randomize","array","n","length","i","floor","random","temp","defaults","reverse","by","compare","sorter","arr","options","opts","assign","original","Array","from","revert","sort","valA","valB","undefined","transitions","eventName","count","uniqueId","cancelTransitionEnd","removeEventListener","listener","onTransitionEnd","callback","evt","currentTarget","target","addEventListener","arrayMax","max","apply","arrayMin","min","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","ceil","getAvailablePositions","positions","available","push","slice","getShortColumn","buffer","minPosition","len","getItemPosition","itemSize","gridSize","total","span","setY","shortColumnIndex","setHeight","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","intersectingRect","hasOverlap","rowIndex","findIndex","items","includes","splice","concat","map","hyphenate","str","replace","m1","toLowerCase","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","el","_getElementOption","TypeError","_init","_getItems","sortedItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","nodeType","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","call","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","matches","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","name","data","shuffle","emit","itemPositions","_getNextPositions","equals","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","_getItemPosition","getTransformedPositions","_getConcealedItems","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","callbacks","_getTransitionFunction","parallel","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","allItems","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","getItemByElement","handleLayout","_disposeItems","parentNode","REMOVED","once","find","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file diff --git a/dist/shuffle.min.js b/dist/shuffle.min.js index 902b84f..b4e7255 100644 --- a/dist/shuffle.min.js +++ b/dist/shuffle.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Shuffle=e()}(this,(function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i=e?l():o=setTimeout(l,e-t)),s};function l(){o=0,r=+new Date,s=t.apply(i,n),i=null,n=null}};function p(){}function m(t){return parseFloat(t)||0}var v=function(){function e(i,n){t(this,e),this.x=m(i),this.y=m(n)}return i(e,null,[{key:"equals",value:function(t,e){return t.x===e.x&&t.y===e.y}}]),e}(),y=function(){function e(i,n,s,o,r){t(this,e),this.id=r,this.left=i,this.top=n,this.width=s,this.height=o}return i(e,null,[{key:"intersects",value:function(t,e){return t.left2&&void 0!==arguments[2]?arguments[2]:window.getComputedStyle(t,null),n=m(i[e]);return b()||"width"!==e?b()||"height"!==e||(n+=m(i.paddingTop)+m(i.paddingBottom)+m(i.borderTopWidth)+m(i.borderBottomWidth)):n+=m(i.paddingLeft)+m(i.paddingRight)+m(i.borderLeftWidth)+m(i.borderRightWidth),n}var S={reverse:!1,by:null,compare:null,randomize:!1,key:"element"};function k(t,e){var i=Object.assign({},S,e),n=Array.from(t),s=!1;return t.length?i.randomize?function(t){for(var e=t.length;e;){e-=1;var i=Math.floor(Math.random()*(e+1)),n=t[i];t[i]=t[e],t[e]=n}return t}(t):("function"==typeof i.by?t.sort((function(t,e){if(s)return 0;var n=i.by(t[i.key]),o=i.by(e[i.key]);return void 0===n&&void 0===o?(s=!0,0):no||"sortLast"===n||"sortFirst"===o?1:0})):"function"==typeof i.compare&&t.sort(i.compare),s?n:(i.reverse&&t.reverse(),t)):[]}var C={},L="transitionend",w=0;function D(t){return!!C[t]&&(C[t].element.removeEventListener(L,C[t].listener),C[t]=null,!0)}function z(t,e){var i=L+(w+=1),n=function(t){t.currentTarget===t.target&&(D(i),e(t))};return t.addEventListener(L,n),C[i]={element:t,listener:n},i}function M(t){return Math.max.apply(Math,t)}function A(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=n-e&&t[s]<=n+e)return s;return 0}function O(t,e){var i={};t.forEach((function(t){i[t.top]?i[t.top].push(t):i[t.top]=[t]}));var n=[],s=[],o=[];return Object.keys(i).forEach((function(t){var r=i[t];s.push(r);var l,a=r[r.length-1],u=a.left+a.width,h=Math.round((e-u)/2),f=r,c=!1;if(h>0){var d=[];(c=r.every((function(t){var e=new y(t.left+h,t.top,t.width,t.height,t.id),i=!n.some((function(t){return y.intersects(e,t)}));return d.push(e),i})))&&(f=d)}if(!c&&r.some((function(t){return n.some((function(e){var i=y.intersects(t,e);return i&&(l=e),i}))}))){var p=o.findIndex((function(t){return t.includes(l)}));o.splice(p,1,s[p])}n=n.concat(f),o.push(f)})),[].concat.apply([],o).sort((function(t,e){return t.id-e.id})).map((function(t){return new v(t.left,t.top)}))}function R(t){return Array.from(new Set(t))}var N=0,B=function(e){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,e);var n=r(o);function o(e){var i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,o),(i=n.call(this)).options=Object.assign({},o.options,s),i.options.delimeter&&(i.options.delimiter=i.options.delimeter),i.lastSort={},i.group=o.ALL_ITEMS,i.lastFilter=o.ALL_ITEMS,i.isEnabled=!0,i.isDestroyed=!1,i.isInitialized=!1,i._transitions=[],i.isTransitioning=!1,i._queue=[];var r=i._getElementOption(e);if(!r)throw new TypeError("Shuffle needs to be initialized with an element.");return i.element=r,i.id="shuffle_"+N,N+=1,i._init(),i.isInitialized=!0,i}return i(o,[{key:"_init",value:function(){if(this.items=this._getItems(),this.options.sizer=this._getElementOption(this.options.sizer),this.element.classList.add(o.Classes.BASE),this._initItems(this.items),this._onResize=this._getResizeFunction(),window.addEventListener("resize",this._onResize),"complete"!==document.readyState){var t=this.layout.bind(this);window.addEventListener("load",(function e(){window.removeEventListener("load",e),t()}))}var e=window.getComputedStyle(this.element,null),i=o.getSize(this.element).width;this._validateStyles(e),this._setColumns(i),this.filter(this.options.group,this.options.initialSort),this.element.offsetWidth,this.setItemTransitions(this.items),this.element.style.transition="height ".concat(this.options.speed,"ms ").concat(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(t,e){var i=this,n=[],s=[];return t===o.ALL_ITEMS?n=e:e.forEach((function(e){i._doesPassFilter(t,e.element)?n.push(e):s.push(e)})),{visible:n,hidden:s}}},{key:"_doesPassFilter",value:function(t,e){if("function"==typeof t)return t.call(e,e,this);var i=e.getAttribute("data-"+o.FILTER_ATTRIBUTE_KEY),n=this.options.delimiter?i.split(this.options.delimiter):JSON.parse(i);function s(t){return n.includes(t)}return Array.isArray(t)?this.options.filterMode===o.FilterMode.ANY?t.some(s):t.every(s):n.includes(t)}},{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(t){t.forEach((function(t){t.init()}))}},{key:"_disposeItems",value:function(t){t.forEach((function(t){t.dispose()}))}},{key:"_updateItemCount",value:function(){this.visibleItems=this._getFilteredItems().length}},{key:"setItemTransitions",value:function(t){var e=this.options,i=e.speed,n=e.easing,s=this.options.useTransforms?["transform"]:["top","left"],o=Object.keys(E.Css.HIDDEN.before).map((function(t){return t.replace(/([A-Z])/g,(function(t,e){return"-".concat(e.toLowerCase())}))})),r=s.concat(o).join();t.forEach((function(t){t.element.style.transitionDuration=i+"ms",t.element.style.transitionTimingFunction=n,t.element.style.transitionProperty=r}))}},{key:"_getItems",value:function(){var t=this;return Array.from(this.element.children).filter((function(e){return c(e,t.options.itemSelector)})).map((function(e){return new E(e,t.options.isRTL)}))}},{key:"_mergeNewItems",value:function(t){var e=Array.from(this.element.children);return k(this.items.concat(t),{by:function(t){return e.indexOf(t)}})}},{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(t,e){var i;return 0===(i="function"==typeof this.options.columnWidth?this.options.columnWidth(t):this.options.sizer?o.getSize(this.options.sizer).width:this.options.columnWidth?this.options.columnWidth:this.items.length>0?o.getSize(this.items[0].element,!0).width:t)&&(i=t),i+e}},{key:"_getGutterSize",value:function(t){return"function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.options.sizer?T(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.getSize(this.element).width,e=this._getGutterSize(t),i=this._getColumnSize(t,e),n=(t+e)/i;Math.abs(Math.round(n)-n)1&&void 0!==arguments[1]?arguments[1]:{};this.isDestroyed||(e.shuffle=this,this.emit(t,e))}},{key:"_resetCols",value:function(){var t=this.cols;for(this.positions=[];t;)t-=1,this.positions.push(0)}},{key:"_layout",value:function(t){var e=this,i=this._getNextPositions(t),n=0;t.forEach((function(t,s){function o(){t.applyCss(E.Css.VISIBLE.after)}if(v.equals(t.point,i[s])&&!t.isHidden)return t.applyCss(E.Css.VISIBLE.before),void o();t.point=i[s],t.scale=E.Scale.VISIBLE,t.isHidden=!1;var r=e.getStylesForTransition(t,E.Css.VISIBLE.before);r.transitionDelay=e._getStaggerAmount(n)+"ms",e._queue.push({item:t,styles:r,callback:o}),n+=1}))}},{key:"_getNextPositions",value:function(t){var e=this;if(this.options.isCentered){var i=t.map((function(t,i){var n=o.getSize(t.element,!0),s=e._getItemPosition(n);return new y(s.x,s.y,n.width,n.height,i)}));return this.getTransformedPositions(i,this.containerWidth)}return t.map((function(t){return e._getItemPosition(o.getSize(t.element,!0))}))}},{key:"_getItemPosition",value:function(t){return function(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,l=A(e.width,n,s,o),a=F(i,l,s),u=x(a,r),h=new v(n*u,a[u]),f=a[u]+e.height,c=0;c0&&void 0!==arguments[0]?arguments[0]:this._getConcealedItems(),i=0;e.forEach((function(e){function n(){e.applyCss(E.Css.HIDDEN.after)}if(e.isHidden)return e.applyCss(E.Css.HIDDEN.before),void n();e.scale=E.Scale.HIDDEN,e.isHidden=!0;var s=t.getStylesForTransition(e,E.Css.HIDDEN.before);s.transitionDelay=t._getStaggerAmount(i)+"ms",t._queue.push({item:e,styles:s,callback:n}),i+=1}))}},{key:"_handleResize",value:function(){this.isEnabled&&!this.isDestroyed&&this.update()}},{key:"getStylesForTransition",value:function(t,e){var i=Object.assign({},e);if(this.options.useTransforms){var n=this.options.isRTL?"-":"",s=this.options.roundTransforms?Math.round(t.point.x):t.point.x,o=this.options.roundTransforms?Math.round(t.point.y):t.point.y;i.transform="translate(".concat(n).concat(s,"px, ").concat(o,"px) scale(").concat(t.scale,")")}else this.options.isRTL?i.right=t.point.x+"px":i.left=t.point.x+"px",i.top=t.point.y+"px";return i}},{key:"_whenTransitionDone",value:function(t,e,i){var n=z(t,(function(t){e(),i(null,t)}));this._transitions.push(n)}},{key:"_getTransitionFunction",value:function(t){var e=this;return function(i){t.item.applyCss(t.styles),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._dispatch(o.EventType.LAYOUT)):this._dispatch(o.EventType.LAYOUT),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0,function(t,e,i){i||("function"==typeof e?(i=e,e=null):i=p);var n=t&&t.length;if(!n)return i(null,[]);var s=!1,o=new Array(n);function r(t){return function(e,r){if(!s){if(e)return i(e,o),void(s=!0);o[t]=r,--n||i(null,o)}}}t.forEach(e?function(t,i){t.call(e,r(i))}:function(t,e){t(r(e))})}(t.map((function(t){return e._getTransitionFunction(t)})),this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(D),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(t){if(t.length){var e=t.map((function(t){return t.item.element}));o._skipTransitions(e,(function(){t.forEach((function(t){t.item.applyCss(t.styles),t.callback()}))}))}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatch(o.EventType.LAYOUT)}},{key:"filter",value:function(t,e){this.isEnabled&&((!t||t&&0===t.length)&&(t=o.ALL_ITEMS),this._filter(t),this._shrink(),this._updateItemCount(),this.sort(e))}},{key:"sort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.lastSort;if(this.isEnabled){this._resetCols();var e=k(this._getFilteredItems(),t);this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){var e=this,i=R(t).map((function(t){return new E(t,e.options.isRTL)}));this._initItems(i),this._resetCols();var n=k(this._mergeNewItems(i),this.lastSort),s=this._filter(this.lastFilter,n),o=function(t){return i.includes(t)},r=function(t){t.scale=E.Scale.HIDDEN,t.isHidden=!0,t.applyCss(E.Css.HIDDEN.before),t.applyCss(E.Css.HIDDEN.after)},l=this._getNextPositions(s.visible);s.visible.forEach((function(t,i){o(t)&&(t.point=l[i],r(t),t.applyCss(e.getStylesForTransition(t,{})))})),s.hidden.forEach((function(t){o(t)&&r(t)})),this.element.offsetWidth,this.setItemTransitions(i),this.items=this._mergeNewItems(i),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isEnabled=!0,t&&this.update()}},{key:"remove",value:function(t){var e=this;if(t.length){var i=R(t),n=i.map((function(t){return e.getItemByElement(t)})).filter((function(t){return!!t}));this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter((function(t){return!n.includes(t)})),this._updateItemCount(),this.once(o.EventType.LAYOUT,(function(){e._disposeItems(n),i.forEach((function(t){t.parentNode.removeChild(t)})),e._dispatch(o.EventType.REMOVED,{collection:i})}))}}},{key:"getItemByElement",value:function(t){return this.items.find((function(e){return e.element===t}))}},{key:"resetItems",value:function(){var t=this;this._disposeItems(this.items),this.isInitialized=!1,this.items=this._getItems(),this._initItems(this.items),this.once(o.EventType.LAYOUT,(function(){t.setItemTransitions(t.items),t.isInitialized=!0})),this.filter(this.lastFilter)}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(this.items),this.items.length=0,this._transitions.length=0,this.options.sizer=null,this.element=null,this.isDestroyed=!0,this.isEnabled=!1}}],[{key:"getSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=window.getComputedStyle(t,null),n=T(t,"width",i),s=T(t,"height",i);if(e){var o=T(t,"marginLeft",i),r=T(t,"marginRight",i),l=T(t,"marginTop",i),a=T(t,"marginBottom",i);n+=o+r,s+=l+a}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i=t.map((function(t){var e=t.style,i=e.transitionDuration,n=e.transitionDelay;return e.transitionDuration="0ms",e.transitionDelay="0ms",{duration:i,delay:n}}));e(),t[0].offsetWidth,t.forEach((function(t,e){t.style.transitionDuration=i[e].duration,t.style.transitionDelay=i[e].delay}))}}]),o}(a);return B.ShuffleItem=E,B.ALL_ITEMS="all",B.FILTER_ATTRIBUTE_KEY="groups",B.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},B.Classes=g,B.FilterMode={ANY:"any",ALL:"all"},B.options={group:B.ALL_ITEMS,speed:250,easing:"cubic-bezier(0.4, 0.0, 0.2, 1)",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimiter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:d,throttleTime:300,staggerAmount:15,staggerAmountMax:150,useTransforms:!0,filterMode:B.FilterMode.ANY,isCentered:!1,isRTL:!1,roundTransforms:!0},B.Point=v,B.Rect=y,B.__sorter=k,B.__getColumnSpan=A,B.__getAvailablePositions=F,B.__getShortColumn=x,B.__getCenteredPositions=O,B})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Shuffle=e()}(this,(function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i=e?l():o=setTimeout(l,e-t)),s};function l(){o=0,r=+new Date,s=t.apply(i,n),i=null,n=null}};function p(){}function m(t){return parseFloat(t)||0}var v=function(){function e(i,n){t(this,e),this.x=m(i),this.y=m(n)}return i(e,null,[{key:"equals",value:function(t,e){return t.x===e.x&&t.y===e.y}}]),e}(),y=function(){function e(i,n,s,o,r){t(this,e),this.id=r,this.left=i,this.top=n,this.width=s,this.height=o}return i(e,null,[{key:"intersects",value:function(t,e){return t.left2&&void 0!==arguments[2]?arguments[2]:window.getComputedStyle(t,null),n=m(i[e]);return b()||"width"!==e?b()||"height"!==e||(n+=m(i.paddingTop)+m(i.paddingBottom)+m(i.borderTopWidth)+m(i.borderBottomWidth)):n+=m(i.paddingLeft)+m(i.paddingRight)+m(i.borderLeftWidth)+m(i.borderRightWidth),n}var S={reverse:!1,by:null,compare:null,randomize:!1,key:"element"};function k(t,e){var i=Object.assign({},S,e),n=Array.from(t),s=!1;return t.length?i.randomize?function(t){for(var e=t.length;e;){e-=1;var i=Math.floor(Math.random()*(e+1)),n=t[i];t[i]=t[e],t[e]=n}return t}(t):("function"==typeof i.by?t.sort((function(t,e){if(s)return 0;var n=i.by(t[i.key]),o=i.by(e[i.key]);return void 0===n&&void 0===o?(s=!0,0):no||"sortLast"===n||"sortFirst"===o?1:0})):"function"==typeof i.compare&&t.sort(i.compare),s?n:(i.reverse&&t.reverse(),t)):[]}var C={},L="transitionend",w=0;function D(t){return!!C[t]&&(C[t].element.removeEventListener(L,C[t].listener),C[t]=null,!0)}function z(t,e){var i=L+(w+=1),n=function(t){t.currentTarget===t.target&&(D(i),e(t))};return t.addEventListener(L,n),C[i]={element:t,listener:n},i}function M(t){return Math.max.apply(Math,t)}function A(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=n-e&&t[s]<=n+e)return s;return 0}function O(t,e){var i={};t.forEach((function(t){i[t.top]?i[t.top].push(t):i[t.top]=[t]}));var n=[],s=[],o=[];return Object.keys(i).forEach((function(t){var r=i[t];s.push(r);var l,a=r[r.length-1],u=a.left+a.width,h=Math.round((e-u)/2),f=r,c=!1;if(h>0){var d=[];(c=r.every((function(t){var e=new y(t.left+h,t.top,t.width,t.height,t.id),i=!n.some((function(t){return y.intersects(e,t)}));return d.push(e),i})))&&(f=d)}if(!c&&r.some((function(t){return n.some((function(e){var i=y.intersects(t,e);return i&&(l=e),i}))}))){var p=o.findIndex((function(t){return t.includes(l)}));o.splice(p,1,s[p])}n=n.concat(f),o.push(f)})),[].concat.apply([],o).sort((function(t,e){return t.id-e.id})).map((function(t){return new v(t.left,t.top)}))}function R(t){return Array.from(new Set(t))}var N=0,B=function(e){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,e);var n=r(o);function o(e){var i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,o),(i=n.call(this)).options=Object.assign({},o.options,s),i.options.delimeter&&(i.options.delimiter=i.options.delimeter),i.lastSort={},i.group=o.ALL_ITEMS,i.lastFilter=o.ALL_ITEMS,i.isEnabled=!0,i.isDestroyed=!1,i.isInitialized=!1,i._transitions=[],i.isTransitioning=!1,i._queue=[];var r=i._getElementOption(e);if(!r)throw new TypeError("Shuffle needs to be initialized with an element.");return i.element=r,i.id="shuffle_"+N,N+=1,i._init(),i.isInitialized=!0,i}return i(o,[{key:"_init",value:function(){if(this.items=this._getItems(),this.sortedItems=this.items,this.options.sizer=this._getElementOption(this.options.sizer),this.element.classList.add(o.Classes.BASE),this._initItems(this.items),this._onResize=this._getResizeFunction(),window.addEventListener("resize",this._onResize),"complete"!==document.readyState){var t=this.layout.bind(this);window.addEventListener("load",(function e(){window.removeEventListener("load",e),t()}))}var e=window.getComputedStyle(this.element,null),i=o.getSize(this.element).width;this._validateStyles(e),this._setColumns(i),this.filter(this.options.group,this.options.initialSort),this.element.offsetWidth,this.setItemTransitions(this.items),this.element.style.transition="height ".concat(this.options.speed,"ms ").concat(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(t,e){var i=this,n=[],s=[];return t===o.ALL_ITEMS?n=e:e.forEach((function(e){i._doesPassFilter(t,e.element)?n.push(e):s.push(e)})),{visible:n,hidden:s}}},{key:"_doesPassFilter",value:function(t,e){if("function"==typeof t)return t.call(e,e,this);var i=e.getAttribute("data-"+o.FILTER_ATTRIBUTE_KEY),n=this.options.delimiter?i.split(this.options.delimiter):JSON.parse(i);function s(t){return n.includes(t)}return Array.isArray(t)?this.options.filterMode===o.FilterMode.ANY?t.some(s):t.every(s):n.includes(t)}},{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(t){t.forEach((function(t){t.init()}))}},{key:"_disposeItems",value:function(t){t.forEach((function(t){t.dispose()}))}},{key:"_updateItemCount",value:function(){this.visibleItems=this._getFilteredItems().length}},{key:"setItemTransitions",value:function(t){var e=this.options,i=e.speed,n=e.easing,s=this.options.useTransforms?["transform"]:["top","left"],o=Object.keys(E.Css.HIDDEN.before).map((function(t){return t.replace(/([A-Z])/g,(function(t,e){return"-".concat(e.toLowerCase())}))})),r=s.concat(o).join();t.forEach((function(t){t.element.style.transitionDuration=i+"ms",t.element.style.transitionTimingFunction=n,t.element.style.transitionProperty=r}))}},{key:"_getItems",value:function(){var t=this;return Array.from(this.element.children).filter((function(e){return c(e,t.options.itemSelector)})).map((function(e){return new E(e,t.options.isRTL)}))}},{key:"_mergeNewItems",value:function(t){var e=Array.from(this.element.children);return k(this.items.concat(t),{by:function(t){return e.indexOf(t)}})}},{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(t,e){var i;return 0===(i="function"==typeof this.options.columnWidth?this.options.columnWidth(t):this.options.sizer?o.getSize(this.options.sizer).width:this.options.columnWidth?this.options.columnWidth:this.items.length>0?o.getSize(this.items[0].element,!0).width:t)&&(i=t),i+e}},{key:"_getGutterSize",value:function(t){return"function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.options.sizer?T(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.getSize(this.element).width,e=this._getGutterSize(t),i=this._getColumnSize(t,e),n=(t+e)/i;Math.abs(Math.round(n)-n)1&&void 0!==arguments[1]?arguments[1]:{};this.isDestroyed||(e.shuffle=this,this.emit(t,e))}},{key:"_resetCols",value:function(){var t=this.cols;for(this.positions=[];t;)t-=1,this.positions.push(0)}},{key:"_layout",value:function(t){var e=this,i=this._getNextPositions(t),n=0;t.forEach((function(t,s){function o(){t.applyCss(E.Css.VISIBLE.after)}if(v.equals(t.point,i[s])&&!t.isHidden)return t.applyCss(E.Css.VISIBLE.before),void o();t.point=i[s],t.scale=E.Scale.VISIBLE,t.isHidden=!1;var r=e.getStylesForTransition(t,E.Css.VISIBLE.before);r.transitionDelay=e._getStaggerAmount(n)+"ms",e._queue.push({item:t,styles:r,callback:o}),n+=1}))}},{key:"_getNextPositions",value:function(t){var e=this;if(this.options.isCentered){var i=t.map((function(t,i){var n=o.getSize(t.element,!0),s=e._getItemPosition(n);return new y(s.x,s.y,n.width,n.height,i)}));return this.getTransformedPositions(i,this.containerWidth)}return t.map((function(t){return e._getItemPosition(o.getSize(t.element,!0))}))}},{key:"_getItemPosition",value:function(t){return function(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,l=A(e.width,n,s,o),a=F(i,l,s),u=x(a,r),h=new v(n*u,a[u]),f=a[u]+e.height,c=0;c0&&void 0!==arguments[0]?arguments[0]:this._getConcealedItems(),i=0;e.forEach((function(e){function n(){e.applyCss(E.Css.HIDDEN.after)}if(e.isHidden)return e.applyCss(E.Css.HIDDEN.before),void n();e.scale=E.Scale.HIDDEN,e.isHidden=!0;var s=t.getStylesForTransition(e,E.Css.HIDDEN.before);s.transitionDelay=t._getStaggerAmount(i)+"ms",t._queue.push({item:e,styles:s,callback:n}),i+=1}))}},{key:"_handleResize",value:function(){this.isEnabled&&!this.isDestroyed&&this.update()}},{key:"getStylesForTransition",value:function(t,e){var i=Object.assign({},e);if(this.options.useTransforms){var n=this.options.isRTL?"-":"",s=this.options.roundTransforms?Math.round(t.point.x):t.point.x,o=this.options.roundTransforms?Math.round(t.point.y):t.point.y;i.transform="translate(".concat(n).concat(s,"px, ").concat(o,"px) scale(").concat(t.scale,")")}else this.options.isRTL?i.right=t.point.x+"px":i.left=t.point.x+"px",i.top=t.point.y+"px";return i}},{key:"_whenTransitionDone",value:function(t,e,i){var n=z(t,(function(t){e(),i(null,t)}));this._transitions.push(n)}},{key:"_getTransitionFunction",value:function(t){var e=this;return function(i){t.item.applyCss(t.styles),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._dispatch(o.EventType.LAYOUT)):this._dispatch(o.EventType.LAYOUT),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0,function(t,e,i){i||("function"==typeof e?(i=e,e=null):i=p);var n=t&&t.length;if(!n)return i(null,[]);var s=!1,o=new Array(n);function r(t){return function(e,r){if(!s){if(e)return i(e,o),void(s=!0);o[t]=r,--n||i(null,o)}}}t.forEach(e?function(t,i){t.call(e,r(i))}:function(t,e){t(r(e))})}(t.map((function(t){return e._getTransitionFunction(t)})),this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(D),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(t){if(t.length){var e=t.map((function(t){return t.item.element}));o._skipTransitions(e,(function(){t.forEach((function(t){t.item.applyCss(t.styles),t.callback()}))}))}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatch(o.EventType.LAYOUT)}},{key:"filter",value:function(t,e){this.isEnabled&&((!t||t&&0===t.length)&&(t=o.ALL_ITEMS),this._filter(t),this._shrink(),this._updateItemCount(),this.sort(e))}},{key:"sort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.lastSort;if(this.isEnabled){this._resetCols();var e=k(this._getFilteredItems(),t);this.sortedItems=e,this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){var e=this,i=R(t).map((function(t){return new E(t,e.options.isRTL)}));this._initItems(i),this._resetCols();var n=k(this._mergeNewItems(i),this.lastSort),s=this._filter(this.lastFilter,n),o=function(t){return i.includes(t)},r=function(t){t.scale=E.Scale.HIDDEN,t.isHidden=!0,t.applyCss(E.Css.HIDDEN.before),t.applyCss(E.Css.HIDDEN.after)},l=this._getNextPositions(s.visible);s.visible.forEach((function(t,i){o(t)&&(t.point=l[i],r(t),t.applyCss(e.getStylesForTransition(t,{})))})),s.hidden.forEach((function(t){o(t)&&r(t)})),this.element.offsetWidth,this.setItemTransitions(i),this.items=this._mergeNewItems(i),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isEnabled=!0,t&&this.update()}},{key:"remove",value:function(t){var e=this;if(t.length){var i=R(t),n=i.map((function(t){return e.getItemByElement(t)})).filter((function(t){return!!t}));this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter((function(t){return!n.includes(t)})),this._updateItemCount(),this.once(o.EventType.LAYOUT,(function(){e._disposeItems(n),i.forEach((function(t){t.parentNode.removeChild(t)})),e._dispatch(o.EventType.REMOVED,{collection:i})}))}}},{key:"getItemByElement",value:function(t){return this.items.find((function(e){return e.element===t}))}},{key:"resetItems",value:function(){var t=this;this._disposeItems(this.items),this.isInitialized=!1,this.items=this._getItems(),this._initItems(this.items),this.once(o.EventType.LAYOUT,(function(){t.setItemTransitions(t.items),t.isInitialized=!0})),this.filter(this.lastFilter)}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(this.items),this.items.length=0,this._transitions.length=0,this.options.sizer=null,this.element=null,this.isDestroyed=!0,this.isEnabled=!1}}],[{key:"getSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=window.getComputedStyle(t,null),n=T(t,"width",i),s=T(t,"height",i);if(e){var o=T(t,"marginLeft",i),r=T(t,"marginRight",i),l=T(t,"marginTop",i),a=T(t,"marginBottom",i);n+=o+r,s+=l+a}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i=t.map((function(t){var e=t.style,i=e.transitionDuration,n=e.transitionDelay;return e.transitionDuration="0ms",e.transitionDelay="0ms",{duration:i,delay:n}}));e(),t[0].offsetWidth,t.forEach((function(t,e){t.style.transitionDuration=i[e].duration,t.style.transitionDelay=i[e].delay}))}}]),o}(u);return B.ShuffleItem=E,B.ALL_ITEMS="all",B.FILTER_ATTRIBUTE_KEY="groups",B.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},B.Classes=g,B.FilterMode={ANY:"any",ALL:"all"},B.options={group:B.ALL_ITEMS,speed:250,easing:"cubic-bezier(0.4, 0.0, 0.2, 1)",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimiter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:d,throttleTime:300,staggerAmount:15,staggerAmountMax:150,useTransforms:!0,filterMode:B.FilterMode.ANY,isCentered:!1,isRTL:!1,roundTransforms:!0},B.Point=v,B.Rect=y,B.__sorter=k,B.__getColumnSpan=A,B.__getAvailablePositions=F,B.__getShortColumn=x,B.__getCenteredPositions=O,B})); //# sourceMappingURL=shuffle.min.js.map diff --git a/dist/shuffle.min.js.map b/dist/shuffle.min.js.map index 50199b1..286b47e 100644 --- a/dist/shuffle.min.js.map +++ b/dist/shuffle.min.js.map @@ -1 +1 @@ -{"version":3,"file":"shuffle.min.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/layout.js","../src/array-min.js","../src/shuffle.js","../src/hyphenate.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","let value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n value = window.getComputedStyle(e, null).width === '10px';\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\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 // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n"],"names":["E","prototype","on","name","callback","ctx","e","this","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","proto","Element","vendor","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","el","selector","nodeType","nodes","parentNode","querySelectorAll","func","wait","args","rtn","timeoutID","last","delta","Date","setTimeout","noop","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","_this","_this2","obj","Object","keys","key","_this3","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","createElement","cssText","appendChild","window","getComputedStyle","removeChild","getNumberStyle","styles","testComputedSize","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","defaults","reverse","by","compare","randomize","sorter","arr","options","opts","assign","original","Array","from","revert","array","n","Math","floor","random","temp","sort","valA","valB","undefined","transitions","eventName","count","cancelTransitionEnd","removeEventListener","onTransitionEnd","evt","currentTarget","target","addEventListener","arrayMax","max","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","round","min","ceil","getAvailablePositions","positions","available","getShortColumn","buffer","minPosition","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","intersectingRect","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","rowIndex","findIndex","items","includes","splice","concat","map","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","TypeError","_init","_getItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","replace","str","m1","toLowerCase","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","shuffle","itemPositions","_getNextPositions","equals","_this4","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","itemSize","_this5","_getItemPosition","getTransformedPositions","gridSize","total","span","setY","shortColumnIndex","setHeight","getItemPosition","_getConcealedItems","_this6","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_this7","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","fns","context","pending","finished","results","maybeDone","err","result","parallel","_this8","_getTransitionFunction","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","_this9","sortedItems","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","_this10","getItemByElement","_disposeItems","REMOVED","find","_this11","includeMargins","marginLeft","marginRight","marginTop","marginBottom","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"22CAAA,SAASA,KAKTA,EAAEC,UAAY,CACZC,GAAI,SAAUC,EAAMC,EAAUC,GAC5B,IAAIC,EAAIC,KAAKD,IAAMC,KAAKD,EAAI,IAO5B,OALCA,EAAEH,KAAUG,EAAEH,GAAQ,KAAKK,KAAK,CAC/BC,GAAIL,EACJC,IAAKA,IAGAE,MAGTG,KAAM,SAAUP,EAAMC,EAAUC,GAC9B,IAAIM,EAAOJ,KACX,SAASK,IACPD,EAAKE,IAAIV,EAAMS,GACfR,EAASU,MAAMT,EAAKU,WAItB,OADAH,EAASI,EAAIZ,EACNG,KAAKL,GAAGC,EAAMS,EAAUP,IAGjCY,KAAM,SAAUd,GAMd,IALA,IAAIe,EAAO,GAAGC,MAAMC,KAAKL,UAAW,GAChCM,IAAWd,KAAKD,IAAMC,KAAKD,EAAI,KAAKH,IAAS,IAAIgB,QACjDG,EAAI,EACJC,EAAMF,EAAOG,OAETF,EAAIC,EAAKD,IACfD,EAAOC,GAAGb,GAAGK,MAAMO,EAAOC,GAAGjB,IAAKa,GAGpC,OAAOX,MAGTM,IAAK,SAAUV,EAAMC,GACnB,IAAIE,EAAIC,KAAKD,IAAMC,KAAKD,EAAI,IACxBmB,EAAOnB,EAAEH,GACTuB,EAAa,GAEjB,GAAID,GAAQrB,EACV,IAAK,IAAIkB,EAAI,EAAGC,EAAME,EAAKD,OAAQF,EAAIC,EAAKD,IACtCG,EAAKH,GAAGb,KAAOL,GAAYqB,EAAKH,GAAGb,GAAGO,IAAMZ,GAC9CsB,EAAWlB,KAAKiB,EAAKH,IAY3B,OAJCI,EAAiB,OACdpB,EAAEH,GAAQuB,SACHpB,EAAEH,GAENI,OAIX,MAAiBP,IACYA,kBChE7B,IAAI2B,EAA2B,oBAAZC,QAA0BA,QAAQ3B,UAAY,GAC7D4B,EAASF,EAAMG,SACdH,EAAMI,iBACNJ,EAAMK,uBACNL,EAAMM,oBACNN,EAAMO,mBACNP,EAAMQ,mBAaX,SAAeC,EAAIC,GACjB,IAAKD,GAAsB,IAAhBA,EAAGE,SAAgB,OAAO,EACrC,GAAIT,EAAQ,OAAOA,EAAOT,KAAKgB,EAAIC,GAEnC,IADA,IAAIE,EAAQH,EAAGI,WAAWC,iBAAiBJ,GAClCf,EAAI,EAAGA,EAAIiB,EAAMf,OAAQF,IAChC,GAAIiB,EAAMjB,IAAMc,EAAI,OAAO,EAE7B,OAAO,GC5BT,MAUA,SAAmBM,EAAMC,GACvB,IAAItC,EAAKuC,EAAMC,EAAKC,EAChBC,EAAO,EAEX,OAAO,WACL1C,EAAME,KACNqC,EAAO7B,UACP,IAAIiC,EAAQ,IAAIC,KAASF,EAIzB,OAHKD,IACCE,GAASL,EAAMvB,IACd0B,EAAYI,WAAW9B,EAAMuB,EAAOK,IACpCH,GAGT,SAASzB,IACP0B,EAAY,EACZC,GAAQ,IAAIE,KACZJ,EAAMH,EAAK5B,MAAMT,EAAKuC,GACtBvC,EAAM,KACNuC,EAAO,OCUX,SAASO,KClCM,SAASC,EAAUC,UACzBC,WAAWD,IAAU,MCJxBE,wBAMQC,EAAGC,kBACRD,EAAIJ,EAAUI,QACdC,EAAIL,EAAUK,wCASrB,SAAcC,EAAGC,UACRD,EAAEF,IAAMG,EAAEH,GAAKE,EAAED,IAAME,EAAEF,WCpBfG,wBAWPJ,EAAGC,EAAGI,EAAGC,EAAGC,kBACjBA,GAAKA,OAGLC,KAAOR,OAGPS,IAAMR,OAGNS,MAAQL,OAGRM,OAASL,2CAShB,SAAkBJ,EAAGC,UAEjBD,EAAEM,KAAOL,EAAEK,KAAOL,EAAEO,OAASP,EAAEK,KAAON,EAAEM,KAAON,EAAEQ,OAC9CR,EAAEO,IAAMN,EAAEM,IAAMN,EAAEQ,QAAUR,EAAEM,IAAMP,EAAEO,IAAMP,EAAES,kBCpCxC,CACbC,KAAM,UACNC,aAAc,eACdC,QAAS,wBACTC,OAAQ,wBCDNR,EAAK,EAEHS,wBACQC,EAASC,aACnBX,GAAM,OACDA,GAAKA,OACLU,QAAUA,OAKVC,MAAQA,OAKRC,WAAY,OAQZC,UAAW,gCAGlB,gBACOD,WAAY,OACZF,QAAQI,UAAUC,OAAOC,EAAQR,aACjCE,QAAQI,UAAUG,IAAID,EAAQT,cAC9BG,QAAQQ,gBAAgB,mCAG/B,gBACON,WAAY,OACZF,QAAQI,UAAUC,OAAOC,EAAQT,cACjCG,QAAQI,UAAUG,IAAID,EAAQR,aAC9BE,QAAQS,aAAa,eAAe,uBAG3C,gBACOC,WAAW,CAACJ,EAAQV,aAAcU,EAAQT,eAC1Cc,SAASZ,EAAYa,IAAIC,cACzBF,SAAS7E,KAAKmE,MAAQF,EAAYa,IAAIE,UAAUC,IAAMhB,EAAYa,IAAIE,UAAUE,UAChFC,MAAQlB,EAAYmB,MAAMrB,aAC1BsB,MAAQ,IAAIrC,4BAGnB,SAAWsC,cACTA,EAAQC,SAAQ,SAACC,GACfC,EAAKvB,QAAQI,UAAUG,IAAIe,mCAI/B,SAAcF,cACZA,EAAQC,SAAQ,SAACC,GACfE,EAAKxB,QAAQI,UAAUC,OAAOiB,8BAIlC,SAASG,cACPC,OAAOC,KAAKF,GAAKJ,SAAQ,SAACO,GACxBC,EAAK7B,QAAQ8B,MAAMF,GAAOH,EAAIG,6BAIlC,gBACOG,cAAc,CACjBzB,EAAQR,OACRQ,EAAQT,QACRS,EAAQV,oBAGLI,QAAQQ,gBAAgB,cACxBR,QAAU,cAInBD,EAAYa,IAAM,CAChBC,QAAS,CACPmB,SAAU,WACVxC,IAAK,EACLyC,WAAY,UACZC,WAAY,aAEdpB,UAAW,CACTE,IAAK,CACHzB,KAAM,GAERwB,IAAK,CACHoB,MAAO,IAGXtC,QAAS,CACPuC,OAAQ,CACNC,QAAS,EACTJ,WAAY,WAEdK,MAAO,CACLC,gBAAiB,KAGrBzC,OAAQ,CACNsC,OAAQ,CACNC,QAAS,GAEXC,MAAO,CACLL,WAAY,SACZM,gBAAiB,MAKvBxC,EAAYmB,MAAQ,CAClBrB,QAAS,EACTC,OAAQ,MCvHV,IAAIlB,EAAQ,qBAEI,OAAVA,SACKA,MAGHoB,EAAUwC,SAASC,MAAQD,SAASE,gBACpC7G,EAAI2G,SAASG,cAAc,cACjC9G,EAAEiG,MAAMc,QAAU,gDAClB5C,EAAQ6C,YAAYhH,GAEpB+C,EAAmD,SAA3CkE,OAAOC,iBAAiBlH,EAAG,MAAM4D,MAEzCO,EAAQgD,YAAYnH,GAEb+C,GCFM,SAASqE,EACtBjD,EAAS8B,OACToB,yDAASJ,OAAOC,iBAAiB/C,EAAS,MAEtCpB,EAAQD,EAAUuE,EAAOpB,WAGxBqB,KAAgC,UAAVrB,EAKfqB,KAAgC,WAAVrB,IAChClD,GAASD,EAAUuE,EAAOE,YACtBzE,EAAUuE,EAAOG,eACjB1E,EAAUuE,EAAOI,gBACjB3E,EAAUuE,EAAOK,oBARrB3E,GAASD,EAAUuE,EAAOM,aACtB7E,EAAUuE,EAAOO,cACjB9E,EAAUuE,EAAOQ,iBACjB/E,EAAUuE,EAAOS,kBAQhB/E,ECXT,IAAMgF,EAAW,CAEfC,SAAS,EAGTC,GAAI,KAGJC,QAAS,KAGTC,WAAW,EAIXpC,IAAK,WASQ,SAASqC,EAAOC,EAAKC,OAE5BC,EAAO1C,OAAO2C,OAAO,GAAIT,EAAUO,GACnCG,EAAWC,MAAMC,KAAKN,GACxBO,GAAS,SAERP,EAAInH,OAILqH,EAAKJ,UAhDX,SAAmBU,WACbC,EAAID,EAAM3H,OAEP4H,GAAG,CACRA,GAAK,MACC9H,EAAI+H,KAAKC,MAAMD,KAAKE,UAAYH,EAAI,IACpCI,EAAOL,EAAM7H,GACnB6H,EAAM7H,GAAK6H,EAAMC,GACjBD,EAAMC,GAAKI,SAGNL,EAsCEV,CAAUE,IAKI,mBAAZE,EAAKN,GACdI,EAAIc,MAAK,SAAC/F,EAAGC,MAEPuF,SACK,MAGHQ,EAAOb,EAAKN,GAAG7E,EAAEmF,EAAKxC,MACtBsD,EAAOd,EAAKN,GAAG5E,EAAEkF,EAAKxC,kBAGfuD,IAATF,QAA+BE,IAATD,GACxBT,GAAS,EACF,GAGLQ,EAAOC,GAAiB,cAATD,GAAiC,aAATC,GACjC,EAGND,EAAOC,GAAiB,aAATD,GAAgC,cAATC,EACjC,EAGF,KAEwB,mBAAjBd,EAAKL,SACrBG,EAAIc,KAAKZ,EAAKL,SAIZU,EACKH,GAGLF,EAAKP,SACPK,EAAIL,UAGCK,IAhDE,GCpDX,IAAMkB,EAAc,GACdC,EAAY,gBACdC,EAAQ,EAOL,SAASC,EAAoBjG,WAC9B8F,EAAY9F,KACd8F,EAAY9F,GAAIU,QAAQwF,oBAAoBH,EAAWD,EAAY9F,GAAInD,UACvEiJ,EAAY9F,GAAM,MACX,GAMJ,SAASmG,EAAgBzF,EAASrE,OACjC2D,EAdC+F,GADPC,GAAS,GAgBHnJ,EAAW,SAACuJ,GACZA,EAAIC,gBAAkBD,EAAIE,SAC5BL,EAAoBjG,GACpB3D,EAAS+J,YAIb1F,EAAQ6F,iBAAiBR,EAAWlJ,GAEpCiJ,EAAY9F,GAAM,CAAEU,QAAAA,EAAS7D,SAAAA,GAEtBmD,EChCM,SAASwG,EAASpB,UACxBE,KAAKmB,IAAI1J,MAAMuI,KAAMF,GCYvB,SAASsB,EAAcC,EAAWC,EAAaC,EAASC,OACzDC,EAAaJ,EAAYC,SAKzBtB,KAAK0B,IAAI1B,KAAK2B,MAAMF,GAAcA,GAAcD,IAElDC,EAAazB,KAAK2B,MAAMF,IAInBzB,KAAK4B,IAAI5B,KAAK6B,KAAKJ,GAAaF,GASlC,SAASO,EAAsBC,EAAWN,EAAYF,MAExC,IAAfE,SACKM,UAyBHC,EAAY,GAGT/J,EAAI,EAAGA,GAAKsJ,EAAUE,EAAYxJ,IAEzC+J,EAAU7K,KAAK+J,EAASa,EAAUjK,MAAMG,EAAGA,EAAIwJ,YAG1CO,EAWF,SAASC,EAAeF,EAAWG,WCjFTpC,EDkFzBqC,GClFyBrC,EDkFFiC,ECjFtB/B,KAAK4B,IAAInK,MAAMuI,KAAMF,IDkFnB7H,EAAI,EAAGC,EAAM6J,EAAU5J,OAAQF,EAAIC,EAAKD,OAC3C8J,EAAU9J,IAAMkK,EAAcD,GAAUH,EAAU9J,IAAMkK,EAAcD,SACjEjK,SAIJ,EA0CF,SAASmK,EAAqBC,EAAWC,OACxCC,EAAS,GAKfF,EAAU5F,SAAQ,SAAC+F,GACbD,EAAOC,EAAS5H,KAElB2H,EAAOC,EAAS5H,KAAKzD,KAAKqL,GAG1BD,EAAOC,EAAS5H,KAAO,CAAC4H,UAOxBC,EAAQ,GACNC,EAAO,GACPC,EAAe,UACrB7F,OAAOC,KAAKwF,GAAQ9F,SAAQ,SAACO,OACrBqF,EAAYE,EAAOvF,GACzB0F,EAAKvL,KAAKkL,OA6BJO,EA5BAC,EAAWR,EAAUA,EAAUlK,OAAS,GACxC2K,EAAMD,EAASlI,KAAOkI,EAAShI,MAC/BkI,EAAS/C,KAAK2B,OAAOW,EAAiBQ,GAAO,GAE/CE,EAAaX,EACbY,GAAU,KACVF,EAAS,EAAG,KACRG,EAAW,IACjBD,EAAUZ,EAAUc,OAAM,SAACC,OACnBC,EAAU,IAAI9I,EAAK6I,EAAEzI,KAAOoI,EAAQK,EAAExI,IAAKwI,EAAEvI,MAAOuI,EAAEtI,OAAQsI,EAAE1I,IAGhE4I,GAAab,EAAMc,MAAK,SAACH,UAAM7I,EAAKiJ,WAAWH,EAASD,aAE9DF,EAAS/L,KAAKkM,GACPC,QAKPN,EAAaE,OAOZD,GAEgBZ,EAAUkB,MAAK,SAACf,UAAaC,EAAMc,MAAK,SAACH,OACpDI,EAAajJ,EAAKiJ,WAAWhB,EAAUY,UACzCI,IACFZ,EAAmBQ,GAEdI,QAIO,KACRC,EAAWd,EAAae,WAAU,SAACC,UAAUA,EAAMC,SAAShB,MAClED,EAAakB,OAAOJ,EAAU,EAAGf,EAAKe,IAI1ChB,EAAQA,EAAMqB,OAAOd,GACrBL,EAAaxL,KAAK6L,MAOb,GAAGc,OAAOrM,MAAM,GAAIkL,GACxBvC,MAAK,SAAC/F,EAAGC,UAAOD,EAAEK,GAAKJ,EAAEI,MACzBqJ,KAAI,SAACvB,UAAa,IAAItI,EAAMsI,EAAS7H,KAAM6H,EAAS5H,QE5LzD,SAASoJ,EAAY7J,UACZwF,MAAMC,KAAK,IAAIqE,IAAI9J,IAI5B,IAAIO,EAAK,EAEHwJ,6QAQQ9I,SAASmE,yDAAU,8BAGxBA,QAAUzC,OAAO2C,OAAO,GAAIyE,EAAQ3E,QAASA,GAI9C5C,EAAK4C,QAAQ4E,cACV5E,QAAQ6E,UAAYzH,EAAK4C,QAAQ4E,aAGnCE,SAAW,KACXC,MAAQJ,EAAQK,YAChBC,WAAaN,EAAQK,YACrBE,WAAY,IACZC,aAAc,IACdC,eAAgB,IAChBC,aAAe,KACfC,iBAAkB,IAClBC,OAAS,OAER/L,EAAK4D,EAAKoI,kBAAkB3J,OAE7BrC,QACG,IAAIiM,UAAU,6DAGjB5J,QAAUrC,IACV2B,GAAK,WAAaA,EACvBA,GAAM,IAEDuK,UACAN,eAAgB,mCAGvB,mBACOhB,MAAQzM,KAAKgO,iBAEb3F,QAAQ4F,MAAQjO,KAAK6N,kBAAkB7N,KAAKqI,QAAQ4F,YAGpD/J,QAAQI,UAAUG,IAAIuI,EAAQxI,QAAQX,WAGtCqK,WAAWlO,KAAKyM,YAGhB0B,UAAYnO,KAAKoO,qBACtBpH,OAAO+C,iBAAiB,SAAU/J,KAAKmO,WAKX,aAAxBzH,SAAS2H,WAA2B,KAChCC,EAAStO,KAAKsO,OAAOC,KAAKvO,MAChCgH,OAAO+C,iBAAiB,QAAQ,SAASyE,IACvCxH,OAAO0C,oBAAoB,OAAQ8E,GACnCF,WAKEG,EAAezH,OAAOC,iBAAiBjH,KAAKkE,QAAS,MACrDkH,EAAiB4B,EAAQ0B,QAAQ1O,KAAKkE,SAASP,WAGhDgL,gBAAgBF,QAIhBG,YAAYxD,QAGZyD,OAAO7O,KAAKqI,QAAQ+E,MAAOpN,KAAKqI,QAAQyG,kBAMxC5K,QAAQ6K,iBACRC,mBAAmBhP,KAAKyM,YACxBvI,QAAQ8B,MAAMiJ,4BAAuBjP,KAAKqI,QAAQ6G,oBAAWlP,KAAKqI,QAAQ8G,0CAQjF,eACQC,EAAiBpP,KAAKqP,cAAcd,KAAKvO,aACxCA,KAAKqI,QAAQiH,SAChBtP,KAAKqI,QAAQiH,SAASF,EAAgBpP,KAAKqI,QAAQkH,cACnDH,mCASN,SAAkBI,SAGM,iBAAXA,EACFxP,KAAKkE,QAAQuL,cAAcD,GAIhCA,GAAUA,EAAOzN,UAAgC,IAApByN,EAAOzN,SAC/ByN,EAILA,GAAUA,EAAOE,OACZF,EAAO,GAGT,oCAQT,SAAgBpI,GAEU,WAApBA,EAAOlB,gBACJhC,QAAQ8B,MAAME,SAAW,YAIR,WAApBkB,EAAOuI,gBACJzL,QAAQ8B,MAAM2J,SAAW,iCAalC,eAAQC,yDAAW5P,KAAKsN,WAAYuC,yDAAa7P,KAAKyM,MAC9CqD,EAAM9P,KAAK+P,iBAAiBH,EAAUC,eAGvCG,qBAAqBF,QAGrBxC,WAAasC,EAIM,iBAAbA,SACJxC,MAAQwC,GAGRE,kCAUT,SAAiBF,EAAUnD,cACrBwD,EAAU,GACRC,EAAS,UAGXN,IAAa5C,EAAQK,UACvB4C,EAAUxD,EAKVA,EAAMlH,SAAQ,SAAC4K,GACTzK,EAAK0K,gBAAgBR,EAAUO,EAAKjM,SACtC+L,EAAQhQ,KAAKkQ,GAEbD,EAAOjQ,KAAKkQ,MAKX,CACLF,QAAAA,EACAC,OAAAA,kCAWJ,SAAgBN,EAAU1L,MACA,mBAAb0L,SACFA,EAAS/O,KAAKqD,EAASA,EAASlE,UAInCqQ,EAAOnM,EAAQoM,aAAa,QAAUtD,EAAQuD,sBAC9C1K,EAAO7F,KAAKqI,QAAQ6E,UACtBmD,EAAKG,MAAMxQ,KAAKqI,QAAQ6E,WACxBuD,KAAKC,MAAML,YAENM,EAAaf,UACb/J,EAAK6G,SAASkD,UAGnBnH,MAAMmI,QAAQhB,GACZ5P,KAAKqI,QAAQwI,aAAe7D,EAAQ8D,WAAWC,IAC1CnB,EAASvD,KAAKsE,GAEhBf,EAAS3D,MAAM0E,GAGjB9K,EAAK6G,SAASkD,uCAQvB,gBAAuBK,IAAAA,QAASC,IAAAA,OAC9BD,EAAQ1K,SAAQ,SAAC4K,GACfA,EAAKa,UAGPd,EAAO3K,SAAQ,SAAC4K,GACdA,EAAKc,oCAST,SAAWxE,GACTA,EAAMlH,SAAQ,SAAC4K,GACbA,EAAKe,uCAST,SAAczE,GACZA,EAAMlH,SAAQ,SAAC4K,GACbA,EAAKgB,6CAQT,gBACOC,aAAepR,KAAKqR,oBAAoBpQ,yCAU/C,SAAmBwL,SACSzM,KAAKqI,QAAvB6G,IAAAA,MAAOC,IAAAA,OACTmC,EAAgBtR,KAAKqI,QAAQkJ,cAAgB,CAAC,aAAe,CAAC,MAAO,QAIrEC,EAAW5L,OAAOC,KAAK5B,EAAYa,IAAId,OAAOsC,QAAQuG,KAAI,SAAC4E,UAAgBA,EC/TxEC,QAAQ,YAAY,SAACC,EAAKC,oBAAWA,EAAGC,qBDgU3CC,EAAaR,EAAc1E,OAAO4E,GAAUO,OAElDtF,EAAMlH,SAAQ,SAAC4K,GACbA,EAAKjM,QAAQ8B,MAAMgM,mBAAqB9C,EAAQ,KAChDiB,EAAKjM,QAAQ8B,MAAMiM,yBAA2B9C,EAC9CgB,EAAKjM,QAAQ8B,MAAMkM,mBAAqBJ,8BAI5C,6BACSrJ,MAAMC,KAAK1I,KAAKkE,QAAQiO,UAC5BtD,QAAO,SAAChN,UAAON,EAAQM,EAAIkE,EAAKsC,QAAQ+J,iBACxCvF,KAAI,SAAChL,UAAO,IAAIoC,EAAYpC,EAAIkE,EAAKsC,QAAQlE,wCAQlD,SAAesI,OACP0F,EAAW1J,MAAMC,KAAK1I,KAAKkE,QAAQiO,iBAClChK,EAAOnI,KAAKyM,MAAMG,OAAOH,GAAQ,CACtCzE,YAAG9D,UACMiO,EAASE,QAAQnO,uCAK9B,kBACSlE,KAAKyM,MAAMoC,QAAO,SAACsB,UAASA,EAAK/L,+CAG1C,kBACSpE,KAAKyM,MAAMoC,QAAO,SAACsB,UAAUA,EAAK/L,2CAU3C,SAAegH,EAAgBkH,OACzBC,SAwBS,KApBXA,EADsC,mBAA7BvS,KAAKqI,QAAQ+B,YACfpK,KAAKqI,QAAQ+B,YAAYgB,GAGvBpL,KAAKqI,QAAQ4F,MACfjB,EAAQ0B,QAAQ1O,KAAKqI,QAAQ4F,OAAOtK,MAGlC3D,KAAKqI,QAAQ+B,YACfpK,KAAKqI,QAAQ+B,YAGXpK,KAAKyM,MAAMxL,OAAS,EACtB+L,EAAQ0B,QAAQ1O,KAAKyM,MAAM,GAAGvI,SAAS,GAAMP,MAI7CyH,KAKPmH,EAAOnH,GAGFmH,EAAOD,gCAShB,SAAelH,SAE2B,mBAA7BpL,KAAKqI,QAAQmK,YACfxS,KAAKqI,QAAQmK,YAAYpH,GACvBpL,KAAKqI,QAAQ4F,MACf9G,EAAenH,KAAKqI,QAAQ4F,MAAO,cAEnCjO,KAAKqI,QAAQmK,uCAWxB,eAAYpH,yDAAiB4B,EAAQ0B,QAAQ1O,KAAKkE,SAASP,MACnD8O,EAASzS,KAAK0S,eAAetH,GAC7BhB,EAAcpK,KAAK2S,eAAevH,EAAgBqH,GACpDG,GAAqBxH,EAAiBqH,GAAUrI,EAGhDtB,KAAK0B,IAAI1B,KAAK2B,MAAMmI,GAAqBA,GACvC5S,KAAKqI,QAAQwK,kBAEjBD,EAAoB9J,KAAK2B,MAAMmI,SAG5BE,KAAOhK,KAAKmB,IAAInB,KAAKC,MAAM6J,GAAqB,GAAI,QACpDxH,eAAiBA,OACjB2H,SAAW3I,mCAMlB,gBACOlG,QAAQ8B,MAAMpC,OAAS5D,KAAKgT,oBAAsB,sCAQzD,kBACShJ,EAAShK,KAAK6K,4CAQvB,SAAkBoI,UACTnK,KAAK4B,IAAIuI,EAAQjT,KAAKqI,QAAQ6K,cAAelT,KAAKqI,QAAQ8K,2CAQnE,SAAUvT,OAAMe,yDAAO,GACjBX,KAAKwN,cAIT7M,EAAKyS,QAAUpT,UACVU,KAAKd,EAAMe,8BAOlB,eACMI,EAAIf,KAAK8S,cACRjI,UAAY,GACV9J,GACLA,GAAK,OACA8J,UAAU5K,KAAK,0BASxB,SAAQwM,cACA4G,EAAgBrT,KAAKsT,kBAAkB7G,GAEzCjD,EAAQ,EACZiD,EAAMlH,SAAQ,SAAC4K,EAAMpP,YACVlB,IACPsQ,EAAKtL,SAASZ,EAAYa,IAAIf,QAAQyC,UAKpCxD,EAAMuQ,OAAOpD,EAAK9K,MAAOgO,EAActS,MAAQoP,EAAK9L,gBACtD8L,EAAKtL,SAASZ,EAAYa,IAAIf,QAAQuC,aACtCzG,IAIFsQ,EAAK9K,MAAQgO,EAActS,GAC3BoP,EAAKhL,MAAQlB,EAAYmB,MAAMrB,QAC/BoM,EAAK9L,UAAW,MAIV+C,EAASoM,EAAKC,uBAAuBtD,EAAMlM,EAAYa,IAAIf,QAAQuC,QACzEc,EAAOX,gBAAkB+M,EAAKE,kBAAkBlK,GAAS,KAEzDgK,EAAK5F,OAAO3N,KAAK,CACfkQ,KAAAA,EACA/I,OAAAA,EACAvH,SAAAA,IAGF2J,GAAS,sCAWb,SAAkBiD,iBAGZzM,KAAKqI,QAAQsL,WAAY,KACrBC,EAAYnH,EAAMI,KAAI,SAACsD,EAAMpP,OAC3B8S,EAAW7G,EAAQ0B,QAAQyB,EAAKjM,SAAS,GACzCmB,EAAQyO,EAAKC,iBAAiBF,UAC7B,IAAIxQ,EAAKgC,EAAMpC,EAAGoC,EAAMnC,EAAG2Q,EAASlQ,MAAOkQ,EAASjQ,OAAQ7C,aAG9Df,KAAKgU,wBAAwBJ,EAAW5T,KAAKoL,uBAK/CqB,EAAMI,KAAI,SAACsD,UAAS2D,EAAKC,iBAAiB/G,EAAQ0B,QAAQyB,EAAKjM,SAAS,uCASjF,SAAiB2P,UFldZ,oBACLA,IAAAA,SAAUhJ,IAAAA,UAAWoJ,IAAAA,SAAUC,IAAAA,MAAO5J,IAAAA,UAAWU,IAAAA,OAE3CmJ,EAAOjK,EAAc2J,EAASlQ,MAAOsQ,EAAUC,EAAO5J,GACtD8J,EAAOxJ,EAAsBC,EAAWsJ,EAAMD,GAC9CG,EAAmBtJ,EAAeqJ,EAAMpJ,GAGxC3F,EAAQ,IAAIrC,EAAMiR,EAAWI,EAAkBD,EAAKC,IAKpDC,EAAYF,EAAKC,GAAoBR,EAASjQ,OAC3C7C,EAAI,EAAGA,EAAIoT,EAAMpT,IACxB8J,EAAUwJ,EAAmBtT,GAAKuT,SAG7BjP,EEicEkP,CAAgB,CACrBV,SAAAA,EACAhJ,UAAW7K,KAAK6K,UAChBoJ,SAAUjU,KAAK+S,SACfmB,MAAOlU,KAAK8S,KACZxI,UAAWtK,KAAKqI,QAAQwK,gBACxB7H,OAAQhL,KAAKqI,QAAQ2C,gDAWzB,SAAwBG,EAAWC,UAC1BF,EAAqBC,EAAWC,0BAQzC,sBAAQyE,yDAAa7P,KAAKwU,qBACpBhL,EAAQ,EACZqG,EAAWtK,SAAQ,SAAC4K,YACTtQ,IACPsQ,EAAKtL,SAASZ,EAAYa,IAAId,OAAOwC,UASnC2J,EAAK9L,gBACP8L,EAAKtL,SAASZ,EAAYa,IAAId,OAAOsC,aACrCzG,IAIFsQ,EAAKhL,MAAQlB,EAAYmB,MAAMpB,OAC/BmM,EAAK9L,UAAW,MAEV+C,EAASqN,EAAKhB,uBAAuBtD,EAAMlM,EAAYa,IAAId,OAAOsC,QACxEc,EAAOX,gBAAkBgO,EAAKf,kBAAkBlK,GAAS,KAEzDiL,EAAK7G,OAAO3N,KAAK,CACfkQ,KAAAA,EACA/I,OAAAA,EACAvH,SAAAA,IAGF2J,GAAS,kCAQb,WAEOxJ,KAAKuN,YAAavN,KAAKwN,kBAIvBkH,+CAWP,SAAuBvE,EAAMwE,OAGrBvN,EAASxB,OAAO2C,OAAO,GAAIoM,MAE7B3U,KAAKqI,QAAQkJ,cAAe,KACxBqD,EAAO5U,KAAKqI,QAAQlE,MAAQ,IAAM,GAClClB,EAAIjD,KAAKqI,QAAQwM,gBAAkB/L,KAAK2B,MAAM0F,EAAK9K,MAAMpC,GAAKkN,EAAK9K,MAAMpC,EACzEC,EAAIlD,KAAKqI,QAAQwM,gBAAkB/L,KAAK2B,MAAM0F,EAAK9K,MAAMnC,GAAKiN,EAAK9K,MAAMnC,EAC/EkE,EAAO0N,8BAAyBF,UAAO3R,iBAAQC,uBAAciN,EAAKhL,gBAE9DnF,KAAKqI,QAAQlE,MACfiD,EAAOf,MAAQ8J,EAAK9K,MAAMpC,EAAI,KAE9BmE,EAAO3D,KAAO0M,EAAK9K,MAAMpC,EAAI,KAE/BmE,EAAO1D,IAAMyM,EAAK9K,MAAMnC,EAAI,YAGvBkE,qCAUT,SAAoBlD,EAAS6Q,EAAcC,OACnCxR,EAAKmG,EAAgBzF,GAAS,SAAC0F,GACnCmL,IACAC,EAAK,KAAMpL,WAGR8D,aAAazN,KAAKuD,yCASzB,SAAuB8E,qBACd,SAAC0M,GACN1M,EAAK6H,KAAKtL,SAASyD,EAAKlB,QACxB6N,EAAKC,oBAAoB5M,EAAK6H,KAAKjM,QAASoE,EAAKzI,SAAUmV,iCAS/D,WACMhV,KAAK2N,sBACFwH,sBAGDC,EAAWpV,KAAKqI,QAAQ6G,MAAQ,EAChCmG,EAAWrV,KAAK4N,OAAO3M,OAAS,EAElCoU,GAAYD,GAAYpV,KAAKyN,mBAC1B6H,kBAAkBtV,KAAK4N,QACnByH,QACJE,kBAAkBvV,KAAK4N,aACvB4H,UAAUxI,EAAQyI,UAAUC,cAM5BF,UAAUxI,EAAQyI,UAAUC,aAI9B9H,OAAO3M,OAAS,mCAOvB,SAAkBqI,mBAEXqE,iBAAkB,EbluBV,SAAkBgI,EAAKC,EAAS/V,GAC1CA,IACoB,mBAAZ+V,GACT/V,EAAW+V,EACXA,EAAU,MAEV/V,EAAW+C,GAIf,IAAIiT,EAAUF,GAAOA,EAAI1U,OACzB,IAAK4U,EAAS,OAAOhW,EAAS,KAAM,IAEpC,IAAIiW,GAAW,EACXC,EAAU,IAAItN,MAAMoN,GAQxB,SAASG,EAAUjV,GACjB,OAAO,SAAUkV,EAAKC,GACpB,IAAIJ,EAAJ,CAEA,GAAIG,EAGF,OAFApW,EAASoW,EAAKF,QACdD,GAAW,GAIbC,EAAQhV,GAAKmV,IAENL,GAAShW,EAAS,KAAMkW,KAlBnCJ,EAAIpQ,QAAQqQ,EAAU,SAAU1V,EAAIa,GAClCb,EAAGW,KAAK+U,EAASI,EAAUjV,KACzB,SAAUb,EAAIa,GAChBb,EAAG8V,EAAUjV,MaotBboV,CAFkB7M,EAAYuD,KAAI,SAAClH,UAAQyQ,EAAKC,uBAAuB1Q,MAEnD3F,KAAKsW,kBAAkB/H,KAAKvO,sCAGlD,gBAEO0N,aAAanI,QAAQkE,QAGrBiE,aAAazM,OAAS,OAGtB0M,iBAAkB,mCAQzB,SAAkB4I,MACZA,EAAQtV,OAAQ,KACZuV,EAAWD,EAAQ1J,KAAI,SAAClH,UAAQA,EAAIwK,KAAKjM,WAE/C8I,EAAQyJ,iBAAiBD,GAAU,WACjCD,EAAQhR,SAAQ,SAACI,GACfA,EAAIwK,KAAKtL,SAASc,EAAIyB,QACtBzB,EAAI9F,mDAMZ,gBACO6N,aAAazM,OAAS,OACtB0M,iBAAkB,OAClB6H,UAAUxI,EAAQyI,UAAUC,8BASnC,SAAO9F,EAAU8G,GACV1W,KAAKuN,cAILqC,GAAaA,GAAgC,IAApBA,EAAS3O,UACrC2O,EAAW5C,EAAQK,gBAGhBsJ,QAAQ/G,QAGRgH,eAGAC,wBAGA3N,KAAKwN,wBAOZ,eAAKA,yDAAc1W,KAAKmN,YACjBnN,KAAKuN,gBAILuJ,iBAECrK,EAAQtE,EAAOnI,KAAKqR,oBAAqBqF,QAE1CK,QAAQtK,QAIRuK,qBAGAC,yBAEA9J,SAAWuJ,yBAOlB,eAAOQ,0DACDlX,KAAKuN,YACF2J,QAEEtI,mBAIF1F,8BAST,gBACOwL,QAAO,sBAQd,SAAIyC,cACI1K,EAAQK,EAAYqK,GAAUtK,KAAI,SAAChL,UAAO,IAAIoC,EAAYpC,EAAIuV,EAAK/O,QAAQlE,eAG5E+J,WAAWzB,QAGXqK,iBAGCO,EAAclP,EADHnI,KAAKsX,eAAe7K,GACAzM,KAAKmN,UACpCoK,EAAoBvX,KAAK2W,QAAQ3W,KAAKsN,WAAY+J,GAElDG,EAAY,SAACrH,UAAS1D,EAAMC,SAASyD,IACrCsH,EAAmB,SAACtH,GACxBA,EAAKhL,MAAQlB,EAAYmB,MAAMpB,OAC/BmM,EAAK9L,UAAW,EAChB8L,EAAKtL,SAASZ,EAAYa,IAAId,OAAOsC,QACrC6J,EAAKtL,SAASZ,EAAYa,IAAId,OAAOwC,QAKjC6M,EAAgBrT,KAAKsT,kBAAkBiE,EAAkBtH,SAC/DsH,EAAkBtH,QAAQ1K,SAAQ,SAAC4K,EAAMpP,GACnCyW,EAAUrH,KACZA,EAAK9K,MAAQgO,EAActS,GAC3B0W,EAAiBtH,GACjBA,EAAKtL,SAASuS,EAAK3D,uBAAuBtD,EAAM,SAIpDoH,EAAkBrH,OAAO3K,SAAQ,SAAC4K,GAC5BqH,EAAUrH,IACZsH,EAAiBtH,WAKhBjM,QAAQ6K,iBAGRC,mBAAmBvC,QAGnBA,MAAQzM,KAAKsX,eAAe7K,QAG5BoC,OAAO7O,KAAKsN,mCAMnB,gBACOC,WAAY,wBAOnB,eAAOmK,kEACAnK,WAAY,EACbmK,QACGhD,+BAUT,SAAO8B,iBACAA,EAASvV,YAIR4O,EAAa/C,EAAY0J,GAEzBmB,EAAW9H,EACdhD,KAAI,SAAC3I,UAAY0T,EAAKC,iBAAiB3T,MACvC2K,QAAO,SAACsB,WAAWA,UAcjBH,qBAAqB,CACxBC,QAAS,GACTC,OAAQyH,SAGLf,QAAQe,QAERzO,YAIAuD,MAAQzM,KAAKyM,MAAMoC,QAAO,SAACsB,UAAUwH,EAASjL,SAASyD,WACvD0G,wBAEA1W,KAAK6M,EAAQyI,UAAUC,QA1BP,WACnBkC,EAAKE,cAAcH,GAGnB9H,EAAWtK,SAAQ,SAACrB,GAClBA,EAAQjC,WAAWiF,YAAYhD,MAGjC0T,EAAKpC,UAAUxI,EAAQyI,UAAUsC,QAAS,CAAElI,WAAAA,wCA0BhD,SAAiB3L,UACRlE,KAAKyM,MAAMuL,MAAK,SAAC7H,UAASA,EAAKjM,UAAYA,+BAOpD,2BAEO4T,cAAc9X,KAAKyM,YACnBgB,eAAgB,OAGhBhB,MAAQzM,KAAKgO,iBAGbE,WAAWlO,KAAKyM,YAEhBtM,KAAK6M,EAAQyI,UAAUC,QAAQ,WAElCuC,EAAKjJ,mBAAmBiJ,EAAKxL,OAC7BwL,EAAKxK,eAAgB,UAIlBoB,OAAO7O,KAAKsN,mCAMnB,gBACO6H,kBACLnO,OAAO0C,oBAAoB,SAAU1J,KAAKmO,gBAGrCjK,QAAQI,UAAUC,OAAO,gBACzBL,QAAQQ,gBAAgB,cAGxBoT,cAAc9X,KAAKyM,YAEnBA,MAAMxL,OAAS,OACfyM,aAAazM,OAAS,OAGtBoH,QAAQ4F,MAAQ,UAChB/J,QAAU,UAIVsJ,aAAc,OACdD,WAAY,2BAyBnB,SAAerJ,OAASgU,0DAEhB9Q,EAASJ,OAAOC,iBAAiB/C,EAAS,MAC5CP,EAAQwD,EAAejD,EAAS,QAASkD,GACzCxD,EAASuD,EAAejD,EAAS,SAAUkD,MAE3C8Q,EAAgB,KACZC,EAAahR,EAAejD,EAAS,aAAckD,GACnDgR,EAAcjR,EAAejD,EAAS,cAAekD,GACrDiR,EAAYlR,EAAejD,EAAS,YAAakD,GACjDkR,EAAenR,EAAejD,EAAS,eAAgBkD,GAC7DzD,GAASwU,EAAaC,EACtBxU,GAAUyU,EAAYC,QAGjB,CACL3U,MAAAA,EACAC,OAAAA,mCAWJ,SAAwB4S,EAAU3W,OAI1Bc,EAAO6V,EAAS3J,KAAI,SAAC3I,OACjB8B,EAAU9B,EAAV8B,MACFuS,EAAWvS,EAAMgM,mBACjBwG,EAAQxS,EAAMS,uBAGpBT,EAAMgM,mBATK,MAUXhM,EAAMS,gBAVK,MAYJ,CACL8R,SAAAA,EACAC,MAAAA,MAIJ3Y,IAGA2W,EAAS,GAAGzH,YAGZyH,EAASjR,SAAQ,SAACrB,EAASnD,GACzBmD,EAAQ8B,MAAMgM,mBAAqBrR,EAAKI,GAAGwX,SAC3CrU,EAAQ8B,MAAMS,gBAAkB9F,EAAKI,GAAGyX,gBA/jCxBC,UAokCtBzL,EAAQ/I,YAAcA,EAEtB+I,EAAQK,UAAY,MACpBL,EAAQuD,qBAAuB,SAG/BvD,EAAQyI,UAAY,CAClBC,OAAQ,iBACRqC,QAAS,mBAIX/K,EAAQxI,QAAUA,EAGlBwI,EAAQ8D,WAAa,CACnBC,IAAK,MACL2H,IAAK,OAIP1L,EAAQ3E,QAAU,CAEhB+E,MAAOJ,EAAQK,UAGf6B,MAAO,IAGPC,OAAQ,iCAGRiD,aAAc,IAIdnE,MAAO,KAIPuE,YAAa,EAIbpI,YAAa,EAIb8C,UAAW,KAIXlC,OAAQ,EAIR6H,gBAAiB,IAIjB/D,YAAa,KAIbQ,SAAAA,EAGAC,aAAc,IAGd2D,cAAe,GAGfC,iBAAkB,IAGlB5B,eAAe,EAKfV,WAAY7D,EAAQ8D,WAAWC,IAG/B4C,YAAY,EAGZxP,OAAO,EAIP0Q,iBAAiB,GAGnB7H,EAAQhK,MAAQA,EAChBgK,EAAQ3J,KAAOA,EAGf2J,EAAQ2L,SAAWxQ,EACnB6E,EAAQ4L,gBAAkB1O,EAC1B8C,EAAQ6L,wBAA0BjO,EAClCoC,EAAQ8L,iBAAmB/N,EAC3BiC,EAAQ+L,uBAAyB7N"} \ No newline at end of file +{"version":3,"file":"shuffle.min.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/layout.js","../src/array-min.js","../src/shuffle.js","../src/hyphenate.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","import getNumber from './get-number';\n\nlet value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n const { width } = window.getComputedStyle(e, null);\n // Fix for issue #314\n value = Math.round(getNumber(width)) === 10;\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n this.sortedItems = this.items;\n\n this.options.sizer = this._getElementOption(this.options.sizer);\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(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\n this.sortedItems = items;\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n"],"names":["E","prototype","on","name","callback","ctx","e","this","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","proto","Element","vendor","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","el","selector","nodeType","nodes","parentNode","querySelectorAll","throttleit","func","wait","args","rtn","timeoutID","last","delta","Date","setTimeout","noop","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","_this","_this2","obj","Object","keys","key","_this3","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","createElement","cssText","appendChild","window","getComputedStyle","Math","round","removeChild","getNumberStyle","styles","testComputedSize","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","defaults","reverse","by","compare","randomize","sorter","arr","options","opts","assign","original","Array","from","revert","array","n","floor","random","temp","sort","valA","valB","undefined","transitions","eventName","count","cancelTransitionEnd","removeEventListener","onTransitionEnd","evt","currentTarget","target","addEventListener","arrayMax","max","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","min","ceil","getAvailablePositions","positions","available","getShortColumn","buffer","minPosition","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","intersectingRect","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","rowIndex","findIndex","items","includes","splice","concat","map","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","TypeError","_init","_getItems","sortedItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","replace","str","m1","toLowerCase","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","shuffle","itemPositions","_getNextPositions","equals","_this4","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","itemSize","_this5","_getItemPosition","getTransformedPositions","gridSize","total","span","setY","shortColumnIndex","setHeight","getItemPosition","_getConcealedItems","_this6","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_this7","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","fns","context","pending","finished","results","maybeDone","err","result","parallel","_this8","_getTransitionFunction","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","_this9","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","_this10","getItemByElement","_disposeItems","REMOVED","find","_this11","includeMargins","marginLeft","marginRight","marginTop","marginBottom","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file diff --git a/docs/_includes/changelog.html b/docs/_includes/changelog.html index 1e0d1ee..13c15ab 100644 --- a/docs/_includes/changelog.html +++ b/docs/_includes/changelog.html @@ -1,42 +1,100 @@

Changelog

-

For a more detailed changelog, visit the latest releases on GitHub.

+

+ For a more detailed changelog, visit the latest releases on + GitHub. +

    +
  • + v5.4.0 2021-05-29 - Add sortedItems property. Fix getComputedStyle bug for + Chrome on Windows. +
  • v5.3.0 2021-03-23 - Add isRTL option.
  • -
  • v5.2.3 2019-08-29 - Add missing inherited methods from TinyEmitter to TypeScript definitions.
  • +
  • + v5.2.3 2019-08-29 - Add missing inherited methods from TinyEmitter to TypeScript + definitions. +
  • v5.2.2 2019-06-03 - Update TypeScript definitions.
  • -
  • v5.2.1 2018-12-01 - Change `index.d.ts` to use `export default Shuffle` (#214). Upgrade dev dependencies.
  • -
  • v5.2.0 2018-08-19 - Lazily test whether the browser's getComputedStyle includes padding. This allows the bundled file to be imported in node for server side rendering.
  • -
  • v5.1.2 2018-03-26 - Fix misspelled delimiter option. Both "delimiter" and "delimeter" will continue to work for v5.
  • +
  • + v5.2.1 2018-12-01 - Change `index.d.ts` to use `export default Shuffle` (#214). Upgrade dev dependencies. +
  • +
  • + v5.2.0 2018-08-19 - Lazily test whether the browser's getComputedStyle includes padding. + This allows the bundled file to be imported in node for server side rendering. +
  • +
  • + v5.1.2 2018-03-26 - Fix misspelled delimiter option. Both "delimiter" and "delimeter" will + continue to work for v5. +
  • v5.1.1 2018-03-02 - Fix new item animation when there is an active filter.
  • -
  • v5.1.0 2018-02-20 - Add compare option to sorter. Add es build to package and "module" field to package.json.
  • +
  • + v5.1.0 2018-02-20 - Add compare option to sorter. Add es build to package and + "module" field to package.json. +
  • v5.0.3 2017-10-30 - Fix rounding error.
  • v5.0.2 2017-09-23 - Update type definitions. Upgrade dev dependencies.
  • v5.0.1 2017-07-18 - Add roundTransforms option.
  • -
  • v5.0.0 2017-07-18 - Change global export from shuffle to Shuffle. Remove bower support. Expect ES6 environment. Make Shuffle instances Event Emitters instead of dispatching CustomEvent.
  • -
  • v4.2.0 2017-05-10 - Replace webpack build with rollup. Replace jshint and jscs with eslint. Add filterMode option.
  • -
  • v4.1.1 2017-03-21 - the before styles for a ShuffleItem were not applied if the item didn’t move.
  • +
  • + v5.0.0 2017-07-18 - Change global export from shuffle to Shuffle. Remove + bower support. Expect ES6 environment. Make Shuffle instances Event Emitters instead of dispatching + CustomEvent. +
  • +
  • + v4.2.0 2017-05-10 - Replace webpack build with rollup. Replace + jshint and jscs with eslint. Add filterMode option. +
  • +
  • + v4.1.1 2017-03-21 - the before styles for a ShuffleItem were not applied if + the item didn’t move. +
  • v4.1.0 2017-01-30 - Use webpack-2 to bundle Shuffle.
  • v4.0.2 2016-09-15 - Update custom-event-polyfill dependency.
  • v4.0.1 2016-07-30 - Fix delimiter option.
  • -
  • v4.0.0 2016-04-20 - Rewrite in ES6 with babel. Remove jQuery and Modernizr dependencies. Remove support for IE<11. Docs improvements. Switch to gulp build system with webpack.
  • -
  • v3.1.0 2015-03-23 - Allow zero speed option (#64) and cancel previous animations instead of ignoring new ones (#69). Handle non-integer columns better (#46)
  • +
  • + v4.0.0 2016-04-20 - Rewrite in ES6 with babel. Remove jQuery and Modernizr dependencies. Remove support + for IE<11. Docs improvements. Switch to gulp build system with webpack. +
  • +
  • + v3.1.0 2015-03-23 - Allow zero speed option (#64) and cancel previous animations instead of ignoring new ones (#69). Handle non-integer columns better (#46) +
  • v3.0.4 2015-02-16 - Publish to NPM.
  • v3.0.2 2015-01-21 - Remove from jQuery plugins directory.
  • v3.0.1 2014-12-29 - Add CommonJS support.
  • -
  • v3.0.0 2014-10-06 - Refactored with improvements, added unit tests, more documentation. Removed some triggered events.
  • -
  • v2.1.2 2014-06-01 - Use window.jQuery instead of window.$ to work better with noConflict. Fixed #25.
  • +
  • + v3.0.0 2014-10-06 - Refactored with improvements, added unit tests, more documentation. Removed some + triggered events. +
  • +
  • + v2.1.2 2014-06-01 - Use window.jQuery instead of window.$ to work better with + noConflict. Fixed #25. +
  • v2.1.1 2014-04-16 - Fix items with zero opacity overlapping visible ones in IE<10.
  • v2.1.0 2014-04-12 - Register with bower as shufflejs.
  • 2014-04-10 - Add AMD support.
  • 2014-04-08 - Separate Modernizr into its own file and custom Shuffle build.
  • 2014-03-08 - Add Bootstrap 3 demo. Fixed issue with percentage width items.
  • -
  • 2013-10-04 - Moved some Shuffle instance properties to constants. Converted from 4 to 2 space indentation. Added events enum and pulled out some strings to constants.
  • +
  • + 2013-10-04 - Moved some Shuffle instance properties to constants. Converted from 4 to 2 space indentation. Added + events enum and pulled out some strings to constants. +
  • 2013-08-30 - Added animate-in demo.
  • v2.0.0 2013-07-05 - Shuffle 2.0 with masonry, adding and removing, and more.
  • -
  • 2012-11-03 - Replaced layout system with masonry. Items can now be different sizes! Added addtional examples.
  • +
  • + 2012-11-03 - Replaced layout system with masonry. Items can now be + different sizes! Added addtional examples. +
  • 2012-10-24 - Better handling of grid item dimensions. Added a minimal markup page.
  • 2012-09-20 - Added destroy method
  • 2012-09-18 - Added sorting ability and made plugin responsive. Updated to Modernizr 2.6.2
  • -
  • 2012-07-21 - Rewrote plugin in more object oriented structure. Added custom events. Updated to Modernizr 2.6.1
  • +
  • + 2012-07-21 - Rewrote plugin in more object oriented structure. Added custom events. Updated to Modernizr 2.6.1 +
  • 2012-07-03 - Removed dependency on the css file and now apply the css with javascript
diff --git a/docs/css/shuffle-styles.css b/docs/css/shuffle-styles.css index 80d8367..584772c 100644 --- a/docs/css/shuffle-styles.css +++ b/docs/css/shuffle-styles.css @@ -1 +1 @@ -.picture-item{height:220px;margin-top:24px;margin-left:0}.picture-item img{display:block;width:100%}@supports ((-o-object-fit: cover) or (object-fit: cover)){.picture-item img{max-width:none;height:100%;-o-object-fit:cover;object-fit:cover}}.picture-item--h2{height:464px}.picture-item__inner{position:relative;height:100%;overflow:hidden;background:#ecf0f1}img.picture-item__blur{display:none}.picture-item__details{display:flex;align-items:baseline;justify-content:space-between;width:100%;padding:1em}.picture-item__description{width:100%;padding:0 2em 1em 1em;margin:0}.picture-item__title{flex-shrink:0;margin-right:4px}.picture-item__tags{flex-shrink:1;text-align:right;margin:0}@media screen and (min-width:768px){.picture-item--overlay .picture-item__details{position:absolute;bottom:0;left:0;width:100%;background-color:rgba(0,0,0,.6);color:#fff;overflow:hidden}.picture-item--overlay .picture-item__description{display:none}@supports (filter:blur(1px)) and ((-webkit-clip-path: inset(0 0 0 0)) or (clip-path: inset(0 0 0 0))){.picture-item--overlay .picture-item__blur{position:absolute;z-index:1;top:0;left:0;display:block;filter:blur(7px);-webkit-clip-path:inset(170px 0 0 0);clip-path:inset(170px 0 0 0)}.picture-item--overlay .picture-item__details{background:none}.picture-item--overlay .picture-item__tags,.picture-item--overlay .picture-item__title{position:relative;z-index:2}}}.my-shuffle-container{position:relative;overflow:hidden}.my-sizer-element{position:absolute;opacity:0;visibility:hidden}.shuffle--animatein{overflow:visible}.shuffle--animatein .picture-item__inner{opacity:0;transform:translateY(220px)}.shuffle--animatein .picture-item__inner--transition{transition:all .6s ease}.shuffle--animatein .picture-item.in .picture-item__inner{opacity:1;transform:translate(0)}@media screen and (max-width:767px){.picture-item{height:auto;margin-top:20px}.picture-item__description,.picture-item__details{font-size:.875em;padding:.625em}.picture-item__description{padding-right:.875em;padding-bottom:1.25em}.picture-item--h2{height:auto}} \ No newline at end of file +.picture-item{height:220px;margin-left:0;margin-top:24px}.picture-item img{display:block;width:100%}@supports ((-o-object-fit:cover) or (object-fit:cover)){.picture-item img{height:100%;max-width:none;-o-object-fit:cover;object-fit:cover}}.picture-item--h2{height:464px}.picture-item__inner{background:#ecf0f1;height:100%;overflow:hidden;position:relative}img.picture-item__blur{display:none}.picture-item__details{align-items:baseline;display:flex;justify-content:space-between;padding:1em;width:100%}.picture-item__description{margin:0;padding:0 2em 1em 1em;width:100%}.picture-item__title{flex-shrink:0;margin-right:4px}.picture-item__tags{flex-shrink:1;margin:0;text-align:right}@media screen and (min-width:768px){.picture-item--overlay .picture-item__details{background-color:rgba(0,0,0,.6);bottom:0;color:#fff;left:0;overflow:hidden;position:absolute;width:100%}.picture-item--overlay .picture-item__description{display:none}@supports (filter:blur(1px)) and ((-webkit-clip-path:inset(0 0 0 0)) or (clip-path:inset(0 0 0 0))){.picture-item--overlay .picture-item__blur{-webkit-clip-path:inset(170px 0 0 0);clip-path:inset(170px 0 0 0);display:block;filter:blur(7px);left:0;position:absolute;top:0;z-index:1}.picture-item--overlay .picture-item__details{background:none}.picture-item--overlay .picture-item__tags,.picture-item--overlay .picture-item__title{position:relative;z-index:2}}}.my-shuffle-container{overflow:hidden;position:relative}.my-sizer-element{opacity:0;position:absolute;visibility:hidden}.shuffle--animatein{overflow:visible}.shuffle--animatein .picture-item__inner{opacity:0;transform:translateY(220px)}.shuffle--animatein .picture-item__inner--transition{transition:all .6s ease}.shuffle--animatein .picture-item.in .picture-item__inner{opacity:1;transform:translate(0)}@media screen and (max-width:767px){.picture-item{height:auto;margin-top:20px}.picture-item__description,.picture-item__details{font-size:.875em;padding:.625em}.picture-item__description{padding-bottom:1.25em;padding-right:.875em}.picture-item--h2{height:auto}} \ No newline at end of file diff --git a/docs/css/style.css b/docs/css/style.css index b85c239..8df957b 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -1 +1 @@ -@charset "UTF-8";*,:after,:before{box-sizing:border-box}main{overflow:hidden}pre.max-height{max-height:30em}img,picture{display:block}img{max-width:100%;height:auto}figure,ul ul{margin:0}ul ul{padding-left:1.25em;list-style-type:circle}li{line-height:1.4}li+li{margin-top:4px}nav>a{display:block;margin:5px 0}#demos{margin-top:1em}body{font-family:Open Sans,Helvetica Neue,Helvetica,sans-serif;color:#5d6d77}a{text-decoration:none}a,a:visited{color:#3498db}a:hover{text-decoration:underline}a:active{color:#2ecc71}h1,h2,h3,h4,h5,h6{color:#34495e;font-weight:700}h1{font-size:10vw;font-weight:400;line-height:1}h1,h2{margin:3vw 0}h2{position:relative;font-size:7vw}h3{font-size:6vw;margin:2vw 0}h4{font-size:1.25em}p{margin:1em 0;line-height:1.4}.intro-text{margin:.7em 0;font-size:1.125em}@media screen and (min-width:768px){h1{margin:.5em 0 .25em;font-size:3.5em}h2{margin:.45em 0;font-size:2.5em}h3{margin:.8em 0 .5em;font-size:1.5em}h1>a,h2>a,h3>a{display:none}h1:hover>a,h2:hover>a,h3:hover>a{position:absolute;display:inline-block;top:0;height:50px;width:50px;background:url(../img/link.svg) no-repeat;overflow:hidden;text-indent:-999em}.intro-text{font-size:1.25em}}.unstyled{list-style-type:none;padding:0;margin:0}.type--underline{text-decoration:underline}code:not([class*=language]){padding:.2em 0;margin:0;font-size:85%;color:#2c3e50;background-color:rgba(27,31,35,.05);border-radius:3px;font-family:Menlo,Consolas,Liberation Mono,Courier,monospace}code:not([class*=language]):after,code:not([class*=language]):before{content:"\00a0";letter-spacing:-.2em}.container{padding-left:3.5%;padding-right:3.5%}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.row{margin-left:auto;margin-right:auto}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.row .row{margin-left:-8px;margin-right:-8px}.row--centered{display:flex;flex-wrap:wrap;justify-content:center}.aspect{position:relative;width:100%;height:0;overflow:hidden;padding-bottom:100%}.aspect--16x9{padding-bottom:56.25%}.aspect--9x16{padding-bottom:177.77778%}.aspect--4x3{padding-bottom:75%}.aspect--3x4{padding-bottom:133.33333%}.aspect--3x2{padding-bottom:66.66667%}.aspect--3x1{padding-bottom:33.33333%}.aspect--2x3{padding-bottom:150%}.aspect--2x1{padding-bottom:50%}.aspect--1x2{padding-bottom:200%}.aspect--1x1{padding-bottom:100%}.aspect--none{height:auto;padding-bottom:0;overflow:visible}.aspect--none>.aspect__inner{position:static}.aspect>div,.aspect__inner{position:absolute;top:0;left:0;right:0;bottom:0}.col-1\@lg,.col-1\@md,.col-1\@sm,.col-1\@xs,.col-2\@lg,.col-2\@md,.col-2\@sm,.col-2\@xs,.col-3\@lg,.col-3\@md,.col-3\@sm,.col-3\@xs,.col-4\@lg,.col-4\@md,.col-4\@sm,.col-4\@xs,.col-5\@lg,.col-5\@md,.col-5\@sm,.col-5\@xs,.col-6\@lg,.col-6\@md,.col-6\@sm,.col-6\@xs,.col-7\@lg,.col-7\@md,.col-7\@sm,.col-7\@xs,.col-8\@lg,.col-8\@md,.col-8\@sm,.col-8\@xs,.col-9\@lg,.col-9\@md,.col-9\@sm,.col-9\@xs,.col-10\@lg,.col-10\@md,.col-10\@sm,.col-10\@xs,.col-11\@lg,.col-11\@md,.col-11\@sm,.col-11\@xs,.col-12\@lg,.col-12\@md,.col-12\@sm,.col-12\@xs{position:relative;box-sizing:border-box;min-height:1px;padding-left:8px;padding-right:8px}.col-1\@xs,.col-2\@xs,.col-3\@xs,.col-4\@xs,.col-5\@xs,.col-6\@xs,.col-7\@xs,.col-8\@xs,.col-9\@xs,.col-10\@xs,.col-11\@xs,.col-12\@xs{float:left}.aspect--16x9\@xs{padding-bottom:56.25%}.aspect--9x16\@xs{padding-bottom:177.77778%}.aspect--4x3\@xs{padding-bottom:75%}.aspect--3x4\@xs{padding-bottom:133.33333%}.aspect--3x2\@xs{padding-bottom:66.66667%}.aspect--3x1\@xs{padding-bottom:33.33333%}.aspect--2x3\@xs{padding-bottom:150%}.aspect--2x1\@xs{padding-bottom:50%}.aspect--1x2\@xs{padding-bottom:200%}.aspect--1x1\@xs{padding-bottom:100%}.aspect--none\@xs{height:auto;padding-bottom:0;overflow:visible}.aspect--none\@xs>.aspect__inner{position:static}.col-1\@xs{width:16.66667%}.col-2\@xs{width:33.33333%}.col-3\@xs{width:50%}.col-4\@xs{width:66.66667%}.col-5\@xs{width:83.33333%}.col-6\@xs{width:100%}.col-pull-0\@xs{right:auto}.col-pull-1\@xs{right:16.66667%}.col-pull-2\@xs{right:33.33333%}.col-pull-3\@xs{right:50%}.col-pull-4\@xs{right:66.66667%}.col-pull-5\@xs{right:83.33333%}.col-pull-6\@xs{right:100%}.col-push-0\@xs{left:auto}.col-push-1\@xs{left:16.66667%}.col-push-2\@xs{left:33.33333%}.col-push-3\@xs{left:50%}.col-push-4\@xs{left:66.66667%}.col-push-5\@xs{left:83.33333%}.col-push-6\@xs{left:100%}.col-offset-0\@xs{margin-left:0}.col-offset-1\@xs{margin-left:16.66667%}.col-offset-2\@xs{margin-left:33.33333%}.col-offset-3\@xs{margin-left:50%}.col-offset-4\@xs{margin-left:66.66667%}.col-offset-5\@xs{margin-left:83.33333%}.col-offset-6\@xs{margin-left:100%}@media screen and (min-width:768px){.col-1\@sm,.col-2\@sm,.col-3\@sm,.col-4\@sm,.col-5\@sm,.col-6\@sm,.col-7\@sm,.col-8\@sm,.col-9\@sm,.col-10\@sm,.col-11\@sm,.col-12\@sm{float:left}.aspect--16x9\@sm{padding-bottom:56.25%}.aspect--9x16\@sm{padding-bottom:177.77778%}.aspect--4x3\@sm{padding-bottom:75%}.aspect--3x4\@sm{padding-bottom:133.33333%}.aspect--3x2\@sm{padding-bottom:66.66667%}.aspect--3x1\@sm{padding-bottom:33.33333%}.aspect--2x3\@sm{padding-bottom:150%}.aspect--2x1\@sm{padding-bottom:50%}.aspect--1x2\@sm{padding-bottom:200%}.aspect--1x1\@sm{padding-bottom:100%}.aspect--none\@sm{height:auto;padding-bottom:0;overflow:visible}.aspect--none\@sm>.aspect__inner{position:static}.col-1\@sm{width:8.33333%}.col-2\@sm{width:16.66667%}.col-3\@sm{width:25%}.col-4\@sm{width:33.33333%}.col-5\@sm{width:41.66667%}.col-6\@sm{width:50%}.col-7\@sm{width:58.33333%}.col-8\@sm{width:66.66667%}.col-9\@sm{width:75%}.col-10\@sm{width:83.33333%}.col-11\@sm{width:91.66667%}.col-12\@sm{width:100%}.col-pull-0\@sm{right:auto}.col-pull-1\@sm{right:8.33333%}.col-pull-2\@sm{right:16.66667%}.col-pull-3\@sm{right:25%}.col-pull-4\@sm{right:33.33333%}.col-pull-5\@sm{right:41.66667%}.col-pull-6\@sm{right:50%}.col-pull-7\@sm{right:58.33333%}.col-pull-8\@sm{right:66.66667%}.col-pull-9\@sm{right:75%}.col-pull-10\@sm{right:83.33333%}.col-pull-11\@sm{right:91.66667%}.col-pull-12\@sm{right:100%}.col-push-0\@sm{left:auto}.col-push-1\@sm{left:8.33333%}.col-push-2\@sm{left:16.66667%}.col-push-3\@sm{left:25%}.col-push-4\@sm{left:33.33333%}.col-push-5\@sm{left:41.66667%}.col-push-6\@sm{left:50%}.col-push-7\@sm{left:58.33333%}.col-push-8\@sm{left:66.66667%}.col-push-9\@sm{left:75%}.col-push-10\@sm{left:83.33333%}.col-push-11\@sm{left:91.66667%}.col-push-12\@sm{left:100%}.col-offset-0\@sm{margin-left:0}.col-offset-1\@sm{margin-left:8.33333%}.col-offset-2\@sm{margin-left:16.66667%}.col-offset-3\@sm{margin-left:25%}.col-offset-4\@sm{margin-left:33.33333%}.col-offset-5\@sm{margin-left:41.66667%}.col-offset-6\@sm{margin-left:50%}.col-offset-7\@sm{margin-left:58.33333%}.col-offset-8\@sm{margin-left:66.66667%}.col-offset-9\@sm{margin-left:75%}.col-offset-10\@sm{margin-left:83.33333%}.col-offset-11\@sm{margin-left:91.66667%}.col-offset-12\@sm{margin-left:100%}.container{padding-left:7%;padding-right:7%}.row{max-width:1200px}}@media screen and (min-width:1024px){.col-1\@md,.col-2\@md,.col-3\@md,.col-4\@md,.col-5\@md,.col-6\@md,.col-7\@md,.col-8\@md,.col-9\@md,.col-10\@md,.col-11\@md,.col-12\@md{float:left}.aspect--16x9\@md{padding-bottom:56.25%}.aspect--9x16\@md{padding-bottom:177.77778%}.aspect--4x3\@md{padding-bottom:75%}.aspect--3x4\@md{padding-bottom:133.33333%}.aspect--3x2\@md{padding-bottom:66.66667%}.aspect--3x1\@md{padding-bottom:33.33333%}.aspect--2x3\@md{padding-bottom:150%}.aspect--2x1\@md{padding-bottom:50%}.aspect--1x2\@md{padding-bottom:200%}.aspect--1x1\@md{padding-bottom:100%}.aspect--none\@md{height:auto;padding-bottom:0;overflow:visible}.aspect--none\@md>.aspect__inner{position:static}.col-1\@md{width:8.33333%}.col-2\@md{width:16.66667%}.col-3\@md{width:25%}.col-4\@md{width:33.33333%}.col-5\@md{width:41.66667%}.col-6\@md{width:50%}.col-7\@md{width:58.33333%}.col-8\@md{width:66.66667%}.col-9\@md{width:75%}.col-10\@md{width:83.33333%}.col-11\@md{width:91.66667%}.col-12\@md{width:100%}.col-pull-0\@md{right:auto}.col-pull-1\@md{right:8.33333%}.col-pull-2\@md{right:16.66667%}.col-pull-3\@md{right:25%}.col-pull-4\@md{right:33.33333%}.col-pull-5\@md{right:41.66667%}.col-pull-6\@md{right:50%}.col-pull-7\@md{right:58.33333%}.col-pull-8\@md{right:66.66667%}.col-pull-9\@md{right:75%}.col-pull-10\@md{right:83.33333%}.col-pull-11\@md{right:91.66667%}.col-pull-12\@md{right:100%}.col-push-0\@md{left:auto}.col-push-1\@md{left:8.33333%}.col-push-2\@md{left:16.66667%}.col-push-3\@md{left:25%}.col-push-4\@md{left:33.33333%}.col-push-5\@md{left:41.66667%}.col-push-6\@md{left:50%}.col-push-7\@md{left:58.33333%}.col-push-8\@md{left:66.66667%}.col-push-9\@md{left:75%}.col-push-10\@md{left:83.33333%}.col-push-11\@md{left:91.66667%}.col-push-12\@md{left:100%}.col-offset-0\@md{margin-left:0}.col-offset-1\@md{margin-left:8.33333%}.col-offset-2\@md{margin-left:16.66667%}.col-offset-3\@md{margin-left:25%}.col-offset-4\@md{margin-left:33.33333%}.col-offset-5\@md{margin-left:41.66667%}.col-offset-6\@md{margin-left:50%}.col-offset-7\@md{margin-left:58.33333%}.col-offset-8\@md{margin-left:66.66667%}.col-offset-9\@md{margin-left:75%}.col-offset-10\@md{margin-left:83.33333%}.col-offset-11\@md{margin-left:91.66667%}.col-offset-12\@md{margin-left:100%}}.code-block{position:relative;overflow:visible;margin:.5em calc(-3.5vw - 8px)}.code-block pre{position:relative;z-index:1;min-height:56px;padding:1em calc(3.5vw + 8px);margin:0}@media screen and (min-width:768px){.code-block{margin-left:calc(-7vw - 8px);margin-right:calc(-7vw - 8px)}.code-block pre{position:relative;z-index:1;padding-left:calc(7vw + 8px);padding-right:calc(7vw + 8px)}}@media (min-width:1395px){.code-block{margin-left:calc(-50vw + 592px);margin-right:calc(-50vw + 592px)}.code-block pre{padding-left:calc(50vw - 592px);padding-right:calc(50vw - 592px)}}.textfield{-webkit-appearance:none;box-sizing:border-box;width:100%;border:2px solid #95a5a6;border-radius:4px;padding:.5em;font-size:1rem;color:#34495e;transition:.15s}.textfield::-moz-placeholder{color:#95a5a6;-moz-transition:.15s;transition:.15s}.textfield:-ms-input-placeholder{color:#95a5a6;-ms-transition:.15s;transition:.15s}.textfield::placeholder{color:#95a5a6;transition:.15s}.textfield:hover{outline-width:0;color:#5d6d77;border-color:#5d6d77}.textfield:hover::-moz-placeholder{color:#5d6d77}.textfield:hover:-ms-input-placeholder{color:#5d6d77}.textfield:hover::placeholder{color:#5d6d77}.textfield:focus{outline-width:0;border-color:#34495e}.textfield:focus::-moz-placeholder{color:#34495e}.textfield:focus:-ms-input-placeholder{color:#34495e}.textfield:focus::placeholder{color:#34495e}.textfield--large{font-size:1.125em}.text-center{text-align:center}.ib{display:inline-block}@media screen and (max-width:767px){.hidden\@xs{display:none}}@media screen and (min-width:768px){.visible\@xs{display:none}}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.clearfix,.clearfix:after{content:" ";display:table;clear:both}.pull-left{float:left}.pull-right{float:right}.full-width{width:100%}.full-height{height:100%}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.table-center-wrap{display:table;table-layout:fixed}.table-center{display:table-cell;vertical-align:middle}.btn-group:after,.btn-group:before{content:" ";display:table}.btn-group:after{clear:both}.btn-group .btn{float:left;border-radius:0}.btn-group .btn:first-child{border-radius:3px 0 0 3px}.btn-group .btn:not(:first-child){margin-left:-1px}.btn-group .btn:last-child{border-radius:0 3px 3px 0}.btn-group label.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn{display:inline-block;padding:.75em .8em;text-align:center;border-radius:3px;border:1px solid #34495e;color:#34495e;font-size:1rem;background-color:rgba(52,73,94,0);transition:.2s ease-out;cursor:pointer;-webkit-appearance:none}@media (-moz-touch-enabled:0),(pointer:fine){.btn:hover{color:#fff;text-decoration:none;background-color:#34495e}}.btn:focus{outline-width:0;box-shadow:0 0 0 2px rgba(52,73,94,.4)}.btn.active,.btn:active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3);color:#fff;background-color:#34495e}.btn:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(52,73,94,.4)}.btn:disabled{cursor:not-allowed;opacity:.7;color:#34495e;background-color:rgba(52,73,94,0)}.btn--warning{color:#e67e22;border-color:#e67e22;background-color:rgba(230,126,34,0)}@media (-moz-touch-enabled:0),(pointer:fine){.btn--warning:hover{background-color:#e67e22}}.btn--warning:focus{box-shadow:0 0 0 2px rgba(230,126,34,.4)}.btn--warning.active,.btn--warning:active{background-color:#e67e22}.btn--warning:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(230,126,34,.4)}.btn--warning:disabled{color:#e67e22;background-color:rgba(230,126,34,0)}.btn--primary{color:#3498db;border-color:#3498db;background-color:rgba(52,152,219,0)}@media (-moz-touch-enabled:0),(pointer:fine){.btn--primary:hover{background-color:#3498db}}.btn--primary:focus{box-shadow:0 0 0 2px rgba(52,152,219,.4)}.btn--primary.active,.btn--primary:active{background-color:#3498db}.btn--primary:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(52,152,219,.4)}.btn--primary:disabled{color:#3498db;background-color:rgba(52,152,219,0)}.btn--danger{color:#e74c3c;border-color:#e74c3c;background-color:rgba(231,76,60,0)}@media (-moz-touch-enabled:0),(pointer:fine){.btn--danger:hover{background-color:#e74c3c}}.btn--danger:focus{box-shadow:0 0 0 2px rgba(231,76,60,.4)}.btn--danger.active,.btn--danger:active{background-color:#e74c3c}.btn--danger:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(231,76,60,.4)}.btn--danger:disabled{color:#e74c3c;background-color:rgba(231,76,60,0)}.btn--go{color:#2ecc71;border-color:#2ecc71;background-color:rgba(46,204,113,0)}@media (-moz-touch-enabled:0),(pointer:fine){.btn--go:hover{background-color:#2ecc71}}.btn--go:focus{box-shadow:0 0 0 2px rgba(46,204,113,.4)}.btn--go.active,.btn--go:active{background-color:#2ecc71}.btn--go:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(46,204,113,.4)}.btn--go:disabled{color:#2ecc71;background-color:rgba(46,204,113,0)}@media screen and (max-width:767px){.btn{font-size:.875rem}}.filter-group .btn{position:relative}.filter-group .btn.active:after,.filter-group .btn.active:before{content:"";position:absolute;top:50%;left:50%;width:20px;height:20px;margin-left:-10px;margin-top:-10px;opacity:0;transition:.2s}.filter-group .btn:before{background-color:#2c3e50;border-radius:50%}.filter-group .btn:after{background-size:60%;background-position:50%;background-repeat:no-repeat;background-image:url(../img/check.svg)}.filter-group .btn.active:after,.filter-group .btn.active:before{opacity:1}.demo-list .figure-wrap{position:relative;z-index:1}.demo-list .figure-wrap,.demo-list .figure-wrap img{transform:translateZ(0);transition:.1s ease}.demo-list:hover .figure-wrap{transform:scaleX(1)}.demo-list:hover .figure-wrap img{filter:grayscale(1)}.demo-list:hover .figure-wrap:hover{z-index:2;transform:scale3d(1.05,1.05,1)}.demo-list:hover .figure-wrap:hover img{filter:none}.demo-list .figure-wrap:nth-child(4n+1){margin-left:0}.demo-list .figure-wrap>a{display:block}.demo-list .figure-wrap figcaption{height:2em;margin-top:.5em;margin-bottom:1em}.demo-link-container:before{content:"➜";display:inline-block;color:#2ecc71;margin-right:5px}.demo-link-container--external:before{transform:rotate(-45deg)}span.demo-link-container:before{margin-left:5px}@media screen and (max-width:47.9375em){.demo-list+.demo-list{margin-top:1em}.figure-wrap:nth-child(odd){margin-left:0}.figure-wrap:nth-child(n+3){margin-top:1em}}.site-nav{padding:10px 0;border-bottom:1px solid #e1e5e6;margin-bottom:28px;background:#ecf0f1}.site-nav__content{display:flex;justify-content:space-between}.site-nav__logo{font-size:20px}.site-nav__logo,.site-nav__logo:visited{color:#34495e}.site-nav__logo:hover,.site-nav__logo:visited:hover{text-decoration:none}.site-nav__links,.site-nav__logo{display:flex;align-items:center}.site-nav__logo svg{display:block;width:24px;height:24px;margin-right:4px}.site-nav__logo rect{transition:.18s cubic-bezier(.4,0,.2,1)}.site-nav__link{position:relative;z-index:3}.site-nav__link:not(:last-of-type){margin-right:8px}.site-nav__dropdown{position:absolute;z-index:2;top:40px;right:0;opacity:0;visibility:hidden;max-height:100vh;transition:.3s cubic-bezier(.165,.84,.44,1);background-color:#fff;transform:translateY(10px);box-shadow:0 7px 10px -1px rgba(0,0,0,.12)}.site-nav__dropdown:before{content:"";position:absolute;top:-8px;right:32px;display:block;border-bottom:8px solid #fff;border-left:9px solid transparent;border-right:9px solid transparent}.site-nav__dropdown li+li{margin-top:8px}.site-nav__dropdown a{display:block;color:#5d6d77}.site-nav__dropdown a:hover{background-color:#ecf0f1;text-decoration:none;color:#5d6d77}.site-nav__dropdown figure{display:flex;align-items:center}.site-nav__dropdown picture{flex-shrink:0;width:100px;height:75px}.site-nav__dropdown figcaption{padding-left:8px;padding-right:8px}.site-nav__dropdown--simple-links a{padding:8px 16px}.site-nav__dropdown--simple-links li+li{margin-top:0}.site-nav__link-toggle{padding:6px 8px}.site-nav__link-toggle:after{content:"";display:inline-block;vertical-align:middle;margin-top:-1px;margin-left:4px;border-top:6px solid;border-left:5px solid transparent;border-right:5px solid transparent;transition:transform .18s cubic-bezier(.4,0,.2,1)}.site-nav__link--dropdown-active .site-nav__link-toggle:after{transform:rotate(-180deg)}.site-nav__link--dropdown-active .site-nav__dropdown{visibility:visible;opacity:1;transform:translateY(0)}@media (-moz-touch-enabled:0),(pointer:fine){.site-nav__logo:hover rect:first-of-type{transform:translate(20px,10px);transition-delay:0ms}.site-nav__logo:hover rect:nth-of-type(2){transform:translateY(20px);transition-delay:10ms}.site-nav__logo:hover rect:nth-of-type(3){transform:translate(-20px,6px);transition-delay:20ms}.site-nav__logo:hover rect:nth-of-type(4){transform:translate(10px,-10px);transition-delay:30ms}.site-nav__logo:hover rect:nth-of-type(5){transform:translate(-10px,10px);transition-delay:40ms}.site-nav__logo:hover rect:nth-of-type(6){transform:translate(-20px,-14px);transition-delay:50ms}.site-nav__logo:hover rect:nth-of-type(7){transform:translateY(-20px);transition-delay:60ms}.site-nav__link-toggle:hover{border-color:#34495e}}@media screen and (max-width:767px){body.site-nav--open{padding-top:51px}body.site-nav--open .site-nav{position:fixed;z-index:4;top:0;left:0;width:100%}.site-nav__dropdown{position:fixed;left:0;right:0;top:51px;width:100vw;padding:8px calc(3.5vw + 8px);overflow:auto;-webkit-overflow-scrolling:touch}}@media screen and (min-width:768px){.site-nav{padding:16px 0}.site-nav__logo{font-size:24px}.site-nav__logo svg{width:32px;height:32px}.site-nav__link:not(:last-child){margin-right:16px}.site-nav__link--dropdown:not(:last-child){margin-right:12px}.site-nav__dropdown{max-height:none!important;right:-100px;padding:16px;box-shadow:0 0 10px rgba(0,0,0,.12)}.site-nav__dropdown:before{right:132px}.site-nav__dropdown ul{-moz-column-count:2;column-count:2;-moz-column-gap:16px;column-gap:16px}.site-nav__dropdown li{page-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}.site-nav__dropdown figcaption{white-space:nowrap}@supports (filter:drop-shadow(0 0 5px rgba(0,0,0,0.12))){.site-nav__dropdown{box-shadow:none;filter:drop-shadow(0 0 5px rgba(0,0,0,.12))}}.site-nav__link-img{width:24px;height:24px}.site-nav__dropdown--simple-links{right:0;padding:0}.site-nav__dropdown--simple-links:before{right:24px}.site-nav__dropdown--simple-links a{width:200px}}@media screen and (min-width:1024px){.site-nav__dropdown{right:0}.site-nav__dropdown:before{right:32px}.site-nav__dropdown--simple-links:before{right:24px}}.site-footer{margin-top:2em;padding:1em 0;background-color:#34495e}.site-footer p{color:#ecf0f1}.site-footer a{color:#fff;text-decoration:underline}.site-footer a:hover{color:#3498db}.has-code-block .code-block pre{margin-bottom:0}.has-code-block+.site-footer{margin-top:0}@media screen and (min-width:768px){.site-footer__credit{text-align:right}}.filter-label{display:block;padding:0;margin-top:0;margin-bottom:4px;color:#95a5a6}.filters-group{padding:0;margin:0 0 4px;border:0}@media screen and (min-width:768px){.filters-group-wrap{display:flex;justify-content:space-between}}.compound-filter-options{margin-top:20px;margin-bottom:40px}.filter-group--compound button{width:40px;height:40px;padding:0;background-color:currentColor}.filter-group--compound label{cursor:pointer}.filter-group--compound .ib+.ib{margin-left:8px}.shape-shuffle-container{position:relative;overflow:hidden}.shape{position:relative;margin-left:0;margin-top:10px}.shape .shape__space{width:100%;height:100%;background-color:#000;border:0 solid transparent}.shape--blue .shape__space{background-color:#3498db;border-bottom-color:#3498db}.shape--red .shape__space{background-color:#e74c3c;border-bottom-color:#e74c3c}.shape--orange .shape__space{background-color:#f39c12;border-bottom-color:#f39c12}.shape--green .shape__space{background-color:#2ecc71;border-bottom-color:#2ecc71}.shape--circle .shape__space{border-radius:50%}.shape--diamond .shape__space{transform:rotate(45deg) scale(.70711)}.shape--triangle .shape__space{padding-top:9px;height:0;width:0;border-width:0 66px 114px;background-color:transparent;margin:auto}@media (min-width:425px){.shape--triangle .shape__space{padding-top:12px;height:0;width:0;border-width:0 90px 156px}}@media (min-width:600px){.shape--triangle .shape__space{padding-top:17.5px;height:0;width:0;border-width:0 131px 227px}}@media (min-width:768px){.shape--triangle .shape__space{padding-top:10px;height:0;width:0;border-width:0 74px 128px}}@media (min-width:1024px){.shape--triangle .shape__space{padding-top:13.5px;height:0;width:0;border-width:0 102px 177px}}@media (min-width:1200px){.shape--triangle .shape__space{padding-top:18px;height:0;width:0;border-width:0 135px 234px}}@media (min-width:1392px){.shape--triangle .shape__space{padding-top:19px;height:0;width:0;border-width:0 142px 246px}}.search-section{margin-top:1em;margin-bottom:1em}.question{float:none;margin:2em 0;overflow:hidden;transition:.2s ease-out}.question--collapsed{height:0!important;margin:0;border-width:0}.question--collapsed+.question{margin-top:0}.question--unanswered{padding-top:1.25em;border-top:2px solid #2ecc71}.question__title{margin-top:0}.question__answer{padding-bottom:1px;margin-bottom:0} \ No newline at end of file +@charset "UTF-8";*,:after,:before{box-sizing:border-box}main{overflow:hidden}pre.max-height{max-height:30em}img,picture{display:block}img{height:auto;max-width:100%}figure,ul ul{margin:0}ul ul{list-style-type:circle;padding-left:1.25em}li{line-height:1.4}li+li{margin-top:4px}nav>a{display:block;margin:5px 0}#demos{margin-top:1em}body{color:#5d6d77;font-family:Open Sans,Helvetica Neue,Helvetica,sans-serif}a{text-decoration:none}a,a:visited{color:#3498db}a:hover{text-decoration:underline}a:active{color:#2ecc71}h1,h2,h3,h4,h5,h6{color:#34495e;font-weight:700}h1{font-size:10vw;font-weight:400;line-height:1}h1,h2{margin:3vw 0}h2{font-size:7vw;position:relative}h3{font-size:6vw;margin:2vw 0}h4{font-size:1.25em}p{line-height:1.4;margin:1em 0}.intro-text{font-size:1.125em;margin:.7em 0}@media screen and (min-width:768px){h1{font-size:3.5em;margin:.5em 0 .25em}h2{font-size:2.5em;margin:.45em 0}h3{font-size:1.5em;margin:.8em 0 .5em}h1>a,h2>a,h3>a{display:none}h1:hover>a,h2:hover>a,h3:hover>a{background:url(../img/link.svg) no-repeat;display:inline-block;height:50px;overflow:hidden;position:absolute;text-indent:-999em;top:0;width:50px}.intro-text{font-size:1.25em}}.unstyled{list-style-type:none;margin:0;padding:0}.type--underline{text-decoration:underline}code:not([class*=language]){background-color:rgba(27,31,35,.05);border-radius:3px;color:#2c3e50;font-family:Menlo,Consolas,Liberation Mono,Courier,monospace;font-size:85%;margin:0;padding:.2em 0}code:not([class*=language]):after,code:not([class*=language]):before{content:"\00a0";letter-spacing:-.2em}.container{padding-left:3.5%;padding-right:3.5%}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.row{margin-left:auto;margin-right:auto}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.row .row{margin-left:-8px;margin-right:-8px}.row--centered{display:flex;flex-wrap:wrap;justify-content:center}.aspect{height:0;overflow:hidden;padding-bottom:100%;position:relative;width:100%}.aspect--16x9{padding-bottom:56.25%}.aspect--9x16{padding-bottom:177.77778%}.aspect--4x3{padding-bottom:75%}.aspect--3x4{padding-bottom:133.33333%}.aspect--3x2{padding-bottom:66.66667%}.aspect--3x1{padding-bottom:33.33333%}.aspect--2x3{padding-bottom:150%}.aspect--2x1{padding-bottom:50%}.aspect--1x2{padding-bottom:200%}.aspect--1x1{padding-bottom:100%}.aspect--none{height:auto;overflow:visible;padding-bottom:0}.aspect--none>.aspect__inner{position:static}.aspect>div,.aspect__inner{bottom:0;left:0;position:absolute;right:0;top:0}.col-1\@lg,.col-1\@md,.col-1\@sm,.col-1\@xs,.col-2\@lg,.col-2\@md,.col-2\@sm,.col-2\@xs,.col-3\@lg,.col-3\@md,.col-3\@sm,.col-3\@xs,.col-4\@lg,.col-4\@md,.col-4\@sm,.col-4\@xs,.col-5\@lg,.col-5\@md,.col-5\@sm,.col-5\@xs,.col-6\@lg,.col-6\@md,.col-6\@sm,.col-6\@xs,.col-7\@lg,.col-7\@md,.col-7\@sm,.col-7\@xs,.col-8\@lg,.col-8\@md,.col-8\@sm,.col-8\@xs,.col-9\@lg,.col-9\@md,.col-9\@sm,.col-9\@xs,.col-10\@lg,.col-10\@md,.col-10\@sm,.col-10\@xs,.col-11\@lg,.col-11\@md,.col-11\@sm,.col-11\@xs,.col-12\@lg,.col-12\@md,.col-12\@sm,.col-12\@xs{box-sizing:border-box;min-height:1px;padding-left:8px;padding-right:8px;position:relative}.col-1\@xs,.col-2\@xs,.col-3\@xs,.col-4\@xs,.col-5\@xs,.col-6\@xs,.col-7\@xs,.col-8\@xs,.col-9\@xs,.col-10\@xs,.col-11\@xs,.col-12\@xs{float:left}.aspect--16x9\@xs{padding-bottom:56.25%}.aspect--9x16\@xs{padding-bottom:177.77778%}.aspect--4x3\@xs{padding-bottom:75%}.aspect--3x4\@xs{padding-bottom:133.33333%}.aspect--3x2\@xs{padding-bottom:66.66667%}.aspect--3x1\@xs{padding-bottom:33.33333%}.aspect--2x3\@xs{padding-bottom:150%}.aspect--2x1\@xs{padding-bottom:50%}.aspect--1x2\@xs{padding-bottom:200%}.aspect--1x1\@xs{padding-bottom:100%}.aspect--none\@xs{height:auto;overflow:visible;padding-bottom:0}.aspect--none\@xs>.aspect__inner{position:static}.col-1\@xs{width:16.66667%}.col-2\@xs{width:33.33333%}.col-3\@xs{width:50%}.col-4\@xs{width:66.66667%}.col-5\@xs{width:83.33333%}.col-6\@xs{width:100%}.col-pull-0\@xs{right:auto}.col-pull-1\@xs{right:16.66667%}.col-pull-2\@xs{right:33.33333%}.col-pull-3\@xs{right:50%}.col-pull-4\@xs{right:66.66667%}.col-pull-5\@xs{right:83.33333%}.col-pull-6\@xs{right:100%}.col-push-0\@xs{left:auto}.col-push-1\@xs{left:16.66667%}.col-push-2\@xs{left:33.33333%}.col-push-3\@xs{left:50%}.col-push-4\@xs{left:66.66667%}.col-push-5\@xs{left:83.33333%}.col-push-6\@xs{left:100%}.col-offset-0\@xs{margin-left:0}.col-offset-1\@xs{margin-left:16.66667%}.col-offset-2\@xs{margin-left:33.33333%}.col-offset-3\@xs{margin-left:50%}.col-offset-4\@xs{margin-left:66.66667%}.col-offset-5\@xs{margin-left:83.33333%}.col-offset-6\@xs{margin-left:100%}@media screen and (min-width:768px){.col-1\@sm,.col-2\@sm,.col-3\@sm,.col-4\@sm,.col-5\@sm,.col-6\@sm,.col-7\@sm,.col-8\@sm,.col-9\@sm,.col-10\@sm,.col-11\@sm,.col-12\@sm{float:left}.aspect--16x9\@sm{padding-bottom:56.25%}.aspect--9x16\@sm{padding-bottom:177.77778%}.aspect--4x3\@sm{padding-bottom:75%}.aspect--3x4\@sm{padding-bottom:133.33333%}.aspect--3x2\@sm{padding-bottom:66.66667%}.aspect--3x1\@sm{padding-bottom:33.33333%}.aspect--2x3\@sm{padding-bottom:150%}.aspect--2x1\@sm{padding-bottom:50%}.aspect--1x2\@sm{padding-bottom:200%}.aspect--1x1\@sm{padding-bottom:100%}.aspect--none\@sm{height:auto;overflow:visible;padding-bottom:0}.aspect--none\@sm>.aspect__inner{position:static}.col-1\@sm{width:8.33333%}.col-2\@sm{width:16.66667%}.col-3\@sm{width:25%}.col-4\@sm{width:33.33333%}.col-5\@sm{width:41.66667%}.col-6\@sm{width:50%}.col-7\@sm{width:58.33333%}.col-8\@sm{width:66.66667%}.col-9\@sm{width:75%}.col-10\@sm{width:83.33333%}.col-11\@sm{width:91.66667%}.col-12\@sm{width:100%}.col-pull-0\@sm{right:auto}.col-pull-1\@sm{right:8.33333%}.col-pull-2\@sm{right:16.66667%}.col-pull-3\@sm{right:25%}.col-pull-4\@sm{right:33.33333%}.col-pull-5\@sm{right:41.66667%}.col-pull-6\@sm{right:50%}.col-pull-7\@sm{right:58.33333%}.col-pull-8\@sm{right:66.66667%}.col-pull-9\@sm{right:75%}.col-pull-10\@sm{right:83.33333%}.col-pull-11\@sm{right:91.66667%}.col-pull-12\@sm{right:100%}.col-push-0\@sm{left:auto}.col-push-1\@sm{left:8.33333%}.col-push-2\@sm{left:16.66667%}.col-push-3\@sm{left:25%}.col-push-4\@sm{left:33.33333%}.col-push-5\@sm{left:41.66667%}.col-push-6\@sm{left:50%}.col-push-7\@sm{left:58.33333%}.col-push-8\@sm{left:66.66667%}.col-push-9\@sm{left:75%}.col-push-10\@sm{left:83.33333%}.col-push-11\@sm{left:91.66667%}.col-push-12\@sm{left:100%}.col-offset-0\@sm{margin-left:0}.col-offset-1\@sm{margin-left:8.33333%}.col-offset-2\@sm{margin-left:16.66667%}.col-offset-3\@sm{margin-left:25%}.col-offset-4\@sm{margin-left:33.33333%}.col-offset-5\@sm{margin-left:41.66667%}.col-offset-6\@sm{margin-left:50%}.col-offset-7\@sm{margin-left:58.33333%}.col-offset-8\@sm{margin-left:66.66667%}.col-offset-9\@sm{margin-left:75%}.col-offset-10\@sm{margin-left:83.33333%}.col-offset-11\@sm{margin-left:91.66667%}.col-offset-12\@sm{margin-left:100%}.container{padding-left:7%;padding-right:7%}.row{max-width:1200px}}@media screen and (min-width:1024px){.col-1\@md,.col-2\@md,.col-3\@md,.col-4\@md,.col-5\@md,.col-6\@md,.col-7\@md,.col-8\@md,.col-9\@md,.col-10\@md,.col-11\@md,.col-12\@md{float:left}.aspect--16x9\@md{padding-bottom:56.25%}.aspect--9x16\@md{padding-bottom:177.77778%}.aspect--4x3\@md{padding-bottom:75%}.aspect--3x4\@md{padding-bottom:133.33333%}.aspect--3x2\@md{padding-bottom:66.66667%}.aspect--3x1\@md{padding-bottom:33.33333%}.aspect--2x3\@md{padding-bottom:150%}.aspect--2x1\@md{padding-bottom:50%}.aspect--1x2\@md{padding-bottom:200%}.aspect--1x1\@md{padding-bottom:100%}.aspect--none\@md{height:auto;overflow:visible;padding-bottom:0}.aspect--none\@md>.aspect__inner{position:static}.col-1\@md{width:8.33333%}.col-2\@md{width:16.66667%}.col-3\@md{width:25%}.col-4\@md{width:33.33333%}.col-5\@md{width:41.66667%}.col-6\@md{width:50%}.col-7\@md{width:58.33333%}.col-8\@md{width:66.66667%}.col-9\@md{width:75%}.col-10\@md{width:83.33333%}.col-11\@md{width:91.66667%}.col-12\@md{width:100%}.col-pull-0\@md{right:auto}.col-pull-1\@md{right:8.33333%}.col-pull-2\@md{right:16.66667%}.col-pull-3\@md{right:25%}.col-pull-4\@md{right:33.33333%}.col-pull-5\@md{right:41.66667%}.col-pull-6\@md{right:50%}.col-pull-7\@md{right:58.33333%}.col-pull-8\@md{right:66.66667%}.col-pull-9\@md{right:75%}.col-pull-10\@md{right:83.33333%}.col-pull-11\@md{right:91.66667%}.col-pull-12\@md{right:100%}.col-push-0\@md{left:auto}.col-push-1\@md{left:8.33333%}.col-push-2\@md{left:16.66667%}.col-push-3\@md{left:25%}.col-push-4\@md{left:33.33333%}.col-push-5\@md{left:41.66667%}.col-push-6\@md{left:50%}.col-push-7\@md{left:58.33333%}.col-push-8\@md{left:66.66667%}.col-push-9\@md{left:75%}.col-push-10\@md{left:83.33333%}.col-push-11\@md{left:91.66667%}.col-push-12\@md{left:100%}.col-offset-0\@md{margin-left:0}.col-offset-1\@md{margin-left:8.33333%}.col-offset-2\@md{margin-left:16.66667%}.col-offset-3\@md{margin-left:25%}.col-offset-4\@md{margin-left:33.33333%}.col-offset-5\@md{margin-left:41.66667%}.col-offset-6\@md{margin-left:50%}.col-offset-7\@md{margin-left:58.33333%}.col-offset-8\@md{margin-left:66.66667%}.col-offset-9\@md{margin-left:75%}.col-offset-10\@md{margin-left:83.33333%}.col-offset-11\@md{margin-left:91.66667%}.col-offset-12\@md{margin-left:100%}}.code-block{margin:.5em calc(-3.5vw - 8px);overflow:visible;position:relative}.code-block pre{margin:0;min-height:56px;padding:1em calc(3.5vw + 8px);position:relative;z-index:1}@media screen and (min-width:768px){.code-block{margin-left:calc(-7vw - 8px);margin-right:calc(-7vw - 8px)}.code-block pre{padding-left:calc(7vw + 8px);padding-right:calc(7vw + 8px);position:relative;z-index:1}}@media (min-width:1395px){.code-block{margin-left:calc(-50vw + 592px);margin-right:calc(-50vw + 592px)}.code-block pre{padding-left:calc(50vw - 592px);padding-right:calc(50vw - 592px)}}.textfield{-webkit-appearance:none;border:2px solid #95a5a6;border-radius:4px;box-sizing:border-box;color:#34495e;font-size:1rem;padding:.5em;transition:.15s;width:100%}.textfield::-moz-placeholder{color:#95a5a6;-moz-transition:.15s;transition:.15s}.textfield:-ms-input-placeholder{color:#95a5a6;-ms-transition:.15s;transition:.15s}.textfield::placeholder{color:#95a5a6;transition:.15s}.textfield:hover{border-color:#5d6d77;color:#5d6d77;outline-width:0}.textfield:hover::-moz-placeholder{color:#5d6d77}.textfield:hover:-ms-input-placeholder{color:#5d6d77}.textfield:hover::placeholder{color:#5d6d77}.textfield:focus{border-color:#34495e;outline-width:0}.textfield:focus::-moz-placeholder{color:#34495e}.textfield:focus:-ms-input-placeholder{color:#34495e}.textfield:focus::placeholder{color:#34495e}.textfield--large{font-size:1.125em}.text-center{text-align:center}.ib{display:inline-block}@media screen and (max-width:767px){.hidden\@xs{display:none}}@media screen and (min-width:768px){.visible\@xs{display:none}}.hidden{display:none!important;visibility:hidden}.visuallyhidden{clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.clearfix,.clearfix:after{clear:both;content:" ";display:table}.pull-left{float:left}.pull-right{float:right}.full-width{width:100%}.full-height{height:100%}.hide-text{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.table-center-wrap{display:table;table-layout:fixed}.table-center{display:table-cell;vertical-align:middle}.btn-group:after,.btn-group:before{content:" ";display:table}.btn-group:after{clear:both}.btn-group .btn{border-radius:0;float:left}.btn-group .btn:first-child{border-radius:3px 0 0 3px}.btn-group .btn:not(:first-child){margin-left:-1px}.btn-group .btn:last-child{border-radius:0 3px 3px 0}.btn-group label.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn{-webkit-appearance:none;background-color:rgba(52,73,94,0);border:1px solid #34495e;border-radius:3px;color:#34495e;cursor:pointer;display:inline-block;font-size:1rem;padding:.75em .8em;text-align:center;transition:.2s ease-out}@media (-moz-touch-enabled:0),(pointer:fine){.btn:hover{background-color:#34495e;color:#fff;text-decoration:none}}.btn:focus{box-shadow:0 0 0 2px rgba(52,73,94,.4);outline-width:0}.btn.active,.btn:active{background-color:#34495e;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);color:#fff}.btn:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(52,73,94,.4)}.btn:disabled{background-color:rgba(52,73,94,0);color:#34495e;cursor:not-allowed;opacity:.7}.btn--warning{background-color:rgba(230,126,34,0);border-color:#e67e22;color:#e67e22}@media (-moz-touch-enabled:0),(pointer:fine){.btn--warning:hover{background-color:#e67e22}}.btn--warning:focus{box-shadow:0 0 0 2px rgba(230,126,34,.4)}.btn--warning.active,.btn--warning:active{background-color:#e67e22}.btn--warning:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(230,126,34,.4)}.btn--warning:disabled{background-color:rgba(230,126,34,0);color:#e67e22}.btn--primary{background-color:rgba(52,152,219,0);border-color:#3498db;color:#3498db}@media (-moz-touch-enabled:0),(pointer:fine){.btn--primary:hover{background-color:#3498db}}.btn--primary:focus{box-shadow:0 0 0 2px rgba(52,152,219,.4)}.btn--primary.active,.btn--primary:active{background-color:#3498db}.btn--primary:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(52,152,219,.4)}.btn--primary:disabled{background-color:rgba(52,152,219,0);color:#3498db}.btn--danger{background-color:rgba(231,76,60,0);border-color:#e74c3c;color:#e74c3c}@media (-moz-touch-enabled:0),(pointer:fine){.btn--danger:hover{background-color:#e74c3c}}.btn--danger:focus{box-shadow:0 0 0 2px rgba(231,76,60,.4)}.btn--danger.active,.btn--danger:active{background-color:#e74c3c}.btn--danger:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(231,76,60,.4)}.btn--danger:disabled{background-color:rgba(231,76,60,0);color:#e74c3c}.btn--go{background-color:rgba(46,204,113,0);border-color:#2ecc71;color:#2ecc71}@media (-moz-touch-enabled:0),(pointer:fine){.btn--go:hover{background-color:#2ecc71}}.btn--go:focus{box-shadow:0 0 0 2px rgba(46,204,113,.4)}.btn--go.active,.btn--go:active{background-color:#2ecc71}.btn--go:focus.active{box-shadow:inset 0 1px 2px rgba(0,0,0,.3),0 0 0 2px rgba(46,204,113,.4)}.btn--go:disabled{background-color:rgba(46,204,113,0);color:#2ecc71}@media screen and (max-width:767px){.btn{font-size:.875rem}}.filter-group .btn{position:relative}.filter-group .btn.active:after,.filter-group .btn.active:before{content:"";height:20px;left:50%;margin-left:-10px;margin-top:-10px;opacity:0;position:absolute;top:50%;transition:.2s;width:20px}.filter-group .btn:before{background-color:#2c3e50;border-radius:50%}.filter-group .btn:after{background-image:url(../img/check.svg);background-position:50%;background-repeat:no-repeat;background-size:60%}.filter-group .btn.active:after,.filter-group .btn.active:before{opacity:1}.demo-list .figure-wrap{position:relative;z-index:1}.demo-list .figure-wrap,.demo-list .figure-wrap img{transform:translateZ(0);transition:.1s ease}.demo-list:hover .figure-wrap{transform:scaleX(1)}.demo-list:hover .figure-wrap img{filter:grayscale(1)}.demo-list:hover .figure-wrap:hover{transform:scale3d(1.05,1.05,1);z-index:2}.demo-list:hover .figure-wrap:hover img{filter:none}.demo-list .figure-wrap:nth-child(4n+1){margin-left:0}.demo-list .figure-wrap>a{display:block}.demo-list .figure-wrap figcaption{height:2em;margin-bottom:1em;margin-top:.5em}.demo-link-container:before{color:#2ecc71;content:"➜";display:inline-block;margin-right:5px}.demo-link-container--external:before{transform:rotate(-45deg)}span.demo-link-container:before{margin-left:5px}@media screen and (max-width:47.9375em){.demo-list+.demo-list{margin-top:1em}.figure-wrap:nth-child(odd){margin-left:0}.figure-wrap:nth-child(n+3){margin-top:1em}}.site-nav{background:#ecf0f1;border-bottom:1px solid #e1e5e6;margin-bottom:28px;padding:10px 0}.site-nav__content{display:flex;justify-content:space-between}.site-nav__logo{font-size:20px}.site-nav__logo,.site-nav__logo:visited{color:#34495e}.site-nav__logo:hover,.site-nav__logo:visited:hover{text-decoration:none}.site-nav__links,.site-nav__logo{align-items:center;display:flex}.site-nav__logo svg{display:block;height:24px;margin-right:4px;width:24px}.site-nav__logo rect{transition:.18s cubic-bezier(.4,0,.2,1)}.site-nav__link{position:relative;z-index:3}.site-nav__link:not(:last-of-type){margin-right:8px}.site-nav__dropdown{background-color:#fff;box-shadow:0 7px 10px -1px rgba(0,0,0,.12);max-height:100vh;opacity:0;position:absolute;right:0;top:40px;transform:translateY(10px);transition:.3s cubic-bezier(.165,.84,.44,1);visibility:hidden;z-index:2}.site-nav__dropdown:before{border-bottom:8px solid #fff;border-left:9px solid transparent;border-right:9px solid transparent;content:"";display:block;position:absolute;right:32px;top:-8px}.site-nav__dropdown li+li{margin-top:8px}.site-nav__dropdown a{color:#5d6d77;display:block}.site-nav__dropdown a:hover{background-color:#ecf0f1;color:#5d6d77;text-decoration:none}.site-nav__dropdown figure{align-items:center;display:flex}.site-nav__dropdown picture{flex-shrink:0;height:75px;width:100px}.site-nav__dropdown figcaption{padding-left:8px;padding-right:8px}.site-nav__dropdown--simple-links a{padding:8px 16px}.site-nav__dropdown--simple-links li+li{margin-top:0}.site-nav__link-toggle{padding:6px 8px}.site-nav__link-toggle:after{border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid;content:"";display:inline-block;margin-left:4px;margin-top:-1px;transition:transform .18s cubic-bezier(.4,0,.2,1);vertical-align:middle}.site-nav__link--dropdown-active .site-nav__link-toggle:after{transform:rotate(-180deg)}.site-nav__link--dropdown-active .site-nav__dropdown{opacity:1;transform:translateY(0);visibility:visible}@media (-moz-touch-enabled:0),(pointer:fine){.site-nav__logo:hover rect:first-of-type{transform:translate(20px,10px);transition-delay:0ms}.site-nav__logo:hover rect:nth-of-type(2){transform:translateY(20px);transition-delay:10ms}.site-nav__logo:hover rect:nth-of-type(3){transform:translate(-20px,6px);transition-delay:20ms}.site-nav__logo:hover rect:nth-of-type(4){transform:translate(10px,-10px);transition-delay:30ms}.site-nav__logo:hover rect:nth-of-type(5){transform:translate(-10px,10px);transition-delay:40ms}.site-nav__logo:hover rect:nth-of-type(6){transform:translate(-20px,-14px);transition-delay:50ms}.site-nav__logo:hover rect:nth-of-type(7){transform:translateY(-20px);transition-delay:60ms}.site-nav__link-toggle:hover{border-color:#34495e}}@media screen and (max-width:767px){body.site-nav--open{padding-top:51px}body.site-nav--open .site-nav{left:0;position:fixed;top:0;width:100%;z-index:4}.site-nav__dropdown{-webkit-overflow-scrolling:touch;left:0;overflow:auto;padding:8px calc(3.5vw + 8px);position:fixed;right:0;top:51px;width:100vw}}@media screen and (min-width:768px){.site-nav{padding:16px 0}.site-nav__logo{font-size:24px}.site-nav__logo svg{height:32px;width:32px}.site-nav__link:not(:last-child){margin-right:16px}.site-nav__link--dropdown:not(:last-child){margin-right:12px}.site-nav__dropdown{box-shadow:0 0 10px rgba(0,0,0,.12);max-height:none!important;padding:16px;right:-100px}.site-nav__dropdown:before{right:132px}.site-nav__dropdown ul{-moz-column-count:2;column-count:2;-moz-column-gap:16px;column-gap:16px}.site-nav__dropdown li{-moz-column-break-inside:avoid;break-inside:avoid;page-break-inside:avoid}.site-nav__dropdown figcaption{white-space:nowrap}@supports (filter:drop-shadow(0 0 5px rgba(0,0,0,0.12))){.site-nav__dropdown{box-shadow:none;filter:drop-shadow(0 0 5px rgba(0,0,0,.12))}}.site-nav__link-img{height:24px;width:24px}.site-nav__dropdown--simple-links{padding:0;right:0}.site-nav__dropdown--simple-links:before{right:24px}.site-nav__dropdown--simple-links a{width:200px}}@media screen and (min-width:1024px){.site-nav__dropdown{right:0}.site-nav__dropdown:before{right:32px}.site-nav__dropdown--simple-links:before{right:24px}}.site-footer{background-color:#34495e;margin-top:2em;padding:1em 0}.site-footer p{color:#ecf0f1}.site-footer a{color:#fff;text-decoration:underline}.site-footer a:hover{color:#3498db}.has-code-block .code-block pre{margin-bottom:0}.has-code-block+.site-footer{margin-top:0}@media screen and (min-width:768px){.site-footer__credit{text-align:right}}.filter-label{color:#95a5a6;display:block;margin-bottom:4px;margin-top:0;padding:0}.filters-group{border:0;margin:0 0 4px;padding:0}@media screen and (min-width:768px){.filters-group-wrap{display:flex;justify-content:space-between}}.compound-filter-options{margin-bottom:40px;margin-top:20px}.filter-group--compound button{background-color:currentColor;height:40px;padding:0;width:40px}.filter-group--compound label{cursor:pointer}.filter-group--compound .ib+.ib{margin-left:8px}.shape-shuffle-container{overflow:hidden;position:relative}.shape{margin-left:0;margin-top:10px;position:relative}.shape .shape__space{background-color:#000;border:0 solid transparent;height:100%;width:100%}.shape--blue .shape__space{background-color:#3498db;border-bottom-color:#3498db}.shape--red .shape__space{background-color:#e74c3c;border-bottom-color:#e74c3c}.shape--orange .shape__space{background-color:#f39c12;border-bottom-color:#f39c12}.shape--green .shape__space{background-color:#2ecc71;border-bottom-color:#2ecc71}.shape--circle .shape__space{border-radius:50%}.shape--diamond .shape__space{transform:rotate(45deg) scale(.70711)}.shape--triangle .shape__space{background-color:transparent;border-width:0 66px 114px;height:0;margin:auto;padding-top:9px;width:0}@media (min-width:425px){.shape--triangle .shape__space{border-width:0 90px 156px;height:0;padding-top:12px;width:0}}@media (min-width:600px){.shape--triangle .shape__space{border-width:0 131px 227px;height:0;padding-top:17.5px;width:0}}@media (min-width:768px){.shape--triangle .shape__space{border-width:0 74px 128px;height:0;padding-top:10px;width:0}}@media (min-width:1024px){.shape--triangle .shape__space{border-width:0 102px 177px;height:0;padding-top:13.5px;width:0}}@media (min-width:1200px){.shape--triangle .shape__space{border-width:0 135px 234px;height:0;padding-top:18px;width:0}}@media (min-width:1392px){.shape--triangle .shape__space{border-width:0 142px 246px;height:0;padding-top:19px;width:0}}.search-section{margin-bottom:1em;margin-top:1em}.question{float:none;margin:2em 0;overflow:hidden;transition:.2s ease-out}.question--collapsed{border-width:0;height:0!important;margin:0}.question--collapsed+.question{margin-top:0}.question--unanswered{border-top:2px solid #2ecc71;padding-top:1.25em}.question__title{margin-top:0}.question__answer{margin-bottom:0;padding-bottom:1px} \ No newline at end of file diff --git a/docs/dist/shuffle.js b/docs/dist/shuffle.js index d429463..9238970 100644 --- a/docs/dist/shuffle.js +++ b/docs/dist/shuffle.js @@ -105,6 +105,8 @@ }; } + var tinyEmitter = {exports: {}}; + function E () { // Keep this empty so it's easier to inherit from // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) @@ -169,9 +171,10 @@ } }; - var tinyEmitter = E; - var TinyEmitter = E; - tinyEmitter.TinyEmitter = TinyEmitter; + tinyEmitter.exports = E; + tinyEmitter.exports.TinyEmitter = E; + + var TinyEmitter = tinyEmitter.exports; var proto = typeof Element !== 'undefined' ? Element.prototype : {}; var vendor = proto.matches @@ -510,7 +513,12 @@ var e = document.createElement('div'); e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;'; element.appendChild(e); - value = window.getComputedStyle(e, null).width === '10px'; + + var _window$getComputedSt = window.getComputedStyle(e, null), + width = _window$getComputedSt.width; // Fix for issue #314 + + + value = Math.round(getNumber(width)) === 10; element.removeChild(e); return value; }); @@ -973,6 +981,7 @@ key: "_init", value: function _init() { this.items = this._getItems(); + this.sortedItems = this.items; this.options.sizer = this._getElementOption(this.options.sizer); // Add class and invalidate styles this.element.classList.add(Shuffle.Classes.BASE); // Set initial css for each item @@ -1815,6 +1824,7 @@ this._resetCols(); var items = sorter(this._getFilteredItems(), sortOptions); + this.sortedItems = items; this._layout(items); // `_layout` always happens after `_shrink`, so it's safe to process the style // queue here with styles from the shrink method. @@ -2151,7 +2161,7 @@ }]); return Shuffle; - }(tinyEmitter); + }(TinyEmitter); Shuffle.ShuffleItem = ShuffleItem; Shuffle.ALL_ITEMS = 'all'; diff --git a/docs/dist/shuffle.js.map b/docs/dist/shuffle.js.map index 1ded37c..9130afa 100644 --- a/docs/dist/shuffle.js.map +++ b/docs/dist/shuffle.js.map @@ -1 +1 @@ -{"version":3,"file":"shuffle.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/array-min.js","../src/layout.js","../src/hyphenate.js","../src/shuffle.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","let value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n value = window.getComputedStyle(e, null).width === '10px';\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\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 // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n"],"names":["getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","obj","Object","keys","key","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","e","createElement","cssText","appendChild","window","getComputedStyle","removeChild","getNumberStyle","styles","testComputedSize","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","randomize","array","n","length","i","Math","floor","random","temp","defaults","reverse","by","compare","sorter","arr","options","opts","assign","original","Array","from","revert","sort","valA","valB","undefined","transitions","eventName","count","uniqueId","cancelTransitionEnd","removeEventListener","listener","onTransitionEnd","callback","evt","currentTarget","target","addEventListener","arrayMax","max","apply","arrayMin","min","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","round","ceil","getAvailablePositions","positions","available","push","slice","getShortColumn","buffer","minPosition","len","getItemPosition","itemSize","gridSize","total","span","setY","shortColumnIndex","setHeight","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","intersectingRect","hasOverlap","rowIndex","findIndex","items","includes","splice","concat","map","hyphenate","str","replace","m1","toLowerCase","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","el","_getElementOption","TypeError","_init","_getItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","nodeType","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","call","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","matches","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","name","data","shuffle","emit","itemPositions","_getNextPositions","equals","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","_getItemPosition","getTransformedPositions","_getConcealedItems","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","callbacks","_getTransitionFunction","parallel","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","allItems","_mergeNewItems","sortedItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","getItemByElement","handleLayout","_disposeItems","parentNode","REMOVED","once","find","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"shuffle.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/array-min.js","../src/layout.js","../src/hyphenate.js","../src/shuffle.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","import getNumber from './get-number';\n\nlet value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n const { width } = window.getComputedStyle(e, null);\n // Fix for issue #314\n value = Math.round(getNumber(width)) === 10;\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n this.sortedItems = this.items;\n\n this.options.sizer = this._getElementOption(this.options.sizer);\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(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\n this.sortedItems = items;\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n"],"names":["tinyEmitterModule","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","obj","Object","keys","key","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","e","createElement","cssText","appendChild","window","getComputedStyle","Math","round","removeChild","getNumberStyle","styles","testComputedSize","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","randomize","array","n","length","i","floor","random","temp","defaults","reverse","by","compare","sorter","arr","options","opts","assign","original","Array","from","revert","sort","valA","valB","undefined","transitions","eventName","count","uniqueId","cancelTransitionEnd","removeEventListener","listener","onTransitionEnd","callback","evt","currentTarget","target","addEventListener","arrayMax","max","apply","arrayMin","min","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","ceil","getAvailablePositions","positions","available","push","slice","getShortColumn","buffer","minPosition","len","getItemPosition","itemSize","gridSize","total","span","setY","shortColumnIndex","setHeight","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","intersectingRect","hasOverlap","rowIndex","findIndex","items","includes","splice","concat","map","hyphenate","str","replace","m1","toLowerCase","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","el","_getElementOption","TypeError","_init","_getItems","sortedItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","nodeType","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","call","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","matches","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","name","data","shuffle","emit","itemPositions","_getNextPositions","equals","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","_getItemPosition","getTransformedPositions","_getConcealedItems","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","callbacks","_getTransitionFunction","parallel","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","allItems","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","getItemByElement","handleLayout","_disposeItems","parentNode","REMOVED","once","find","includeMargins","marginLeft","marginRight","marginTop","marginBottom","zero","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file diff --git a/docs/dist/shuffle.min.js b/docs/dist/shuffle.min.js index 902b84f..b4e7255 100644 --- a/docs/dist/shuffle.min.js +++ b/docs/dist/shuffle.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Shuffle=e()}(this,(function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i=e?l():o=setTimeout(l,e-t)),s};function l(){o=0,r=+new Date,s=t.apply(i,n),i=null,n=null}};function p(){}function m(t){return parseFloat(t)||0}var v=function(){function e(i,n){t(this,e),this.x=m(i),this.y=m(n)}return i(e,null,[{key:"equals",value:function(t,e){return t.x===e.x&&t.y===e.y}}]),e}(),y=function(){function e(i,n,s,o,r){t(this,e),this.id=r,this.left=i,this.top=n,this.width=s,this.height=o}return i(e,null,[{key:"intersects",value:function(t,e){return t.left2&&void 0!==arguments[2]?arguments[2]:window.getComputedStyle(t,null),n=m(i[e]);return b()||"width"!==e?b()||"height"!==e||(n+=m(i.paddingTop)+m(i.paddingBottom)+m(i.borderTopWidth)+m(i.borderBottomWidth)):n+=m(i.paddingLeft)+m(i.paddingRight)+m(i.borderLeftWidth)+m(i.borderRightWidth),n}var S={reverse:!1,by:null,compare:null,randomize:!1,key:"element"};function k(t,e){var i=Object.assign({},S,e),n=Array.from(t),s=!1;return t.length?i.randomize?function(t){for(var e=t.length;e;){e-=1;var i=Math.floor(Math.random()*(e+1)),n=t[i];t[i]=t[e],t[e]=n}return t}(t):("function"==typeof i.by?t.sort((function(t,e){if(s)return 0;var n=i.by(t[i.key]),o=i.by(e[i.key]);return void 0===n&&void 0===o?(s=!0,0):no||"sortLast"===n||"sortFirst"===o?1:0})):"function"==typeof i.compare&&t.sort(i.compare),s?n:(i.reverse&&t.reverse(),t)):[]}var C={},L="transitionend",w=0;function D(t){return!!C[t]&&(C[t].element.removeEventListener(L,C[t].listener),C[t]=null,!0)}function z(t,e){var i=L+(w+=1),n=function(t){t.currentTarget===t.target&&(D(i),e(t))};return t.addEventListener(L,n),C[i]={element:t,listener:n},i}function M(t){return Math.max.apply(Math,t)}function A(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=n-e&&t[s]<=n+e)return s;return 0}function O(t,e){var i={};t.forEach((function(t){i[t.top]?i[t.top].push(t):i[t.top]=[t]}));var n=[],s=[],o=[];return Object.keys(i).forEach((function(t){var r=i[t];s.push(r);var l,a=r[r.length-1],u=a.left+a.width,h=Math.round((e-u)/2),f=r,c=!1;if(h>0){var d=[];(c=r.every((function(t){var e=new y(t.left+h,t.top,t.width,t.height,t.id),i=!n.some((function(t){return y.intersects(e,t)}));return d.push(e),i})))&&(f=d)}if(!c&&r.some((function(t){return n.some((function(e){var i=y.intersects(t,e);return i&&(l=e),i}))}))){var p=o.findIndex((function(t){return t.includes(l)}));o.splice(p,1,s[p])}n=n.concat(f),o.push(f)})),[].concat.apply([],o).sort((function(t,e){return t.id-e.id})).map((function(t){return new v(t.left,t.top)}))}function R(t){return Array.from(new Set(t))}var N=0,B=function(e){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,e);var n=r(o);function o(e){var i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,o),(i=n.call(this)).options=Object.assign({},o.options,s),i.options.delimeter&&(i.options.delimiter=i.options.delimeter),i.lastSort={},i.group=o.ALL_ITEMS,i.lastFilter=o.ALL_ITEMS,i.isEnabled=!0,i.isDestroyed=!1,i.isInitialized=!1,i._transitions=[],i.isTransitioning=!1,i._queue=[];var r=i._getElementOption(e);if(!r)throw new TypeError("Shuffle needs to be initialized with an element.");return i.element=r,i.id="shuffle_"+N,N+=1,i._init(),i.isInitialized=!0,i}return i(o,[{key:"_init",value:function(){if(this.items=this._getItems(),this.options.sizer=this._getElementOption(this.options.sizer),this.element.classList.add(o.Classes.BASE),this._initItems(this.items),this._onResize=this._getResizeFunction(),window.addEventListener("resize",this._onResize),"complete"!==document.readyState){var t=this.layout.bind(this);window.addEventListener("load",(function e(){window.removeEventListener("load",e),t()}))}var e=window.getComputedStyle(this.element,null),i=o.getSize(this.element).width;this._validateStyles(e),this._setColumns(i),this.filter(this.options.group,this.options.initialSort),this.element.offsetWidth,this.setItemTransitions(this.items),this.element.style.transition="height ".concat(this.options.speed,"ms ").concat(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(t,e){var i=this,n=[],s=[];return t===o.ALL_ITEMS?n=e:e.forEach((function(e){i._doesPassFilter(t,e.element)?n.push(e):s.push(e)})),{visible:n,hidden:s}}},{key:"_doesPassFilter",value:function(t,e){if("function"==typeof t)return t.call(e,e,this);var i=e.getAttribute("data-"+o.FILTER_ATTRIBUTE_KEY),n=this.options.delimiter?i.split(this.options.delimiter):JSON.parse(i);function s(t){return n.includes(t)}return Array.isArray(t)?this.options.filterMode===o.FilterMode.ANY?t.some(s):t.every(s):n.includes(t)}},{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(t){t.forEach((function(t){t.init()}))}},{key:"_disposeItems",value:function(t){t.forEach((function(t){t.dispose()}))}},{key:"_updateItemCount",value:function(){this.visibleItems=this._getFilteredItems().length}},{key:"setItemTransitions",value:function(t){var e=this.options,i=e.speed,n=e.easing,s=this.options.useTransforms?["transform"]:["top","left"],o=Object.keys(E.Css.HIDDEN.before).map((function(t){return t.replace(/([A-Z])/g,(function(t,e){return"-".concat(e.toLowerCase())}))})),r=s.concat(o).join();t.forEach((function(t){t.element.style.transitionDuration=i+"ms",t.element.style.transitionTimingFunction=n,t.element.style.transitionProperty=r}))}},{key:"_getItems",value:function(){var t=this;return Array.from(this.element.children).filter((function(e){return c(e,t.options.itemSelector)})).map((function(e){return new E(e,t.options.isRTL)}))}},{key:"_mergeNewItems",value:function(t){var e=Array.from(this.element.children);return k(this.items.concat(t),{by:function(t){return e.indexOf(t)}})}},{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(t,e){var i;return 0===(i="function"==typeof this.options.columnWidth?this.options.columnWidth(t):this.options.sizer?o.getSize(this.options.sizer).width:this.options.columnWidth?this.options.columnWidth:this.items.length>0?o.getSize(this.items[0].element,!0).width:t)&&(i=t),i+e}},{key:"_getGutterSize",value:function(t){return"function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.options.sizer?T(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.getSize(this.element).width,e=this._getGutterSize(t),i=this._getColumnSize(t,e),n=(t+e)/i;Math.abs(Math.round(n)-n)1&&void 0!==arguments[1]?arguments[1]:{};this.isDestroyed||(e.shuffle=this,this.emit(t,e))}},{key:"_resetCols",value:function(){var t=this.cols;for(this.positions=[];t;)t-=1,this.positions.push(0)}},{key:"_layout",value:function(t){var e=this,i=this._getNextPositions(t),n=0;t.forEach((function(t,s){function o(){t.applyCss(E.Css.VISIBLE.after)}if(v.equals(t.point,i[s])&&!t.isHidden)return t.applyCss(E.Css.VISIBLE.before),void o();t.point=i[s],t.scale=E.Scale.VISIBLE,t.isHidden=!1;var r=e.getStylesForTransition(t,E.Css.VISIBLE.before);r.transitionDelay=e._getStaggerAmount(n)+"ms",e._queue.push({item:t,styles:r,callback:o}),n+=1}))}},{key:"_getNextPositions",value:function(t){var e=this;if(this.options.isCentered){var i=t.map((function(t,i){var n=o.getSize(t.element,!0),s=e._getItemPosition(n);return new y(s.x,s.y,n.width,n.height,i)}));return this.getTransformedPositions(i,this.containerWidth)}return t.map((function(t){return e._getItemPosition(o.getSize(t.element,!0))}))}},{key:"_getItemPosition",value:function(t){return function(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,l=A(e.width,n,s,o),a=F(i,l,s),u=x(a,r),h=new v(n*u,a[u]),f=a[u]+e.height,c=0;c0&&void 0!==arguments[0]?arguments[0]:this._getConcealedItems(),i=0;e.forEach((function(e){function n(){e.applyCss(E.Css.HIDDEN.after)}if(e.isHidden)return e.applyCss(E.Css.HIDDEN.before),void n();e.scale=E.Scale.HIDDEN,e.isHidden=!0;var s=t.getStylesForTransition(e,E.Css.HIDDEN.before);s.transitionDelay=t._getStaggerAmount(i)+"ms",t._queue.push({item:e,styles:s,callback:n}),i+=1}))}},{key:"_handleResize",value:function(){this.isEnabled&&!this.isDestroyed&&this.update()}},{key:"getStylesForTransition",value:function(t,e){var i=Object.assign({},e);if(this.options.useTransforms){var n=this.options.isRTL?"-":"",s=this.options.roundTransforms?Math.round(t.point.x):t.point.x,o=this.options.roundTransforms?Math.round(t.point.y):t.point.y;i.transform="translate(".concat(n).concat(s,"px, ").concat(o,"px) scale(").concat(t.scale,")")}else this.options.isRTL?i.right=t.point.x+"px":i.left=t.point.x+"px",i.top=t.point.y+"px";return i}},{key:"_whenTransitionDone",value:function(t,e,i){var n=z(t,(function(t){e(),i(null,t)}));this._transitions.push(n)}},{key:"_getTransitionFunction",value:function(t){var e=this;return function(i){t.item.applyCss(t.styles),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._dispatch(o.EventType.LAYOUT)):this._dispatch(o.EventType.LAYOUT),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0,function(t,e,i){i||("function"==typeof e?(i=e,e=null):i=p);var n=t&&t.length;if(!n)return i(null,[]);var s=!1,o=new Array(n);function r(t){return function(e,r){if(!s){if(e)return i(e,o),void(s=!0);o[t]=r,--n||i(null,o)}}}t.forEach(e?function(t,i){t.call(e,r(i))}:function(t,e){t(r(e))})}(t.map((function(t){return e._getTransitionFunction(t)})),this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(D),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(t){if(t.length){var e=t.map((function(t){return t.item.element}));o._skipTransitions(e,(function(){t.forEach((function(t){t.item.applyCss(t.styles),t.callback()}))}))}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatch(o.EventType.LAYOUT)}},{key:"filter",value:function(t,e){this.isEnabled&&((!t||t&&0===t.length)&&(t=o.ALL_ITEMS),this._filter(t),this._shrink(),this._updateItemCount(),this.sort(e))}},{key:"sort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.lastSort;if(this.isEnabled){this._resetCols();var e=k(this._getFilteredItems(),t);this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){var e=this,i=R(t).map((function(t){return new E(t,e.options.isRTL)}));this._initItems(i),this._resetCols();var n=k(this._mergeNewItems(i),this.lastSort),s=this._filter(this.lastFilter,n),o=function(t){return i.includes(t)},r=function(t){t.scale=E.Scale.HIDDEN,t.isHidden=!0,t.applyCss(E.Css.HIDDEN.before),t.applyCss(E.Css.HIDDEN.after)},l=this._getNextPositions(s.visible);s.visible.forEach((function(t,i){o(t)&&(t.point=l[i],r(t),t.applyCss(e.getStylesForTransition(t,{})))})),s.hidden.forEach((function(t){o(t)&&r(t)})),this.element.offsetWidth,this.setItemTransitions(i),this.items=this._mergeNewItems(i),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isEnabled=!0,t&&this.update()}},{key:"remove",value:function(t){var e=this;if(t.length){var i=R(t),n=i.map((function(t){return e.getItemByElement(t)})).filter((function(t){return!!t}));this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter((function(t){return!n.includes(t)})),this._updateItemCount(),this.once(o.EventType.LAYOUT,(function(){e._disposeItems(n),i.forEach((function(t){t.parentNode.removeChild(t)})),e._dispatch(o.EventType.REMOVED,{collection:i})}))}}},{key:"getItemByElement",value:function(t){return this.items.find((function(e){return e.element===t}))}},{key:"resetItems",value:function(){var t=this;this._disposeItems(this.items),this.isInitialized=!1,this.items=this._getItems(),this._initItems(this.items),this.once(o.EventType.LAYOUT,(function(){t.setItemTransitions(t.items),t.isInitialized=!0})),this.filter(this.lastFilter)}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(this.items),this.items.length=0,this._transitions.length=0,this.options.sizer=null,this.element=null,this.isDestroyed=!0,this.isEnabled=!1}}],[{key:"getSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=window.getComputedStyle(t,null),n=T(t,"width",i),s=T(t,"height",i);if(e){var o=T(t,"marginLeft",i),r=T(t,"marginRight",i),l=T(t,"marginTop",i),a=T(t,"marginBottom",i);n+=o+r,s+=l+a}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i=t.map((function(t){var e=t.style,i=e.transitionDuration,n=e.transitionDelay;return e.transitionDuration="0ms",e.transitionDelay="0ms",{duration:i,delay:n}}));e(),t[0].offsetWidth,t.forEach((function(t,e){t.style.transitionDuration=i[e].duration,t.style.transitionDelay=i[e].delay}))}}]),o}(a);return B.ShuffleItem=E,B.ALL_ITEMS="all",B.FILTER_ATTRIBUTE_KEY="groups",B.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},B.Classes=g,B.FilterMode={ANY:"any",ALL:"all"},B.options={group:B.ALL_ITEMS,speed:250,easing:"cubic-bezier(0.4, 0.0, 0.2, 1)",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimiter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:d,throttleTime:300,staggerAmount:15,staggerAmountMax:150,useTransforms:!0,filterMode:B.FilterMode.ANY,isCentered:!1,isRTL:!1,roundTransforms:!0},B.Point=v,B.Rect=y,B.__sorter=k,B.__getColumnSpan=A,B.__getAvailablePositions=F,B.__getShortColumn=x,B.__getCenteredPositions=O,B})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Shuffle=e()}(this,(function(){"use strict";function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i=e?l():o=setTimeout(l,e-t)),s};function l(){o=0,r=+new Date,s=t.apply(i,n),i=null,n=null}};function p(){}function m(t){return parseFloat(t)||0}var v=function(){function e(i,n){t(this,e),this.x=m(i),this.y=m(n)}return i(e,null,[{key:"equals",value:function(t,e){return t.x===e.x&&t.y===e.y}}]),e}(),y=function(){function e(i,n,s,o,r){t(this,e),this.id=r,this.left=i,this.top=n,this.width=s,this.height=o}return i(e,null,[{key:"intersects",value:function(t,e){return t.left2&&void 0!==arguments[2]?arguments[2]:window.getComputedStyle(t,null),n=m(i[e]);return b()||"width"!==e?b()||"height"!==e||(n+=m(i.paddingTop)+m(i.paddingBottom)+m(i.borderTopWidth)+m(i.borderBottomWidth)):n+=m(i.paddingLeft)+m(i.paddingRight)+m(i.borderLeftWidth)+m(i.borderRightWidth),n}var S={reverse:!1,by:null,compare:null,randomize:!1,key:"element"};function k(t,e){var i=Object.assign({},S,e),n=Array.from(t),s=!1;return t.length?i.randomize?function(t){for(var e=t.length;e;){e-=1;var i=Math.floor(Math.random()*(e+1)),n=t[i];t[i]=t[e],t[e]=n}return t}(t):("function"==typeof i.by?t.sort((function(t,e){if(s)return 0;var n=i.by(t[i.key]),o=i.by(e[i.key]);return void 0===n&&void 0===o?(s=!0,0):no||"sortLast"===n||"sortFirst"===o?1:0})):"function"==typeof i.compare&&t.sort(i.compare),s?n:(i.reverse&&t.reverse(),t)):[]}var C={},L="transitionend",w=0;function D(t){return!!C[t]&&(C[t].element.removeEventListener(L,C[t].listener),C[t]=null,!0)}function z(t,e){var i=L+(w+=1),n=function(t){t.currentTarget===t.target&&(D(i),e(t))};return t.addEventListener(L,n),C[i]={element:t,listener:n},i}function M(t){return Math.max.apply(Math,t)}function A(t,e,i,n){var s=t/e;return Math.abs(Math.round(s)-s)=n-e&&t[s]<=n+e)return s;return 0}function O(t,e){var i={};t.forEach((function(t){i[t.top]?i[t.top].push(t):i[t.top]=[t]}));var n=[],s=[],o=[];return Object.keys(i).forEach((function(t){var r=i[t];s.push(r);var l,a=r[r.length-1],u=a.left+a.width,h=Math.round((e-u)/2),f=r,c=!1;if(h>0){var d=[];(c=r.every((function(t){var e=new y(t.left+h,t.top,t.width,t.height,t.id),i=!n.some((function(t){return y.intersects(e,t)}));return d.push(e),i})))&&(f=d)}if(!c&&r.some((function(t){return n.some((function(e){var i=y.intersects(t,e);return i&&(l=e),i}))}))){var p=o.findIndex((function(t){return t.includes(l)}));o.splice(p,1,s[p])}n=n.concat(f),o.push(f)})),[].concat.apply([],o).sort((function(t,e){return t.id-e.id})).map((function(t){return new v(t.left,t.top)}))}function R(t){return Array.from(new Set(t))}var N=0,B=function(e){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&s(t,e)}(o,e);var n=r(o);function o(e){var i,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,o),(i=n.call(this)).options=Object.assign({},o.options,s),i.options.delimeter&&(i.options.delimiter=i.options.delimeter),i.lastSort={},i.group=o.ALL_ITEMS,i.lastFilter=o.ALL_ITEMS,i.isEnabled=!0,i.isDestroyed=!1,i.isInitialized=!1,i._transitions=[],i.isTransitioning=!1,i._queue=[];var r=i._getElementOption(e);if(!r)throw new TypeError("Shuffle needs to be initialized with an element.");return i.element=r,i.id="shuffle_"+N,N+=1,i._init(),i.isInitialized=!0,i}return i(o,[{key:"_init",value:function(){if(this.items=this._getItems(),this.sortedItems=this.items,this.options.sizer=this._getElementOption(this.options.sizer),this.element.classList.add(o.Classes.BASE),this._initItems(this.items),this._onResize=this._getResizeFunction(),window.addEventListener("resize",this._onResize),"complete"!==document.readyState){var t=this.layout.bind(this);window.addEventListener("load",(function e(){window.removeEventListener("load",e),t()}))}var e=window.getComputedStyle(this.element,null),i=o.getSize(this.element).width;this._validateStyles(e),this._setColumns(i),this.filter(this.options.group,this.options.initialSort),this.element.offsetWidth,this.setItemTransitions(this.items),this.element.style.transition="height ".concat(this.options.speed,"ms ").concat(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(t,e){var i=this,n=[],s=[];return t===o.ALL_ITEMS?n=e:e.forEach((function(e){i._doesPassFilter(t,e.element)?n.push(e):s.push(e)})),{visible:n,hidden:s}}},{key:"_doesPassFilter",value:function(t,e){if("function"==typeof t)return t.call(e,e,this);var i=e.getAttribute("data-"+o.FILTER_ATTRIBUTE_KEY),n=this.options.delimiter?i.split(this.options.delimiter):JSON.parse(i);function s(t){return n.includes(t)}return Array.isArray(t)?this.options.filterMode===o.FilterMode.ANY?t.some(s):t.every(s):n.includes(t)}},{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(t){t.forEach((function(t){t.init()}))}},{key:"_disposeItems",value:function(t){t.forEach((function(t){t.dispose()}))}},{key:"_updateItemCount",value:function(){this.visibleItems=this._getFilteredItems().length}},{key:"setItemTransitions",value:function(t){var e=this.options,i=e.speed,n=e.easing,s=this.options.useTransforms?["transform"]:["top","left"],o=Object.keys(E.Css.HIDDEN.before).map((function(t){return t.replace(/([A-Z])/g,(function(t,e){return"-".concat(e.toLowerCase())}))})),r=s.concat(o).join();t.forEach((function(t){t.element.style.transitionDuration=i+"ms",t.element.style.transitionTimingFunction=n,t.element.style.transitionProperty=r}))}},{key:"_getItems",value:function(){var t=this;return Array.from(this.element.children).filter((function(e){return c(e,t.options.itemSelector)})).map((function(e){return new E(e,t.options.isRTL)}))}},{key:"_mergeNewItems",value:function(t){var e=Array.from(this.element.children);return k(this.items.concat(t),{by:function(t){return e.indexOf(t)}})}},{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(t,e){var i;return 0===(i="function"==typeof this.options.columnWidth?this.options.columnWidth(t):this.options.sizer?o.getSize(this.options.sizer).width:this.options.columnWidth?this.options.columnWidth:this.items.length>0?o.getSize(this.items[0].element,!0).width:t)&&(i=t),i+e}},{key:"_getGutterSize",value:function(t){return"function"==typeof this.options.gutterWidth?this.options.gutterWidth(t):this.options.sizer?T(this.options.sizer,"marginLeft"):this.options.gutterWidth}},{key:"_setColumns",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.getSize(this.element).width,e=this._getGutterSize(t),i=this._getColumnSize(t,e),n=(t+e)/i;Math.abs(Math.round(n)-n)1&&void 0!==arguments[1]?arguments[1]:{};this.isDestroyed||(e.shuffle=this,this.emit(t,e))}},{key:"_resetCols",value:function(){var t=this.cols;for(this.positions=[];t;)t-=1,this.positions.push(0)}},{key:"_layout",value:function(t){var e=this,i=this._getNextPositions(t),n=0;t.forEach((function(t,s){function o(){t.applyCss(E.Css.VISIBLE.after)}if(v.equals(t.point,i[s])&&!t.isHidden)return t.applyCss(E.Css.VISIBLE.before),void o();t.point=i[s],t.scale=E.Scale.VISIBLE,t.isHidden=!1;var r=e.getStylesForTransition(t,E.Css.VISIBLE.before);r.transitionDelay=e._getStaggerAmount(n)+"ms",e._queue.push({item:t,styles:r,callback:o}),n+=1}))}},{key:"_getNextPositions",value:function(t){var e=this;if(this.options.isCentered){var i=t.map((function(t,i){var n=o.getSize(t.element,!0),s=e._getItemPosition(n);return new y(s.x,s.y,n.width,n.height,i)}));return this.getTransformedPositions(i,this.containerWidth)}return t.map((function(t){return e._getItemPosition(o.getSize(t.element,!0))}))}},{key:"_getItemPosition",value:function(t){return function(t){for(var e=t.itemSize,i=t.positions,n=t.gridSize,s=t.total,o=t.threshold,r=t.buffer,l=A(e.width,n,s,o),a=F(i,l,s),u=x(a,r),h=new v(n*u,a[u]),f=a[u]+e.height,c=0;c0&&void 0!==arguments[0]?arguments[0]:this._getConcealedItems(),i=0;e.forEach((function(e){function n(){e.applyCss(E.Css.HIDDEN.after)}if(e.isHidden)return e.applyCss(E.Css.HIDDEN.before),void n();e.scale=E.Scale.HIDDEN,e.isHidden=!0;var s=t.getStylesForTransition(e,E.Css.HIDDEN.before);s.transitionDelay=t._getStaggerAmount(i)+"ms",t._queue.push({item:e,styles:s,callback:n}),i+=1}))}},{key:"_handleResize",value:function(){this.isEnabled&&!this.isDestroyed&&this.update()}},{key:"getStylesForTransition",value:function(t,e){var i=Object.assign({},e);if(this.options.useTransforms){var n=this.options.isRTL?"-":"",s=this.options.roundTransforms?Math.round(t.point.x):t.point.x,o=this.options.roundTransforms?Math.round(t.point.y):t.point.y;i.transform="translate(".concat(n).concat(s,"px, ").concat(o,"px) scale(").concat(t.scale,")")}else this.options.isRTL?i.right=t.point.x+"px":i.left=t.point.x+"px",i.top=t.point.y+"px";return i}},{key:"_whenTransitionDone",value:function(t,e,i){var n=z(t,(function(t){e(),i(null,t)}));this._transitions.push(n)}},{key:"_getTransitionFunction",value:function(t){var e=this;return function(i){t.item.applyCss(t.styles),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._dispatch(o.EventType.LAYOUT)):this._dispatch(o.EventType.LAYOUT),this._queue.length=0}},{key:"_startTransitions",value:function(t){var e=this;this.isTransitioning=!0,function(t,e,i){i||("function"==typeof e?(i=e,e=null):i=p);var n=t&&t.length;if(!n)return i(null,[]);var s=!1,o=new Array(n);function r(t){return function(e,r){if(!s){if(e)return i(e,o),void(s=!0);o[t]=r,--n||i(null,o)}}}t.forEach(e?function(t,i){t.call(e,r(i))}:function(t,e){t(r(e))})}(t.map((function(t){return e._getTransitionFunction(t)})),this._movementFinished.bind(this))}},{key:"_cancelMovement",value:function(){this._transitions.forEach(D),this._transitions.length=0,this.isTransitioning=!1}},{key:"_styleImmediately",value:function(t){if(t.length){var e=t.map((function(t){return t.item.element}));o._skipTransitions(e,(function(){t.forEach((function(t){t.item.applyCss(t.styles),t.callback()}))}))}}},{key:"_movementFinished",value:function(){this._transitions.length=0,this.isTransitioning=!1,this._dispatch(o.EventType.LAYOUT)}},{key:"filter",value:function(t,e){this.isEnabled&&((!t||t&&0===t.length)&&(t=o.ALL_ITEMS),this._filter(t),this._shrink(),this._updateItemCount(),this.sort(e))}},{key:"sort",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.lastSort;if(this.isEnabled){this._resetCols();var e=k(this._getFilteredItems(),t);this.sortedItems=e,this._layout(e),this._processQueue(),this._setContainerSize(),this.lastSort=t}}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.isEnabled&&(t||this._setColumns(),this.sort())}},{key:"layout",value:function(){this.update(!0)}},{key:"add",value:function(t){var e=this,i=R(t).map((function(t){return new E(t,e.options.isRTL)}));this._initItems(i),this._resetCols();var n=k(this._mergeNewItems(i),this.lastSort),s=this._filter(this.lastFilter,n),o=function(t){return i.includes(t)},r=function(t){t.scale=E.Scale.HIDDEN,t.isHidden=!0,t.applyCss(E.Css.HIDDEN.before),t.applyCss(E.Css.HIDDEN.after)},l=this._getNextPositions(s.visible);s.visible.forEach((function(t,i){o(t)&&(t.point=l[i],r(t),t.applyCss(e.getStylesForTransition(t,{})))})),s.hidden.forEach((function(t){o(t)&&r(t)})),this.element.offsetWidth,this.setItemTransitions(i),this.items=this._mergeNewItems(i),this.filter(this.lastFilter)}},{key:"disable",value:function(){this.isEnabled=!1}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.isEnabled=!0,t&&this.update()}},{key:"remove",value:function(t){var e=this;if(t.length){var i=R(t),n=i.map((function(t){return e.getItemByElement(t)})).filter((function(t){return!!t}));this._toggleFilterClasses({visible:[],hidden:n}),this._shrink(n),this.sort(),this.items=this.items.filter((function(t){return!n.includes(t)})),this._updateItemCount(),this.once(o.EventType.LAYOUT,(function(){e._disposeItems(n),i.forEach((function(t){t.parentNode.removeChild(t)})),e._dispatch(o.EventType.REMOVED,{collection:i})}))}}},{key:"getItemByElement",value:function(t){return this.items.find((function(e){return e.element===t}))}},{key:"resetItems",value:function(){var t=this;this._disposeItems(this.items),this.isInitialized=!1,this.items=this._getItems(),this._initItems(this.items),this.once(o.EventType.LAYOUT,(function(){t.setItemTransitions(t.items),t.isInitialized=!0})),this.filter(this.lastFilter)}},{key:"destroy",value:function(){this._cancelMovement(),window.removeEventListener("resize",this._onResize),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(this.items),this.items.length=0,this._transitions.length=0,this.options.sizer=null,this.element=null,this.isDestroyed=!0,this.isEnabled=!1}}],[{key:"getSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=window.getComputedStyle(t,null),n=T(t,"width",i),s=T(t,"height",i);if(e){var o=T(t,"marginLeft",i),r=T(t,"marginRight",i),l=T(t,"marginTop",i),a=T(t,"marginBottom",i);n+=o+r,s+=l+a}return{width:n,height:s}}},{key:"_skipTransitions",value:function(t,e){var i=t.map((function(t){var e=t.style,i=e.transitionDuration,n=e.transitionDelay;return e.transitionDuration="0ms",e.transitionDelay="0ms",{duration:i,delay:n}}));e(),t[0].offsetWidth,t.forEach((function(t,e){t.style.transitionDuration=i[e].duration,t.style.transitionDelay=i[e].delay}))}}]),o}(u);return B.ShuffleItem=E,B.ALL_ITEMS="all",B.FILTER_ATTRIBUTE_KEY="groups",B.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"},B.Classes=g,B.FilterMode={ANY:"any",ALL:"all"},B.options={group:B.ALL_ITEMS,speed:250,easing:"cubic-bezier(0.4, 0.0, 0.2, 1)",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimiter:null,buffer:0,columnThreshold:.01,initialSort:null,throttle:d,throttleTime:300,staggerAmount:15,staggerAmountMax:150,useTransforms:!0,filterMode:B.FilterMode.ANY,isCentered:!1,isRTL:!1,roundTransforms:!0},B.Point=v,B.Rect=y,B.__sorter=k,B.__getColumnSpan=A,B.__getAvailablePositions=F,B.__getShortColumn=x,B.__getCenteredPositions=O,B})); //# sourceMappingURL=shuffle.min.js.map diff --git a/docs/dist/shuffle.min.js.map b/docs/dist/shuffle.min.js.map index 50199b1..286b47e 100644 --- a/docs/dist/shuffle.min.js.map +++ b/docs/dist/shuffle.min.js.map @@ -1 +1 @@ -{"version":3,"file":"shuffle.min.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/layout.js","../src/array-min.js","../src/shuffle.js","../src/hyphenate.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","let value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n value = window.getComputedStyle(e, null).width === '10px';\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\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 // Add class and invalidate styles\n this.element.classList.add(Shuffle.Classes.BASE);\n\n // Set initial css for each item\n this._initItems(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n"],"names":["E","prototype","on","name","callback","ctx","e","this","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","proto","Element","vendor","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","el","selector","nodeType","nodes","parentNode","querySelectorAll","func","wait","args","rtn","timeoutID","last","delta","Date","setTimeout","noop","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","_this","_this2","obj","Object","keys","key","_this3","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","createElement","cssText","appendChild","window","getComputedStyle","removeChild","getNumberStyle","styles","testComputedSize","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","defaults","reverse","by","compare","randomize","sorter","arr","options","opts","assign","original","Array","from","revert","array","n","Math","floor","random","temp","sort","valA","valB","undefined","transitions","eventName","count","cancelTransitionEnd","removeEventListener","onTransitionEnd","evt","currentTarget","target","addEventListener","arrayMax","max","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","round","min","ceil","getAvailablePositions","positions","available","getShortColumn","buffer","minPosition","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","intersectingRect","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","rowIndex","findIndex","items","includes","splice","concat","map","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","TypeError","_init","_getItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","replace","str","m1","toLowerCase","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","shuffle","itemPositions","_getNextPositions","equals","_this4","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","itemSize","_this5","_getItemPosition","getTransformedPositions","gridSize","total","span","setY","shortColumnIndex","setHeight","getItemPosition","_getConcealedItems","_this6","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_this7","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","fns","context","pending","finished","results","maybeDone","err","result","parallel","_this8","_getTransitionFunction","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","_this9","sortedItems","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","_this10","getItemByElement","_disposeItems","REMOVED","find","_this11","includeMargins","marginLeft","marginRight","marginTop","marginBottom","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"shuffle.min.js","sources":["../node_modules/tiny-emitter/index.js","../node_modules/matches-selector/index.js","../node_modules/throttleit/index.js","../node_modules/array-parallel/index.js","../src/get-number.js","../src/point.js","../src/rect.js","../src/classes.js","../src/shuffle-item.js","../src/computed-size.js","../src/get-number-style.js","../src/sorter.js","../src/on-transition-end.js","../src/array-max.js","../src/layout.js","../src/array-min.js","../src/shuffle.js","../src/hyphenate.js"],"sourcesContent":["function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","'use strict';\n\nvar proto = typeof Element !== 'undefined' ? 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 (!el || el.nodeType !== 1) return false;\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","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","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 * 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","import getNumber from './get-number';\n\nclass Point {\n /**\n * Represents a coordinate pair.\n * @param {number} [x=0] X.\n * @param {number} [y=0] Y.\n */\n constructor(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 */\n static equals(a, b) {\n return a.x === b.x && a.y === b.y;\n }\n}\n\nexport default Point;\n","export default class Rect {\n /**\n * Class for representing rectangular regions.\n * https://github.com/google/closure-library/blob/master/closure/goog/math/rect.js\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} id Identifier\n * @constructor\n */\n constructor(x, y, w, h, id) {\n this.id = id;\n\n /** @type {number} */\n this.left = x;\n\n /** @type {number} */\n this.top = y;\n\n /** @type {number} */\n this.width = w;\n\n /** @type {number} */\n this.height = h;\n }\n\n /**\n * Returns whether two rectangles intersect.\n * @param {Rect} a A Rectangle.\n * @param {Rect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\n static intersects(a, b) {\n return (\n a.left < b.left + b.width && b.left < a.left + a.width\n && a.top < b.top + b.height && b.top < a.top + a.height);\n }\n}\n","export default {\n BASE: 'shuffle',\n SHUFFLE_ITEM: 'shuffle-item',\n VISIBLE: 'shuffle-item--visible',\n HIDDEN: 'shuffle-item--hidden',\n};\n","import Point from './point';\nimport Classes from './classes';\n\nlet id = 0;\n\nclass ShuffleItem {\n constructor(element, isRTL) {\n id += 1;\n this.id = id;\n this.element = element;\n\n /**\n * Set correct direction of item\n */\n this.isRTL = isRTL;\n\n /**\n * Used to separate items for layout and shrink.\n */\n this.isVisible = true;\n\n /**\n * Used to determine if a transition will happen. By the time the _layout\n * and _shrink methods get the ShuffleItem instances, the `isVisible` value\n * has already been changed by the separation methods, so this property is\n * needed to know if the item was visible/hidden before the shrink/layout.\n */\n this.isHidden = false;\n }\n\n show() {\n this.isVisible = true;\n this.element.classList.remove(Classes.HIDDEN);\n this.element.classList.add(Classes.VISIBLE);\n this.element.removeAttribute('aria-hidden');\n }\n\n hide() {\n this.isVisible = false;\n this.element.classList.remove(Classes.VISIBLE);\n this.element.classList.add(Classes.HIDDEN);\n this.element.setAttribute('aria-hidden', true);\n }\n\n init() {\n this.addClasses([Classes.SHUFFLE_ITEM, Classes.VISIBLE]);\n this.applyCss(ShuffleItem.Css.INITIAL);\n this.applyCss(this.isRTL ? ShuffleItem.Css.DIRECTION.rtl : ShuffleItem.Css.DIRECTION.ltr);\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 Object.keys(obj).forEach((key) => {\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 visibility: 'visible',\n willChange: 'transform',\n },\n DIRECTION: {\n ltr: {\n left: 0,\n },\n rtl: {\n right: 0,\n },\n },\n VISIBLE: {\n before: {\n opacity: 1,\n visibility: 'visible',\n },\n after: {\n transitionDelay: '',\n },\n },\n HIDDEN: {\n before: {\n opacity: 0,\n },\n after: {\n visibility: 'hidden',\n transitionDelay: '',\n },\n },\n};\n\nShuffleItem.Scale = {\n VISIBLE: 1,\n HIDDEN: 0.001,\n};\n\nexport default ShuffleItem;\n","import getNumber from './get-number';\n\nlet value = null;\nexport default () => {\n if (value !== null) {\n return value;\n }\n\n const element = document.body || document.documentElement;\n const e = document.createElement('div');\n e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\n element.appendChild(e);\n\n const { width } = window.getComputedStyle(e, null);\n // Fix for issue #314\n value = Math.round(getNumber(width)) === 10;\n\n element.removeChild(e);\n\n return value;\n};\n","import getNumber from './get-number';\nimport testComputedSize 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(\n element, style,\n styles = window.getComputedStyle(element, null),\n) {\n let value = getNumber(styles[style]);\n\n // Support IE<=11 and W3C spec.\n if (!testComputedSize() && style === 'width') {\n value += getNumber(styles.paddingLeft)\n + getNumber(styles.paddingRight)\n + getNumber(styles.borderLeftWidth)\n + getNumber(styles.borderRightWidth);\n } else if (!testComputedSize() && 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 * Fisher-Yates shuffle.\n * http://stackoverflow.com/a/962890/373422\n * https://bost.ocks.org/mike/shuffle/\n * @param {Array} array Array to shuffle.\n * @return {Array} Randomly sorted array.\n */\nfunction randomize(array) {\n let n = array.length;\n\n while (n) {\n n -= 1;\n const i = Math.floor(Math.random() * (n + 1));\n const temp = array[i];\n array[i] = array[n];\n array[n] = temp;\n }\n\n return array;\n}\n\nconst defaults = {\n // Use array.reverse() to reverse the results\n reverse: false,\n\n // Sorting function\n by: null,\n\n // Custom sort function\n compare: 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/**\n * You can return `undefined` from the `by` function to revert to DOM order.\n * @param {Array} arr Array to sort.\n * @param {SortOptions} options Sorting options.\n * @return {Array}\n */\nexport default function sorter(arr, options) {\n // eslint-disable-next-line prefer-object-spread\n const opts = Object.assign({}, defaults, options);\n const original = Array.from(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((a, b) => {\n // Exit early if we already know we want to revert\n if (revert) {\n return 0;\n }\n\n const valA = opts.by(a[opts.key]);\n const 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 } else if (typeof opts.compare === 'function') {\n arr.sort(opts.compare);\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","const transitions = {};\nconst eventName = 'transitionend';\nlet count = 0;\n\nfunction uniqueId() {\n count += 1;\n return eventName + count;\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\nexport function onTransitionEnd(element, callback) {\n const id = uniqueId();\n const 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","export default function arrayMax(array) {\n return Math.max.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import Point from './point';\nimport Rect from './rect';\nimport arrayMax from './array-max';\nimport arrayMin from './array-min';\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 let 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, 10]\n //\n // Next, find the first smallest number (the short column).\n // [20, 10, 10]\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 const available = [];\n\n // For how many possible positions for this item there are.\n for (let 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 const minPosition = arrayMin(positions);\n for (let 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 * 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({\n itemSize, positions, gridSize, total, threshold, buffer,\n}) {\n const span = getColumnSpan(itemSize.width, gridSize, total, threshold);\n const setY = getAvailablePositions(positions, span, total);\n const shortColumnIndex = getShortColumn(setY, buffer);\n\n // Position the item\n const point = new Point(gridSize * shortColumnIndex, 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 const setHeight = setY[shortColumnIndex] + itemSize.height;\n for (let i = 0; i < span; i++) {\n positions[shortColumnIndex + i] = setHeight;\n }\n\n return point;\n}\n\n/**\n * This method attempts to center items. This method could potentially be slow\n * with a large number of items because it must place items, then check every\n * previous item to ensure there is no overlap.\n * @param {Array.} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.}\n */\nexport function getCenteredPositions(itemRects, containerWidth) {\n const rowMap = {};\n\n // Populate rows by their offset because items could jump between rows like:\n // a c\n // bbb\n itemRects.forEach((itemRect) => {\n if (rowMap[itemRect.top]) {\n // Push the point to the last row array.\n rowMap[itemRect.top].push(itemRect);\n } else {\n // Start of a new row.\n rowMap[itemRect.top] = [itemRect];\n }\n });\n\n // For each row, find the end of the last item, then calculate\n // the remaining space by dividing it by 2. Then add that\n // offset to the x position of each point.\n let rects = [];\n const rows = [];\n const centeredRows = [];\n Object.keys(rowMap).forEach((key) => {\n const itemRects = rowMap[key];\n rows.push(itemRects);\n const lastItem = itemRects[itemRects.length - 1];\n const end = lastItem.left + lastItem.width;\n const offset = Math.round((containerWidth - end) / 2);\n\n let finalRects = itemRects;\n let canMove = false;\n if (offset > 0) {\n const newRects = [];\n canMove = itemRects.every((r) => {\n const newRect = new Rect(r.left + offset, r.top, r.width, r.height, r.id);\n\n // Check all current rects to make sure none overlap.\n const noOverlap = !rects.some((r) => Rect.intersects(newRect, r));\n\n newRects.push(newRect);\n return noOverlap;\n });\n\n // If none of the rectangles overlapped, the whole group can be centered.\n if (canMove) {\n finalRects = newRects;\n }\n }\n\n // If the items are not going to be offset, ensure that the original\n // placement for this row will not overlap previous rows (row-spanning\n // elements could be in the way).\n if (!canMove) {\n let intersectingRect;\n const hasOverlap = itemRects.some((itemRect) => rects.some((r) => {\n const intersects = Rect.intersects(itemRect, r);\n if (intersects) {\n intersectingRect = r;\n }\n return intersects;\n }));\n\n // If there is any overlap, replace the overlapping row with the original.\n if (hasOverlap) {\n const rowIndex = centeredRows.findIndex((items) => items.includes(intersectingRect));\n centeredRows.splice(rowIndex, 1, rows[rowIndex]);\n }\n }\n\n rects = rects.concat(finalRects);\n centeredRows.push(finalRects);\n });\n\n // Reduce array of arrays to a single array of points.\n // https://stackoverflow.com/a/10865042/373422\n // Then reset sort back to how the items were passed to this method.\n // Remove the wrapper object with index, map to a Point.\n return [].concat.apply([], centeredRows) // eslint-disable-line prefer-spread\n .sort((a, b) => (a.id - b.id))\n .map((itemRect) => new Point(itemRect.left, itemRect.top));\n}\n","export default function arrayMin(array) {\n return Math.min.apply(Math, array); // eslint-disable-line prefer-spread\n}\n","import TinyEmitter from 'tiny-emitter';\nimport matches from 'matches-selector';\nimport throttle from 'throttleit';\nimport parallel from 'array-parallel';\n\nimport Point from './point';\nimport Rect from './rect';\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 {\n getItemPosition,\n getColumnSpan,\n getAvailablePositions,\n getShortColumn,\n getCenteredPositions,\n} from './layout';\nimport arrayMax from './array-max';\nimport hyphenate from './hyphenate';\n\nfunction arrayUnique(x) {\n return Array.from(new Set(x));\n}\n\n// Used for unique instance variables\nlet id = 0;\n\nclass Shuffle extends TinyEmitter {\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 super();\n // eslint-disable-next-line prefer-object-spread\n this.options = Object.assign({}, Shuffle.options, options);\n\n // Allow misspelling of delimiter since that's how it used to be.\n // Remove in v6.\n if (this.options.delimeter) {\n this.options.delimiter = this.options.delimeter;\n }\n\n this.lastSort = {};\n this.group = Shuffle.ALL_ITEMS;\n 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 const el = this._getElementOption(element);\n\n if (!el) {\n throw new TypeError('Shuffle needs to be initialized with an element.');\n }\n\n this.element = el;\n this.id = 'shuffle_' + id;\n id += 1;\n\n this._init();\n this.isInitialized = true;\n }\n\n _init() {\n this.items = this._getItems();\n this.sortedItems = this.items;\n\n this.options.sizer = this._getElementOption(this.options.sizer);\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(this.items);\n\n // Bind resize events\n this._onResize = this._getResizeFunction();\n window.addEventListener('resize', this._onResize);\n\n // If the page has not already emitted the `load` event, call layout on load.\n // This avoids layout issues caused by images and fonts loading after the\n // instance has been initialized.\n if (document.readyState !== 'complete') {\n const layout = this.layout.bind(this);\n window.addEventListener('load', function onLoad() {\n window.removeEventListener('load', onLoad);\n layout();\n });\n }\n\n // Get container css all in one request. Causes reflow\n const containerCss = window.getComputedStyle(this.element, null);\n const 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; // eslint-disable-line no-unused-expressions\n this.setItemTransitions(this.items);\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 const 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\n // Check for an element\n if (option && option.nodeType && option.nodeType === 1) {\n return option;\n }\n\n // Check for jQuery object\n 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|string[]|function(Element):boolean} [category] Category to\n * filter by. If it's given, the last 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: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _filter(category = this.lastFilter, collection = this.items) {\n const 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|string[]|function(Element):boolean} category Category or function to filter by.\n * @param {ShuffleItem[]} items A collection of items to filter.\n * @return {{visible: ShuffleItem[], hidden: ShuffleItem[]}}\n * @private\n */\n _getFilteredSets(category, items) {\n let visible = [];\n const 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|string[]|function():boolean} 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 if (typeof category === 'function') {\n return category.call(element, element, this);\n }\n\n // Check each element's data-groups attribute against the given category.\n const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY);\n const keys = this.options.delimiter\n ? attr.split(this.options.delimiter)\n : JSON.parse(attr);\n\n function testCategory(category) {\n return keys.includes(category);\n }\n\n if (Array.isArray(category)) {\n if (this.options.filterMode === Shuffle.FilterMode.ANY) {\n return category.some(testCategory);\n }\n return category.every(testCategory);\n }\n\n return keys.includes(category);\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 {ShuffleItem[]} items Set to initialize.\n * @private\n */\n _initItems(items) {\n items.forEach((item) => {\n item.init();\n });\n }\n\n /**\n * Remove element reference and styles.\n * @param {ShuffleItem[]} items Set to dispose.\n * @private\n */\n _disposeItems(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 a new Shuffle instance.\n * @param {ShuffleItem[]} items Shuffle items to set transitions on.\n * @protected\n */\n setItemTransitions(items) {\n const { speed, easing } = this.options;\n const positionProps = this.options.useTransforms ? ['transform'] : ['top', 'left'];\n\n // Allow users to transtion other properties if they exist in the `before`\n // css mapping of the shuffle item.\n const cssProps = Object.keys(ShuffleItem.Css.HIDDEN.before).map((k) => hyphenate(k));\n const properties = positionProps.concat(cssProps).join();\n\n items.forEach((item) => {\n item.element.style.transitionDuration = speed + 'ms';\n item.element.style.transitionTimingFunction = easing;\n item.element.style.transitionProperty = properties;\n });\n }\n\n _getItems() {\n return Array.from(this.element.children)\n .filter((el) => matches(el, this.options.itemSelector))\n .map((el) => new ShuffleItem(el, this.options.isRTL));\n }\n\n /**\n * Combine the current items array with a new one and sort it by DOM order.\n * @param {ShuffleItem[]} items Items to track.\n * @return {ShuffleItem[]}\n */\n _mergeNewItems(items) {\n const children = Array.from(this.element.children);\n return sorter(this.items.concat(items), {\n by(element) {\n return children.indexOf(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 let 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.options.sizer) {\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 let size;\n if (typeof this.options.gutterWidth === 'function') {\n size = this.options.gutterWidth(containerWidth);\n } else if (this.options.sizer) {\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 const gutter = this._getGutterSize(containerWidth);\n const columnWidth = this._getColumnSize(containerWidth, gutter);\n let 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 || 0), 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 * Emit an event from this instance.\n * @param {string} name Event name.\n * @param {Object} [data={}] Optional object data.\n */\n _dispatch(name, data = {}) {\n if (this.isDestroyed) {\n return;\n }\n\n data.shuffle = this;\n this.emit(name, data);\n }\n\n /**\n * Zeros out the y columns array, which is used to determine item placement.\n * @private\n */\n _resetCols() {\n let i = this.cols;\n this.positions = [];\n while (i) {\n i -= 1;\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 {ShuffleItem[]} items Array of items that will be shown/layed\n * out in order in their array.\n */\n _layout(items) {\n const itemPositions = this._getNextPositions(items);\n\n let count = 0;\n items.forEach((item, i) => {\n function callback() {\n item.applyCss(ShuffleItem.Css.VISIBLE.after);\n }\n\n // If the item will not change its position, do not add it to the render\n // queue. Transitions don't fire when setting a property to the same value.\n if (Point.equals(item.point, itemPositions[i]) && !item.isHidden) {\n item.applyCss(ShuffleItem.Css.VISIBLE.before);\n callback();\n return;\n }\n\n item.point = itemPositions[i];\n item.scale = ShuffleItem.Scale.VISIBLE;\n item.isHidden = false;\n\n // Clone the object so that the `before` object isn't modified when the\n // transition delay is added.\n const styles = this.getStylesForTransition(item, 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 += 1;\n });\n }\n\n /**\n * Return an array of Point instances representing the future positions of\n * each item.\n * @param {ShuffleItem[]} items Array of sorted shuffle items.\n * @return {Point[]}\n * @private\n */\n _getNextPositions(items) {\n // If position data is going to be changed, add the item's size to the\n // transformer to allow for calculations.\n if (this.options.isCentered) {\n const itemsData = items.map((item, i) => {\n const itemSize = Shuffle.getSize(item.element, true);\n const point = this._getItemPosition(itemSize);\n return new Rect(point.x, point.y, itemSize.width, itemSize.height, i);\n });\n\n return this.getTransformedPositions(itemsData, this.containerWidth);\n }\n\n // If no transforms are going to happen, simply return an array of the\n // future points of each item.\n return items.map((item) => this._getItemPosition(Shuffle.getSize(item.element, true)));\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 * Mutate positions before they're applied.\n * @param {Rect[]} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Point[]}\n * @protected\n */\n getTransformedPositions(itemRects, containerWidth) {\n return getCenteredPositions(itemRects, containerWidth);\n }\n\n /**\n * Hides the elements that don't match our filter.\n * @param {ShuffleItem[]} 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.isHidden) {\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n callback();\n return;\n }\n\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n\n const styles = this.getStylesForTransition(item, 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 += 1;\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 this.update();\n }\n\n /**\n * Returns styles which will be applied to the an item for a transition.\n * @param {ShuffleItem} item Item to get styles for. Should have updated\n * scale and point properties.\n * @param {Object} styleObject Extra styles that will be used in the transition.\n * @return {!Object} Transforms for transitions, left/top for animate.\n * @protected\n */\n getStylesForTransition(item, styleObject) {\n // Clone the object to avoid mutating the original.\n // eslint-disable-next-line prefer-object-spread\n const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\n const sign = this.options.isRTL ? '-' : '';\n const x = this.options.roundTransforms ? Math.round(item.point.x) : item.point.x;\n const y = this.options.roundTransforms ? Math.round(item.point.y) : item.point.y;\n styles.transform = `translate(${sign}${x}px, ${y}px) scale(${item.scale})`;\n } else {\n if (this.options.isRTL) {\n styles.right = item.point.x + 'px';\n } else {\n styles.left = item.point.x + 'px';\n }\n styles.top = item.point.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 const 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(opts.styles);\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 const hasSpeed = this.options.speed > 0;\n const 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._dispatch(Shuffle.EventType.LAYOUT);\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._dispatch(Shuffle.EventType.LAYOUT);\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 {Object[]} 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 const 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 {Object[]} objects Array of transition objects.\n * @private\n */\n _styleImmediately(objects) {\n if (objects.length) {\n const elements = objects.map((obj) => obj.item.element);\n\n Shuffle._skipTransitions(elements, () => {\n objects.forEach((obj) => {\n obj.item.applyCss(obj.styles);\n obj.callback();\n });\n });\n }\n }\n\n _movementFinished() {\n this._transitions.length = 0;\n this.isTransitioning = false;\n this._dispatch(Shuffle.EventType.LAYOUT);\n }\n\n /**\n * The magic. This is what makes the plugin 'shuffle'\n * @param {string|string[]|function(Element):boolean} [category] Category to filter by.\n * Can be a function, string, or array of strings.\n * @param {SortOptions} [sortOptions] A sort object which can sort the visible set\n */\n filter(category, sortOptions) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // eslint-disable-line no-param-reassign\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(sortOptions);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {SortOptions} [sortOptions] The options object to pass to `sorter`.\n */\n sort(sortOptions = this.lastSort) {\n if (!this.isEnabled) {\n return;\n }\n\n this._resetCols();\n\n const items = sorter(this._getFilteredItems(), sortOptions);\n this.sortedItems = items;\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 = sortOptions;\n }\n\n /**\n * Reposition everything.\n * @param {boolean} [isOnlyLayout=false] If true, column and gutter widths won't be recalculated.\n */\n update(isOnlyLayout = false) {\n if (this.isEnabled) {\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 {Element[]} newItems Collection of new items.\n */\n add(newItems) {\n const items = arrayUnique(newItems).map((el) => new ShuffleItem(el, this.options.isRTL));\n\n // Add classes and set initial positions.\n this._initItems(items);\n\n // Determine which items will go with the current filter.\n this._resetCols();\n\n const allItems = this._mergeNewItems(items);\n const sortedItems = sorter(allItems, this.lastSort);\n const allSortedItemsSet = this._filter(this.lastFilter, sortedItems);\n\n const isNewItem = (item) => items.includes(item);\n const applyHiddenState = (item) => {\n item.scale = ShuffleItem.Scale.HIDDEN;\n item.isHidden = true;\n item.applyCss(ShuffleItem.Css.HIDDEN.before);\n item.applyCss(ShuffleItem.Css.HIDDEN.after);\n };\n\n // Layout all items again so that new items get positions.\n // Synchonously apply positions.\n const itemPositions = this._getNextPositions(allSortedItemsSet.visible);\n allSortedItemsSet.visible.forEach((item, i) => {\n if (isNewItem(item)) {\n item.point = itemPositions[i];\n applyHiddenState(item);\n item.applyCss(this.getStylesForTransition(item, {}));\n }\n });\n\n allSortedItemsSet.hidden.forEach((item) => {\n if (isNewItem(item)) {\n applyHiddenState(item);\n }\n });\n\n // Cause layout so that the styles above are applied.\n this.element.offsetWidth; // eslint-disable-line no-unused-expressions\n\n // Add transition to each item.\n this.setItemTransitions(items);\n\n // Update the list of items.\n this.items = this._mergeNewItems(items);\n\n // Update layout/visibility of new and old items.\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 = true) {\n this.isEnabled = true;\n if (isUpdateLayout) {\n this.update();\n }\n }\n\n /**\n * Remove 1 or more shuffle items.\n * @param {Element[]} elements An array containing one or more\n * elements in shuffle\n * @return {Shuffle} The shuffle instance.\n */\n remove(elements) {\n if (!elements.length) {\n return;\n }\n\n const collection = arrayUnique(elements);\n\n const oldItems = collection\n .map((element) => this.getItemByElement(element))\n .filter((item) => !!item);\n\n const 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\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) => !oldItems.includes(item));\n this._updateItemCount();\n\n this.once(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 undefined if it's not found.\n */\n getItemByElement(element) {\n return this.items.find((item) => item.element === element);\n }\n\n /**\n * Dump the elements currently stored and reinitialize all child elements which\n * match the `itemSelector`.\n */\n resetItems() {\n // Remove refs to current items.\n this._disposeItems(this.items);\n this.isInitialized = false;\n\n // Find new items in the DOM.\n this.items = this._getItems();\n\n // Set initial styles on the new items.\n this._initItems(this.items);\n\n this.once(Shuffle.EventType.LAYOUT, () => {\n // Add transition to each item.\n this.setItemTransitions(this.items);\n this.isInitialized = true;\n });\n\n // Lay out all items.\n this.filter(this.lastFilter);\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(this.items);\n\n this.items.length = 0;\n this._transitions.length = 0;\n\n // Null DOM references\n this.options.sizer = null;\n this.element = 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 this.isEnabled = false;\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=false] Whether to include margins.\n * @return {{width: number, height: number}} The width and height.\n */\n static getSize(element, includeMargins = false) {\n // Store the styles so that they can be used by others without asking for it again.\n const styles = window.getComputedStyle(element, null);\n let width = getNumberStyle(element, 'width', styles);\n let height = getNumberStyle(element, 'height', styles);\n\n if (includeMargins) {\n const marginLeft = getNumberStyle(element, 'marginLeft', styles);\n const marginRight = getNumberStyle(element, 'marginRight', styles);\n const marginTop = getNumberStyle(element, 'marginTop', styles);\n const 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 {Element[]} 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 const zero = '0ms';\n\n // Save current duration and delay.\n const data = elements.map((element) => {\n const { style } = element;\n const duration = style.transitionDuration;\n const 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 forced synchronous layout.\n elements[0].offsetWidth; // eslint-disable-line no-unused-expressions\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/** @enum {string} */\nShuffle.EventType = {\n LAYOUT: 'shuffle:layout',\n REMOVED: 'shuffle:removed',\n};\n\n/** @enum {string} */\nShuffle.Classes = Classes;\n\n/** @enum {string} */\nShuffle.FilterMode = {\n ANY: 'any',\n ALL: 'all',\n};\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: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\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 delimiter\n // to ','.\n delimiter: 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,\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: 150,\n\n // Whether to use transforms or absolute positioning.\n useTransforms: true,\n\n // Affects using an array with filter. e.g. `filter(['one', 'two'])`. With \"any\",\n // the element passes the test if any of its groups are in the array. With \"all\",\n // the element only passes if all groups are in the array.\n filterMode: Shuffle.FilterMode.ANY,\n\n // Attempt to center grid items in each row.\n isCentered: false,\n\n // Attempt to align grid items to right.\n isRTL: false,\n\n // Whether to round pixel values used in translate(x, y). This usually avoids\n // blurriness.\n roundTransforms: true,\n};\n\nShuffle.Point = Point;\nShuffle.Rect = Rect;\n\n// Expose for testing. Hack at your own risk.\nShuffle.__sorter = sorter;\nShuffle.__getColumnSpan = getColumnSpan;\nShuffle.__getAvailablePositions = getAvailablePositions;\nShuffle.__getShortColumn = getShortColumn;\nShuffle.__getCenteredPositions = getCenteredPositions;\n\nexport default Shuffle;\n","/**\n * Hyphenates a javascript style string to a css one. For example:\n * MozBoxSizing -> -moz-box-sizing.\n * @param {string} str The string to hyphenate.\n * @return {string} The hyphenated string.\n */\nexport default function hyphenate(str) {\n return str.replace(/([A-Z])/g, (str, m1) => `-${m1.toLowerCase()}`);\n}\n"],"names":["E","prototype","on","name","callback","ctx","e","this","push","fn","once","self","listener","off","apply","arguments","_","emit","data","slice","call","evtArr","i","len","length","evts","liveEvents","proto","Element","vendor","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","el","selector","nodeType","nodes","parentNode","querySelectorAll","throttleit","func","wait","args","rtn","timeoutID","last","delta","Date","setTimeout","noop","getNumber","value","parseFloat","Point","x","y","a","b","Rect","w","h","id","left","top","width","height","BASE","SHUFFLE_ITEM","VISIBLE","HIDDEN","ShuffleItem","element","isRTL","isVisible","isHidden","classList","remove","Classes","add","removeAttribute","setAttribute","addClasses","applyCss","Css","INITIAL","DIRECTION","rtl","ltr","scale","Scale","point","classes","forEach","className","_this","_this2","obj","Object","keys","key","_this3","style","removeClasses","position","visibility","willChange","right","before","opacity","after","transitionDelay","document","body","documentElement","createElement","cssText","appendChild","window","getComputedStyle","Math","round","removeChild","getNumberStyle","styles","testComputedSize","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","defaults","reverse","by","compare","randomize","sorter","arr","options","opts","assign","original","Array","from","revert","array","n","floor","random","temp","sort","valA","valB","undefined","transitions","eventName","count","cancelTransitionEnd","removeEventListener","onTransitionEnd","evt","currentTarget","target","addEventListener","arrayMax","max","getColumnSpan","itemWidth","columnWidth","columns","threshold","columnSpan","abs","min","ceil","getAvailablePositions","positions","available","getShortColumn","buffer","minPosition","getCenteredPositions","itemRects","containerWidth","rowMap","itemRect","rects","rows","centeredRows","intersectingRect","lastItem","end","offset","finalRects","canMove","newRects","every","r","newRect","noOverlap","some","intersects","rowIndex","findIndex","items","includes","splice","concat","map","arrayUnique","Set","Shuffle","delimeter","delimiter","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","_getElementOption","TypeError","_init","_getItems","sortedItems","sizer","_initItems","_onResize","_getResizeFunction","readyState","layout","bind","onLoad","containerCss","getSize","_validateStyles","_setColumns","filter","initialSort","offsetWidth","setItemTransitions","transition","speed","easing","resizeFunction","_handleResize","throttle","throttleTime","option","querySelector","jquery","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","attr","getAttribute","FILTER_ATTRIBUTE_KEY","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","k","replace","str","m1","toLowerCase","properties","join","transitionDuration","transitionTimingFunction","transitionProperty","children","itemSelector","indexOf","gutterSize","size","gutterWidth","gutter","_getGutterSize","_getColumnSize","calculatedColumns","columnThreshold","cols","colWidth","_getContainerSize","index","staggerAmount","staggerAmountMax","shuffle","itemPositions","_getNextPositions","equals","_this4","getStylesForTransition","_getStaggerAmount","isCentered","itemsData","itemSize","_this5","_getItemPosition","getTransformedPositions","gridSize","total","span","setY","shortColumnIndex","setHeight","getItemPosition","_getConcealedItems","_this6","update","styleObject","sign","roundTransforms","transform","itemCallback","done","_this7","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","fns","context","pending","finished","results","maybeDone","err","result","parallel","_this8","_getTransitionFunction","_movementFinished","objects","elements","_skipTransitions","sortOptions","_filter","_shrink","_updateItemCount","_resetCols","_layout","_processQueue","_setContainerSize","isOnlyLayout","newItems","_this9","_mergeNewItems","allSortedItemsSet","isNewItem","applyHiddenState","isUpdateLayout","oldItems","_this10","getItemByElement","_disposeItems","REMOVED","find","_this11","includeMargins","marginLeft","marginRight","marginTop","marginBottom","duration","delay","TinyEmitter","ALL","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index 5f22dff..21e1a6b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -82,7 +82,7 @@ export interface ShuffleOptions { /** * Whether to round pixel values used in translate(x, y). This usually avoids blurriness. */ - roundTransforms?: boolean, + roundTransforms?: boolean; /** * Element or selector string. Use an element to determine the size of columns and gutters. @@ -246,7 +246,7 @@ declare class Shuffle extends TinyEmitter { * Returns styles which will be applied to the an item for a transition. * @param {object} obj Transition options. */ - protected getStylesForTransition(obj: { item: Shuffle.ShuffleItem, styles: InlineCssStyles }): InlineCssStyles; + protected getStylesForTransition(obj: { item: Shuffle.ShuffleItem; styles: InlineCssStyles }): InlineCssStyles; /** * Mutate positions before they're applied. @@ -293,8 +293,12 @@ declare class Shuffle extends TinyEmitter { /** Whether items are currently transitioning */ isTransitioning: boolean; - /** ShuffleItems being kept track of */ + /** ShuffleItems being kept track of, sorted in DOM order. */ items: Shuffle.ShuffleItem[]; + + /** Visible ShuffleItems being tracked, sorted in the current sort order */ + sortedItems: Shuffle.ShuffleItem[]; + lastFilter: FilterArg; lastSort: SortOptions; @@ -312,7 +316,7 @@ declare class Shuffle extends TinyEmitter { * @param {HTMLElement} element The element. * @param {boolean} [includeMargins=false] Whether to include margins. */ - static getSize(element: HTMLElement, includeMargins?: boolean): {width: number, height: number}; + static getSize(element: HTMLElement, includeMargins?: boolean): { width: number; height: number }; } declare namespace Shuffle { diff --git a/package.json b/package.json index a02032b..ecb09fa 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "cssnano": "^5.0.4", "eslint": "^7.5.0", "eslint-config-airbnb-base": "^14.0.0", + "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.17.3", "gulp": "^4.0.2", "gulp-postcss": "^9.0.0", diff --git a/src/computed-size.js b/src/computed-size.js index 41d1514..01d1c8c 100644 --- a/src/computed-size.js +++ b/src/computed-size.js @@ -1,3 +1,5 @@ +import getNumber from './get-number'; + let value = null; export default () => { if (value !== null) { @@ -9,7 +11,9 @@ export default () => { e.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;'; element.appendChild(e); - value = window.getComputedStyle(e, null).width === '10px'; + const { width } = window.getComputedStyle(e, null); + // Fix for issue #314 + value = Math.round(getNumber(width)) === 10; element.removeChild(e); diff --git a/src/shuffle.js b/src/shuffle.js index a661506..b2f9330 100644 --- a/src/shuffle.js +++ b/src/shuffle.js @@ -10,13 +10,7 @@ import Classes from './classes'; import getNumberStyle from './get-number-style'; import sorter from './sorter'; import { onTransitionEnd, cancelTransitionEnd } from './on-transition-end'; -import { - getItemPosition, - getColumnSpan, - getAvailablePositions, - getShortColumn, - getCenteredPositions, -} from './layout'; +import { getItemPosition, getColumnSpan, getAvailablePositions, getShortColumn, getCenteredPositions } from './layout'; import arrayMax from './array-max'; import hyphenate from './hyphenate'; @@ -72,6 +66,7 @@ class Shuffle extends TinyEmitter { _init() { this.items = this._getItems(); + this.sortedItems = this.items; this.options.sizer = this._getElementOption(this.options.sizer); @@ -126,9 +121,7 @@ class Shuffle extends TinyEmitter { */ _getResizeFunction() { const resizeFunction = this._handleResize.bind(this); - return this.options.throttle - ? this.options.throttle(resizeFunction, this.options.throttleTime) - : resizeFunction; + return this.options.throttle ? this.options.throttle(resizeFunction, this.options.throttleTime) : resizeFunction; } /** @@ -216,8 +209,8 @@ class Shuffle extends TinyEmitter { if (category === Shuffle.ALL_ITEMS) { visible = items; - // Loop through each item and use provided function to determine - // whether to hide it or not. + // Loop through each item and use provided function to determine + // whether to hide it or not. } else { items.forEach((item) => { if (this._doesPassFilter(category, item.element)) { @@ -248,9 +241,7 @@ class Shuffle extends TinyEmitter { // Check each element's data-groups attribute against the given category. const attr = element.getAttribute('data-' + Shuffle.FILTER_ATTRIBUTE_KEY); - const keys = this.options.delimiter - ? attr.split(this.options.delimiter) - : JSON.parse(attr); + const keys = this.options.delimiter ? attr.split(this.options.delimiter) : JSON.parse(attr); function testCategory(category) { return keys.includes(category); @@ -376,19 +367,19 @@ class Shuffle extends TinyEmitter { if (typeof this.options.columnWidth === 'function') { size = this.options.columnWidth(containerWidth); - // columnWidth option isn't a function, are they using a sizing element? + // columnWidth option isn't a function, are they using a sizing element? } else if (this.options.sizer) { size = Shuffle.getSize(this.options.sizer).width; - // if not, how about the explicitly set option? + // 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 + // 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 + // if there's no items, use size of container } else { size = containerWidth; } @@ -431,8 +422,7 @@ class Shuffle extends TinyEmitter { let calculatedColumns = (containerWidth + gutter) / columnWidth; // Widths given from getStyles are not precise enough... - if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) - < this.options.columnThreshold) { + if (Math.abs(Math.round(calculatedColumns) - calculatedColumns) < this.options.columnThreshold) { // e.g. calculatedColumns = 11.998876 calculatedColumns = Math.round(calculatedColumns); } @@ -719,9 +709,9 @@ class Shuffle extends TinyEmitter { this._styleImmediately(this._queue); this._dispatch(Shuffle.EventType.LAYOUT); - // 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. + // 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._dispatch(Shuffle.EventType.LAYOUT); } @@ -818,6 +808,7 @@ class Shuffle extends TinyEmitter { this._resetCols(); const items = sorter(this._getFilteredItems(), sortOptions); + this.sortedItems = items; this._layout(items); @@ -943,9 +934,7 @@ class Shuffle extends TinyEmitter { const collection = arrayUnique(elements); - const oldItems = collection - .map((element) => this.getItemByElement(element)) - .filter((item) => !!item); + const oldItems = collection.map((element) => this.getItemByElement(element)).filter((item) => !!item); const handleLayout = () => { this._disposeItems(oldItems); @@ -1025,6 +1014,7 @@ class Shuffle extends TinyEmitter { this._disposeItems(this.items); this.items.length = 0; + this.sortedItems.length = 0; this._transitions.length = 0; // Null DOM references diff --git a/test/fixtures.js b/test/fixtures.js index c42152b..11fd393 100644 --- a/test/fixtures.js +++ b/test/fixtures.js @@ -26,4 +26,4 @@ export const delimiter = `
Person 9
Person 10
-` +`; diff --git a/test/test.js b/test/test.js index 6398752..2fe16cb 100644 --- a/test/test.js +++ b/test/test.js @@ -38,7 +38,6 @@ describe('shuffle', () => { } describe('regular fixture', () => { - beforeEach(() => { // Mock the transition end event wrapper. sinon.stub(Shuffle.prototype, '_whenTransitionDone').callsFake(whenTransitionDoneStub); @@ -55,6 +54,7 @@ describe('shuffle', () => { instance = new Shuffle(fixture); expect(instance.items.length).toBe(10); expect(instance.visibleItems).toBe(10); + expect(instance.sortedItems).toHaveLength(10); expect(instance.options.group).toBe('all'); expect(instance.options.speed).toBe(250); expect(instance.options.itemSelector).toBe('*'); @@ -165,23 +165,23 @@ describe('shuffle', () => { expect(instance.positions).toEqual([40, 40, 30, 30]); }); - it('can filter by the data attribute', done => { + it('can filter by the data attribute', (done) => { instance = new Shuffle(fixture, { speed: 0, }); function second() { expect(instance.visibleItems).toBe(3); - const hidden = [3, 4, 5, 6, 7, 8, 10].map(num => id(`item${num}`)); + const hidden = [3, 4, 5, 6, 7, 8, 10].map((num) => id(`item${num}`)); - const visible = [1, 2, 9].map(num => id(`item${num}`)); + const visible = [1, 2, 9].map((num) => id(`item${num}`)); - hidden.forEach(element => { + hidden.forEach((element) => { expect(element.classList.contains(Shuffle.Classes.HIDDEN)).toBe(true); expect(element.style.visibility).toBe('hidden'); }); - visible.forEach(element => { + visible.forEach((element) => { expect(element.classList.contains(Shuffle.Classes.VISIBLE)).toBe(true); expect(element.style.visibility).toBe('visible'); }); @@ -194,16 +194,16 @@ describe('shuffle', () => { function third() { expect(instance.visibleItems).toBe(2); - const hidden = [1, 2, 5, 6, 7, 8, 9, 10].map(num => id(`item${num}`)); + const hidden = [1, 2, 5, 6, 7, 8, 9, 10].map((num) => id(`item${num}`)); - const visible = [3, 4].map(num => id(`item${num}`)); + const visible = [3, 4].map((num) => id(`item${num}`)); - hidden.forEach(element => { + hidden.forEach((element) => { expect(element.classList.contains(Shuffle.Classes.HIDDEN)).toBe(true); expect(element.style.visibility).toBe('hidden'); }); - visible.forEach(element => { + visible.forEach((element) => { expect(element.classList.contains(Shuffle.Classes.VISIBLE)).toBe(true); expect(element.style.visibility).toBe('visible'); }); @@ -264,15 +264,20 @@ describe('shuffle', () => { it('can center already-positioned items', () => { // 4-2-1 even heights - expect(Shuffle.__getCenteredPositions([ - new Shuffle.Rect(0, 0, 250, 100, 0), - new Shuffle.Rect(250, 0, 250, 100, 1), - new Shuffle.Rect(500, 0, 250, 100, 2), - new Shuffle.Rect(750, 0, 250, 100, 3), - new Shuffle.Rect(0, 100, 600, 100, 4), - new Shuffle.Rect(600, 100, 300, 100, 5), - new Shuffle.Rect(0, 200, 250, 100, 6), - ], 1000)).toEqual([ + expect( + Shuffle.__getCenteredPositions( + [ + new Shuffle.Rect(0, 0, 250, 100, 0), + new Shuffle.Rect(250, 0, 250, 100, 1), + new Shuffle.Rect(500, 0, 250, 100, 2), + new Shuffle.Rect(750, 0, 250, 100, 3), + new Shuffle.Rect(0, 100, 600, 100, 4), + new Shuffle.Rect(600, 100, 300, 100, 5), + new Shuffle.Rect(0, 200, 250, 100, 6), + ], + 1000, + ), + ).toEqual([ new Shuffle.Point(0, 0), new Shuffle.Point(250, 0), new Shuffle.Point(500, 0), @@ -287,15 +292,16 @@ describe('shuffle', () => { // 2x1 // Centers the first row, but then finds that the 3rd item will overlap // the 2x2 and resets the first row. - expect(Shuffle.__getCenteredPositions([ - new Shuffle.Rect(0, 0, 500, 200, 0), - new Shuffle.Rect(500, 0, 250, 100, 1), - new Shuffle.Rect(500, 100, 500, 100, 2), - ], 1000)).toEqual([ - new Shuffle.Point(0, 0), - new Shuffle.Point(500, 0), - new Shuffle.Point(500, 100), - ]); + expect( + Shuffle.__getCenteredPositions( + [ + new Shuffle.Rect(0, 0, 500, 200, 0), + new Shuffle.Rect(500, 0, 250, 100, 1), + new Shuffle.Rect(500, 100, 500, 100, 2), + ], + 1000, + ), + ).toEqual([new Shuffle.Point(0, 0), new Shuffle.Point(500, 0), new Shuffle.Point(500, 100)]); }); it('can get an element option', () => { @@ -317,12 +323,14 @@ describe('shuffle', () => { expect(instance._doesPassFilter('design', first)).toBe(true); expect(instance._doesPassFilter('black', first)).toBe(false); - expect(instance._doesPassFilter(element => { - expect(element).toBeDefined(); - return element.getAttribute('data-age') === '21'; - }, first)).toBe(true); + expect( + instance._doesPassFilter((element) => { + expect(element).toBeDefined(); + return element.getAttribute('data-age') === '21'; + }, first), + ).toBe(true); - expect(instance._doesPassFilter(element => element.getAttribute('data-age') === '22', first)).toBe(false); + expect(instance._doesPassFilter((element) => element.getAttribute('data-age') === '22', first)).toBe(false); // Arrays. expect(instance._doesPassFilter(['design'], first)).toBe(true); @@ -348,7 +356,39 @@ describe('shuffle', () => { instance.sort(); expect(instance.lastSort).toEqual({ glen: true }); + }); + it('tracks sorted items', () => { + instance = new Shuffle(fixture); + expect(instance.sortedItems.map((item) => item.element.id)).toEqual([ + 'item1', + 'item2', + 'item3', + 'item4', + 'item5', + 'item6', + 'item7', + 'item8', + 'item9', + 'item10', + ]); + + instance.sort({ + reverse: true, + }); + + expect(instance.sortedItems.map((item) => item.element.id)).toEqual([ + 'item10', + 'item9', + 'item8', + 'item7', + 'item6', + 'item5', + 'item4', + 'item3', + 'item2', + 'item1', + ]); }); it('should reset columns', () => { @@ -376,7 +416,7 @@ describe('shuffle', () => { expect(fixture.classList.contains('shuffle')).toBe(false); - Array.from(fixture.children).forEach(child => { + Array.from(fixture.children).forEach((child) => { expect(child.classList.contains('shuffle-item')).toBe(false); expect(child.classList.contains('shuffle-item--visible')).toBe(false); expect(child.classList.contains('shuffle-item--hidden')).toBe(false); @@ -422,7 +462,7 @@ describe('shuffle', () => { children = null; }); - it('can remove items', done => { + it('can remove items', (done) => { instance = new Shuffle(fixture, { speed: 16, }); @@ -440,7 +480,7 @@ describe('shuffle', () => { instance.remove(itemsToRemove); }); - it('can remove items without transforms', done => { + it('can remove items without transforms', (done) => { instance = new Shuffle(fixture, { speed: 100, useTransforms: false, @@ -517,13 +557,14 @@ describe('shuffle', () => { items.length = 0; }); - it('can add items', done => { + it('can add items', (done) => { fixture.appendChild(items[0]); fixture.appendChild(items[1]); instance.add(items); // Already 2 in the items, plus number 11. expect(instance.visibleItems).toBe(3); + expect(instance.sortedItems.map((item) => item.element.id)).toEqual(['item8', 'item10', 'item11']); expect(instance.items).toHaveLength(12); instance.once(Shuffle.EventType.LAYOUT, () => { @@ -531,13 +572,14 @@ describe('shuffle', () => { }); }); - it('can prepend items', done => { + it('can prepend items', (done) => { fixture.insertBefore(items[1], fixture.firstElementChild); fixture.insertBefore(items[0], fixture.firstElementChild); instance.add(items); expect(instance.items[0].element).toBe(items[0]); expect(instance.items[1].element).toBe(items[1]); + expect(instance.sortedItems.map((item) => item.element.id)).toEqual(['item11', 'item8', 'item10']); expect(instance.items).toHaveLength(12); instance.once(Shuffle.EventType.LAYOUT, () => { @@ -557,7 +599,6 @@ describe('shuffle', () => { expect(instance.items[1].element).toBe(items[1]); expect(instance.items).toHaveLength(2); }); - }); }); @@ -611,7 +652,7 @@ describe('shuffle', () => { // The layout method will have already set styles to their 'after' states // upon initialization. Reset them here. - instance.items.forEach(item => { + instance.items.forEach((item) => { item.applyCss(Shuffle.ShuffleItem.Css.INITIAL); }); @@ -635,8 +676,8 @@ describe('shuffle', () => { beforeEach(() => { appendFixture('regular'); - items = Array.from(fixture.children).map(element => ({ - element + items = Array.from(fixture.children).map((element) => ({ + element, })); clone = Array.from(items); @@ -678,11 +719,13 @@ describe('shuffle', () => { }); it('can sort by a function and reverse it', () => { - clone.sort((a, b) => { - const age1 = parseInt(a.element.getAttribute('data-age'), 10); - const age2 = parseInt(b.element.getAttribute('data-age'), 10); - return age1 - age2; - }).reverse(); + clone + .sort((a, b) => { + const age1 = parseInt(a.element.getAttribute('data-age'), 10); + const age2 = parseInt(b.element.getAttribute('data-age'), 10); + return age1 - age2; + }) + .reverse(); const result = Shuffle.__sorter(items, { reverse: true, @@ -696,42 +739,48 @@ describe('shuffle', () => { it('will revert to DOM order if the `by` function returns undefined', () => { let count = 0; - expect(Shuffle.__sorter(items, { - by() { - count++; - return count < 5 ? Math.random() : undefined; - }, - })).toEqual(clone); + expect( + Shuffle.__sorter(items, { + by() { + count++; + return count < 5 ? Math.random() : undefined; + }, + }), + ).toEqual(clone); }); it('can sort things to the top', () => { items = items.slice(0, 4); const final = [items[1], items[0], items[3], items[2]]; - expect(Shuffle.__sorter(items, { - by(element) { - const age = parseInt(element.getAttribute('data-age'), 10); - if (age === 50) { - return 'sortFirst'; - } else { - return age; - } - }, - })).toEqual(final); + expect( + Shuffle.__sorter(items, { + by(element) { + const age = parseInt(element.getAttribute('data-age'), 10); + if (age === 50) { + return 'sortFirst'; + } else { + return age; + } + }, + }), + ).toEqual(final); }); it('can sort things to the bottom', () => { items = items.slice(0, 4); const final = [items[0], items[2], items[1], items[3]]; - expect(Shuffle.__sorter(items, { - by(element) { - const age = parseInt(element.getAttribute('data-age'), 10); - if (age === 27) { - return 'sortLast'; - } else { - return age; - } - }, - })).toEqual(final); + expect( + Shuffle.__sorter(items, { + by(element) { + const age = parseInt(element.getAttribute('data-age'), 10); + if (age === 27) { + return 'sortLast'; + } else { + return age; + } + }, + }), + ).toEqual(final); }); it('can have a custom sort comparator', () => { @@ -747,25 +796,26 @@ describe('shuffle', () => { clone[3], // ux, 27 clone[4], // ux, 35 ]; - expect(Shuffle.__sorter(items, { - compare(a, b) { - // Sort by first group, then by age. - const groupA = JSON.parse(a.element.getAttribute('data-groups'))[0]; - const groupB = JSON.parse(b.element.getAttribute('data-groups'))[0]; - if (groupA > groupB) { - return 1; - } - if (groupA < groupB) { - return -1; - } - - // At this point, the group strings are the exact same. Test the age. - const ageA = parseInt(a.element.getAttribute('data-age'), 10); - const ageB = parseInt(b.element.getAttribute('data-age'), 10); - return ageA - ageB; - }, - })).toEqual(final); + expect( + Shuffle.__sorter(items, { + compare(a, b) { + // Sort by first group, then by age. + const groupA = JSON.parse(a.element.getAttribute('data-groups'))[0]; + const groupB = JSON.parse(b.element.getAttribute('data-groups'))[0]; + if (groupA > groupB) { + return 1; + } + if (groupA < groupB) { + return -1; + } + + // At this point, the group strings are the exact same. Test the age. + const ageA = parseInt(a.element.getAttribute('data-age'), 10); + const ageB = parseInt(b.element.getAttribute('data-age'), 10); + return ageA - ageB; + }, + }), + ).toEqual(final); }); - }); }); diff --git a/test/types/types.ts b/test/types/types.ts index 297ca8e..e931494 100644 --- a/test/types/types.ts +++ b/test/types/types.ts @@ -9,12 +9,7 @@ if (!mainElement) { throw new TypeError('oopsie'); } -console.log( - Shuffle.EventType.LAYOUT, - Shuffle.Classes.SHUFFLE_ITEM, - Shuffle.FilterMode.ALL, - Shuffle.ShuffleItem.Css, -); +console.log(Shuffle.EventType.LAYOUT, Shuffle.Classes.SHUFFLE_ITEM, Shuffle.FilterMode.ALL, Shuffle.ShuffleItem.Css); const options: ShuffleOptions = { buffer: 0, @@ -49,6 +44,7 @@ const sortOptions: SortOptions = { }, }; shuffle.sort(sortOptions); +console.log(shuffle.sortedItems); shuffle.update(true); Shuffle.getSize(mainElement, true);