You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Vestride_Shuffle/docs/dist/shuffle.js.map

1 line
89 KiB
Plaintext

{"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;\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) {\n id += 1;\n this.id = id;\n this.element = element;\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.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 left: 0,\n visibility: 'visible',\n 'will-change': 'transform',\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","const element = document.body || document.documentElement;\nconst e = document.createElement('div');\ne.style.cssText = 'width:10px;padding:2px;box-sizing:border-box;';\nelement.appendChild(e);\n\nconst { width } = window.getComputedStyle(e, null);\nconst ret = width === '10px';\n\nelement.removeChild(e);\n\nexport default ret;\n","import getNumber from './get-number';\nimport COMPUTED_SIZE_INCLUDES_PADDING from './computed-size';\n\n/**\n * Retrieve the computed style for an element, parsed as a float.\n * @param {Element} element Element to get style for.\n * @param {string} style Style property.\n * @param {CSSStyleDeclaration} [styles] Optionally include clean styles to\n * use instead of asking for them again.\n * @return {number} The parsed computed value or zero if that fails because IE\n * will return 'auto' when the element doesn't have margins instead of\n * the computed style.\n */\nexport default function getNumberStyle(\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 (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'width') {\n value += getNumber(styles.paddingLeft) +\n getNumber(styles.paddingRight) +\n getNumber(styles.borderLeftWidth) +\n getNumber(styles.borderRightWidth);\n } else if (!COMPUTED_SIZE_INCLUDES_PADDING && style === 'height') {\n value += getNumber(styles.paddingTop) +\n getNumber(styles.paddingBottom) +\n getNumber(styles.borderTopWidth) +\n getNumber(styles.borderBottomWidth);\n }\n\n return value;\n}\n","/**\n * 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// You can return `undefined` from the `by` function to revert to DOM order.\nexport default function sorter(arr, options) {\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.<number>} 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.<number>} 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.<number>} 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.<Rect>} itemRects Item data objects.\n * @param {number} containerWidth Width of the containing element.\n * @return {Array.<Point>}\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 this.options = Object.assign({}, Shuffle.options, options);\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 // Check for an element\n } else if (option && option.nodeType && option.nodeType === 1) {\n return option;\n\n // Check for jQuery object\n } else if (option && option.jquery) {\n return option[0];\n }\n\n return null;\n }\n\n /**\n * Ensures the shuffle container has the css styles it needs applied to it.\n * @param {Object} styles Key value pairs for position and overflow.\n * @private\n */\n _validateStyles(styles) {\n // Position cannot be static.\n if (styles.position === 'static') {\n this.element.style.position = 'relative';\n }\n\n // Overflow has to be hidden.\n if (styles.overflow !== 'hidden') {\n this.element.style.overflow = 'hidden';\n }\n }\n\n /**\n * Filter the elements by a category.\n * @param {string|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.delimeter ?\n attr.split(this.options.delimeter) :\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));\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), 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 const styles = Object.assign({}, styleObject);\n\n if (this.options.useTransforms) {\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(${x}px, ${y}px) scale(${item.scale})`;\n } else {\n styles.left = item.point.x + 'px';\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 {Object} [sortObj] A sort object which can sort the visible set\n */\n filter(category, sortObj) {\n if (!this.isEnabled) {\n return;\n }\n\n if (!category || (category && category.length === 0)) {\n category = Shuffle.ALL_ITEMS; // 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(sortObj);\n }\n\n /**\n * Gets the visible elements, sorts them, and passes them to layout.\n * @param {Object} [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));\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 delimeter\n // to ','.\n delimeter: null,\n\n // Useful for percentage based heights when they might not always be exactly\n // the same (in pixels).\n buffer: 0,\n\n // Reading the width of elements isn't precise enough and can cause columns to\n // jump between values.\n columnThreshold: 0.01,\n\n // Shuffle can be isInitialized with a sort object. It is the same object\n // given to the sort method.\n initialSort: null,\n\n // By default, shuffle will throttle resize events. This can be changed or\n // removed.\n throttle,\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 // 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","ShuffleItem","element","isVisible","isHidden","classList","remove","Classes","HIDDEN","add","VISIBLE","removeAttribute","setAttribute","addClasses","SHUFFLE_ITEM","applyCss","Css","INITIAL","scale","Scale","point","classes","forEach","className","obj","keys","key","style","removeClasses","document","body","documentElement","e","createElement","cssText","appendChild","window","getComputedStyle","ret","removeChild","getNumberStyle","styles","COMPUTED_SIZE_INCLUDES_PADDING","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","paddingTop","paddingBottom","borderTopWidth","borderBottomWidth","randomize","array","n","length","i","Math","floor","random","temp","defaults","sorter","arr","options","opts","Object","assign","original","Array","from","revert","by","sort","valA","valB","undefined","compare","reverse","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","lastSort","group","ALL_ITEMS","lastFilter","isEnabled","isDestroyed","isInitialized","_transitions","isTransitioning","_queue","el","_getElementOption","TypeError","_init","_getItems","sizer","BASE","_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","position","overflow","category","collection","set","_getFilteredSets","_toggleFilterClasses","visible","hidden","item","_doesPassFilter","call","attr","getAttribute","FILTER_ATTRIBUTE_KEY","delimeter","split","JSON","parse","testCategory","isArray","filterMode","FilterMode","ANY","show","hide","init","dispose","visibleItems","_getFilteredItems","positionProps","useTransforms","cssProps","before","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","after","equals","getStylesForTransition","transitionDelay","_getStaggerAmount","isCentered","itemsData","_getItemPosition","getTransformedPositions","_getConcealedItems","update","styleObject","roundTransforms","transform","itemCallback","done","_whenTransitionDone","_cancelMovement","hasSpeed","hasQueue","_startTransitions","_styleImmediately","_dispatch","EventType","LAYOUT","callbacks","_getTransitionFunction","_movementFinished","objects","elements","_skipTransitions","sortObj","_filter","_shrink","_updateItemCount","sortOptions","_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","__sorter","__getColumnSpan","__getAvailablePositions","__getShortColumn","__getCenteredPositions"],"mappings":"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"}