{"mappings":"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","sources":["","node_modules/.pnpm/mixitup@3.3.1/node_modules/mixitup/dist/mixitup.js","js/mixitup-multifilter.min.js"],"sourcesContent":["(function () {\n\n var $parcel$global =\n typeof globalThis !== 'undefined'\n ? globalThis\n : typeof self !== 'undefined'\n ? self\n : typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n var parcelRequire = $parcel$global[\"parcelRequireb86c\"];\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"19YmI\", function(module, exports) {\n/**!\n * MixItUp v3.3.1\n * A high-performance, dependency-free library for animated filtering, sorting and more\n * Build 94e0fbf6-cd0b-4987-b3c0-14b59b67b8a0\n *\n * @copyright Copyright 2014-2018 KunkaLabs Limited.\n * @author KunkaLabs Limited.\n * @link https://www.kunkalabs.com/mixitup/\n *\n * @license Commercial use requires a commercial license.\n * https://www.kunkalabs.com/mixitup/licenses/\n *\n * Non-commercial use permitted under same terms as CC BY-NC 3.0 license.\n * http://creativecommons.org/licenses/by-nc/3.0/\n */ (function(window1) {\n \"use strict\";\n var mixitup = null, h = null;\n (function() {\n var VENDORS = [\n \"webkit\",\n \"moz\",\n \"o\",\n \"ms\"\n ], canary = window1.document.createElement(\"div\"), i = -1;\n // window.requestAnimationFrame\n for(i = 0; i < VENDORS.length && !window1.requestAnimationFrame; i++)window1.requestAnimationFrame = window1[VENDORS[i] + \"RequestAnimationFrame\"];\n // Element.nextElementSibling\n if (typeof canary.nextElementSibling === \"undefined\") Object.defineProperty(window1.Element.prototype, \"nextElementSibling\", {\n get: function() {\n var el = this.nextSibling;\n while(el){\n if (el.nodeType === 1) return el;\n el = el.nextSibling;\n }\n return null;\n }\n });\n // Element.matches\n (function(ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches || ElementPrototype.machesSelector || ElementPrototype.mozMatchesSelector || ElementPrototype.msMatchesSelector || ElementPrototype.oMatchesSelector || ElementPrototype.webkitMatchesSelector || function(selector) {\n return Array.prototype.indexOf.call(this.parentElement.querySelectorAll(selector), this) > -1;\n };\n })(window1.Element.prototype);\n // Object.keys\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\n if (!Object.keys) Object.keys = function() {\n var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = false, dontEnums = [], dontEnumsLength = -1;\n hasDontEnumBug = !({\n toString: null\n }).propertyIsEnumerable(\"toString\");\n dontEnums = [\n \"toString\",\n \"toLocaleString\",\n \"valueOf\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"constructor\"\n ];\n dontEnumsLength = dontEnums.length;\n return function(obj) {\n var result = [], prop = \"\", i = -1;\n if (typeof obj !== \"object\" && (typeof obj !== \"function\" || obj === null)) throw new TypeError(\"Object.keys called on non-object\");\n for(prop in obj)if (hasOwnProperty.call(obj, prop)) result.push(prop);\n if (hasDontEnumBug) {\n for(i = 0; i < dontEnumsLength; i++)if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);\n }\n return result;\n };\n }();\n // Array.isArray\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n if (!Array.isArray) Array.isArray = function(arg) {\n return Object.prototype.toString.call(arg) === \"[object Array]\";\n };\n // Object.create\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n if (typeof Object.create !== \"function\") Object.create = function(undefined) {\n var Temp = function() {};\n return function(prototype, propertiesObject) {\n if (prototype !== Object(prototype) && prototype !== null) throw TypeError(\"Argument must be an object, or null\");\n Temp.prototype = prototype || {};\n var result = new Temp();\n Temp.prototype = null;\n if (propertiesObject !== undefined) Object.defineProperties(result, propertiesObject);\n if (prototype === null) /* jshint ignore:start */ result.__proto__ = null;\n return result;\n };\n }();\n // String.prototyoe.trim\n if (!String.prototype.trim) String.prototype.trim = function() {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n };\n // Array.prototype.indexOf\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n if (!Array.prototype.indexOf) Array.prototype.indexOf = function(searchElement) {\n var n, k, t, len;\n if (this === null) throw new TypeError();\n t = Object(this);\n len = t.length >>> 0;\n if (len === 0) return -1;\n n = 0;\n if (arguments.length > 1) {\n n = Number(arguments[1]);\n if (n !== n) n = 0;\n else if (n !== 0 && n !== Infinity && n !== -Infinity) n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n if (n >= len) return -1;\n for(k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++){\n if (k in t && t[k] === searchElement) return k;\n }\n return -1;\n };\n // Function.prototype.bind\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind\n if (!Function.prototype.bind) Function.prototype.bind = function(oThis) {\n var aArgs, self, FNOP, fBound;\n if (typeof this !== \"function\") throw new TypeError();\n aArgs = Array.prototype.slice.call(arguments, 1);\n self = this;\n FNOP = function() {};\n fBound = function() {\n return self.apply(this instanceof FNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n if (this.prototype) FNOP.prototype = this.prototype;\n fBound.prototype = new FNOP();\n return fBound;\n };\n // Element.prototype.dispatchEvent\n if (!window1.Element.prototype.dispatchEvent) window1.Element.prototype.dispatchEvent = function(event) {\n try {\n return this.fireEvent(\"on\" + event.type, event);\n } catch (err) {}\n };\n })();\n /**\n * The `mixitup()` \"factory\" function creates and returns individual instances\n * of MixItUp, known as \"mixers\", on which API methods can be called.\n *\n * When loading MixItUp via a script tag, the factory function is accessed\n * via the global variable `mixitup`. When using a module loading\n * system (e.g. ES2015, CommonJS, RequireJS), the factory function is\n * exported into your module when you require the MixItUp library.\n *\n * @example\n * mixitup(container [,config] [,foreignDoc])\n *\n * @example Example 1: Creating a mixer instance with an element reference\n * var containerEl = document.querySelector('.container');\n *\n * var mixer = mixitup(containerEl);\n *\n * @example Example 2: Creating a mixer instance with a selector string\n * var mixer = mixitup('.container');\n *\n * @example Example 3: Passing a configuration object\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade scale(0.5)'\n * }\n * });\n *\n * @example Example 4: Passing an iframe reference\n * var mixer = mixitup(containerEl, config, foreignDocument);\n *\n * @global\n * @namespace\n * @public\n * @kind function\n * @since 3.0.0\n * @param {(Element|string)} container\n * A DOM element or selector string representing the container(s) on which to instantiate MixItUp.\n * @param {object} [config]\n * An optional \"configuration object\" used to customize the behavior of the MixItUp instance.\n * @param {object} [foreignDoc]\n * An optional reference to a `document`, which can be used to control a MixItUp instance in an iframe.\n * @return {mixitup.Mixer}\n * A \"mixer\" object holding the MixItUp instance.\n */ mixitup = function(container, config, foreignDoc) {\n var el = null, returnCollection = false, instance = null, facade = null, doc = null, output = null, instances = [], id = \"\", elements = [], i = -1;\n doc = foreignDoc || window1.document;\n if (returnCollection = arguments[3]) // A non-documented 4th paramater enabling control of multiple instances\n returnCollection = typeof returnCollection === \"boolean\";\n if (typeof container === \"string\") elements = doc.querySelectorAll(container);\n else if (container && typeof container === \"object\" && h.isElement(container, doc)) elements = [\n container\n ];\n else if (container && typeof container === \"object\" && container.length) // Although not documented, the container may also be an array-like list of\n // elements such as a NodeList or jQuery collection, is returnCollection is true\n elements = container;\n else throw new Error(mixitup.messages.errorFactoryInvalidContainer());\n if (elements.length < 1) throw new Error(mixitup.messages.errorFactoryContainerNotFound());\n for(i = 0; el = elements[i]; i++){\n if (i > 0 && !returnCollection) break;\n if (!el.id) {\n id = \"MixItUp\" + h.randomHex();\n el.id = id;\n } else id = el.id;\n if (mixitup.instances[id] instanceof mixitup.Mixer) {\n instance = mixitup.instances[id];\n if (!config || config && config.debug && config.debug.showWarnings !== false) console.warn(mixitup.messages.warningFactoryPreexistingInstance());\n } else {\n instance = new mixitup.Mixer();\n instance.attach(el, doc, id, config);\n mixitup.instances[id] = instance;\n }\n facade = new mixitup.Facade(instance);\n if (config && config.debug && config.debug.enable) instances.push(instance);\n else instances.push(facade);\n }\n if (returnCollection) output = new mixitup.Collection(instances);\n else // Return the first instance regardless\n output = instances[0];\n return output;\n };\n /**\n * The `.use()` static method is used to extend the functionality of mixitup with compatible\n * extensions and libraries in an environment with modular scoping e.g. ES2015, CommonJS, or RequireJS.\n *\n * You need only call the `.use()` function once per project, per extension, as module loaders\n * will cache a single reference to MixItUp inclusive of all changes made.\n *\n * @example\n * mixitup.use(extension)\n *\n * @example Example 1: Extending MixItUp with the Pagination Extension\n *\n * import mixitup from 'mixitup';\n * import mixitupPagination from 'mixitup-pagination';\n *\n * mixitup.use(mixitupPagination);\n *\n * // All mixers created by the factory function in all modules will now\n * // have pagination functionality\n *\n * var mixer = mixitup('.container');\n *\n * @public\n * @name use\n * @memberof mixitup\n * @kind function\n * @static\n * @since 3.0.0\n * @param {*} extension A reference to the extension or library to be used.\n * @return {void}\n */ mixitup.use = function(extension) {\n mixitup.Base.prototype.callActions.call(mixitup, \"beforeUse\", arguments);\n // Call the extension's factory function, passing\n // the mixitup factory as a paramater\n if (typeof extension === \"function\" && extension.TYPE === \"mixitup-extension\") // Mixitup extension\n {\n if (typeof mixitup.extensions[extension.NAME] === \"undefined\") {\n extension(mixitup);\n mixitup.extensions[extension.NAME] = extension;\n }\n } else if (extension.fn && extension.fn.jquery) // jQuery\n mixitup.libraries.$ = extension;\n mixitup.Base.prototype.callActions.call(mixitup, \"afterUse\", arguments);\n };\n mixitup.instances = {};\n mixitup.extensions = {};\n mixitup.libraries = {};\n /**\n * @private\n */ h = {\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {boolean}\n */ hasClass: function(el, cls) {\n return !!el.className.match(new RegExp(\"(\\\\s|^)\" + cls + \"(\\\\s|$)\"));\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {void}\n */ addClass: function(el, cls) {\n if (!this.hasClass(el, cls)) el.className += el.className ? \" \" + cls : cls;\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {void}\n */ removeClass: function(el, cls) {\n if (this.hasClass(el, cls)) {\n var reg = new RegExp(\"(\\\\s|^)\" + cls + \"(\\\\s|$)\");\n el.className = el.className.replace(reg, \" \").trim();\n }\n },\n /**\n * Merges the properties of the source object onto the\n * target object. Alters the target object.\n *\n * @private\n * @param {object} destination\n * @param {object} source\n * @param {boolean} [deep=false]\n * @param {boolean} [handleErrors=false]\n * @return {void}\n */ extend: function(destination, source, deep, handleErrors) {\n var sourceKeys = [], key = \"\", i = -1;\n deep = deep || false;\n handleErrors = handleErrors || false;\n try {\n if (Array.isArray(source)) for(i = 0; i < source.length; i++)sourceKeys.push(i);\n else if (source) sourceKeys = Object.keys(source);\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (!deep || typeof source[key] !== \"object\" || this.isElement(source[key])) // All non-object properties, or all properties if shallow extend\n destination[key] = source[key];\n else if (Array.isArray(source[key])) {\n // Arrays\n if (!destination[key]) destination[key] = [];\n this.extend(destination[key], source[key], deep, handleErrors);\n } else {\n // Objects\n if (!destination[key]) destination[key] = {};\n this.extend(destination[key], source[key], deep, handleErrors);\n }\n }\n } catch (err) {\n if (handleErrors) this.handleExtendError(err, destination);\n else throw err;\n }\n return destination;\n },\n /**\n * @private\n * @param {Error} err\n * @param {object} destination\n * @return {void}\n */ handleExtendError: function(err, destination) {\n var re = /property \"?(\\w*)\"?[,:] object/i, matches = null, erroneous = \"\", message = \"\", suggestion = \"\", probableMatch = \"\", key = \"\", mostMatchingChars = -1, i = -1;\n if (err instanceof TypeError && (matches = re.exec(err.message))) {\n erroneous = matches[1];\n for(key in destination){\n i = 0;\n while(i < erroneous.length && erroneous.charAt(i) === key.charAt(i))i++;\n if (i > mostMatchingChars) {\n mostMatchingChars = i;\n probableMatch = key;\n }\n }\n if (mostMatchingChars > 1) suggestion = mixitup.messages.errorConfigInvalidPropertySuggestion({\n probableMatch: probableMatch\n });\n message = mixitup.messages.errorConfigInvalidProperty({\n erroneous: erroneous,\n suggestion: suggestion\n });\n throw new TypeError(message);\n }\n throw err;\n },\n /**\n * @private\n * @param {string} str\n * @return {function}\n */ template: function(str) {\n var re = /\\${([\\w]*)}/g, dynamics = {}, matches = null;\n while(matches = re.exec(str))dynamics[matches[1]] = new RegExp(\"\\\\${\" + matches[1] + \"}\", \"g\");\n return function(data) {\n var key = \"\", output = str;\n data = data || {};\n for(key in dynamics)output = output.replace(dynamics[key], typeof data[key] !== \"undefined\" ? data[key] : \"\");\n return output;\n };\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {function} fn\n * @param {boolean} useCapture\n * @return {void}\n */ on: function(el, type, fn, useCapture) {\n if (!el) return;\n if (el.addEventListener) el.addEventListener(type, fn, useCapture);\n else if (el.attachEvent) {\n el[\"e\" + type + fn] = fn;\n el[type + fn] = function() {\n el[\"e\" + type + fn](window1.event);\n };\n el.attachEvent(\"on\" + type, el[type + fn]);\n }\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {function} fn\n * @return {void}\n */ off: function(el, type, fn) {\n if (!el) return;\n if (el.removeEventListener) el.removeEventListener(type, fn, false);\n else if (el.detachEvent) {\n el.detachEvent(\"on\" + type, el[type + fn]);\n el[type + fn] = null;\n }\n },\n /**\n * @private\n * @param {string} eventType\n * @param {object} detail\n * @param {Document} [doc]\n * @return {CustomEvent}\n */ getCustomEvent: function(eventType, detail, doc) {\n var event = null;\n doc = doc || window1.document;\n if (typeof window1.CustomEvent === \"function\") event = new window1.CustomEvent(eventType, {\n detail: detail,\n bubbles: true,\n cancelable: true\n });\n else if (typeof doc.createEvent === \"function\") {\n event = doc.createEvent(\"CustomEvent\");\n event.initCustomEvent(eventType, true, true, detail);\n } else {\n event = doc.createEventObject(), event.type = eventType;\n event.returnValue = false;\n event.cancelBubble = false;\n event.detail = detail;\n }\n return event;\n },\n /**\n * @private\n * @param {Event} e\n * @return {Event}\n */ getOriginalEvent: function(e) {\n if (e.touches && e.touches.length) return e.touches[0];\n else if (e.changedTouches && e.changedTouches.length) return e.changedTouches[0];\n else return e;\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} selector\n * @return {Number}\n */ index: function(el, selector) {\n var i = 0;\n while((el = el.previousElementSibling) !== null)if (!selector || el.matches(selector)) ++i;\n return i;\n },\n /**\n * Converts a dash or snake-case string to camel case.\n *\n * @private\n * @param {string} str\n * @param {boolean} [isPascal]\n * @return {string}\n */ camelCase: function(str) {\n return str.toLowerCase().replace(/([_-][a-z])/g, function($1) {\n return $1.toUpperCase().replace(/[_-]/, \"\");\n });\n },\n /**\n * Converts a dash or snake-case string to pascal case.\n *\n * @private\n * @param {string} str\n * @param {boolean} [isPascal]\n * @return {string}\n */ pascalCase: function(str) {\n return (str = this.camelCase(str)).charAt(0).toUpperCase() + str.slice(1);\n },\n /**\n * Converts a camel or pascal-case string to dash case.\n *\n * @private\n * @param {string} str\n * @return {string}\n */ dashCase: function(str) {\n return str.replace(/([A-Z])/g, \"-$1\").replace(/^-/, \"\").toLowerCase();\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {HTMLHtmlElement} [doc]\n * @return {boolean}\n */ isElement: function(el, doc) {\n doc = doc || window1.document;\n if (window1.HTMLElement && el instanceof window1.HTMLElement) return true;\n else if (doc.defaultView && doc.defaultView.HTMLElement && el instanceof doc.defaultView.HTMLElement) return true;\n else return el !== null && el.nodeType === 1 && typeof el.nodeName === \"string\";\n },\n /**\n * @private\n * @param {string} htmlString\n * @param {HTMLHtmlElement} [doc]\n * @return {DocumentFragment}\n */ createElement: function(htmlString, doc) {\n var frag = null, temp = null;\n doc = doc || window1.document;\n frag = doc.createDocumentFragment();\n temp = doc.createElement(\"div\");\n temp.innerHTML = htmlString.trim();\n while(temp.firstChild)frag.appendChild(temp.firstChild);\n return frag;\n },\n /**\n * @private\n * @param {Node} node\n * @return {void}\n */ removeWhitespace: function(node) {\n var deleting;\n while(node && node.nodeName === \"#text\"){\n deleting = node;\n node = node.previousSibling;\n deleting.parentElement && deleting.parentElement.removeChild(deleting);\n }\n },\n /**\n * @private\n * @param {Array<*>} a\n * @param {Array<*>} b\n * @return {boolean}\n */ isEqualArray: function(a, b) {\n var i = a.length;\n if (i !== b.length) return false;\n while(i--){\n if (a[i] !== b[i]) return false;\n }\n return true;\n },\n /**\n * @private\n * @param {object} a\n * @param {object} b\n * @return {boolean}\n */ deepEquals: function(a, b) {\n var key;\n if (typeof a === \"object\" && a && typeof b === \"object\" && b) {\n if (Object.keys(a).length !== Object.keys(b).length) return false;\n for(key in a){\n if (!b.hasOwnProperty(key) || !this.deepEquals(a[key], b[key])) return false;\n }\n } else if (a !== b) return false;\n return true;\n },\n /**\n * @private\n * @param {Array<*>} oldArray\n * @return {Array<*>}\n */ arrayShuffle: function(oldArray) {\n var newArray = oldArray.slice(), len = newArray.length, i = len, p = -1, t = [];\n while(i--){\n p = ~~(Math.random() * len);\n t = newArray[i];\n newArray[i] = newArray[p];\n newArray[p] = t;\n }\n return newArray;\n },\n /**\n * @private\n * @param {object} list\n */ arrayFromList: function(list) {\n var output, i;\n try {\n return Array.prototype.slice.call(list);\n } catch (err) {\n output = [];\n for(i = 0; i < list.length; i++)output.push(list[i]);\n return output;\n }\n },\n /**\n * @private\n * @param {function} func\n * @param {Number} wait\n * @param {boolean} immediate\n * @return {function}\n */ debounce: function(func, wait, immediate) {\n var timeout;\n return function() {\n var self = this, args = arguments, callNow = immediate && !timeout, later = null;\n later = function() {\n timeout = null;\n if (!immediate) func.apply(self, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(self, args);\n };\n },\n /**\n * @private\n * @param {HTMLElement} element\n * @return {object}\n */ position: function(element) {\n var xPosition = 0, yPosition = 0, offsetParent = element;\n while(element){\n xPosition -= element.scrollLeft;\n yPosition -= element.scrollTop;\n if (element === offsetParent) {\n xPosition += element.offsetLeft;\n yPosition += element.offsetTop;\n offsetParent = element.offsetParent;\n }\n element = element.parentElement;\n }\n return {\n x: xPosition,\n y: yPosition\n };\n },\n /**\n * @private\n * @param {object} node1\n * @param {object} node2\n * @return {Number}\n */ getHypotenuse: function(node1, node2) {\n var distanceX = node1.x - node2.x, distanceY = node1.y - node2.y;\n distanceX = distanceX < 0 ? distanceX * -1 : distanceX, distanceY = distanceY < 0 ? distanceY * -1 : distanceY;\n return Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));\n },\n /**\n * Calcuates the area of intersection between two rectangles and expresses it as\n * a ratio in comparison to the area of the first rectangle.\n *\n * @private\n * @param {Rect} box1\n * @param {Rect} box2\n * @return {number}\n */ getIntersectionRatio: function(box1, box2) {\n var controlArea = box1.width * box1.height, intersectionX = -1, intersectionY = -1, intersectionArea = -1, ratio = -1;\n intersectionX = Math.max(0, Math.min(box1.left + box1.width, box2.left + box2.width) - Math.max(box1.left, box2.left));\n intersectionY = Math.max(0, Math.min(box1.top + box1.height, box2.top + box2.height) - Math.max(box1.top, box2.top));\n intersectionArea = intersectionY * intersectionX;\n ratio = intersectionArea / controlArea;\n return ratio;\n },\n /**\n * @private\n * @param {object} el\n * @param {string} selector\n * @param {boolean} [includeSelf]\n * @param {HTMLHtmlElement} [doc]\n * @return {Element|null}\n */ closestParent: function(el, selector, includeSelf, doc) {\n var parent = el.parentNode;\n doc = doc || window1.document;\n if (includeSelf && el.matches(selector)) return el;\n while(parent && parent != doc.body){\n if (parent.matches && parent.matches(selector)) return parent;\n else if (parent.parentNode) parent = parent.parentNode;\n else return null;\n }\n return null;\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} selector\n * @param {HTMLHtmlElement} [doc]\n * @return {NodeList}\n */ children: function(el, selector, doc) {\n var children = [], tempId = \"\";\n doc = doc || window1.doc;\n if (el) {\n if (!el.id) {\n tempId = \"Temp\" + this.randomHexKey();\n el.id = tempId;\n }\n children = doc.querySelectorAll(\"#\" + el.id + \" > \" + selector);\n if (tempId) el.removeAttribute(\"id\");\n }\n return children;\n },\n /**\n * Creates a clone of a provided array, with any empty strings removed.\n *\n * @private\n * @param {Array<*>} originalArray\n * @return {Array<*>}\n */ clean: function(originalArray) {\n var cleanArray = [], i = -1;\n for(i = 0; i < originalArray.length; i++)if (originalArray[i] !== \"\") cleanArray.push(originalArray[i]);\n return cleanArray;\n },\n /**\n * Abstracts an ES6 promise into a q-like deferred interface for storage and deferred resolution.\n *\n * @private\n * @param {object} libraries\n * @return {h.Deferred}\n */ defer: function(libraries) {\n var deferred = null, promiseWrapper = null, $ = null;\n promiseWrapper = new this.Deferred();\n if (mixitup.features.has.promises) // ES6 native promise or polyfill\n promiseWrapper.promise = new Promise(function(resolve, reject) {\n promiseWrapper.resolve = resolve;\n promiseWrapper.reject = reject;\n });\n else if (($ = window1.jQuery || libraries.$) && typeof $.Deferred === \"function\") {\n // jQuery\n deferred = $.Deferred();\n promiseWrapper.promise = deferred.promise();\n promiseWrapper.resolve = deferred.resolve;\n promiseWrapper.reject = deferred.reject;\n } else if (window1.console) // No implementation\n console.warn(mixitup.messages.warningNoPromiseImplementation());\n return promiseWrapper;\n },\n /**\n * @private\n * @param {Array} tasks\n * @param {object} libraries\n * @return {Promise}\n */ all: function(tasks, libraries) {\n var $ = null;\n if (mixitup.features.has.promises) return Promise.all(tasks);\n else if (($ = window1.jQuery || libraries.$) && typeof $.when === \"function\") return $.when.apply($, tasks).done(function() {\n // jQuery when returns spread arguments rather than an array or resolutions\n return arguments;\n });\n // No implementation\n if (window1.console) console.warn(mixitup.messages.warningNoPromiseImplementation());\n return [];\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} property\n * @param {Array} vendors\n * @return {string}\n */ getPrefix: function(el, property, vendors) {\n var i = -1, prefix = \"\";\n if (h.dashCase(property) in el.style) return \"\";\n for(i = 0; prefix = vendors[i]; i++){\n if (prefix + property in el.style) return prefix.toLowerCase();\n }\n return \"unsupported\";\n },\n /**\n * @private\n * @return {string}\n */ randomHex: function() {\n return (\"00000\" + (Math.random() * 16777216 << 0).toString(16)).substr(-6).toUpperCase();\n },\n /**\n * @private\n * @param {HTMLDocument} [doc]\n * @return {object}\n */ getDocumentState: function(doc) {\n doc = typeof doc.body === \"object\" ? doc : window1.document;\n return {\n scrollTop: window1.pageYOffset,\n scrollLeft: window1.pageXOffset,\n docHeight: doc.documentElement.scrollHeight,\n docWidth: doc.documentElement.scrollWidth,\n viewportHeight: doc.documentElement.clientHeight,\n viewportWidth: doc.documentElement.clientWidth\n };\n },\n /**\n * @private\n * @param {object} obj\n * @param {function} fn\n * @return {function}\n */ bind: function(obj, fn) {\n return function() {\n return fn.apply(obj, arguments);\n };\n },\n /**\n * @private\n * @param {HTMLElement} el\n * @return {boolean}\n */ isVisible: function(el) {\n var styles = null;\n if (el.offsetParent) return true;\n styles = window1.getComputedStyle(el);\n if (styles.position === \"fixed\" && styles.visibility !== \"hidden\" && styles.opacity !== \"0\") // Fixed elements report no offsetParent,\n // but may still be invisible\n return true;\n return false;\n },\n /**\n * @private\n * @param {object} obj\n */ seal: function(obj) {\n if (typeof Object.seal === \"function\") Object.seal(obj);\n },\n /**\n * @private\n * @param {object} obj\n */ freeze: function(obj) {\n if (typeof Object.freeze === \"function\") Object.freeze(obj);\n },\n /**\n * @private\n * @param {string} control\n * @param {string} specimen\n * @return {boolean}\n */ compareVersions: function(control, specimen) {\n var controlParts = control.split(\".\"), specimenParts = specimen.split(\".\"), controlPart = -1, specimenPart = -1, i = -1;\n for(i = 0; i < controlParts.length; i++){\n controlPart = parseInt(controlParts[i].replace(/[^\\d.]/g, \"\"));\n specimenPart = parseInt(specimenParts[i].replace(/[^\\d.]/g, \"\") || 0);\n if (specimenPart < controlPart) return false;\n else if (specimenPart > controlPart) return true;\n }\n return true;\n },\n /**\n * @private\n * @constructor\n */ Deferred: function() {\n this.promise = null;\n this.resolve = null;\n this.reject = null;\n this.id = h.randomHex();\n },\n /**\n * @private\n * @param {object} obj\n * @return {boolean}\n */ isEmptyObject: function(obj) {\n var key = \"\";\n if (typeof Object.keys === \"function\") return Object.keys(obj).length === 0;\n for(key in obj){\n if (obj.hasOwnProperty(key)) return false;\n }\n return true;\n },\n /**\n * @param {mixitup.Config.ClassNames} classNames\n * @param {string} elementName\n * @param {string} [modifier]\n * @return {string}\n */ getClassname: function(classNames, elementName, modifier) {\n var classname = \"\";\n classname += classNames.block;\n if (classname.length) classname += classNames.delineatorElement;\n classname += classNames[\"element\" + this.pascalCase(elementName)];\n if (!modifier) return classname;\n if (classname.length) classname += classNames.delineatorModifier;\n classname += modifier;\n return classname;\n },\n /**\n * Returns the value of a property on a given object via its string key.\n *\n * @param {object} obj\n * @param {string} stringKey\n * @return {*} value\n */ getProperty: function(obj, stringKey) {\n var parts = stringKey.split(\".\"), returnCurrent = null, current = \"\", i = 0;\n if (!stringKey) return obj;\n returnCurrent = function(obj) {\n if (!obj) return null;\n else return obj[current];\n };\n while(i < parts.length){\n current = parts[i];\n obj = returnCurrent(obj);\n i++;\n }\n if (typeof obj !== \"undefined\") return obj;\n else return null;\n }\n };\n mixitup.h = h;\n /**\n * The Base class adds instance methods to all other extensible MixItUp classes,\n * enabling the calling of any registered hooks.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Base = function() {};\n mixitup.Base.prototype = {\n constructor: mixitup.Base,\n /**\n * Calls any registered hooks for the provided action.\n *\n * @memberof mixitup.Base\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} actionName\n * @param {Array<*>} args\n * @return {void}\n */ callActions: function(actionName, args) {\n var self = this, hooks = self.constructor.actions[actionName], extensionName = \"\";\n if (!hooks || h.isEmptyObject(hooks)) return;\n for(extensionName in hooks)hooks[extensionName].apply(self, args);\n },\n /**\n * Calls any registered hooks for the provided filter.\n *\n * @memberof mixitup.Base\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} filterName\n * @param {*} input\n * @param {Array<*>} args\n * @return {*}\n */ callFilters: function(filterName, input, args) {\n var self = this, hooks = self.constructor.filters[filterName], output = input, extensionName = \"\";\n if (!hooks || h.isEmptyObject(hooks)) return output;\n args = args || [];\n for(extensionName in hooks){\n args = h.arrayFromList(args);\n args.unshift(output);\n output = hooks[extensionName].apply(self, args);\n }\n return output;\n }\n };\n /**\n * The BaseStatic class holds a set of static methods which are then added to all other\n * extensible MixItUp classes as a means of integrating extensions via the addition of new\n * methods and/or actions and hooks.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.BaseStatic = function() {\n this.actions = {};\n this.filters = {};\n /**\n * Performs a shallow extend on the class's prototype, adding one or more new members to\n * the class in a single operation.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {object} extension\n * @return {void}\n */ this.extend = function(extension) {\n h.extend(this.prototype, extension);\n };\n /**\n * Registers a function to be called on the action hook of the provided name.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {string} hookName\n * @param {string} extensionName\n * @param {function} func\n * @return {void}\n */ this.registerAction = function(hookName, extensionName, func) {\n (this.actions[hookName] = this.actions[hookName] || {})[extensionName] = func;\n };\n /**\n * Registers a function to be called on the filter of the provided name.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {string} hookName\n * @param {string} extensionName\n * @param {function} func\n * @return {void}\n */ this.registerFilter = function(hookName, extensionName, func) {\n (this.filters[hookName] = this.filters[hookName] || {})[extensionName] = func;\n };\n };\n /**\n * The `mixitup.Features` class performs all feature and CSS prefix detection\n * neccessary for MixItUp to function correctly, as well as storing various\n * string and array constants. All feature decection is on evaluation of the\n * library and stored in a singleton instance for use by other internal classes.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Features = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.boxSizingPrefix = \"\";\n this.transformPrefix = \"\";\n this.transitionPrefix = \"\";\n this.boxSizingPrefix = \"\";\n this.transformProp = \"\";\n this.transformRule = \"\";\n this.transitionProp = \"\";\n this.perspectiveProp = \"\";\n this.perspectiveOriginProp = \"\";\n this.has = new mixitup.Has();\n this.canary = null;\n this.BOX_SIZING_PROP = \"boxSizing\";\n this.TRANSITION_PROP = \"transition\";\n this.TRANSFORM_PROP = \"transform\";\n this.PERSPECTIVE_PROP = \"perspective\";\n this.PERSPECTIVE_ORIGIN_PROP = \"perspectiveOrigin\";\n this.VENDORS = [\n \"Webkit\",\n \"moz\",\n \"O\",\n \"ms\"\n ];\n this.TWEENABLE = [\n \"opacity\",\n \"width\",\n \"height\",\n \"marginRight\",\n \"marginBottom\",\n \"x\",\n \"y\",\n \"scale\",\n \"translateX\",\n \"translateY\",\n \"translateZ\",\n \"rotateX\",\n \"rotateY\",\n \"rotateZ\"\n ];\n this.callActions(\"afterConstruct\");\n };\n mixitup.BaseStatic.call(mixitup.Features);\n mixitup.Features.prototype = Object.create(mixitup.Base.prototype);\n h.extend(mixitup.Features.prototype, /** @lends mixitup.Features */ {\n constructor: mixitup.Features,\n /**\n * @private\n * @return {void}\n */ init: function() {\n var self = this;\n self.callActions(\"beforeInit\", arguments);\n self.canary = document.createElement(\"div\");\n self.setPrefixes();\n self.runTests();\n self.callActions(\"beforeInit\", arguments);\n },\n /**\n * @private\n * @return {void}\n */ runTests: function() {\n var self = this;\n self.callActions(\"beforeRunTests\", arguments);\n self.has.promises = typeof window1.Promise === \"function\";\n self.has.transitions = self.transitionPrefix !== \"unsupported\";\n self.callActions(\"afterRunTests\", arguments);\n h.freeze(self.has);\n },\n /**\n * @private\n * @return {void}\n */ setPrefixes: function() {\n var self = this;\n self.callActions(\"beforeSetPrefixes\", arguments);\n self.transitionPrefix = h.getPrefix(self.canary, \"Transition\", self.VENDORS);\n self.transformPrefix = h.getPrefix(self.canary, \"Transform\", self.VENDORS);\n self.boxSizingPrefix = h.getPrefix(self.canary, \"BoxSizing\", self.VENDORS);\n self.boxSizingProp = self.boxSizingPrefix ? self.boxSizingPrefix + h.pascalCase(self.BOX_SIZING_PROP) : self.BOX_SIZING_PROP;\n self.transitionProp = self.transitionPrefix ? self.transitionPrefix + h.pascalCase(self.TRANSITION_PROP) : self.TRANSITION_PROP;\n self.transformProp = self.transformPrefix ? self.transformPrefix + h.pascalCase(self.TRANSFORM_PROP) : self.TRANSFORM_PROP;\n self.transformRule = self.transformPrefix ? \"-\" + self.transformPrefix + \"-\" + self.TRANSFORM_PROP : self.TRANSFORM_PROP;\n self.perspectiveProp = self.transformPrefix ? self.transformPrefix + h.pascalCase(self.PERSPECTIVE_PROP) : self.PERSPECTIVE_PROP;\n self.perspectiveOriginProp = self.transformPrefix ? self.transformPrefix + h.pascalCase(self.PERSPECTIVE_ORIGIN_PROP) : self.PERSPECTIVE_ORIGIN_PROP;\n self.callActions(\"afterSetPrefixes\", arguments);\n }\n });\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Has = function() {\n this.transitions = false;\n this.promises = false;\n h.seal(this);\n };\n // Assign a singleton instance to `mixitup.features` and initialise:\n mixitup.features = new mixitup.Features();\n mixitup.features.init();\n /**\n * A group of properties defining the mixer's animation and effects settings.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name animation\n * @namespace\n * @public\n * @since 2.0.0\n */ mixitup.ConfigAnimation = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A boolean dictating whether or not animation should be enabled for the MixItUp instance.\n * If `false`, all operations will occur instantly and syncronously, although callback\n * functions and any returned promises will still be fulfilled.\n *\n * @example Example: Create a mixer with all animations disabled\n * var mixer = mixitup(containerEl, {\n * animation: {\n * enable: false\n * }\n * });\n *\n * @name enable\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.enable = true;\n /**\n * A string of one or more space-seperated properties to which transitions will be\n * applied for all filtering animations.\n *\n * Properties can be listed any order or combination, although they will be applied in a specific\n * predefined order to produce consistent results.\n *\n * To learn more about available effects, experiment with our \n * sandbox demo and try out the \"Export config\" button in the Animation options drop down.\n *\n * @example Example: Apply \"fade\" and \"translateZ\" effects to all animations\n * // As targets are filtered in and out, they will fade between\n * // opacity 1 and 0 and transform between translateZ(-100px) and\n * // translateZ(0).\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade translateZ(-100px)'\n * }\n * });\n *\n * @name effects\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default 'fade scale'\n */ this.effects = \"fade scale\";\n /**\n * A string of one or more space-seperated effects to be applied only to filter-in\n * animations, overriding `config.animation.effects` if set.\n *\n * @example Example: Apply downwards vertical translate to targets being filtered in\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effectsIn: 'fade translateY(-100%)'\n * }\n * });\n *\n * @name effectsIn\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default ''\n */ this.effectsIn = \"\";\n /**\n * A string of one or more space-seperated effects to be applied only to filter-out\n * animations, overriding `config.animation.effects` if set.\n *\n * @example Example: Apply upwards vertical translate to targets being filtered out\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effectsOut: 'fade translateY(-100%)'\n * }\n * });\n *\n * @name effectsOut\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default ''\n */ this.effectsOut = \"\";\n /**\n * An integer dictating the duration of all MixItUp animations in milliseconds, not\n * including any additional delay apllied via the `'stagger'` effect.\n *\n * @example Example: Apply an animation duration of 200ms to all mixitup animations\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * duration: 200\n * }\n * });\n *\n * @name duration\n * @memberof mixitup.Config.animation\n * @instance\n * @type {number}\n * @default 600\n */ this.duration = 600;\n /**\n * A valid CSS3 transition-timing function or shorthand. For a full list of accepted\n * values, visit easings.net.\n *\n * @example Example 1: Apply \"ease-in-out\" easing to all animations\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * easing: 'ease-in-out'\n * }\n * });\n *\n * @example Example 2: Apply a custom \"cubic-bezier\" easing function to all animations\n * var mixer = mixitup(containerEl, {\n * animation: {\n * easing: 'cubic-bezier(0.645, 0.045, 0.355, 1)'\n * }\n * });\n *\n * @name easing\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default 'ease'\n */ this.easing = \"ease\";\n /**\n * A boolean dictating whether or not to apply perspective to the MixItUp container\n * during animations. By default, perspective is always applied and creates the\n * illusion of three-dimensional space for effects such as `translateZ`, `rotateX`,\n * and `rotateY`.\n *\n * You may wish to disable this and define your own perspective settings via CSS.\n *\n * @example Example: Prevent perspective from being applied to any 3D transforms\n * var mixer = mixitup(containerEl, {\n * animation: {\n * applyPerspective: false\n * }\n * });\n *\n * @name applyPerspective\n * @memberof mixitup.Config.animation\n * @instance\n * @type {bolean}\n * @default true\n */ this.applyPerspective = true;\n /**\n * The perspective distance value to be applied to the container during animations,\n * affecting any 3D-transform-based effects.\n *\n * @example Example: Set a perspective distance of 2000px\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'rotateY(-25deg)',\n * perspectiveDistance: '2000px'\n * }\n * });\n *\n * @name perspectiveDistance\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default '3000px'\n */ this.perspectiveDistance = \"3000px\";\n /**\n * The perspective-origin value to be applied to the container during animations,\n * affecting any 3D-transform-based effects.\n *\n * @example Example: Set a perspective origin in the top-right of the container\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'transateZ(-200px)',\n * perspectiveOrigin: '100% 0'\n * }\n * });\n *\n * @name perspectiveOrigin\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default '50% 50%'\n */ this.perspectiveOrigin = \"50% 50%\";\n /**\n * A boolean dictating whether or not to enable the queuing of operations.\n *\n * If `true` (default), and a control is clicked or an API call is made while another\n * operation is progress, the operation will go into the queue and will be automatically exectuted\n * when the previous operaitons is finished.\n *\n * If `false`, any requested operations will be ignored, and the `onMixBusy` callback and `mixBusy`\n * event will be fired. If `debug.showWarnings` is enabled, a console warning will also occur.\n *\n * @example Example: Disable queuing\n * var mixer = mixitup(containerEl, {\n * animation: {\n * queue: false\n * }\n * });\n *\n * @name queue\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.queue = true;\n /**\n * An integer dictacting the maximum number of operations allowed in the queue at\n * any time, when queuing is enabled.\n *\n * @example Example: Allow a maximum of 5 operations in the queue at any time\n * var mixer = mixitup(containerEl, {\n * animation: {\n * queueLimit: 5\n * }\n * });\n *\n * @name queueLimit\n * @memberof mixitup.Config.animation\n * @instance\n * @type {number}\n * @default 3\n */ this.queueLimit = 3;\n /**\n * A boolean dictating whether or not to transition the height and width of the\n * container as elements are filtered in and out. If disabled, the container height\n * will change abruptly.\n *\n * It may be desirable to disable this on mobile devices as the CSS `height` and\n * `width` properties do not receive GPU-acceleration and can therefore cause stuttering.\n *\n * @example Example 1: Disable the transitioning of the container height and/or width\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeContainer: false\n * }\n * });\n *\n * @example Example 2: Disable the transitioning of the container height and/or width for mobile devices only\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeContainer: myFeatureTests.isMobile ? false : true\n * }\n * });\n *\n * @name animateResizeContainer\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.animateResizeContainer = true;\n /**\n * A boolean dictating whether or not to transition the height and width of target\n * elements as they change throughout the course of an animation.\n *\n * This is often a must for flex-box grid layouts where the size of target elements may change\n * depending on final their position in relation to their siblings, or for `.changeLayout()`\n * operations where the size of targets change between layouts.\n *\n * NB: This feature requires additional calculations and manipulation to non-hardware-accelerated\n * properties which may adversely affect performance on slower devices, and is therefore\n * disabled by default.\n *\n * @example Example: Enable the transitioning of target widths and heights\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeTargets: true\n * }\n * });\n *\n * @name animateResizeTargets\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default false\n */ this.animateResizeTargets = false;\n /**\n * A custom function used to manipulate the order in which the stagger delay is\n * incremented when using the ‘stagger’ effect.\n *\n * When using the 'stagger' effect, the delay applied to each target element is incremented\n * based on its index. You may create a custom function to manipulate the order in which the\n * delay is incremented and create engaging non-linear stagger effects.\n *\n * The function receives the index of the target element as a parameter, and must\n * return an integer which serves as the multiplier for the stagger delay.\n *\n * @example Example 1: Stagger target elements by column in a 3-column grid\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade stagger(100ms)',\n * staggerSequence: function(i) {\n * return i % 3;\n * }\n * }\n * });\n *\n * @example Example 2: Using an algorithm to produce a more complex sequence\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade stagger(100ms)',\n * staggerSequence: function(i) {\n * return (2*i) - (5*((i/3) - ((1/3) * (i%3))));\n * }\n * }\n * });\n *\n * @name staggerSequence\n * @memberof mixitup.Config.animation\n * @instance\n * @type {function}\n * @default null\n */ this.staggerSequence = null;\n /**\n * A boolean dictating whether or not to reverse the direction of `translate`\n * and `rotate` transforms for elements being filtered out.\n *\n * It can be used to create carousel-like animations where elements enter and exit\n * from opposite directions. If enabled, the effect `translateX(-100%)` for elements\n * being filtered in would become `translateX(100%)` for targets being filtered out.\n *\n * This functionality can also be achieved by providing seperate effects\n * strings for `config.animation.effectsIn` and `config.animation.effectsOut`.\n *\n * @example Example: Reverse the desired direction on any translate/rotate effect for targets being filtered out\n * // Elements being filtered in will be translated from '100%' to '0' while\n * // elements being filtered out will be translated from 0 to '-100%'\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade translateX(100%)',\n * reverseOut: true,\n * nudge: false // Disable nudging to create a carousel-like effect\n * }\n * });\n *\n * @name reverseOut\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default false\n */ this.reverseOut = false;\n /**\n * A boolean dictating whether or not to \"nudge\" the animation path of targets\n * when they are being filtered in and out simulatenously.\n *\n * This has been the default behavior of MixItUp since version 1, but it\n * may be desirable to disable this effect when filtering directly from\n * one exclusive set of targets to a different exclusive set of targets,\n * to create a carousel-like effect, or a generally more subtle animation.\n *\n * @example Example: Disable the \"nudging\" of targets being filtered in and out simulatenously\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * nudge: false\n * }\n * });\n *\n * @name nudge\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.nudge = true;\n /**\n * A boolean dictating whether or not to clamp the height of the container while MixItUp's\n * geometry tests are carried out before an operation.\n *\n * To prevent scroll-bar flicker, clamping is turned on by default. But in the case where the\n * height of the container might affect its vertical positioning in the viewport\n * (e.g. a vertically-centered container), this should be turned off to ensure accurate\n * test results and a smooth animation.\n *\n * @example Example: Disable container height-clamping\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * clampHeight: false\n * }\n * });\n *\n * @name clampHeight\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.clampHeight = true;\n /**\n * A boolean dictating whether or not to clamp the width of the container while MixItUp's\n * geometry tests are carried out before an operation.\n *\n * To prevent scroll-bar flicker, clamping is turned on by default. But in the case where the\n * width of the container might affect its horitzontal positioning in the viewport\n * (e.g. a horizontall-centered container), this should be turned off to ensure accurate\n * test results and a smooth animation.\n *\n * @example Example: Disable container width-clamping\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * clampWidth: false\n * }\n * });\n *\n * @name clampWidth\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */ this.clampWidth = true;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigAnimation);\n mixitup.ConfigAnimation.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigAnimation.prototype.constructor = mixitup.ConfigAnimation;\n /**\n * A group of properties relating to the behavior of the Mixer.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name behavior\n * @namespace\n * @public\n * @since 3.1.12\n */ mixitup.ConfigBehavior = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A boolean dictating whether to allow \"live\" sorting of the mixer.\n *\n * Because of the expensive nature of sorting, MixItUp makes use of several\n * internal optimizations to skip redundant sorting operations, such as when\n * the newly requested sort command is the same as the active one. The caveat\n * to this optimization is that \"live\" edits to the value of a target's sorting\n * attribute will be ignored when requesting a re-sort by the same attribute.\n *\n * By setting to `behavior.liveSort` to `true`, the mixer will always re-sort\n * regardless of whether or not the sorting attribute and order have changed.\n *\n * @example Example: Enabling `liveSort` to allow for re-sorting\n *\n * var mixer = mixitup(containerEl, {\n * behavior: {\n * liveSort: true\n * },\n * load: {\n * sort: 'edited:desc'\n * }\n * });\n *\n * var target = containerEl.children[3];\n *\n * console.log(target.getAttribute('data-edited')); // '2015-04-24'\n *\n * target.setAttribute('data-edited', '2017-08-10'); // Update the target's edited date\n *\n * mixer.sort('edited:desc')\n * .then(function(state) {\n * // The target is now at the top of the list\n *\n * console.log(state.targets[0] === target); // true\n * });\n *\n * @name liveSort\n * @memberof mixitup.Config.behavior\n * @instance\n * @type {boolean}\n * @default false\n */ this.liveSort = false;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigBehavior);\n mixitup.ConfigBehavior.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigBehavior.prototype.constructor = mixitup.ConfigBehavior;\n /**\n * A group of optional callback functions to be invoked at various\n * points within the lifecycle of a mixer operation.\n *\n * Each function is analogous to an event of the same name triggered from the\n * container element, and is invoked immediately after it.\n *\n * All callback functions receive the current `state` object as their first\n * argument, as well as other more specific arguments described below.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name callbacks\n * @namespace\n * @public\n * @since 2.0.0\n */ mixitup.ConfigCallbacks = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A callback function invoked immediately after any MixItUp operation is requested\n * and before animations have begun.\n *\n * A second `futureState` argument is passed to the function which represents the final\n * state of the mixer once the requested operation has completed.\n *\n * @example Example: Adding an `onMixStart` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixStart: function(state, futureState) {\n * console.log('Starting operation...');\n * }\n * }\n * });\n *\n * @name onMixStart\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */ this.onMixStart = null;\n /**\n * A callback function invoked when a MixItUp operation is requested while another\n * operation is in progress, and the animation queue is full, or queueing\n * is disabled.\n *\n * @example Example: Adding an `onMixBusy` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixBusy: function(state) {\n * console.log('Mixer busy');\n * }\n * }\n * });\n *\n * @name onMixBusy\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */ this.onMixBusy = null;\n /**\n * A callback function invoked after any MixItUp operation has completed, and the\n * state has been updated.\n *\n * @example Example: Adding an `onMixEnd` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixEnd: function(state) {\n * console.log('Operation complete');\n * }\n * }\n * });\n *\n * @name onMixEnd\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */ this.onMixEnd = null;\n /**\n * A callback function invoked whenever an operation \"fails\", i.e. no targets\n * could be found matching the requested filter.\n *\n * @example Example: Adding an `onMixFail` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixFail: function(state) {\n * console.log('No items could be found matching the requested filter');\n * }\n * }\n * });\n *\n * @name onMixFail\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */ this.onMixFail = null;\n /**\n * A callback function invoked whenever a MixItUp control is clicked, and before its\n * respective operation is requested.\n *\n * The clicked element is assigned to the `this` keyword within the function. The original\n * click event is passed to the function as the second argument, which can be useful if\n * using `` tags as controls where the default behavior needs to be prevented.\n *\n * Returning `false` from the callback will prevent the control click from triggering\n * an operation.\n *\n * @example Example 1: Adding an `onMixClick` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * console.log('The control \"' + this.innerText + '\" was clicked');\n * }\n * }\n * });\n *\n * @example Example 2: Using `onMixClick` to manipulate the original click event\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * // Prevent original click event from bubbling up:\n * originalEvent.stopPropagation();\n *\n * // Prevent default behavior of clicked element:\n * originalEvent.preventDefault();\n * }\n * }\n * });\n *\n * @example Example 3: Using `onMixClick` to conditionally cancel operations\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * // Perform some conditional check:\n *\n * if (myApp.isLoading) {\n * // By returning false, we can prevent the control click from triggering an operation.\n *\n * return false;\n * }\n * }\n * }\n * });\n *\n * @name onMixClick\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */ this.onMixClick = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigCallbacks);\n mixitup.ConfigCallbacks.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigCallbacks.prototype.constructor = mixitup.ConfigCallbacks;\n /**\n * A group of properties relating to clickable control elements.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name controls\n * @namespace\n * @public\n * @since 2.0.0\n */ mixitup.ConfigControls = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A boolean dictating whether or not controls should be enabled for the mixer instance.\n *\n * If `true` (default behavior), MixItUp will search the DOM for any clickable elements with\n * `data-filter`, `data-sort` or `data-toggle` attributes, and bind them for click events.\n *\n * If `false`, no click handlers will be bound, and all functionality must therefore be performed\n * via the mixer's API methods.\n *\n * If you do not intend to use the default controls, setting this property to `false` will\n * marginally improve the startup time of your mixer instance, and will also prevent any other active\n * mixer instances in the DOM which are bound to controls from controlling the instance.\n *\n * @example Example: Disabling controls\n * var mixer = mixitup(containerEl, {\n * controls: {\n * enable: false\n * }\n * });\n *\n * // With the default controls disabled, we can only control\n * // the mixer via its API methods, e.g.:\n *\n * mixer.filter('.cat-1');\n *\n * @name enable\n * @memberof mixitup.Config.controls\n * @instance\n * @type {boolean}\n * @default true\n */ this.enable = true;\n /**\n * A boolean dictating whether or not to use event delegation when binding click events\n * to the default controls.\n *\n * If `false` (default behavior), each control button in the DOM will be found and\n * individually bound when a mixer is instantiated, with their corresponding actions\n * cached for performance.\n *\n * If `true`, a single click handler will be applied to the `window` (or container element - see\n * `config.controls.scope`), and any click events triggered by elements with `data-filter`,\n * `data-sort` or `data-toggle` attributes present will be handled as they propagate upwards.\n *\n * If you require a user interface where control buttons may be added, removed, or changed during the\n * lifetime of a mixer, `controls.live` should be set to `true`. There is a marginal but unavoidable\n * performance deficit when using live controls, as the value of each control button must be read\n * from the DOM in real time once the click event has propagated.\n *\n * @example Example: Setting live controls\n * var mixer = mixitup(containerEl, {\n * controls: {\n * live: true\n * }\n * });\n *\n * // Control buttons can now be added, remove and changed without breaking\n * // the mixer's UI\n *\n * @name live\n * @memberof mixitup.Config.controls\n * @instance\n * @type {boolean}\n * @default true\n */ this.live = false;\n /**\n * A string dictating the \"scope\" to use when binding or querying the default controls. The available\n * values are `'global'` or `'local'`.\n *\n * When set to `'global'` (default behavior), MixItUp will query the entire document for control buttons\n * to bind, or delegate click events from (see `config.controls.live`).\n *\n * When set to `'local'`, MixItUp will only query (or bind click events to) its own container element.\n * This may be desireable if you require multiple active mixer instances within the same document, with\n * controls that would otherwise intefere with each other if scoped globally.\n *\n * Conversely, if you wish to control multiple instances with a single UI, you would create one\n * set of controls and keep the controls scope of each mixer set to `global`.\n *\n * @example Example: Setting 'local' scoped controls\n * var mixerOne = mixitup(containerOne, {\n * controls: {\n * scope: 'local'\n * }\n * });\n *\n * var mixerTwo = mixitup(containerTwo, {\n * controls: {\n * scope: 'local'\n * }\n * });\n *\n * // Both mixers can now exist within the same document with\n * // isolated controls placed within their container elements.\n *\n * @name scope\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'global'\n */ this.scope = \"global\"; // enum: ['local' ,'global']\n /**\n * A string dictating the type of logic to apply when concatenating the filter selectors of\n * active toggle buttons (i.e. any clickable element with a `data-toggle` attribute).\n *\n * If set to `'or'` (default behavior), selectors will be concatenated together as\n * a comma-seperated list. For example:\n *\n * `'.cat-1, .cat-2'` (shows any elements matching `'.cat-1'` OR `'.cat-2'`)\n *\n * If set to `'and'`, selectors will be directly concatenated together. For example:\n *\n * `'.cat-1.cat-2'` (shows any elements which match both `'.cat-1'` AND `'.cat-2'`)\n *\n * @example Example: Setting \"and\" toggle logic\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleLogic: 'and'\n * }\n * });\n *\n * @name toggleLogic\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'or'\n */ this.toggleLogic = \"or\"; // enum: ['or', 'and']\n /**\n * A string dictating the filter behavior when all toggles are inactive.\n *\n * When set to `'all'` (default behavior), *all* targets will be shown by default\n * when no toggles are active, or at the moment all active toggles are toggled off.\n *\n * When set to `'none'`, no targets will be shown by default when no toggles are\n * active, or at the moment all active toggles are toggled off.\n *\n * @example Example 1: Setting the default toggle behavior to `'all'`\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleDefault: 'all'\n * }\n * });\n *\n * mixer.toggleOn('.cat-2')\n * .then(function() {\n * // Deactivate all active toggles\n *\n * return mixer.toggleOff('.cat-2')\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // 'all'\n * console.log(state.totalShow); // 12\n * });\n *\n * @example Example 2: Setting the default toggle behavior to `'none'`\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleDefault: 'none'\n * }\n * });\n *\n * mixer.toggleOn('.cat-2')\n * .then(function() {\n * // Deactivate all active toggles\n *\n * return mixer.toggleOff('.cat-2')\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // 'none'\n * console.log(state.totalShow); // 0\n * });\n *\n * @name toggleDefault\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'all'\n */ this.toggleDefault = \"all\"; // enum: ['all', 'none']\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigControls);\n mixitup.ConfigControls.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigControls.prototype.constructor = mixitup.ConfigControls;\n /**\n * A group of properties defining the output and structure of class names programmatically\n * added to controls and containers to reflect the state of the mixer.\n *\n * Most commonly, class names are added to controls by MixItUp to indicate that\n * the control is active so that it can be styled accordingly - `'mixitup-control-active'` by default.\n *\n * Using a \"BEM\" like structure, each classname is broken into the three parts:\n * a block namespace (`'mixitup'`), an element name (e.g. `'control'`), and an optional modifier\n * name (e.g. `'active'`) reflecting the state of the element.\n *\n * By default, each part of the classname is concatenated together using single hyphens as\n * delineators, but this can be easily customised to match the naming convention and style of\n * your project.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name classNames\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigClassNames = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * The \"block\" portion, or top-level namespace added to the start of any class names created by MixItUp.\n *\n * @example Example 1: changing the `config.classNames.block` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio'\n * }\n * });\n *\n * // Active control output: \"portfolio-control-active\"\n *\n * @example Example 2: Removing `config.classNames.block`\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: ''\n * }\n * });\n *\n * // Active control output: \"control-active\"\n *\n * @name block\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'mixitup'\n */ this.block = \"mixitup\";\n /**\n * The \"element\" portion of the class name added to container.\n *\n * @name elementContainer\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'container'\n */ this.elementContainer = \"container\";\n /**\n * The \"element\" portion of the class name added to filter controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementFilter` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementFilter: 'filter'\n * }\n * });\n *\n * // Active filter output: \"mixitup-filter-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementFilter` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementFilter: 'filter'\n * }\n * });\n *\n * // Active filter output: \"portfolio-filter-active\"\n *\n * @name elementFilter\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */ this.elementFilter = \"control\";\n /**\n * The \"element\" portion of the class name added to sort controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementSort` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementSort: 'sort'\n * }\n * });\n *\n * // Active sort output: \"mixitup-sort-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementSort` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementSort: 'sort'\n * }\n * });\n *\n * // Active sort output: \"portfolio-sort-active\"\n *\n * @name elementSort\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */ this.elementSort = \"control\";\n /**\n * The \"element\" portion of the class name added to multimix controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementMultimix` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementMultimix: 'multimix'\n * }\n * });\n *\n * // Active multimix output: \"mixitup-multimix-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementMultimix` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementSort: 'multimix'\n * }\n * });\n *\n * // Active multimix output: \"portfolio-multimix-active\"\n *\n * @name elementMultimix\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */ this.elementMultimix = \"control\";\n /**\n * The \"element\" portion of the class name added to toggle controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementToggle` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementToggle: 'toggle'\n * }\n * });\n *\n * // Active toggle output: \"mixitup-toggle-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementToggle` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementToggle: 'toggle'\n * }\n * });\n *\n * // Active toggle output: \"portfolio-toggle-active\"\n *\n * @name elementToggle\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */ this.elementToggle = \"control\";\n /**\n * The \"modifier\" portion of the class name added to active controls.\n * @name modifierActive\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'active'\n */ this.modifierActive = \"active\";\n /**\n * The \"modifier\" portion of the class name added to disabled controls.\n *\n * @name modifierDisabled\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'disabled'\n */ this.modifierDisabled = \"disabled\";\n /**\n * The \"modifier\" portion of the class name added to the container when in a \"failed\" state.\n *\n * @name modifierFailed\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'failed'\n */ this.modifierFailed = \"failed\";\n /**\n * The delineator used between the \"block\" and \"element\" portions of any class name added by MixItUp.\n *\n * If the block portion is ommited by setting it to an empty string, no delineator will be added.\n *\n * @example Example: changing the delineator to match BEM convention\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * delineatorElement: '__'\n * }\n * });\n *\n * // example active control output: \"mixitup__control-active\"\n *\n * @name delineatorElement\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default '-'\n */ this.delineatorElement = \"-\";\n /**\n * The delineator used between the \"element\" and \"modifier\" portions of any class name added by MixItUp.\n *\n * If the element portion is ommited by setting it to an empty string, no delineator will be added.\n *\n * @example Example: changing both delineators to match BEM convention\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * delineatorElement: '__'\n * delineatorModifier: '--'\n * }\n * });\n *\n * // Active control output: \"mixitup__control--active\"\n *\n * @name delineatorModifier\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default '-'\n */ this.delineatorModifier = \"-\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigClassNames);\n mixitup.ConfigClassNames.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigClassNames.prototype.constructor = mixitup.ConfigClassNames;\n /**\n * A group of properties relating to MixItUp's dataset API.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name data\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigData = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A string specifying the name of the key containing your data model's unique\n * identifier (UID). To use the dataset API, a UID key must be specified and\n * be present and unique on all objects in the dataset you provide to MixItUp.\n *\n * For example, if your dataset is made up of MongoDB documents, the UID\n * key would be `'id'` or `'_id'`.\n *\n * @example Example: Setting the UID to `'id'`\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id'\n * }\n * });\n *\n * @name uidKey\n * @memberof mixitup.Config.data\n * @instance\n * @type {string}\n * @default ''\n */ this.uidKey = \"\";\n /**\n * A boolean dictating whether or not MixItUp should \"dirty check\" each object in\n * your dataset for changes whenever `.dataset()` is called, and re-render any targets\n * for which a change is found.\n *\n * Depending on the complexity of your data model, dirty checking can be expensive\n * and is therefore disabled by default.\n *\n * NB: For changes to be detected, a new immutable instance of the edited model must be\n * provided to mixitup, rather than manipulating properties on the existing instance.\n * If your changes are a result of a DB write and read, you will most likely be calling\n * `.dataset()` with a clean set of objects each time, so this will not be an issue.\n *\n * @example Example: Enabling dirty checking\n *\n * var myDataset = [\n * {\n * id: 0,\n * title: \"Blog Post Title 0\"\n * ...\n * },\n * {\n * id: 1,\n * title: \"Blog Post Title 1\"\n * ...\n * }\n * ];\n *\n * // Instantiate a mixer with a pre-loaded dataset, and a target renderer\n * // function defined\n *\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id',\n * dirtyCheck: true\n * },\n * load: {\n * dataset: myDataset\n * },\n * render: {\n * target: function() { ... }\n * }\n * });\n *\n * // For illustration, we will clone and edit the second object in the dataset.\n * // NB: this would typically be done server-side in response to a DB update,\n * and then re-queried via an API.\n *\n * myDataset[1] = Object.assign({}, myDataset[1]);\n *\n * myDataset[1].title = 'Blog Post Title 11';\n *\n * mixer.dataset(myDataset)\n * .then(function() {\n * // the target with ID \"1\", will be re-rendered reflecting its new title\n * });\n *\n * @name dirtyCheck\n * @memberof mixitup.Config.data\n * @instance\n * @type {boolean}\n * @default false\n */ this.dirtyCheck = false;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigData);\n mixitup.ConfigData.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigData.prototype.constructor = mixitup.ConfigData;\n /**\n * A group of properties allowing the toggling of various debug features.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name debug\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigDebug = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A boolean dictating whether or not the mixer instance returned by the\n * `mixitup()` factory function should expose private properties and methods.\n *\n * By default, mixer instances only expose their public API, but enabling\n * debug mode will give you access to various mixer internals which may aid\n * in debugging, or the authoring of extensions.\n *\n * @example Example: Enabling debug mode\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * enable: true\n * }\n * });\n *\n * // Private properties and methods will now be visible on the mixer instance:\n *\n * console.log(mixer);\n *\n * @name enable\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default false\n */ this.enable = false;\n /**\n * A boolean dictating whether or not warnings should be shown when various\n * common gotchas occur.\n *\n * Warnings are intended to provide insights during development when something\n * occurs that is not a fatal, but may indicate an issue with your integration,\n * and are therefore turned on by default. However, you may wish to disable\n * them in production.\n *\n * @example Example 1: Disabling warnings\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * showWarnings: false\n * }\n * });\n *\n * @example Example 2: Disabling warnings based on environment\n *\n * var showWarnings = myAppConfig.environment === 'development' ? true : false;\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * showWarnings: showWarnings\n * }\n * });\n *\n * @name showWarnings\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default true\n */ this.showWarnings = true;\n /**\n * Used for server-side testing only.\n *\n * @private\n * @name fauxAsync\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default false\n */ this.fauxAsync = false;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigDebug);\n mixitup.ConfigDebug.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigDebug.prototype.constructor = mixitup.ConfigDebug;\n /**\n * A group of properties relating to the layout of the container.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name layout\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigLayout = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A boolean dictating whether or not mixitup should query all descendants\n * of the container for targets, or only immediate children.\n *\n * By default, mixitup will query all descendants matching the\n * `selectors.target` selector when indexing targets upon instantiation.\n * This allows for targets to be nested inside a sub-container which is\n * useful when ring-fencing targets from locally scoped controls in your\n * markup (see `controls.scope`).\n *\n * However, if you are building a more complex UI requiring the nesting\n * of mixers within mixers, you will most likely want to limit targets to\n * immediate children of the container by setting this property to `false`.\n *\n * @example Example: Restricting targets to immediate children\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * allowNestedTargets: false\n * }\n * });\n *\n * @name allowNestedTargets\n * @memberof mixitup.Config.layout\n * @instance\n * @type {boolean}\n * @default true\n */ this.allowNestedTargets = true;\n /**\n * A string specifying an optional class name to apply to the container when in\n * its default state.\n *\n * By changing this class name or adding a class name to the container via the\n * `.changeLayout()` API method, the CSS layout of the container can be changed,\n * and MixItUp will attemp to gracefully animate the container and its targets\n * between states.\n *\n * @example Example 1: Specifying a container class name\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * containerClassName: 'grid'\n * }\n * });\n *\n * @example Example 2: Changing the default class name with `.changeLayout()`\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * containerClassName: 'grid'\n * }\n * });\n *\n * mixer.changeLayout('list')\n * .then(function(state) {\n * console.log(state.activeContainerClass); // \"list\"\n * });\n *\n * @name containerClassName\n * @memberof mixitup.Config.layout\n * @instance\n * @type {string}\n * @default ''\n */ this.containerClassName = \"\";\n /**\n * A reference to a non-target sibling element after which to insert targets\n * when there are no targets in the container.\n *\n * @example Example: Setting a `siblingBefore` reference element\n *\n * var addButton = containerEl.querySelector('button');\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * siblingBefore: addButton\n * }\n * });\n *\n * @name siblingBefore\n * @memberof mixitup.Config.layout\n * @instance\n * @type {HTMLElement}\n * @default null\n */ this.siblingBefore = null;\n /**\n * A reference to a non-target sibling element before which to insert targets\n * when there are no targets in the container.\n *\n * @example Example: Setting an `siblingAfter` reference element\n *\n * var gap = containerEl.querySelector('.gap');\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * siblingAfter: gap\n * }\n * });\n *\n * @name siblingAfter\n * @memberof mixitup.Config.layout\n * @instance\n * @type {HTMLElement}\n * @default null\n */ this.siblingAfter = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigLayout);\n mixitup.ConfigLayout.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigLayout.prototype.constructor = mixitup.ConfigLayout;\n /**\n * A group of properties defining the initial state of the mixer on load (instantiation).\n *\n * @constructor\n * @memberof mixitup.Config\n * @name load\n * @namespace\n * @public\n * @since 2.0.0\n */ mixitup.ConfigLoad = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A string defining any filtering to be statically applied to the mixer on load.\n * As per the `.filter()` API, this can be any valid selector string, or the\n * values `'all'` or `'none'`.\n *\n * @example Example 1: Defining an initial filter selector to be applied on load\n *\n * // The mixer will show only those targets matching '.category-a' on load.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * filter: '.category-a'\n * }\n * });\n *\n * @example Example 2: Hiding all targets on load\n *\n * // The mixer will show hide all targets on load.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * filter: 'none'\n * }\n * });\n *\n * @name filter\n * @memberof mixitup.Config.load\n * @instance\n * @type {string}\n * @default 'all'\n */ this.filter = \"all\";\n /**\n * A string defining any sorting to be statically applied to the mixer on load.\n * As per the `.sort()` API, this should be a valid \"sort string\" made up of\n * an attribute to sort by (or `'default'`) followed by an optional sorting\n * order, or the value `'random'`;\n *\n * @example Example: Defining sorting to be applied on load\n *\n * // The mixer will sort the container by the value of the `data-published-date`\n * // attribute, in descending order.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * sort: 'published-date:desc'\n * }\n * });\n *\n * @name sort\n * @memberof mixitup.Config.load\n * @instance\n * @type {string}\n * @default 'default:asc'\n */ this.sort = \"default:asc\";\n /**\n * An array of objects representing the underlying data of any pre-rendered targets,\n * when using the `.dataset()` API.\n *\n * NB: If targets are pre-rendered when the mixer is instantiated, this must be set.\n *\n * @example Example: Defining the initial underyling dataset\n *\n * var myDataset = [\n * {\n * id: 0,\n * title: \"Blog Post Title 0\",\n * ...\n * },\n * {\n * id: 1,\n * title: \"Blog Post Title 1\",\n * ...\n * }\n * ];\n *\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id'\n * },\n * load: {\n * dataset: myDataset\n * }\n * });\n *\n * @name dataset\n * @memberof mixitup.Config.load\n * @instance\n * @type {Array.}\n * @default null\n */ this.dataset = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigLoad);\n mixitup.ConfigLoad.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigLoad.prototype.constructor = mixitup.ConfigLoad;\n /**\n * A group of properties defining the selectors used to query elements within a mixitup container.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name selectors\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigSelectors = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A selector string used to query and index target elements within the container.\n *\n * By default, the class selector `'.mix'` is used, but this can be changed to an\n * attribute or element selector to match the style of your project.\n *\n * @example Example 1: Changing the target selector\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * target: '.portfolio-item'\n * }\n * });\n *\n * @example Example 2: Using an attribute selector as a target selector\n *\n * // The mixer will search for any children with the attribute `data-ref=\"mix\"`\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * target: '[data-ref=\"mix\"]'\n * }\n * });\n *\n * @name target\n * @memberof mixitup.Config.selectors\n * @instance\n * @type {string}\n * @default '.mix'\n */ this.target = \".mix\";\n /**\n * A optional selector string used to add further specificity to the querying of control elements,\n * in addition to their mandatory data attribute (e.g. `data-filter`, `data-toggle`, `data-sort`).\n *\n * This can be used if other elements in your document must contain the above attributes\n * (e.g. for use in third-party scripts), and would otherwise interfere with MixItUp. Adding\n * an additional `control` selector of your choice allows MixItUp to restrict event handling\n * to only those elements matching the defined selector.\n *\n * @name control\n * @memberof mixitup.Config.selectors\n * @instance\n * @type {string}\n * @default ''\n *\n * @example Example 1: Adding a `selectors.control` selector\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * control: '.mixitup-control'\n * }\n * });\n *\n * // Will not be handled:\n * // \n *\n * // Will be handled:\n * // \n */ this.control = \"\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigSelectors);\n mixitup.ConfigSelectors.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigSelectors.prototype.constructor = mixitup.ConfigSelectors;\n /**\n * A group of optional render functions for creating and updating elements.\n *\n * All render functions receive a data object, and should return a valid HTML string.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name render\n * @namespace\n * @public\n * @since 3.0.0\n */ mixitup.ConfigRender = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A function returning an HTML string representing a target element, or a reference to a\n * single DOM element.\n *\n * The function is invoked as part of the `.dataset()` API, whenever a new item is added\n * to the dataset, or an item in the dataset changes (if `dataset.dirtyCheck` is enabled).\n *\n * The function receives the relevant dataset item as its first parameter.\n *\n * @example Example 1: Using string concatenation\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * return (\n * '<div class=\"mix\">' +\n * '<h2>' + item.title + '</h2>' +\n * '</div>'\n * );\n * }\n * }\n * });\n *\n * @example Example 2: Using an ES2015 template literal\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * return (\n * `<div class=\"mix\">\n * <h2>${item.title}</h2>\n * </div>`\n * );\n * }\n * }\n * });\n *\n * @example Example 3: Using a Handlebars template\n *\n * var targetTemplate = Handlebars.compile('<div class=\"mix\"><h2>{{title}}</h2></div>');\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: targetTemplate\n * }\n * });\n *\n * @example Example 4: Returning a DOM element\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * // Create a single element using your framework's built-in renderer\n *\n * var el = ...\n *\n * return el;\n * }\n * }\n * });\n *\n * @name target\n * @memberof mixitup.Config.render\n * @instance\n * @type {function}\n * @default 'null'\n */ this.target = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigRender);\n mixitup.ConfigRender.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigRender.prototype.constructor = mixitup.ConfigRender;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.ConfigTemplates = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ConfigTemplates);\n mixitup.ConfigTemplates.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ConfigTemplates.prototype.constructor = mixitup.ConfigTemplates;\n /**\n * `mixitup.Config` is an interface used for customising the functionality of a\n * mixer instance. It is organised into several semantically distinct sub-objects,\n * each one pertaining to a particular aspect of MixItUp functionality.\n *\n * An object literal containing any or all of the available properies,\n * known as the \"configuration object\", can be passed as the second parameter to\n * the `mixitup` factory function when creating a mixer instance to customise its\n * functionality as needed.\n *\n * If no configuration object is passed, the mixer instance will take on the default\n * configuration values detailed below.\n *\n * @example Example 1: Creating and passing the configuration object\n * // Create a configuration object with desired values\n *\n * var config = {\n * animation: {\n * enable: false\n * },\n * selectors: {\n * target: '.item'\n * }\n * };\n *\n * // Pass the configuration object to the mixitup factory function\n *\n * var mixer = mixitup(containerEl, config);\n *\n * @example Example 2: Passing the configuration object inline\n * // Typically, the configuration object is passed inline for brevity.\n *\n * var mixer = mixitup(containerEl, {\n * controls: {\n * live: true,\n * toggleLogic: 'and'\n * }\n * });\n *\n *\n * @constructor\n * @memberof mixitup\n * @namespace\n * @public\n * @since 2.0.0\n */ mixitup.Config = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.animation = new mixitup.ConfigAnimation();\n this.behavior = new mixitup.ConfigBehavior();\n this.callbacks = new mixitup.ConfigCallbacks();\n this.controls = new mixitup.ConfigControls();\n this.classNames = new mixitup.ConfigClassNames();\n this.data = new mixitup.ConfigData();\n this.debug = new mixitup.ConfigDebug();\n this.layout = new mixitup.ConfigLayout();\n this.load = new mixitup.ConfigLoad();\n this.selectors = new mixitup.ConfigSelectors();\n this.render = new mixitup.ConfigRender();\n this.templates = new mixitup.ConfigTemplates();\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Config);\n mixitup.Config.prototype = Object.create(mixitup.Base.prototype);\n mixitup.Config.prototype.constructor = mixitup.Config;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.MixerDom = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.document = null;\n this.body = null;\n this.container = null;\n this.parent = null;\n this.targets = [];\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.MixerDom);\n mixitup.MixerDom.prototype = Object.create(mixitup.Base.prototype);\n mixitup.MixerDom.prototype.constructor = mixitup.MixerDom;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.UiClassNames = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.base = \"\";\n this.active = \"\";\n this.disabled = \"\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.UiClassNames);\n mixitup.UiClassNames.prototype = Object.create(mixitup.Base.prototype);\n mixitup.UiClassNames.prototype.constructor = mixitup.UiClassNames;\n /**\n * An object into which all arbitrary arguments sent to '.dataset()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandDataset = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.dataset = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandDataset);\n mixitup.CommandDataset.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandDataset.prototype.constructor = mixitup.CommandDataset;\n /**\n * An object into which all arbitrary arguments sent to '.multimix()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandMultimix = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.filter = null;\n this.sort = null;\n this.insert = null;\n this.remove = null;\n this.changeLayout = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandMultimix);\n mixitup.CommandMultimix.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandMultimix.prototype.constructor = mixitup.CommandMultimix;\n /**\n * An object into which all arbitrary arguments sent to '.filter()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandFilter = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.selector = \"\";\n this.collection = null;\n this.action = \"show\"; // enum: ['show', 'hide']\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandFilter);\n mixitup.CommandFilter.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandFilter.prototype.constructor = mixitup.CommandFilter;\n /**\n * An object into which all arbitrary arguments sent to '.sort()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandSort = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.sortString = \"\";\n this.attribute = \"\";\n this.order = \"asc\";\n this.collection = null;\n this.next = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandSort);\n mixitup.CommandSort.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandSort.prototype.constructor = mixitup.CommandSort;\n /**\n * An object into which all arbitrary arguments sent to '.insert()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandInsert = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.index = 0;\n this.collection = [];\n this.position = \"before\"; // enum: ['before', 'after']\n this.sibling = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandInsert);\n mixitup.CommandInsert.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandInsert.prototype.constructor = mixitup.CommandInsert;\n /**\n * An object into which all arbitrary arguments sent to '.remove()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandRemove = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.targets = [];\n this.collection = [];\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandRemove);\n mixitup.CommandRemove.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandRemove.prototype.constructor = mixitup.CommandRemove;\n /**\n * An object into which all arbitrary arguments sent to '.changeLayout()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.CommandChangeLayout = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.containerClassName = \"\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.CommandChangeLayout);\n mixitup.CommandChangeLayout.prototype = Object.create(mixitup.Base.prototype);\n mixitup.CommandChangeLayout.prototype.constructor = mixitup.CommandChangeLayout;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {string} type\n * @param {string} selector\n * @param {boolean} [live]\n * @param {string} [parent]\n * An optional string representing the name of the mixer.dom property containing a reference to a parent element.\n */ mixitup.ControlDefinition = function(type, selector, live, parent) {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.type = type;\n this.selector = selector;\n this.live = live || false;\n this.parent = parent || \"\";\n this.callActions(\"afterConstruct\");\n h.freeze(this);\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.ControlDefinition);\n mixitup.ControlDefinition.prototype = Object.create(mixitup.Base.prototype);\n mixitup.ControlDefinition.prototype.constructor = mixitup.ControlDefinition;\n mixitup.controlDefinitions = [];\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition(\"multimix\", \"[data-filter][data-sort]\"));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition(\"filter\", \"[data-filter]\"));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition(\"sort\", \"[data-sort]\"));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition(\"toggle\", \"[data-toggle]\"));\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Control = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.el = null;\n this.selector = \"\";\n this.bound = [];\n this.pending = -1;\n this.type = \"\";\n this.status = \"inactive\"; // enum: ['inactive', 'active', 'disabled', 'live']\n this.filter = \"\";\n this.sort = \"\";\n this.canDisable = false;\n this.handler = null;\n this.classNames = new mixitup.UiClassNames();\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Control);\n mixitup.Control.prototype = Object.create(mixitup.Base.prototype);\n h.extend(mixitup.Control.prototype, /** @lends mixitup.Control */ {\n constructor: mixitup.Control,\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {string} selector\n */ init: function(el, type, selector) {\n var self = this;\n this.callActions(\"beforeInit\", arguments);\n self.el = el;\n self.type = type;\n self.selector = selector;\n if (self.selector) self.status = \"live\";\n else {\n self.canDisable = typeof self.el.disable === \"boolean\";\n switch(self.type){\n case \"filter\":\n self.filter = self.el.getAttribute(\"data-filter\");\n break;\n case \"toggle\":\n self.filter = self.el.getAttribute(\"data-toggle\");\n break;\n case \"sort\":\n self.sort = self.el.getAttribute(\"data-sort\");\n break;\n case \"multimix\":\n self.filter = self.el.getAttribute(\"data-filter\");\n self.sort = self.el.getAttribute(\"data-sort\");\n break;\n }\n }\n self.bindClick();\n mixitup.controls.push(self);\n this.callActions(\"afterInit\", arguments);\n },\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {boolean}\n */ isBound: function(mixer) {\n var self = this, isBound = false;\n this.callActions(\"beforeIsBound\", arguments);\n isBound = self.bound.indexOf(mixer) > -1;\n return self.callFilters(\"afterIsBound\", isBound, arguments);\n },\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {void}\n */ addBinding: function(mixer) {\n var self = this;\n this.callActions(\"beforeAddBinding\", arguments);\n if (!self.isBound()) self.bound.push(mixer);\n this.callActions(\"afterAddBinding\", arguments);\n },\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {void}\n */ removeBinding: function(mixer) {\n var self = this, removeIndex = -1;\n this.callActions(\"beforeRemoveBinding\", arguments);\n if ((removeIndex = self.bound.indexOf(mixer)) > -1) self.bound.splice(removeIndex, 1);\n if (self.bound.length < 1) {\n // No bindings exist, unbind event click handlers\n self.unbindClick();\n // Remove from `mixitup.controls` list\n removeIndex = mixitup.controls.indexOf(self);\n mixitup.controls.splice(removeIndex, 1);\n if (self.status === \"active\") self.renderStatus(self.el, \"inactive\");\n }\n this.callActions(\"afterRemoveBinding\", arguments);\n },\n /**\n * @private\n * @return {void}\n */ bindClick: function() {\n var self = this;\n this.callActions(\"beforeBindClick\", arguments);\n self.handler = function(e) {\n self.handleClick(e);\n };\n h.on(self.el, \"click\", self.handler);\n this.callActions(\"afterBindClick\", arguments);\n },\n /**\n * @private\n * @return {void}\n */ unbindClick: function() {\n var self = this;\n this.callActions(\"beforeUnbindClick\", arguments);\n h.off(self.el, \"click\", self.handler);\n self.handler = null;\n this.callActions(\"afterUnbindClick\", arguments);\n },\n /**\n * @private\n * @param {MouseEvent} e\n * @return {void}\n */ handleClick: function(e) {\n var self = this, button = null, mixer = null, isActive = false, returnValue = void 0, command = {}, clone = null, commands = [], i = -1;\n this.callActions(\"beforeHandleClick\", arguments);\n this.pending = 0;\n mixer = self.bound[0];\n if (!self.selector) button = self.el;\n else button = h.closestParent(e.target, mixer.config.selectors.control + self.selector, true, mixer.dom.document);\n if (!button) {\n self.callActions(\"afterHandleClick\", arguments);\n return;\n }\n switch(self.type){\n case \"filter\":\n command.filter = self.filter || button.getAttribute(\"data-filter\");\n break;\n case \"sort\":\n command.sort = self.sort || button.getAttribute(\"data-sort\");\n break;\n case \"multimix\":\n command.filter = self.filter || button.getAttribute(\"data-filter\");\n command.sort = self.sort || button.getAttribute(\"data-sort\");\n break;\n case \"toggle\":\n command.filter = self.filter || button.getAttribute(\"data-toggle\");\n if (self.status === \"live\") isActive = h.hasClass(button, self.classNames.active);\n else isActive = self.status === \"active\";\n break;\n }\n for(i = 0; i < self.bound.length; i++){\n // Create a clone of the command for each bound mixer instance\n clone = new mixitup.CommandMultimix();\n h.extend(clone, command);\n commands.push(clone);\n }\n commands = self.callFilters(\"commandsHandleClick\", commands, arguments);\n self.pending = self.bound.length;\n for(i = 0; mixer = self.bound[i]; i++){\n command = commands[i];\n if (!command) continue;\n if (!mixer.lastClicked) mixer.lastClicked = button;\n mixitup.events.fire(\"mixClick\", mixer.dom.container, {\n state: mixer.state,\n instance: mixer,\n originalEvent: e,\n control: mixer.lastClicked\n }, mixer.dom.document);\n if (typeof mixer.config.callbacks.onMixClick === \"function\") {\n returnValue = mixer.config.callbacks.onMixClick.call(mixer.lastClicked, mixer.state, e, mixer);\n if (returnValue === false) continue;\n }\n if (self.type === \"toggle\") isActive ? mixer.toggleOff(command.filter) : mixer.toggleOn(command.filter);\n else mixer.multimix(command);\n }\n this.callActions(\"afterHandleClick\", arguments);\n },\n /**\n * @param {object} command\n * @param {Array} toggleArray\n * @return {void}\n */ update: function(command, toggleArray) {\n var self = this, actions = new mixitup.CommandMultimix();\n self.callActions(\"beforeUpdate\", arguments);\n self.pending--;\n self.pending = Math.max(0, self.pending);\n if (self.pending > 0) return;\n if (self.status === \"live\") // Live control (status unknown)\n self.updateLive(command, toggleArray);\n else {\n // Static control\n actions.sort = self.sort;\n actions.filter = self.filter;\n self.callFilters(\"actionsUpdate\", actions, arguments);\n self.parseStatusChange(self.el, command, actions, toggleArray);\n }\n self.callActions(\"afterUpdate\", arguments);\n },\n /**\n * @param {mixitup.CommandMultimix} command\n * @param {Array} toggleArray\n * @return {void}\n */ updateLive: function(command, toggleArray) {\n var self = this, controlButtons = null, actions = null, button = null, i = -1;\n self.callActions(\"beforeUpdateLive\", arguments);\n if (!self.el) return;\n controlButtons = self.el.querySelectorAll(self.selector);\n for(i = 0; button = controlButtons[i]; i++){\n actions = new mixitup.CommandMultimix();\n switch(self.type){\n case \"filter\":\n actions.filter = button.getAttribute(\"data-filter\");\n break;\n case \"sort\":\n actions.sort = button.getAttribute(\"data-sort\");\n break;\n case \"multimix\":\n actions.filter = button.getAttribute(\"data-filter\");\n actions.sort = button.getAttribute(\"data-sort\");\n break;\n case \"toggle\":\n actions.filter = button.getAttribute(\"data-toggle\");\n break;\n }\n actions = self.callFilters(\"actionsUpdateLive\", actions, arguments);\n self.parseStatusChange(button, command, actions, toggleArray);\n }\n self.callActions(\"afterUpdateLive\", arguments);\n },\n /**\n * @param {HTMLElement} button\n * @param {mixitup.CommandMultimix} command\n * @param {mixitup.CommandMultimix} actions\n * @param {Array} toggleArray\n * @return {void}\n */ parseStatusChange: function(button, command, actions, toggleArray) {\n var self = this, alias = \"\", toggle = \"\", i = -1;\n self.callActions(\"beforeParseStatusChange\", arguments);\n switch(self.type){\n case \"filter\":\n if (command.filter === actions.filter) self.renderStatus(button, \"active\");\n else self.renderStatus(button, \"inactive\");\n break;\n case \"multimix\":\n if (command.sort === actions.sort && command.filter === actions.filter) self.renderStatus(button, \"active\");\n else self.renderStatus(button, \"inactive\");\n break;\n case \"sort\":\n if (command.sort.match(/:asc/g)) alias = command.sort.replace(/:asc/g, \"\");\n if (command.sort === actions.sort || alias === actions.sort) self.renderStatus(button, \"active\");\n else self.renderStatus(button, \"inactive\");\n break;\n case \"toggle\":\n if (toggleArray.length < 1) self.renderStatus(button, \"inactive\");\n if (command.filter === actions.filter) self.renderStatus(button, \"active\");\n for(i = 0; i < toggleArray.length; i++){\n toggle = toggleArray[i];\n if (toggle === actions.filter) {\n // Button matches one active toggle\n self.renderStatus(button, \"active\");\n break;\n }\n self.renderStatus(button, \"inactive\");\n }\n break;\n }\n self.callActions(\"afterParseStatusChange\", arguments);\n },\n /**\n * @param {HTMLElement} button\n * @param {string} status\n * @return {void}\n */ renderStatus: function(button, status) {\n var self = this;\n self.callActions(\"beforeRenderStatus\", arguments);\n switch(status){\n case \"active\":\n h.addClass(button, self.classNames.active);\n h.removeClass(button, self.classNames.disabled);\n if (self.canDisable) self.el.disabled = false;\n break;\n case \"inactive\":\n h.removeClass(button, self.classNames.active);\n h.removeClass(button, self.classNames.disabled);\n if (self.canDisable) self.el.disabled = false;\n break;\n case \"disabled\":\n if (self.canDisable) self.el.disabled = true;\n h.addClass(button, self.classNames.disabled);\n h.removeClass(button, self.classNames.active);\n break;\n }\n if (self.status !== \"live\") // Update the control's status propery if not live\n self.status = status;\n self.callActions(\"afterRenderStatus\", arguments);\n }\n });\n mixitup.controls = [];\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.StyleData = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.x = 0;\n this.y = 0;\n this.top = 0;\n this.right = 0;\n this.bottom = 0;\n this.left = 0;\n this.width = 0;\n this.height = 0;\n this.marginRight = 0;\n this.marginBottom = 0;\n this.opacity = 0;\n this.scale = new mixitup.TransformData();\n this.translateX = new mixitup.TransformData();\n this.translateY = new mixitup.TransformData();\n this.translateZ = new mixitup.TransformData();\n this.rotateX = new mixitup.TransformData();\n this.rotateY = new mixitup.TransformData();\n this.rotateZ = new mixitup.TransformData();\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.StyleData);\n mixitup.StyleData.prototype = Object.create(mixitup.Base.prototype);\n mixitup.StyleData.prototype.constructor = mixitup.StyleData;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.TransformData = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.value = 0;\n this.unit = \"\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.TransformData);\n mixitup.TransformData.prototype = Object.create(mixitup.Base.prototype);\n mixitup.TransformData.prototype.constructor = mixitup.TransformData;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.TransformDefaults = function() {\n mixitup.StyleData.apply(this);\n this.callActions(\"beforeConstruct\");\n this.scale.value = 0.01;\n this.scale.unit = \"\";\n this.translateX.value = 20;\n this.translateX.unit = \"px\";\n this.translateY.value = 20;\n this.translateY.unit = \"px\";\n this.translateZ.value = 20;\n this.translateZ.unit = \"px\";\n this.rotateX.value = 90;\n this.rotateX.unit = \"deg\";\n this.rotateY.value = 90;\n this.rotateY.unit = \"deg\";\n this.rotateX.value = 90;\n this.rotateX.unit = \"deg\";\n this.rotateZ.value = 180;\n this.rotateZ.unit = \"deg\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.TransformDefaults);\n mixitup.TransformDefaults.prototype = Object.create(mixitup.StyleData.prototype);\n mixitup.TransformDefaults.prototype.constructor = mixitup.TransformDefaults;\n /**\n * @private\n * @static\n * @since 3.0.0\n * @type {mixitup.TransformDefaults}\n */ mixitup.transformDefaults = new mixitup.TransformDefaults();\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.EventDetail = function() {\n this.state = null;\n this.futureState = null;\n this.instance = null;\n this.originalEvent = null;\n };\n /**\n * The `mixitup.Events` class contains all custom events dispatched by MixItUp at various\n * points within the lifecycle of a mixer operation.\n *\n * Each event is analogous to the callback function of the same name defined in\n * the `callbacks` configuration object, and is triggered immediately before it.\n *\n * Events are always triggered from the container element on which MixItUp is instantiated\n * upon.\n *\n * As with any event, registered event handlers receive the event object as a parameter\n * which includes a `detail` property containting references to the current `state`,\n * the `mixer` instance, and other event-specific properties described below.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */ mixitup.Events = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * A custom event triggered immediately after any MixItUp operation is requested\n * and before animations have begun.\n *\n * The `mixStart` event also exposes a `futureState` property via the\n * `event.detail` object, which represents the final state of the mixer once\n * the requested operation has completed.\n *\n * @name mixStart\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */ this.mixStart = null;\n /**\n * A custom event triggered when a MixItUp operation is requested while another\n * operation is in progress, and the animation queue is full, or queueing\n * is disabled.\n *\n * @name mixBusy\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */ this.mixBusy = null;\n /**\n * A custom event triggered after any MixItUp operation has completed, and the\n * state has been updated.\n *\n * @name mixEnd\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */ this.mixEnd = null;\n /**\n * A custom event triggered whenever a filter operation \"fails\", i.e. no targets\n * could be found matching the requested filter.\n *\n * @name mixFail\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */ this.mixFail = null;\n /**\n * A custom event triggered whenever a MixItUp control is clicked, and before its\n * respective operation is requested.\n *\n * This event also exposes an `originalEvent` property via the `event.detail`\n * object, which holds a reference to the original click event.\n *\n * @name mixClick\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */ this.mixClick = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Events);\n mixitup.Events.prototype = Object.create(mixitup.Base.prototype);\n mixitup.Events.prototype.constructor = mixitup.Events;\n /**\n * @private\n * @param {string} eventType\n * @param {Element} el\n * @param {object} detail\n * @param {Document} [doc]\n */ mixitup.Events.prototype.fire = function(eventType, el, detail, doc) {\n var self = this, event = null, eventDetail = new mixitup.EventDetail();\n self.callActions(\"beforeFire\", arguments);\n if (typeof self[eventType] === \"undefined\") throw new Error('Event type \"' + eventType + '\" not found.');\n eventDetail.state = new mixitup.State();\n h.extend(eventDetail.state, detail.state);\n if (detail.futureState) {\n eventDetail.futureState = new mixitup.State();\n h.extend(eventDetail.futureState, detail.futureState);\n }\n eventDetail.instance = detail.instance;\n if (detail.originalEvent) eventDetail.originalEvent = detail.originalEvent;\n event = h.getCustomEvent(eventType, eventDetail, doc);\n self.callFilters(\"eventFire\", event, arguments);\n el.dispatchEvent(event);\n };\n // Asign a singleton instance to `mixitup.events`:\n mixitup.events = new mixitup.Events();\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.QueueItem = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.args = [];\n this.instruction = null;\n this.triggerElement = null;\n this.deferred = null;\n this.isToggling = false;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.QueueItem);\n mixitup.QueueItem.prototype = Object.create(mixitup.Base.prototype);\n mixitup.QueueItem.prototype.constructor = mixitup.QueueItem;\n /**\n * The `mixitup.Mixer` class is used to hold discreet, user-configured\n * instances of MixItUp on a provided container element.\n *\n * Mixer instances are returned whenever the `mixitup()` factory function is called,\n * which expose a range of methods enabling API-based filtering, sorting,\n * insertion, removal and more.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */ mixitup.Mixer = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.config = new mixitup.Config();\n this.id = \"\";\n this.isBusy = false;\n this.isToggling = false;\n this.incPadding = true;\n this.controls = [];\n this.targets = [];\n this.origOrder = [];\n this.cache = {};\n this.toggleArray = [];\n this.targetsMoved = 0;\n this.targetsImmovable = 0;\n this.targetsBound = 0;\n this.targetsDone = 0;\n this.staggerDuration = 0;\n this.effectsIn = null;\n this.effectsOut = null;\n this.transformIn = [];\n this.transformOut = [];\n this.queue = [];\n this.state = null;\n this.lastOperation = null;\n this.lastClicked = null;\n this.userCallback = null;\n this.userDeferred = null;\n this.dom = new mixitup.MixerDom();\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Mixer);\n mixitup.Mixer.prototype = Object.create(mixitup.Base.prototype);\n h.extend(mixitup.Mixer.prototype, /** @lends mixitup.Mixer */ {\n constructor: mixitup.Mixer,\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} container\n * @param {HTMLElement} document\n * @param {string} id\n * @param {object} [config]\n */ attach: function(container, document1, id, config) {\n var self = this, target = null, i = -1;\n self.callActions(\"beforeAttach\", arguments);\n self.id = id;\n if (config) h.extend(self.config, config, true, true);\n self.sanitizeConfig();\n self.cacheDom(container, document1);\n if (self.config.layout.containerClassName) h.addClass(self.dom.container, self.config.layout.containerClassName);\n if (!mixitup.features.has.transitions) self.config.animation.enable = false;\n if (typeof window1.console === \"undefined\") self.config.debug.showWarnings = false;\n if (self.config.data.uidKey) // If the dataset API is in use, force disable controls\n self.config.controls.enable = false;\n self.indexTargets();\n self.state = self.getInitialState();\n for(i = 0; target = self.lastOperation.toHide[i]; i++)target.hide();\n if (self.config.controls.enable) {\n self.initControls();\n self.buildToggleArray(null, self.state);\n self.updateControls({\n filter: self.state.activeFilter,\n sort: self.state.activeSort\n });\n }\n self.parseEffects();\n self.callActions(\"afterAttach\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ sanitizeConfig: function() {\n var self = this;\n self.callActions(\"beforeSanitizeConfig\", arguments);\n // Sanitize enum/string config options\n self.config.controls.scope = self.config.controls.scope.toLowerCase().trim();\n self.config.controls.toggleLogic = self.config.controls.toggleLogic.toLowerCase().trim();\n self.config.controls.toggleDefault = self.config.controls.toggleDefault.toLowerCase().trim();\n self.config.animation.effects = self.config.animation.effects.trim();\n self.callActions(\"afterSanitizeConfig\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {mixitup.State}\n */ getInitialState: function() {\n var self = this, state = new mixitup.State(), operation = new mixitup.Operation();\n self.callActions(\"beforeGetInitialState\", arguments);\n // Map initial values into a mock state object in order to construct an operation\n state.activeContainerClassName = self.config.layout.containerClassName;\n if (self.config.load.dataset) {\n // Dataset API\n if (!self.config.data.uidKey || typeof self.config.data.uidKey !== \"string\") throw new TypeError(mixitup.messages.errorConfigDataUidKeyNotSet());\n operation.startDataset = operation.newDataset = state.activeDataset = self.config.load.dataset.slice();\n operation.startContainerClassName = operation.newContainerClassName = state.activeContainerClassName;\n operation.show = self.targets.slice();\n state = self.callFilters(\"stateGetInitialState\", state, arguments);\n } else {\n // DOM API\n state.activeFilter = self.parseFilterArgs([\n self.config.load.filter\n ]).command;\n state.activeSort = self.parseSortArgs([\n self.config.load.sort\n ]).command;\n state.totalTargets = self.targets.length;\n state = self.callFilters(\"stateGetInitialState\", state, arguments);\n if (state.activeSort.collection || state.activeSort.attribute || state.activeSort.order === \"random\" || state.activeSort.order === \"desc\") {\n // Sorting on load\n operation.newSort = state.activeSort;\n self.sortOperation(operation);\n self.printSort(false, operation);\n self.targets = operation.newOrder;\n } else operation.startOrder = operation.newOrder = self.targets;\n operation.startFilter = operation.newFilter = state.activeFilter;\n operation.startSort = operation.newSort = state.activeSort;\n operation.startContainerClassName = operation.newContainerClassName = state.activeContainerClassName;\n if (operation.newFilter.selector === \"all\") operation.newFilter.selector = self.config.selectors.target;\n else if (operation.newFilter.selector === \"none\") operation.newFilter.selector = \"\";\n }\n operation = self.callFilters(\"operationGetInitialState\", operation, [\n state\n ]);\n self.lastOperation = operation;\n if (operation.newFilter) self.filterOperation(operation);\n state = self.buildState(operation);\n return state;\n },\n /**\n * Caches references of DOM elements neccessary for the mixer's functionality.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} el\n * @param {HTMLHtmlElement} document\n * @return {void}\n */ cacheDom: function(el, document1) {\n var self = this;\n self.callActions(\"beforeCacheDom\", arguments);\n self.dom.document = document1;\n self.dom.body = self.dom.document.querySelector(\"body\");\n self.dom.container = el;\n self.dom.parent = el;\n self.callActions(\"afterCacheDom\", arguments);\n },\n /**\n * Indexes all child elements of the mixer matching the `selectors.target`\n * selector, instantiating a mixitup.Target for each one.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ indexTargets: function() {\n var self = this, target = null, el = null, dataset = null, i = -1;\n self.callActions(\"beforeIndexTargets\", arguments);\n self.dom.targets = self.config.layout.allowNestedTargets ? self.dom.container.querySelectorAll(self.config.selectors.target) : h.children(self.dom.container, self.config.selectors.target, self.dom.document);\n self.dom.targets = h.arrayFromList(self.dom.targets);\n self.targets = [];\n if ((dataset = self.config.load.dataset) && dataset.length !== self.dom.targets.length) throw new Error(mixitup.messages.errorDatasetPrerenderedMismatch());\n if (self.dom.targets.length) {\n for(i = 0; el = self.dom.targets[i]; i++){\n target = new mixitup.Target();\n target.init(el, self, dataset ? dataset[i] : void 0);\n target.isInDom = true;\n self.targets.push(target);\n }\n self.dom.parent = self.dom.targets[0].parentElement === self.dom.container ? self.dom.container : self.dom.targets[0].parentElement;\n }\n self.origOrder = self.targets;\n self.callActions(\"afterIndexTargets\", arguments);\n },\n initControls: function() {\n var self = this, definition = \"\", controlElements = null, el = null, parent = null, delagators = null, control = null, i = -1, j = -1;\n self.callActions(\"beforeInitControls\", arguments);\n switch(self.config.controls.scope){\n case \"local\":\n parent = self.dom.container;\n break;\n case \"global\":\n parent = self.dom.document;\n break;\n default:\n throw new Error(mixitup.messages.errorConfigInvalidControlsScope());\n }\n for(i = 0; definition = mixitup.controlDefinitions[i]; i++)if (self.config.controls.live || definition.live) {\n if (definition.parent) {\n delagators = self.dom[definition.parent];\n if (!delagators || delagators.length < 0) continue;\n if (typeof delagators.length !== \"number\") delagators = [\n delagators\n ];\n } else delagators = [\n parent\n ];\n for(j = 0; el = delagators[j]; j++){\n control = self.getControl(el, definition.type, definition.selector);\n self.controls.push(control);\n }\n } else {\n controlElements = parent.querySelectorAll(self.config.selectors.control + definition.selector);\n for(j = 0; el = controlElements[j]; j++){\n control = self.getControl(el, definition.type, \"\");\n if (!control) continue;\n self.controls.push(control);\n }\n }\n self.callActions(\"afterInitControls\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} el\n * @param {string} type\n * @param {string} selector\n * @return {mixitup.Control|null}\n */ getControl: function(el, type, selector) {\n var self = this, control = null, i = -1;\n self.callActions(\"beforeGetControl\", arguments);\n if (!selector) // Static controls only\n for(i = 0; control = mixitup.controls[i]; i++){\n if (control.el === el && control.isBound(self)) // Control already bound to this mixer (as another type).\n // NB: This prevents duplicate controls from being registered where a selector\n // might collide, eg: \"[data-filter]\" and \"[data-filter][data-sort]\"\n return self.callFilters(\"controlGetControl\", null, arguments);\n else if (control.el === el && control.type === type && control.selector === selector) {\n // Another mixer is already using this control, add this mixer as a binding\n control.addBinding(self);\n return self.callFilters(\"controlGetControl\", control, arguments);\n }\n }\n // Create new control\n control = new mixitup.Control();\n control.init(el, type, selector);\n control.classNames.base = h.getClassname(self.config.classNames, type);\n control.classNames.active = h.getClassname(self.config.classNames, type, self.config.classNames.modifierActive);\n control.classNames.disabled = h.getClassname(self.config.classNames, type, self.config.classNames.modifierDisabled);\n // Add a reference to this mixer as a binding\n control.addBinding(self);\n return self.callFilters(\"controlGetControl\", control, arguments);\n },\n /**\n * Creates a compound selector by joining the `toggleArray` value as per the\n * defined toggle logic.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @return {string}\n */ getToggleSelector: function() {\n var self = this, delineator = self.config.controls.toggleLogic === \"or\" ? \", \" : \"\", toggleSelector = \"\";\n self.callActions(\"beforeGetToggleSelector\", arguments);\n self.toggleArray = h.clean(self.toggleArray);\n toggleSelector = self.toggleArray.join(delineator);\n if (toggleSelector === \"\") toggleSelector = self.config.controls.toggleDefault;\n return self.callFilters(\"selectorGetToggleSelector\", toggleSelector, arguments);\n },\n /**\n * Breaks compound selector strings in an array of discreet selectors,\n * as per the active `controls.toggleLogic` configuration option. Accepts\n * either a dynamic command object, or a state object.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {object} [command]\n * @param {mixitup.State} [state]\n * @return {void}\n */ buildToggleArray: function(command, state) {\n var self = this, activeFilterSelector = \"\";\n self.callActions(\"beforeBuildToggleArray\", arguments);\n if (command && command.filter) activeFilterSelector = command.filter.selector.replace(/\\s/g, \"\");\n else if (state) activeFilterSelector = state.activeFilter.selector.replace(/\\s/g, \"\");\n else return;\n if (activeFilterSelector === self.config.selectors.target || activeFilterSelector === \"all\") activeFilterSelector = \"\";\n if (self.config.controls.toggleLogic === \"or\") self.toggleArray = activeFilterSelector.split(\",\");\n else self.toggleArray = self.splitCompoundSelector(activeFilterSelector);\n self.toggleArray = h.clean(self.toggleArray);\n self.callActions(\"afterBuildToggleArray\", arguments);\n },\n /**\n * Takes a compound selector (e.g. `.cat-1.cat-2`, `[data-cat=\"1\"][data-cat=\"2\"]`)\n * and breaks into its individual selectors.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} compoundSelector\n * @return {string[]}\n */ splitCompoundSelector: function(compoundSelector) {\n // Break at a `.` or `[`, capturing the delineator\n var partials = compoundSelector.split(/([\\.\\[])/g), toggleArray = [], selector = \"\", i = -1;\n if (partials[0] === \"\") partials.shift();\n for(i = 0; i < partials.length; i++){\n if (i % 2 === 0) selector = \"\";\n selector += partials[i];\n if (i % 2 !== 0) toggleArray.push(selector);\n }\n return toggleArray;\n },\n /**\n * Updates controls to their active/inactive state based on the command or\n * current state of the mixer.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {object} command\n * @return {void}\n */ updateControls: function(command) {\n var self = this, control = null, output = new mixitup.CommandMultimix(), i = -1;\n self.callActions(\"beforeUpdateControls\", arguments);\n // Sanitise to defaults\n if (command.filter) output.filter = command.filter.selector;\n else output.filter = self.state.activeFilter.selector;\n if (command.sort) output.sort = self.buildSortString(command.sort);\n else output.sort = self.buildSortString(self.state.activeSort);\n if (output.filter === self.config.selectors.target) output.filter = \"all\";\n if (output.filter === \"\") output.filter = \"none\";\n h.freeze(output);\n for(i = 0; control = self.controls[i]; i++)control.update(output, self.toggleArray);\n self.callActions(\"afterUpdateControls\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.CommandSort} command\n * @return {string}\n */ buildSortString: function(command) {\n var self = this;\n var output = \"\";\n output += command.sortString;\n if (command.next) output += \" \" + self.buildSortString(command.next);\n return output;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} command\n * @param {Operation} operation\n * @return {Promise.}\n */ insertTargets: function(command, operation) {\n var self = this, nextSibling = null, insertionIndex = -1, frag = null, target = null, el = null, i = -1;\n self.callActions(\"beforeInsertTargets\", arguments);\n if (typeof command.index === \"undefined\") command.index = 0;\n nextSibling = self.getNextSibling(command.index, command.sibling, command.position);\n frag = self.dom.document.createDocumentFragment();\n if (nextSibling) insertionIndex = h.index(nextSibling, self.config.selectors.target);\n else insertionIndex = self.targets.length;\n if (command.collection) {\n for(i = 0; el = command.collection[i]; i++){\n if (self.dom.targets.indexOf(el) > -1) throw new Error(mixitup.messages.errorInsertPreexistingElement());\n // Ensure elements are hidden when they are added to the DOM, so they can\n // be animated in gracefully\n el.style.display = \"none\";\n frag.appendChild(el);\n frag.appendChild(self.dom.document.createTextNode(\" \"));\n if (!h.isElement(el, self.dom.document) || !el.matches(self.config.selectors.target)) continue;\n target = new mixitup.Target();\n target.init(el, self);\n target.isInDom = true;\n self.targets.splice(insertionIndex, 0, target);\n insertionIndex++;\n }\n self.dom.parent.insertBefore(frag, nextSibling);\n }\n // Since targets have been added, the original order must be updated\n operation.startOrder = self.origOrder = self.targets;\n self.callActions(\"afterInsertTargets\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Number} [index]\n * @param {Element} [sibling]\n * @param {string} [position]\n * @return {Element}\n */ getNextSibling: function(index, sibling, position) {\n var self = this, element = null;\n index = Math.max(index, 0);\n if (sibling && position === \"before\") // Explicit sibling\n element = sibling;\n else if (sibling && position === \"after\") // Explicit sibling\n element = sibling.nextElementSibling || null;\n else if (self.targets.length > 0 && typeof index !== \"undefined\") // Index and targets exist\n element = index < self.targets.length || !self.targets.length ? self.targets[index].dom.el : self.targets[self.targets.length - 1].dom.el.nextElementSibling;\n else if (self.targets.length === 0 && self.dom.parent.children.length > 0) {\n // No targets but other siblings\n if (self.config.layout.siblingAfter) element = self.config.layout.siblingAfter;\n else if (self.config.layout.siblingBefore) element = self.config.layout.siblingBefore.nextElementSibling;\n else self.dom.parent.children[0];\n } else element;\n return self.callFilters(\"elementGetNextSibling\", element, arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ filterOperation: function(operation) {\n var self = this, testResult = false, index = -1, action = \"\", target = null, i = -1;\n self.callActions(\"beforeFilterOperation\", arguments);\n action = operation.newFilter.action;\n for(i = 0; target = operation.newOrder[i]; i++){\n if (operation.newFilter.collection) // show via collection\n testResult = operation.newFilter.collection.indexOf(target.dom.el) > -1;\n else // show via selector\n if (operation.newFilter.selector === \"\") testResult = false;\n else testResult = target.dom.el.matches(operation.newFilter.selector);\n self.evaluateHideShow(testResult, target, action, operation);\n }\n if (operation.toRemove.length) {\n for(i = 0; target = operation.show[i]; i++)if (operation.toRemove.indexOf(target) > -1) {\n // If any shown targets should be removed, move them into the toHide array\n operation.show.splice(i, 1);\n if ((index = operation.toShow.indexOf(target)) > -1) operation.toShow.splice(index, 1);\n operation.toHide.push(target);\n operation.hide.push(target);\n i--;\n }\n }\n operation.matching = operation.show.slice();\n if (operation.show.length === 0 && operation.newFilter.selector !== \"\" && self.targets.length !== 0) operation.hasFailed = true;\n self.callActions(\"afterFilterOperation\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {boolean} testResult\n * @param {Element} target\n * @param {string} action\n * @param {Operation} operation\n * @return {void}\n */ evaluateHideShow: function(testResult, target, action, operation) {\n var self = this, filteredTestResult = false, args = Array.prototype.slice.call(arguments, 1);\n filteredTestResult = self.callFilters(\"testResultEvaluateHideShow\", testResult, args);\n self.callActions(\"beforeEvaluateHideShow\", arguments);\n if (filteredTestResult === true && action === \"show\" || filteredTestResult === false && action === \"hide\") {\n operation.show.push(target);\n !target.isShown && operation.toShow.push(target);\n } else {\n operation.hide.push(target);\n target.isShown && operation.toHide.push(target);\n }\n self.callActions(\"afterEvaluateHideShow\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ sortOperation: function(operation) {\n var self = this, newOrder = [], target = null, el = null, i = -1;\n self.callActions(\"beforeSortOperation\", arguments);\n operation.startOrder = self.targets;\n if (operation.newSort.collection) {\n // Sort by collection\n newOrder = [];\n for(i = 0; el = operation.newSort.collection[i]; i++){\n if (self.dom.targets.indexOf(el) < 0) throw new Error(mixitup.messages.errorSortNonExistentElement());\n target = new mixitup.Target();\n target.init(el, self);\n target.isInDom = true;\n newOrder.push(target);\n }\n operation.newOrder = newOrder;\n } else if (operation.newSort.order === \"random\") // Sort random\n operation.newOrder = h.arrayShuffle(operation.startOrder);\n else if (operation.newSort.attribute === \"\") {\n // Sort by default\n operation.newOrder = self.origOrder.slice();\n if (operation.newSort.order === \"desc\") operation.newOrder.reverse();\n } else {\n // Sort by attribute\n operation.newOrder = operation.startOrder.slice();\n operation.newOrder.sort(function(a, b) {\n return self.compare(a, b, operation.newSort);\n });\n }\n if (h.isEqualArray(operation.newOrder, operation.startOrder)) operation.willSort = false;\n self.callActions(\"afterSortOperation\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {mixitup.Target} a\n * @param {mixitup.Target} b\n * @param {mixitup.CommandSort} command\n * @return {Number}\n */ compare: function(a, b, command) {\n var self = this, order = command.order, attrA = self.getAttributeValue(a, command.attribute), attrB = self.getAttributeValue(b, command.attribute);\n if (isNaN(attrA * 1) || isNaN(attrB * 1)) {\n attrA = attrA.toLowerCase();\n attrB = attrB.toLowerCase();\n } else {\n attrA = attrA * 1;\n attrB = attrB * 1;\n }\n if (attrA < attrB) return order === \"asc\" ? -1 : 1;\n if (attrA > attrB) return order === \"asc\" ? 1 : -1;\n if (attrA === attrB && command.next) return self.compare(a, b, command.next);\n return 0;\n },\n /**\n * Reads the values of any data attributes present the provided target element\n * which match the current sort command.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Target} target\n * @param {string} [attribute]\n * @return {(String|Number)}\n */ getAttributeValue: function(target, attribute) {\n var self = this, value = \"\";\n value = target.dom.el.getAttribute(\"data-\" + attribute);\n if (value === null) {\n if (self.config.debug.showWarnings) // Encourage users to assign values to all targets to avoid erroneous sorting\n // when types are mixed\n console.warn(mixitup.messages.warningInconsistentSortingAttributes({\n attribute: \"data-\" + attribute\n }));\n }\n // If an attribute is not present, return 0 as a safety value\n return self.callFilters(\"valueGetAttributeValue\", value || 0, arguments);\n },\n /**\n * Inserts elements into the DOM in the appropriate\n * order using a document fragment for minimal\n * DOM thrashing\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {boolean} isResetting\n * @param {Operation} operation\n * @return {void}\n */ printSort: function(isResetting, operation) {\n var self = this, startOrder = isResetting ? operation.newOrder : operation.startOrder, newOrder = isResetting ? operation.startOrder : operation.newOrder, nextSibling = startOrder.length ? startOrder[startOrder.length - 1].dom.el.nextElementSibling : null, frag = window1.document.createDocumentFragment(), whitespace = null, target = null, el = null, i = -1;\n self.callActions(\"beforePrintSort\", arguments);\n // Empty the container\n for(i = 0; target = startOrder[i]; i++){\n el = target.dom.el;\n if (el.style.position === \"absolute\") continue;\n h.removeWhitespace(el.previousSibling);\n el.parentElement.removeChild(el);\n }\n whitespace = nextSibling ? nextSibling.previousSibling : self.dom.parent.lastChild;\n if (whitespace && whitespace.nodeName === \"#text\") h.removeWhitespace(whitespace);\n for(i = 0; target = newOrder[i]; i++){\n // Add targets into a document fragment\n el = target.dom.el;\n if (h.isElement(frag.lastChild)) frag.appendChild(window1.document.createTextNode(\" \"));\n frag.appendChild(el);\n }\n // Insert the document fragment into the container\n // before any other non-target elements\n if (self.dom.parent.firstChild && self.dom.parent.firstChild !== nextSibling) frag.insertBefore(window1.document.createTextNode(\" \"), frag.childNodes[0]);\n if (nextSibling) {\n frag.appendChild(window1.document.createTextNode(\" \"));\n self.dom.parent.insertBefore(frag, nextSibling);\n } else self.dom.parent.appendChild(frag);\n self.callActions(\"afterPrintSort\", arguments);\n },\n /**\n * Parses user-defined sort strings (i.e. `default:asc`) into sort commands objects.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} sortString\n * @param {mixitup.CommandSort} command\n * @return {mixitup.CommandSort}\n */ parseSortString: function(sortString, command) {\n var self = this, rules = sortString.split(\" \"), current = command, rule = [], i = -1;\n // command.sortString = sortString;\n for(i = 0; i < rules.length; i++){\n rule = rules[i].split(\":\");\n current.sortString = rules[i];\n current.attribute = h.dashCase(rule[0]);\n current.order = rule[1] || \"asc\";\n switch(current.attribute){\n case \"default\":\n // treat \"default\" as sorting by no attribute\n current.attribute = \"\";\n break;\n case \"random\":\n // treat \"random\" as an order not an attribute\n current.attribute = \"\";\n current.order = \"random\";\n break;\n }\n if (!current.attribute || current.order === \"random\") break;\n if (i < rules.length - 1) {\n // Embed reference to the next command\n current.next = new mixitup.CommandSort();\n h.freeze(current);\n current = current.next;\n }\n }\n return self.callFilters(\"commandsParseSort\", command, arguments);\n },\n /**\n * Parses all effects out of the user-defined `animation.effects` string into\n * their respective properties and units.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @return {void}\n */ parseEffects: function() {\n var self = this, transformName = \"\", effectsIn = self.config.animation.effectsIn || self.config.animation.effects, effectsOut = self.config.animation.effectsOut || self.config.animation.effects;\n self.callActions(\"beforeParseEffects\", arguments);\n self.effectsIn = new mixitup.StyleData();\n self.effectsOut = new mixitup.StyleData();\n self.transformIn = [];\n self.transformOut = [];\n self.effectsIn.opacity = self.effectsOut.opacity = 1;\n self.parseEffect(\"fade\", effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect(\"fade\", effectsOut, self.effectsOut, self.transformOut, true);\n for(transformName in mixitup.transformDefaults){\n if (!(mixitup.transformDefaults[transformName] instanceof mixitup.TransformData)) continue;\n self.parseEffect(transformName, effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect(transformName, effectsOut, self.effectsOut, self.transformOut, true);\n }\n self.parseEffect(\"stagger\", effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect(\"stagger\", effectsOut, self.effectsOut, self.transformOut, true);\n self.callActions(\"afterParseEffects\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} effectName\n * @param {string} effectString\n * @param {StyleData} effects\n * @param {String[]} transform\n * @param {boolean} [isOut]\n */ parseEffect: function(effectName, effectString, effects, transform, isOut) {\n var self = this, re = /\\(([^)]+)\\)/, propIndex = -1, str = \"\", match = [], val = \"\", units = [\n \"%\",\n \"px\",\n \"em\",\n \"rem\",\n \"vh\",\n \"vw\",\n \"deg\"\n ], unit = \"\", i = -1;\n self.callActions(\"beforeParseEffect\", arguments);\n if (typeof effectString !== \"string\") throw new TypeError(mixitup.messages.errorConfigInvalidAnimationEffects());\n if (effectString.indexOf(effectName) < 0) {\n // The effect is not present in the effects string\n if (effectName === \"stagger\") // Reset stagger to 0\n self.staggerDuration = 0;\n return;\n }\n // The effect is present\n propIndex = effectString.indexOf(effectName + \"(\");\n if (propIndex > -1) {\n // The effect has a user defined value in parentheses\n // Extract from the first parenthesis to the end of string\n str = effectString.substring(propIndex);\n // Match any number of characters between \"(\" and \")\"\n match = re.exec(str);\n val = match[1];\n }\n switch(effectName){\n case \"fade\":\n effects.opacity = val ? parseFloat(val) : 0;\n break;\n case \"stagger\":\n self.staggerDuration = val ? parseFloat(val) : 100;\n break;\n default:\n // All other effects are transforms following the same structure\n if (isOut && self.config.animation.reverseOut && effectName !== \"scale\") effects[effectName].value = (val ? parseFloat(val) : mixitup.transformDefaults[effectName].value) * -1;\n else effects[effectName].value = val ? parseFloat(val) : mixitup.transformDefaults[effectName].value;\n if (val) {\n for(i = 0; unit = units[i]; i++)if (val.indexOf(unit) > -1) {\n effects[effectName].unit = unit;\n break;\n }\n } else effects[effectName].unit = mixitup.transformDefaults[effectName].unit;\n transform.push(effectName + \"(\" + effects[effectName].value + effects[effectName].unit + \")\");\n }\n self.callActions(\"afterParseEffect\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {State}\n */ buildState: function(operation) {\n var self = this, state = new mixitup.State(), target = null, i = -1;\n self.callActions(\"beforeBuildState\", arguments);\n // Map target elements into state arrays.\n // the real target objects should never be exposed\n for(i = 0; target = self.targets[i]; i++)if (!operation.toRemove.length || operation.toRemove.indexOf(target) < 0) state.targets.push(target.dom.el);\n for(i = 0; target = operation.matching[i]; i++)state.matching.push(target.dom.el);\n for(i = 0; target = operation.show[i]; i++)state.show.push(target.dom.el);\n for(i = 0; target = operation.hide[i]; i++)if (!operation.toRemove.length || operation.toRemove.indexOf(target) < 0) state.hide.push(target.dom.el);\n state.id = self.id;\n state.container = self.dom.container;\n state.activeFilter = operation.newFilter;\n state.activeSort = operation.newSort;\n state.activeDataset = operation.newDataset;\n state.activeContainerClassName = operation.newContainerClassName;\n state.hasFailed = operation.hasFailed;\n state.totalTargets = self.targets.length;\n state.totalShow = operation.show.length;\n state.totalHide = operation.hide.length;\n state.totalMatching = operation.matching.length;\n state.triggerElement = operation.triggerElement;\n return self.callFilters(\"stateBuildState\", state, arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {boolean} shouldAnimate\n * @param {Operation} operation\n * @return {void}\n */ goMix: function(shouldAnimate, operation) {\n var self = this, deferred = null;\n self.callActions(\"beforeGoMix\", arguments);\n // If the animation duration is set to 0ms,\n // or no effects specified,\n // or the container is hidden\n // then abort animation\n if (!self.config.animation.duration || !self.config.animation.effects || !h.isVisible(self.dom.container)) shouldAnimate = false;\n if (!operation.toShow.length && !operation.toHide.length && !operation.willSort && !operation.willChangeLayout) // If nothing to show or hide, and not sorting or\n // changing layout\n shouldAnimate = false;\n if (!operation.startState.show.length && !operation.show.length) // If nothing currently shown, nothing to show\n shouldAnimate = false;\n mixitup.events.fire(\"mixStart\", self.dom.container, {\n state: operation.startState,\n futureState: operation.newState,\n instance: self\n }, self.dom.document);\n if (typeof self.config.callbacks.onMixStart === \"function\") self.config.callbacks.onMixStart.call(self.dom.container, operation.startState, operation.newState, self);\n h.removeClass(self.dom.container, h.getClassname(self.config.classNames, \"container\", self.config.classNames.modifierFailed));\n if (!self.userDeferred) // Queue empty, no pending operations\n deferred = self.userDeferred = h.defer(mixitup.libraries);\n else // Use existing deferred\n deferred = self.userDeferred;\n self.isBusy = true;\n if (!shouldAnimate || !mixitup.features.has.transitions) {\n // Abort\n if (self.config.debug.fauxAsync) setTimeout(function() {\n self.cleanUp(operation);\n }, self.config.animation.duration);\n else self.cleanUp(operation);\n return self.callFilters(\"promiseGoMix\", deferred.promise, arguments);\n }\n // If we should animate and the platform supports transitions, go for it\n if (window1.pageYOffset !== operation.docState.scrollTop) window1.scrollTo(operation.docState.scrollLeft, operation.docState.scrollTop);\n if (self.config.animation.applyPerspective) {\n self.dom.parent.style[mixitup.features.perspectiveProp] = self.config.animation.perspectiveDistance;\n self.dom.parent.style[mixitup.features.perspectiveOriginProp] = self.config.animation.perspectiveOrigin;\n }\n if (self.config.animation.animateResizeContainer && operation.startHeight !== operation.newHeight && operation.viewportDeltaY !== operation.startHeight - operation.newHeight) self.dom.parent.style.height = operation.startHeight + \"px\";\n if (self.config.animation.animateResizeContainer && operation.startWidth !== operation.newWidth && operation.viewportDeltaX !== operation.startWidth - operation.newWidth) self.dom.parent.style.width = operation.startWidth + \"px\";\n if (operation.startHeight === operation.newHeight) self.dom.parent.style.height = operation.startHeight + \"px\";\n if (operation.startWidth === operation.newWidth) self.dom.parent.style.width = operation.startWidth + \"px\";\n if (operation.startHeight === operation.newHeight && operation.startWidth === operation.newWidth) self.dom.parent.style.overflow = \"hidden\";\n requestAnimationFrame(function() {\n self.moveTargets(operation);\n });\n return self.callFilters(\"promiseGoMix\", deferred.promise, arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ getStartMixData: function(operation) {\n var self = this, parentStyle = window1.getComputedStyle(self.dom.parent), parentRect = self.dom.parent.getBoundingClientRect(), target = null, data = {}, i = -1, boxSizing = parentStyle[mixitup.features.boxSizingProp];\n self.incPadding = boxSizing === \"border-box\";\n self.callActions(\"beforeGetStartMixData\", arguments);\n for(i = 0; target = operation.show[i]; i++){\n data = target.getPosData();\n operation.showPosData[i] = {\n startPosData: data\n };\n }\n for(i = 0; target = operation.toHide[i]; i++){\n data = target.getPosData();\n operation.toHidePosData[i] = {\n startPosData: data\n };\n }\n operation.startX = parentRect.left;\n operation.startY = parentRect.top;\n operation.startHeight = self.incPadding ? parentRect.height : parentRect.height - parseFloat(parentStyle.paddingTop) - parseFloat(parentStyle.paddingBottom) - parseFloat(parentStyle.borderTop) - parseFloat(parentStyle.borderBottom);\n operation.startWidth = self.incPadding ? parentRect.width : parentRect.width - parseFloat(parentStyle.paddingLeft) - parseFloat(parentStyle.paddingRight) - parseFloat(parentStyle.borderLeft) - parseFloat(parentStyle.borderRight);\n self.callActions(\"afterGetStartMixData\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ setInter: function(operation) {\n var self = this, target = null, i = -1;\n self.callActions(\"beforeSetInter\", arguments);\n // Prevent scrollbar flicker on non-inertial scroll platforms by clamping height/width\n if (self.config.animation.clampHeight) {\n self.dom.parent.style.height = operation.startHeight + \"px\";\n self.dom.parent.style.overflow = \"hidden\";\n }\n if (self.config.animation.clampWidth) {\n self.dom.parent.style.width = operation.startWidth + \"px\";\n self.dom.parent.style.overflow = \"hidden\";\n }\n for(i = 0; target = operation.toShow[i]; i++)target.show();\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.startContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n self.callActions(\"afterSetInter\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ getInterMixData: function(operation) {\n var self = this, target = null, i = -1;\n self.callActions(\"beforeGetInterMixData\", arguments);\n for(i = 0; target = operation.show[i]; i++)operation.showPosData[i].interPosData = target.getPosData();\n for(i = 0; target = operation.toHide[i]; i++)operation.toHidePosData[i].interPosData = target.getPosData();\n self.callActions(\"afterGetInterMixData\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ setFinal: function(operation) {\n var self = this, target = null, i = -1;\n self.callActions(\"beforeSetFinal\", arguments);\n operation.willSort && self.printSort(false, operation);\n for(i = 0; target = operation.toHide[i]; i++)target.hide();\n self.callActions(\"afterSetFinal\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ getFinalMixData: function(operation) {\n var self = this, parentStyle = null, parentRect = null, target = null, i = -1;\n self.callActions(\"beforeGetFinalMixData\", arguments);\n for(i = 0; target = operation.show[i]; i++)operation.showPosData[i].finalPosData = target.getPosData();\n for(i = 0; target = operation.toHide[i]; i++)operation.toHidePosData[i].finalPosData = target.getPosData();\n // Remove clamping\n if (self.config.animation.clampHeight || self.config.animation.clampWidth) self.dom.parent.style.height = self.dom.parent.style.width = self.dom.parent.style.overflow = \"\";\n if (!self.incPadding) parentStyle = window1.getComputedStyle(self.dom.parent);\n parentRect = self.dom.parent.getBoundingClientRect();\n operation.newX = parentRect.left;\n operation.newY = parentRect.top;\n operation.newHeight = self.incPadding ? parentRect.height : parentRect.height - parseFloat(parentStyle.paddingTop) - parseFloat(parentStyle.paddingBottom) - parseFloat(parentStyle.borderTop) - parseFloat(parentStyle.borderBottom);\n operation.newWidth = self.incPadding ? parentRect.width : parentRect.width - parseFloat(parentStyle.paddingLeft) - parseFloat(parentStyle.paddingRight) - parseFloat(parentStyle.borderLeft) - parseFloat(parentStyle.borderRight);\n operation.viewportDeltaX = operation.docState.viewportWidth - this.dom.document.documentElement.clientWidth;\n operation.viewportDeltaY = operation.docState.viewportHeight - this.dom.document.documentElement.clientHeight;\n if (operation.willSort) self.printSort(true, operation);\n for(i = 0; target = operation.toShow[i]; i++)target.hide();\n for(i = 0; target = operation.toHide[i]; i++)target.show();\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.newContainerClassName);\n h.addClass(self.dom.container, self.config.layout.containerClassName);\n }\n self.callActions(\"afterGetFinalMixData\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Operation} operation\n */ getTweenData: function(operation) {\n var self = this, target = null, posData = null, effectNames = Object.getOwnPropertyNames(self.effectsIn), effectName = \"\", effect = null, widthChange = -1, heightChange = -1, i = -1, j = -1;\n self.callActions(\"beforeGetTweenData\", arguments);\n for(i = 0; target = operation.show[i]; i++){\n posData = operation.showPosData[i];\n posData.posIn = new mixitup.StyleData();\n posData.posOut = new mixitup.StyleData();\n posData.tweenData = new mixitup.StyleData();\n // Process x and y\n if (target.isShown) {\n posData.posIn.x = posData.startPosData.x - posData.interPosData.x;\n posData.posIn.y = posData.startPosData.y - posData.interPosData.y;\n } else posData.posIn.x = posData.posIn.y = 0;\n posData.posOut.x = posData.finalPosData.x - posData.interPosData.x;\n posData.posOut.y = posData.finalPosData.y - posData.interPosData.y;\n // Process opacity\n posData.posIn.opacity = target.isShown ? 1 : self.effectsIn.opacity;\n posData.posOut.opacity = 1;\n posData.tweenData.opacity = posData.posOut.opacity - posData.posIn.opacity;\n // Adjust x and y if not nudging\n if (!target.isShown && !self.config.animation.nudge) {\n posData.posIn.x = posData.posOut.x;\n posData.posIn.y = posData.posOut.y;\n }\n posData.tweenData.x = posData.posOut.x - posData.posIn.x;\n posData.tweenData.y = posData.posOut.y - posData.posIn.y;\n // Process width, height, and margins\n if (self.config.animation.animateResizeTargets) {\n posData.posIn.width = posData.startPosData.width;\n posData.posIn.height = posData.startPosData.height;\n // \"||\" Prevents width/height change from including 0 width/height if hiding or showing\n widthChange = (posData.startPosData.width || posData.finalPosData.width) - posData.interPosData.width;\n posData.posIn.marginRight = posData.startPosData.marginRight - widthChange;\n heightChange = (posData.startPosData.height || posData.finalPosData.height) - posData.interPosData.height;\n posData.posIn.marginBottom = posData.startPosData.marginBottom - heightChange;\n posData.posOut.width = posData.finalPosData.width;\n posData.posOut.height = posData.finalPosData.height;\n widthChange = (posData.finalPosData.width || posData.startPosData.width) - posData.interPosData.width;\n posData.posOut.marginRight = posData.finalPosData.marginRight - widthChange;\n heightChange = (posData.finalPosData.height || posData.startPosData.height) - posData.interPosData.height;\n posData.posOut.marginBottom = posData.finalPosData.marginBottom - heightChange;\n posData.tweenData.width = posData.posOut.width - posData.posIn.width;\n posData.tweenData.height = posData.posOut.height - posData.posIn.height;\n posData.tweenData.marginRight = posData.posOut.marginRight - posData.posIn.marginRight;\n posData.tweenData.marginBottom = posData.posOut.marginBottom - posData.posIn.marginBottom;\n }\n // Process transforms\n for(j = 0; effectName = effectNames[j]; j++){\n effect = self.effectsIn[effectName];\n if (!(effect instanceof mixitup.TransformData) || !effect.value) continue;\n posData.posIn[effectName].value = effect.value;\n posData.posOut[effectName].value = 0;\n posData.tweenData[effectName].value = posData.posOut[effectName].value - posData.posIn[effectName].value;\n posData.posIn[effectName].unit = posData.posOut[effectName].unit = posData.tweenData[effectName].unit = effect.unit;\n }\n }\n for(i = 0; target = operation.toHide[i]; i++){\n posData = operation.toHidePosData[i];\n posData.posIn = new mixitup.StyleData();\n posData.posOut = new mixitup.StyleData();\n posData.tweenData = new mixitup.StyleData();\n // Process x and y\n posData.posIn.x = target.isShown ? posData.startPosData.x - posData.interPosData.x : 0;\n posData.posIn.y = target.isShown ? posData.startPosData.y - posData.interPosData.y : 0;\n posData.posOut.x = self.config.animation.nudge ? 0 : posData.posIn.x;\n posData.posOut.y = self.config.animation.nudge ? 0 : posData.posIn.y;\n posData.tweenData.x = posData.posOut.x - posData.posIn.x;\n posData.tweenData.y = posData.posOut.y - posData.posIn.y;\n // Process width, height, and margins\n if (self.config.animation.animateResizeTargets) {\n posData.posIn.width = posData.startPosData.width;\n posData.posIn.height = posData.startPosData.height;\n widthChange = posData.startPosData.width - posData.interPosData.width;\n posData.posIn.marginRight = posData.startPosData.marginRight - widthChange;\n heightChange = posData.startPosData.height - posData.interPosData.height;\n posData.posIn.marginBottom = posData.startPosData.marginBottom - heightChange;\n }\n // Process opacity\n posData.posIn.opacity = 1;\n posData.posOut.opacity = self.effectsOut.opacity;\n posData.tweenData.opacity = posData.posOut.opacity - posData.posIn.opacity;\n // Process transforms\n for(j = 0; effectName = effectNames[j]; j++){\n effect = self.effectsOut[effectName];\n if (!(effect instanceof mixitup.TransformData) || !effect.value) continue;\n posData.posIn[effectName].value = 0;\n posData.posOut[effectName].value = effect.value;\n posData.tweenData[effectName].value = posData.posOut[effectName].value - posData.posIn[effectName].value;\n posData.posIn[effectName].unit = posData.posOut[effectName].unit = posData.tweenData[effectName].unit = effect.unit;\n }\n }\n self.callActions(\"afterGetTweenData\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Operation} operation\n * @return {void}\n */ moveTargets: function(operation) {\n var self = this, target = null, moveData = null, posData = null, statusChange = \"\", willTransition = false, staggerIndex = -1, i = -1, checkProgress = self.checkProgress.bind(self);\n self.callActions(\"beforeMoveTargets\", arguments);\n // TODO: this is an extra loop in addition to the calcs\n // done in getOperation, could some of this be done there?\n for(i = 0; target = operation.show[i]; i++){\n moveData = new mixitup.IMoveData();\n posData = operation.showPosData[i];\n statusChange = target.isShown ? \"none\" : \"show\";\n willTransition = self.willTransition(statusChange, operation.hasEffect, posData.posIn, posData.posOut);\n if (willTransition) // Prevent non-transitioning targets from incrementing the staggerIndex\n staggerIndex++;\n target.show();\n moveData.posIn = posData.posIn;\n moveData.posOut = posData.posOut;\n moveData.statusChange = statusChange;\n moveData.staggerIndex = staggerIndex;\n moveData.operation = operation;\n moveData.callback = willTransition ? checkProgress : null;\n target.move(moveData);\n }\n for(i = 0; target = operation.toHide[i]; i++){\n posData = operation.toHidePosData[i];\n moveData = new mixitup.IMoveData();\n statusChange = \"hide\";\n willTransition = self.willTransition(statusChange, posData.posIn, posData.posOut);\n moveData.posIn = posData.posIn;\n moveData.posOut = posData.posOut;\n moveData.statusChange = statusChange;\n moveData.staggerIndex = i;\n moveData.operation = operation;\n moveData.callback = willTransition ? checkProgress : null;\n target.move(moveData);\n }\n if (self.config.animation.animateResizeContainer) {\n self.dom.parent.style[mixitup.features.transitionProp] = \"height \" + self.config.animation.duration + \"ms ease, \" + \"width \" + self.config.animation.duration + \"ms ease \";\n requestAnimationFrame(function() {\n if (operation.startHeight !== operation.newHeight && operation.viewportDeltaY !== operation.startHeight - operation.newHeight) self.dom.parent.style.height = operation.newHeight + \"px\";\n if (operation.startWidth !== operation.newWidth && operation.viewportDeltaX !== operation.startWidth - operation.newWidth) self.dom.parent.style.width = operation.newWidth + \"px\";\n });\n }\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, self.config.layout.ContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n self.callActions(\"afterMoveTargets\", arguments);\n },\n /**\n * @private\n * @instance\n * @return {boolean}\n */ hasEffect: function() {\n var self = this, EFFECTABLES = [\n \"scale\",\n \"translateX\",\n \"translateY\",\n \"translateZ\",\n \"rotateX\",\n \"rotateY\",\n \"rotateZ\"\n ], effectName = \"\", effect = null, result = false, value = -1, i = -1;\n if (self.effectsIn.opacity !== 1) return self.callFilters(\"resultHasEffect\", true, arguments);\n for(i = 0; effectName = EFFECTABLES[i]; i++){\n effect = self.effectsIn[effectName];\n value = typeof effect && effect.value !== \"undefined\" ? effect.value : effect;\n if (value !== 0) {\n result = true;\n break;\n }\n }\n return self.callFilters(\"resultHasEffect\", result, arguments);\n },\n /**\n * Determines if a target element will transition in\n * some fasion and therefore requires binding of\n * transitionEnd\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} statusChange\n * @param {boolean} hasEffect\n * @param {StyleData} posIn\n * @param {StyleData} posOut\n * @return {boolean}\n */ willTransition: function(statusChange, hasEffect, posIn, posOut) {\n var self = this, result = false;\n if (!h.isVisible(self.dom.container)) // If the container is not visible, the transitionEnd\n // event will not occur and MixItUp will hang\n result = false;\n else if (statusChange !== \"none\" && hasEffect || posIn.x !== posOut.x || posIn.y !== posOut.y) // If opacity and/or translate will change\n result = true;\n else if (self.config.animation.animateResizeTargets) // Check if width, height or margins will change\n result = posIn.width !== posOut.width || posIn.height !== posOut.height || posIn.marginRight !== posOut.marginRight || posIn.marginTop !== posOut.marginTop;\n else result = false;\n return self.callFilters(\"resultWillTransition\", result, arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ checkProgress: function(operation) {\n var self = this;\n self.targetsDone++;\n if (self.targetsBound === self.targetsDone) self.cleanUp(operation);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */ cleanUp: function(operation) {\n var self = this, target = null, whitespaceBefore = null, whitespaceAfter = null, nextInQueue = null, i = -1;\n self.callActions(\"beforeCleanUp\", arguments);\n self.targetsMoved = self.targetsImmovable = self.targetsBound = self.targetsDone = 0;\n for(i = 0; target = operation.show[i]; i++){\n target.cleanUp();\n target.show();\n }\n for(i = 0; target = operation.toHide[i]; i++){\n target.cleanUp();\n target.hide();\n }\n if (operation.willSort) self.printSort(false, operation);\n // Remove any styles applied to the parent container\n self.dom.parent.style[mixitup.features.transitionProp] = self.dom.parent.style.height = self.dom.parent.style.width = self.dom.parent.style.overflow = self.dom.parent.style[mixitup.features.perspectiveProp] = self.dom.parent.style[mixitup.features.perspectiveOriginProp] = \"\";\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.startContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n if (operation.toRemove.length) {\n for(i = 0; target = self.targets[i]; i++)if (operation.toRemove.indexOf(target) > -1) {\n if ((whitespaceBefore = target.dom.el.previousSibling) && whitespaceBefore.nodeName === \"#text\" && (whitespaceAfter = target.dom.el.nextSibling) && whitespaceAfter.nodeName === \"#text\") h.removeWhitespace(whitespaceBefore);\n if (!operation.willSort) // NB: Sorting will remove targets as a bi-product of `printSort()`\n self.dom.parent.removeChild(target.dom.el);\n self.targets.splice(i, 1);\n target.isInDom = false;\n i--;\n }\n // Since targets have been removed, the original order must be updated\n self.origOrder = self.targets;\n }\n if (operation.willSort) self.targets = operation.newOrder;\n self.state = operation.newState;\n self.lastOperation = operation;\n self.dom.targets = self.state.targets;\n // mixEnd\n mixitup.events.fire(\"mixEnd\", self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n if (typeof self.config.callbacks.onMixEnd === \"function\") self.config.callbacks.onMixEnd.call(self.dom.container, self.state, self);\n if (operation.hasFailed) {\n // mixFail\n mixitup.events.fire(\"mixFail\", self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n if (typeof self.config.callbacks.onMixFail === \"function\") self.config.callbacks.onMixFail.call(self.dom.container, self.state, self);\n h.addClass(self.dom.container, h.getClassname(self.config.classNames, \"container\", self.config.classNames.modifierFailed));\n }\n // User-defined callback function\n if (typeof self.userCallback === \"function\") self.userCallback.call(self.dom.container, self.state, self);\n if (typeof self.userDeferred.resolve === \"function\") self.userDeferred.resolve(self.state);\n self.userCallback = null;\n self.userDeferred = null;\n self.lastClicked = null;\n self.isToggling = false;\n self.isBusy = false;\n if (self.queue.length) {\n self.callActions(\"beforeReadQueueCleanUp\", arguments);\n nextInQueue = self.queue.shift();\n // Update non-public API properties stored in queue\n self.userDeferred = nextInQueue.deferred;\n self.isToggling = nextInQueue.isToggling;\n self.lastClicked = nextInQueue.triggerElement;\n if (nextInQueue.instruction.command instanceof mixitup.CommandMultimix) self.multimix.apply(self, nextInQueue.args);\n else self.dataset.apply(self, nextInQueue.args);\n }\n self.callActions(\"afterCleanUp\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseMultimixArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandMultimix();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n if (typeof arg === \"object\") h.extend(instruction.command, arg);\n else if (typeof arg === \"boolean\") instruction.animate = arg;\n else if (typeof arg === \"function\") instruction.callback = arg;\n }\n // Coerce arbitrary command arguments into typed command objects\n if (instruction.command.insert && !(instruction.command.insert instanceof mixitup.CommandInsert)) instruction.command.insert = self.parseInsertArgs([\n instruction.command.insert\n ]).command;\n if (instruction.command.remove && !(instruction.command.remove instanceof mixitup.CommandRemove)) instruction.command.remove = self.parseRemoveArgs([\n instruction.command.remove\n ]).command;\n if (instruction.command.filter && !(instruction.command.filter instanceof mixitup.CommandFilter)) instruction.command.filter = self.parseFilterArgs([\n instruction.command.filter\n ]).command;\n if (instruction.command.sort && !(instruction.command.sort instanceof mixitup.CommandSort)) instruction.command.sort = self.parseSortArgs([\n instruction.command.sort\n ]).command;\n if (instruction.command.changeLayout && !(instruction.command.changeLayout instanceof mixitup.CommandChangeLayout)) instruction.command.changeLayout = self.parseChangeLayoutArgs([\n instruction.command.changeLayout\n ]).command;\n instruction = self.callFilters(\"instructionParseMultimixArgs\", instruction, arguments);\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseFilterArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandFilter();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (typeof arg === \"string\") // Selector\n instruction.command.selector = arg;\n else if (arg === null) instruction.command.collection = [];\n else if (typeof arg === \"object\" && h.isElement(arg, self.dom.document)) // Single element\n instruction.command.collection = [\n arg\n ];\n else if (typeof arg === \"object\" && typeof arg.length !== \"undefined\") // Multiple elements in array, NodeList or jQuery collection\n instruction.command.collection = h.arrayFromList(arg);\n else if (typeof arg === \"object\") // Filter command\n h.extend(instruction.command, arg);\n else if (typeof arg === \"boolean\") instruction.animate = arg;\n else if (typeof arg === \"function\") instruction.callback = arg;\n }\n if (instruction.command.selector && instruction.command.collection) throw new Error(mixitup.messages.errorFilterInvalidArguments());\n instruction = self.callFilters(\"instructionParseFilterArgs\", instruction, arguments);\n h.freeze(instruction);\n return instruction;\n },\n parseSortArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, sortString = \"\", i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandSort();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n switch(typeof arg){\n case \"string\":\n // Sort string\n sortString = arg;\n break;\n case \"object\":\n // Array of element references\n if (arg.length) instruction.command.collection = h.arrayFromList(arg);\n break;\n case \"boolean\":\n instruction.animate = arg;\n break;\n case \"function\":\n instruction.callback = arg;\n break;\n }\n }\n if (sortString) instruction.command = self.parseSortString(sortString, instruction.command);\n instruction = self.callFilters(\"instructionParseSortArgs\", instruction, arguments);\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseInsertArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandInsert();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n if (typeof arg === \"number\") // Insert index\n instruction.command.index = arg;\n else if (typeof arg === \"string\" && [\n \"before\",\n \"after\"\n ].indexOf(arg) > -1) // 'before'/'after'\n instruction.command.position = arg;\n else if (typeof arg === \"string\") // Markup\n instruction.command.collection = h.arrayFromList(h.createElement(arg).childNodes);\n else if (typeof arg === \"object\" && h.isElement(arg, self.dom.document)) // Single element\n !instruction.command.collection.length ? instruction.command.collection = [\n arg\n ] : instruction.command.sibling = arg;\n else if (typeof arg === \"object\" && arg.length) // Multiple elements in array or jQuery collection\n !instruction.command.collection.length ? instruction.command.collection = arg : instruction.command.sibling = arg[0];\n else if (typeof arg === \"object\" && arg.childNodes && arg.childNodes.length) // Document fragment\n !instruction.command.collection.length ? instruction.command.collection = h.arrayFromList(arg.childNodes) : instruction.command.sibling = arg.childNodes[0];\n else if (typeof arg === \"object\") // Insert command\n h.extend(instruction.command, arg);\n else if (typeof arg === \"boolean\") instruction.animate = arg;\n else if (typeof arg === \"function\") instruction.callback = arg;\n }\n if (instruction.command.index && instruction.command.sibling) throw new Error(mixitup.messages.errorInsertInvalidArguments());\n if (!instruction.command.collection.length && self.config.debug.showWarnings) console.warn(mixitup.messages.warningInsertNoElements());\n instruction = self.callFilters(\"instructionParseInsertArgs\", instruction, arguments);\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseRemoveArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), target = null, arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandRemove();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n switch(typeof arg){\n case \"number\":\n if (self.targets[arg]) instruction.command.targets[0] = self.targets[arg];\n break;\n case \"string\":\n instruction.command.collection = h.arrayFromList(self.dom.parent.querySelectorAll(arg));\n break;\n case \"object\":\n if (arg && arg.length) instruction.command.collection = arg;\n else if (h.isElement(arg, self.dom.document)) instruction.command.collection = [\n arg\n ];\n else // Remove command\n h.extend(instruction.command, arg);\n break;\n case \"boolean\":\n instruction.animate = arg;\n break;\n case \"function\":\n instruction.callback = arg;\n break;\n }\n }\n if (instruction.command.collection.length) {\n for(i = 0; target = self.targets[i]; i++)if (instruction.command.collection.indexOf(target.dom.el) > -1) instruction.command.targets.push(target);\n }\n if (!instruction.command.targets.length && self.config.debug.showWarnings) console.warn(mixitup.messages.warningRemoveNoElements());\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseDatasetArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandDataset();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n switch(typeof arg){\n case \"object\":\n if (Array.isArray(arg) || typeof arg.length === \"number\") instruction.command.dataset = arg;\n else // Change layout command\n h.extend(instruction.command, arg);\n break;\n case \"boolean\":\n instruction.animate = arg;\n break;\n case \"function\":\n instruction.callback = arg;\n break;\n }\n }\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */ parseChangeLayoutArgs: function(args) {\n var self = this, instruction = new mixitup.UserInstruction(), arg = null, i = -1;\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandChangeLayout();\n for(i = 0; i < args.length; i++){\n arg = args[i];\n if (arg === null) continue;\n switch(typeof arg){\n case \"string\":\n instruction.command.containerClassName = arg;\n break;\n case \"object\":\n // Change layout command\n h.extend(instruction.command, arg);\n break;\n case \"boolean\":\n instruction.animate = arg;\n break;\n case \"function\":\n instruction.callback = arg;\n break;\n }\n }\n h.freeze(instruction);\n return instruction;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.QueueItem} queueItem\n * @return {Promise.}\n */ queueMix: function(queueItem) {\n var self = this, deferred = null, toggleSelector = \"\";\n self.callActions(\"beforeQueueMix\", arguments);\n deferred = h.defer(mixitup.libraries);\n if (self.config.animation.queue && self.queue.length < self.config.animation.queueLimit) {\n queueItem.deferred = deferred;\n self.queue.push(queueItem);\n // Keep controls in sync with user interactions. Mixer will catch up as it drains the queue.\n if (self.config.controls.enable) {\n if (self.isToggling) {\n self.buildToggleArray(queueItem.instruction.command);\n toggleSelector = self.getToggleSelector();\n self.updateControls({\n filter: {\n selector: toggleSelector\n }\n });\n } else self.updateControls(queueItem.instruction.command);\n }\n } else {\n if (self.config.debug.showWarnings) console.warn(mixitup.messages.warningMultimixInstanceQueueFull());\n deferred.resolve(self.state);\n mixitup.events.fire(\"mixBusy\", self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n if (typeof self.config.callbacks.onMixBusy === \"function\") self.config.callbacks.onMixBusy.call(self.dom.container, self.state, self);\n }\n return self.callFilters(\"promiseQueueMix\", deferred.promise, arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array.} newDataset\n * @return {Operation}\n */ getDataOperation: function(newDataset) {\n var self = this, operation = new mixitup.Operation(), startDataset = [];\n operation = self.callFilters(\"operationUnmappedGetDataOperation\", operation, arguments);\n if (self.dom.targets.length && !(startDataset = self.state.activeDataset || []).length) throw new Error(mixitup.messages.errorDatasetNotSet());\n operation.id = h.randomHex();\n operation.startState = self.state;\n operation.startDataset = startDataset;\n operation.newDataset = newDataset.slice();\n self.diffDatasets(operation);\n operation.startOrder = self.targets;\n operation.newOrder = operation.show;\n if (self.config.animation.enable) {\n self.getStartMixData(operation);\n self.setInter(operation);\n operation.docState = h.getDocumentState(self.dom.document);\n self.getInterMixData(operation);\n self.setFinal(operation);\n self.getFinalMixData(operation);\n self.parseEffects();\n operation.hasEffect = self.hasEffect();\n self.getTweenData(operation);\n }\n self.targets = operation.show.slice();\n operation.newState = self.buildState(operation);\n // NB: Targets to be removed must be included in `self.targets` for removal during clean up,\n // but are added after state is built so that state is accurate\n Array.prototype.push.apply(self.targets, operation.toRemove);\n operation = self.callFilters(\"operationMappedGetDataOperation\", operation, arguments);\n return operation;\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Operation} operation\n * @return {void}\n */ diffDatasets: function(operation) {\n var self = this, persistantStartIds = [], persistantNewIds = [], insertedTargets = [], data = null, target = null, el = null, frag = null, nextEl = null, uids = {}, id = \"\", i = -1;\n self.callActions(\"beforeDiffDatasets\", arguments);\n for(i = 0; data = operation.newDataset[i]; i++){\n if (typeof (id = data[self.config.data.uidKey]) === \"undefined\" || id.toString().length < 1) throw new TypeError(mixitup.messages.errorDatasetInvalidUidKey({\n uidKey: self.config.data.uidKey\n }));\n if (!uids[id]) uids[id] = true;\n else throw new Error(mixitup.messages.errorDatasetDuplicateUid({\n uid: id\n }));\n if ((target = self.cache[id]) instanceof mixitup.Target) {\n // Already in cache\n if (self.config.data.dirtyCheck && !h.deepEquals(data, target.data)) {\n // change detected\n el = target.render(data);\n target.data = data;\n if (el !== target.dom.el) {\n // Update target element reference\n if (target.isInDom) {\n target.unbindEvents();\n self.dom.parent.replaceChild(el, target.dom.el);\n }\n if (!target.isShown) el.style.display = \"none\";\n target.dom.el = el;\n if (target.isInDom) target.bindEvents();\n }\n }\n el = target.dom.el;\n } else {\n // New target\n target = new mixitup.Target();\n target.init(null, self, data);\n target.hide();\n }\n if (!target.isInDom) {\n // Adding to DOM\n if (!frag) // Open frag\n frag = self.dom.document.createDocumentFragment();\n if (frag.lastElementChild) frag.appendChild(self.dom.document.createTextNode(\" \"));\n frag.appendChild(target.dom.el);\n target.isInDom = true;\n target.unbindEvents();\n target.bindEvents();\n target.hide();\n operation.toShow.push(target);\n insertedTargets.push(target);\n } else {\n // Already in DOM\n nextEl = target.dom.el.nextElementSibling;\n persistantNewIds.push(id);\n if (frag) {\n // Close and insert previously opened frag\n if (frag.lastElementChild) frag.appendChild(self.dom.document.createTextNode(\" \"));\n self.insertDatasetFrag(frag, target.dom.el, insertedTargets);\n frag = null;\n }\n }\n operation.show.push(target);\n }\n if (frag) {\n // Unclosed frag remaining\n nextEl = nextEl || self.config.layout.siblingAfter;\n if (nextEl) frag.appendChild(self.dom.document.createTextNode(\" \"));\n self.insertDatasetFrag(frag, nextEl, insertedTargets);\n }\n for(i = 0; data = operation.startDataset[i]; i++){\n id = data[self.config.data.uidKey];\n target = self.cache[id];\n if (operation.show.indexOf(target) < 0) {\n // Previously shown but now absent\n operation.hide.push(target);\n operation.toHide.push(target);\n operation.toRemove.push(target);\n } else persistantStartIds.push(id);\n }\n if (!h.isEqualArray(persistantStartIds, persistantNewIds)) operation.willSort = true;\n self.callActions(\"afterDiffDatasets\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.1.5\n * @param {DocumentFragment} frag\n * @param {(HTMLElement|null)} nextEl\n * @param {Array.} targets\n * @return {void}\n */ insertDatasetFrag: function(frag, nextEl, targets) {\n var self = this;\n var insertAt = nextEl ? h.arrayFromList(self.dom.parent.children).indexOf(nextEl) : self.targets.length;\n self.dom.parent.insertBefore(frag, nextEl);\n while(targets.length){\n self.targets.splice(insertAt, 0, targets.shift());\n insertAt++;\n }\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.CommandSort} sortCommandA\n * @param {mixitup.CommandSort} sortCommandB\n * @return {boolean}\n */ willSort: function(sortCommandA, sortCommandB) {\n var self = this, result = false;\n if (self.config.behavior.liveSort || sortCommandA.order === \"random\" || sortCommandA.attribute !== sortCommandB.attribute || sortCommandA.order !== sortCommandB.order || sortCommandA.collection !== sortCommandB.collection || sortCommandA.next === null && sortCommandB.next || sortCommandA.next && sortCommandB.next === null) result = true;\n else if (sortCommandA.next && sortCommandB.next) result = self.willSort(sortCommandA.next, sortCommandB.next);\n else result = false;\n return self.callFilters(\"resultWillSort\", result, arguments);\n },\n /**\n * A shorthand method for `.filter('all')`. Shows all targets in the container.\n *\n * @example\n *\n * .show()\n *\n * @example Example: Showing all targets\n *\n * mixer.show()\n * .then(function(state) {\n * console.log(state.totalShow === state.totalTargets); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @return {Promise.}\n */ show: function() {\n var self = this;\n return self.filter(\"all\");\n },\n /**\n * A shorthand method for `.filter('none')`. Hides all targets in the container.\n *\n * @example\n *\n * .hide()\n *\n * @example Example: Hiding all targets\n *\n * mixer.hide()\n * .then(function(state) {\n * console.log(state.totalShow === 0); // true\n * console.log(state.totalHide === state.totalTargets); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @return {Promise.}\n */ hide: function() {\n var self = this;\n return self.filter(\"none\");\n },\n /**\n * Returns a boolean indicating whether or not a MixItUp operation is\n * currently in progress.\n *\n * @example\n *\n * .isMixing()\n *\n * @example Example: Checking the status of a mixer\n *\n * mixer.sort('random', function() {\n * console.log(mixer.isMixing()) // false\n * });\n *\n * console.log(mixer.isMixing()) // true\n *\n * @public\n * @instance\n * @since 2.0.0\n * @return {boolean}\n */ isMixing: function() {\n var self = this;\n return self.isBusy;\n },\n /**\n * Filters all targets in the container by a provided selector string, or the values `'all'`\n * or `'none'`. Only targets matching the selector will be shown.\n *\n * @example\n *\n * .filter(selector [, animate] [, callback])\n *\n * @example Example 1: Filtering targets by a class selector\n *\n * mixer.filter('.category-a')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('.category-a').length); // true\n * });\n *\n * @example Example 2: Filtering targets by an attribute selector\n *\n * mixer.filter('[data-category~=\"a\"]')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('[data-category~=\"a\"]').length); // true\n * });\n *\n * @example Example 3: Filtering targets by a compound selector\n *\n * // Show only those targets with the classes 'category-a' AND 'category-b'\n *\n * mixer.filter('.category-a.category-c')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('.category-a.category-c').length); // true\n * });\n *\n * @example Example 4: Filtering via an element collection\n *\n * var collection = Array.from(container.querySelectorAll('.mix'));\n *\n * console.log(collection.length); // 34\n *\n * // Filter the collection manually using Array.prototype.filter\n *\n * var filtered = collection.filter(function(target) {\n * return parseInt(target.getAttribute('data-price')) > 10;\n * });\n *\n * console.log(filtered.length); // 22\n *\n * // Pass the filtered collection to MixItUp\n *\n * mixer.filter(filtered)\n * .then(function(state) {\n * console.log(state.activeFilter.collection.length === 22); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(string|HTMLElement|Array.)} selector\n * Any valid CSS selector (i.e. `'.category-a'`), or the values `'all'` or `'none'`. The filter method also accepts a reference to single target element or a collection of target elements to show.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ filter: function() {\n var self = this, instruction = self.parseFilterArgs(arguments);\n return self.multimix({\n filter: instruction.command\n }, instruction.animate, instruction.callback);\n },\n /**\n * Adds an additional selector to the currently active filter selector, concatenating\n * as per the logic defined in `controls.toggleLogic`.\n *\n * @example\n *\n * .toggleOn(selector [, animate] [, callback])\n *\n * @example Example: Toggling on a filter selector\n *\n * console.log(mixer.getState().activeFilter.selector); // '.category-a'\n *\n * mixer.toggleOn('.category-b')\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // '.category-a, .category-b'\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} selector\n * Any valid CSS selector (i.e. `'.category-a'`)\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ toggleOn: function() {\n var self = this, instruction = self.parseFilterArgs(arguments), selector = instruction.command.selector, toggleSelector = \"\";\n self.isToggling = true;\n if (self.toggleArray.indexOf(selector) < 0) self.toggleArray.push(selector);\n toggleSelector = self.getToggleSelector();\n return self.multimix({\n filter: toggleSelector\n }, instruction.animate, instruction.callback);\n },\n /**\n * Removes a selector from the active filter selector.\n *\n * @example\n *\n * .toggleOff(selector [, animate] [, callback])\n *\n * @example Example: Toggling off a filter selector\n *\n * console.log(mixer.getState().activeFilter.selector); // '.category-a, .category-b'\n *\n * mixer.toggleOff('.category-b')\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // '.category-a'\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} selector\n * Any valid CSS selector (i.e. `'.category-a'`)\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ toggleOff: function() {\n var self = this, instruction = self.parseFilterArgs(arguments), selector = instruction.command.selector, selectorIndex = self.toggleArray.indexOf(selector), toggleSelector = \"\";\n self.isToggling = true;\n if (selectorIndex > -1) self.toggleArray.splice(selectorIndex, 1);\n toggleSelector = self.getToggleSelector();\n return self.multimix({\n filter: toggleSelector\n }, instruction.animate, instruction.callback);\n },\n /**\n * Sorts all targets in the container according to a provided sort string.\n *\n * @example\n *\n * .sort(sortString [, animate] [, callback])\n *\n * @example Example 1: Sorting by the default DOM order\n *\n * // Reverse the default order of the targets\n *\n * mixer.sort('default:desc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'default'); // true\n * console.log(state.activeSort.order === 'desc'); // true\n * });\n *\n * @example Example 2: Sorting by a custom data-attribute\n *\n * // Sort the targets by the value of a `data-published-date` attribute\n *\n * mixer.sort('published-date:asc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.activeSort.order === 'asc'); // true\n * });\n *\n * @example Example 3: Sorting by multiple attributes\n *\n * // Sort the targets by the value of a `data-published-date` attribute, then by `data-title`\n *\n * mixer.sort('published-date:desc data-title:asc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.activeSort.order === 'desc'); // true\n *\n * console.log(state.activeSort.next.attribute === 'title'); // true\n * console.log(state.activeSort.next.order === 'asc'); // true\n * });\n *\n * @example Example 4: Sorting by random\n *\n * mixer.sort('random')\n * .then(function(state) {\n * console.log(state.activeSort.order === 'random') // true\n * });\n *\n * @example Example 5: Sorting via an element collection\n *\n * var collection = Array.from(container.querySelectorAll('.mix'));\n *\n * // Swap the position of two elements in the collection:\n *\n * var temp = collection[1];\n *\n * collection[1] = collection[0];\n * collection[0] = temp;\n *\n * // Pass the sorted collection to MixItUp\n *\n * mixer.sort(collection)\n * .then(function(state) {\n * console.log(state.targets[0] === collection[0]); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(string|Array.)} sortString\n * A valid sort string (e.g. `'default'`, `'published-date:asc'`, or `'random'`). The sort method also accepts an array of all target elements in a user-defined order.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ sort: function() {\n var self = this, instruction = self.parseSortArgs(arguments);\n return self.multimix({\n sort: instruction.command\n }, instruction.animate, instruction.callback);\n },\n /**\n * Changes the layout of the container by adding, removing or updating a\n * layout-specific class name. If `animation.animateResizetargets` is\n * enabled, MixItUp will attempt to gracefully animate the width, height,\n * and position of targets between layout states.\n *\n * @example\n *\n * .changeLayout(containerClassName [, animate] [, callback])\n *\n * @example Example 1: Adding a new class name to the container\n *\n * mixer.changeLayout('container-list')\n * .then(function(state) {\n * console.log(state.activeContainerClass === 'container-list'); // true\n * });\n *\n * @example Example 2: Removing a previously added class name from the container\n *\n * mixer.changeLayout('')\n * .then(function(state) {\n * console.log(state.activeContainerClass === ''); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {string} containerClassName\n * A layout-specific class name to add to the container.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ changeLayout: function() {\n var self = this, instruction = self.parseChangeLayoutArgs(arguments);\n return self.multimix({\n changeLayout: instruction.command\n }, instruction.animate, instruction.callback);\n },\n /**\n * Updates the contents and order of the container to reflect the provided dataset,\n * if the dataset API is in use.\n *\n * The dataset API is designed for use in API-driven JavaScript applications, and\n * can be used instead of DOM-based methods such as `.filter()`, `.sort()`,\n * `.insert()`, etc. When used, insertion, removal, sorting and pagination can be\n * achieved purely via changes to your data model, without the uglyness of having\n * to interact with or query the DOM directly.\n *\n * @example\n *\n * .dataset(dataset [, animate] [, callback])\n *\n * @example Example 1: Rendering a dataset\n *\n * var myDataset = [\n * {id: 1, ...},\n * {id: 2, ...},\n * {id: 3, ...}\n * ];\n *\n * mixer.dataset(myDataset)\n * .then(function(state) {\n * console.log(state.totalShow === 3); // true\n * });\n *\n * @example Example 2: Sorting a dataset\n *\n * // Create a new dataset in reverse order\n *\n * var newDataset = myDataset.slice().reverse();\n *\n * mixer.dataset(newDataset)\n * .then(function(state) {\n * console.log(state.activeDataset[0] === myDataset[2]); // true\n * });\n *\n * @example Example 3: Removing an item from the dataset\n *\n * console.log(myDataset.length); // 3\n *\n * // Create a new dataset with the last item removed.\n *\n * var newDataset = myDataset.slice().pop();\n *\n * mixer.dataset(newDataset)\n * .then(function(state) {\n * console.log(state.totalShow === 2); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {Array.} dataset\n * An array of objects, each one representing the underlying data model of a target to be rendered.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ dataset: function() {\n var self = this, instruction = self.parseDatasetArgs(arguments), operation = null, queueItem = null, animate = false;\n self.callActions(\"beforeDataset\", arguments);\n if (!self.isBusy) {\n if (instruction.callback) self.userCallback = instruction.callback;\n animate = instruction.animate ^ self.config.animation.enable ? instruction.animate : self.config.animation.enable;\n operation = self.getDataOperation(instruction.command.dataset);\n return self.goMix(animate, operation);\n } else {\n queueItem = new mixitup.QueueItem();\n queueItem.args = arguments;\n queueItem.instruction = instruction;\n return self.queueMix(queueItem);\n }\n },\n /**\n * Performs simultaneous `filter`, `sort`, `insert`, `remove` and `changeLayout`\n * operations as requested.\n *\n * @example\n *\n * .multimix(multimixCommand [, animate] [, callback])\n *\n * @example Example 1: Performing simultaneous filtering and sorting\n *\n * mixer.multimix({\n * filter: '.category-b',\n * sort: 'published-date:desc'\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector === '.category-b'); // true\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * });\n *\n * @example Example 2: Performing simultaneous sorting, insertion, and removal\n *\n * console.log(mixer.getState().totalShow); // 6\n *\n * // NB: When inserting via `multimix()`, an object should be provided as the value\n * // for the `insert` portion of the command, allowing for a collection of elements\n * // and an insertion index to be specified.\n *\n * mixer.multimix({\n * sort: 'published-date:desc', // Sort the container, including any new elements\n * insert: {\n * collection: [newElementReferenceA, newElementReferenceB], // Add 2 new elements at index 5\n * index: 5\n * },\n * remove: existingElementReference // Remove 1 existing element\n * })\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.totalShow === 7); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {object} multimixCommand\n * An object containing one or more things to do\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ multimix: function() {\n var self = this, operation = null, animate = false, queueItem = null, instruction = self.parseMultimixArgs(arguments);\n self.callActions(\"beforeMultimix\", arguments);\n if (!self.isBusy) {\n operation = self.getOperation(instruction.command);\n if (self.config.controls.enable) {\n // Update controls for API calls\n if (instruction.command.filter && !self.isToggling) {\n // As we are not toggling, reset the toggle array\n // so new filter overrides existing toggles\n self.toggleArray.length = 0;\n self.buildToggleArray(operation.command);\n }\n if (self.queue.length < 1) self.updateControls(operation.command);\n }\n if (instruction.callback) self.userCallback = instruction.callback;\n // Always allow the instruction to override the instance setting\n animate = instruction.animate ^ self.config.animation.enable ? instruction.animate : self.config.animation.enable;\n self.callFilters(\"operationMultimix\", operation, arguments);\n return self.goMix(animate, operation);\n } else {\n queueItem = new mixitup.QueueItem();\n queueItem.args = arguments;\n queueItem.instruction = instruction;\n queueItem.triggerElement = self.lastClicked;\n queueItem.isToggling = self.isToggling;\n return self.queueMix(queueItem);\n }\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} multimixCommand\n * @param {boolean} [isPreFetch]\n * An optional boolean indicating that the operation is being pre-fetched for execution at a later time.\n * @return {Operation|null}\n */ getOperation: function(multimixCommand) {\n var self = this, sortCommand = multimixCommand.sort, filterCommand = multimixCommand.filter, changeLayoutCommand = multimixCommand.changeLayout, removeCommand = multimixCommand.remove, insertCommand = multimixCommand.insert, operation = new mixitup.Operation();\n operation = self.callFilters(\"operationUnmappedGetOperation\", operation, arguments);\n operation.id = h.randomHex();\n operation.command = multimixCommand;\n operation.startState = self.state;\n operation.triggerElement = self.lastClicked;\n if (self.isBusy) {\n if (self.config.debug.showWarnings) console.warn(mixitup.messages.warningGetOperationInstanceBusy());\n return null;\n }\n if (insertCommand) self.insertTargets(insertCommand, operation);\n if (removeCommand) operation.toRemove = removeCommand.targets;\n operation.startSort = operation.newSort = operation.startState.activeSort;\n operation.startOrder = operation.newOrder = self.targets;\n if (sortCommand) {\n operation.startSort = operation.startState.activeSort;\n operation.newSort = sortCommand;\n operation.willSort = self.willSort(sortCommand, operation.startState.activeSort);\n if (operation.willSort) self.sortOperation(operation);\n }\n operation.startFilter = operation.startState.activeFilter;\n if (filterCommand) operation.newFilter = filterCommand;\n else operation.newFilter = h.extend(new mixitup.CommandFilter(), operation.startFilter);\n if (operation.newFilter.selector === \"all\") operation.newFilter.selector = self.config.selectors.target;\n else if (operation.newFilter.selector === \"none\") operation.newFilter.selector = \"\";\n self.filterOperation(operation);\n operation.startContainerClassName = operation.startState.activeContainerClassName;\n if (changeLayoutCommand) {\n operation.newContainerClassName = changeLayoutCommand.containerClassName;\n if (operation.newContainerClassName !== operation.startContainerClassName) operation.willChangeLayout = true;\n } else operation.newContainerClassName = operation.startContainerClassName;\n if (self.config.animation.enable) {\n // Populate the operation's position data\n self.getStartMixData(operation);\n self.setInter(operation);\n operation.docState = h.getDocumentState(self.dom.document);\n self.getInterMixData(operation);\n self.setFinal(operation);\n self.getFinalMixData(operation);\n self.parseEffects();\n operation.hasEffect = self.hasEffect();\n self.getTweenData(operation);\n }\n if (operation.willSort) self.targets = operation.newOrder;\n operation.newState = self.buildState(operation);\n return self.callFilters(\"operationMappedGetOperation\", operation, arguments);\n },\n /**\n * Renders a previously created operation at a specific point in its path, as\n * determined by a multiplier between 0 and 1.\n *\n * @example\n * .tween(operation, multiplier)\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Operation} operation\n * An operation object created via the `getOperation` method\n *\n * @param {Float} multiplier\n * Any number between 0 and 1 representing the percentage complete of the operation\n * @return {void}\n */ tween: function(operation, multiplier) {\n var target = null, posData = null, toHideIndex = -1, i = -1;\n multiplier = Math.min(multiplier, 1);\n multiplier = Math.max(multiplier, 0);\n for(i = 0; target = operation.show[i]; i++){\n posData = operation.showPosData[i];\n target.applyTween(posData, multiplier);\n }\n for(i = 0; target = operation.hide[i]; i++){\n if (target.isShown) target.hide();\n if ((toHideIndex = operation.toHide.indexOf(target)) > -1) {\n posData = operation.toHidePosData[toHideIndex];\n if (!target.isShown) target.show();\n target.applyTween(posData, multiplier);\n }\n }\n },\n /**\n * Inserts one or more new target elements into the container at a specified\n * index.\n *\n * To be indexed as targets, new elements must match the `selectors.target`\n * selector (`'.mix'` by default).\n *\n * @example\n *\n * .insert(newElements [, index] [, animate], [, callback])\n *\n * @example Example 1: Inserting a single element via reference\n *\n * console.log(mixer.getState().totalShow); // 0\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insert(newElement)\n * .then(function(state) {\n * console.log(state.totalShow === 1); // true\n * });\n *\n * @example Example 2: Inserting a single element via HTML string\n *\n * console.log(mixer.getState().totalShow); // 1\n *\n * // Create a new element via reference\n *\n * var newElementHtml = '<div class=\"mix\"></div>';\n *\n * // Create and insert the new element at index 1\n *\n * mixer.insert(newElementHtml, 1)\n * .then(function(state) {\n * console.log(state.totalShow === 2); // true\n * console.log(state.show[1].outerHTML === newElementHtml); // true\n * });\n *\n * @example Example 3: Inserting multiple elements via reference\n *\n * console.log(mixer.getState().totalShow); // 2\n *\n * // Create an array of new elements to insert.\n *\n * var newElement1 = document.createElement('div');\n * var newElement2 = document.createElement('div');\n *\n * newElement1.classList.add('mix');\n * newElement2.classList.add('mix');\n *\n * var newElementsCollection = [newElement1, newElement2];\n *\n * // Insert the new elements starting at index 1\n *\n * mixer.insert(newElementsCollection, 1)\n * .then(function(state) {\n * console.log(state.totalShow === 4); // true\n * console.log(state.show[1] === newElement1); // true\n * console.log(state.show[2] === newElement2); // true\n * });\n *\n * @example Example 4: Inserting a jQuery collection object containing one or more elements\n *\n * console.log(mixer.getState().totalShow); // 4\n *\n * var $newElement = $('<div class=\"mix\"></div>');\n *\n * // Insert the new elements starting at index 3\n *\n * mixer.insert($newElement, 3)\n * .then(function(state) {\n * console.log(state.totalShow === 5); // true\n * console.log(state.show[3] === $newElement[0]); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {number} index=0\n * The index at which to insert the new element(s). `0` by default.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ insert: function() {\n var self = this, args = self.parseInsertArgs(arguments);\n return self.multimix({\n insert: args.command\n }, args.animate, args.callback);\n },\n /**\n * Inserts one or more new elements before a provided reference element.\n *\n * @example\n *\n * .insertBefore(newElements, referenceElement [, animate] [, callback])\n *\n * @example Example: Inserting a new element before a reference element\n *\n * // An existing reference element is chosen at index 2\n *\n * var referenceElement = mixer.getState().show[2];\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insertBefore(newElement, referenceElement)\n * .then(function(state) {\n * // The new element is inserted into the container at index 2, before the reference element\n *\n * console.log(state.show[2] === newElement); // true\n *\n * // The reference element is now at index 3\n *\n * console.log(state.show[3] === referenceElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {HTMLElement} referenceElement\n * A reference to an existing element in the container to insert new elements before.\n *@param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ insertBefore: function() {\n var self = this, args = self.parseInsertArgs(arguments);\n return self.insert(args.command.collection, \"before\", args.command.sibling, args.animate, args.callback);\n },\n /**\n * Inserts one or more new elements after a provided reference element.\n *\n * @example\n *\n * .insertAfter(newElements, referenceElement [, animate] [, callback])\n *\n * @example Example: Inserting a new element after a reference element\n *\n * // An existing reference element is chosen at index 2\n *\n * var referenceElement = mixer.getState().show[2];\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insertAfter(newElement, referenceElement)\n * .then(function(state) {\n * // The new element is inserted into the container at index 3, after the reference element\n *\n * console.log(state.show[3] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {HTMLElement} referenceElement\n * A reference to an existing element in the container to insert new elements after.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ insertAfter: function() {\n var self = this, args = self.parseInsertArgs(arguments);\n return self.insert(args.command.collection, \"after\", args.command.sibling, args.animate, args.callback);\n },\n /**\n * Inserts one or more new elements into the container before all existing targets.\n *\n * @example\n *\n * .prepend(newElements [,animate] [,callback])\n *\n * @example Example: Prepending a new element\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * // Insert the element into the container\n *\n * mixer.prepend(newElement)\n * .then(function(state) {\n * console.log(state.show[0] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ prepend: function() {\n var self = this, args = self.parseInsertArgs(arguments);\n return self.insert(0, args.command.collection, args.animate, args.callback);\n },\n /**\n * Inserts one or more new elements into the container after all existing targets.\n *\n * @example\n *\n * .append(newElements [,animate] [,callback])\n *\n * @example Example: Appending a new element\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * // Insert the element into the container\n *\n * mixer.append(newElement)\n * .then(function(state) {\n * console.log(state.show[state.show.length - 1] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ append: function() {\n var self = this, args = self.parseInsertArgs(arguments);\n return self.insert(self.state.totalTargets, args.command.collection, args.animate, args.callback);\n },\n /**\n * Removes one or more existing target elements from the container.\n *\n * @example\n *\n * .remove(elements [, animate] [, callback])\n *\n * @example Example 1: Removing an element by reference\n *\n * var elementToRemove = containerEl.firstElementChild;\n *\n * mixer.remove(elementToRemove)\n * .then(function(state) {\n * console.log(state.targets.indexOf(elementToRemove) === -1); // true\n * });\n *\n * @example Example 2: Removing a collection of elements by reference\n *\n * var elementsToRemove = containerEl.querySelectorAll('.category-a');\n *\n * console.log(elementsToRemove.length) // 3\n *\n * mixer.remove(elementsToRemove)\n * .then(function() {\n * console.log(containerEl.querySelectorAll('.category-a').length); // 0\n * });\n *\n * @example Example 3: Removing one or more elements by selector\n *\n * mixer.remove('.category-a')\n * .then(function() {\n * console.log(containerEl.querySelectorAll('.category-a').length); // 0\n * });\n *\n * @example Example 4: Removing an element by index\n *\n * console.log(mixer.getState.totalShow); // 4\n *\n * // Remove the element at index 3\n *\n * mixer.remove(3)\n * .then(function(state) {\n * console.log(state.totalShow); // 3\n * console.log(state.show[3]); // undefined\n * });\n *\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string|number)} elements\n * A reference to a single element to remove, an array-like collection of elements, a selector string, or the index of an element to remove.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */ remove: function() {\n var self = this, args = self.parseRemoveArgs(arguments);\n return self.multimix({\n remove: args.command\n }, args.animate, args.callback);\n },\n /**\n * Retrieves the the value of any property or sub-object within the current\n * mixitup configuration, or the whole configuration object.\n *\n * @example\n *\n * .getConfig([stringKey])\n *\n * @example Example 1: retrieve the entire configuration object\n *\n * var config = mixer.getConfig(); // Config { ... }\n *\n * @example Example 2: retrieve a named sub-object of configuration object\n *\n * var animation = mixer.getConfig('animation'); // ConfigAnimation { ... }\n *\n * @example Example 3: retrieve a value of configuration object via a dot-notation string key\n *\n * var effects = mixer.getConfig('animation.effects'); // 'fade scale'\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {string} [stringKey] A \"dot-notation\" string key\n * @return {*}\n */ getConfig: function(stringKey) {\n var self = this, value = null;\n if (!stringKey) value = self.config;\n else value = h.getProperty(self.config, stringKey);\n return self.callFilters(\"valueGetConfig\", value, arguments);\n },\n /**\n * Updates the configuration of the mixer, after it has been instantiated.\n *\n * See the Configuration Object documentation for a full list of avilable\n * configuration options.\n *\n * @example\n *\n * .configure(config)\n *\n * @example Example 1: Updating animation options\n *\n * mixer.configure({\n * animation: {\n * effects: 'fade translateX(-100%)',\n * duration: 300\n * }\n * });\n *\n * @example Example 2: Removing a callback after it has been set\n *\n * var mixer;\n *\n * function handleMixEndOnce() {\n * // Do something ..\n *\n * // Then nullify the callback\n *\n * mixer.configure({\n * callbacks: {\n * onMixEnd: null\n * }\n * });\n * };\n *\n * // Instantiate a mixer with a callback defined\n *\n * mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixEnd: handleMixEndOnce\n * }\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {object} config\n * An object containing one of more configuration options.\n * @return {void}\n */ configure: function(config) {\n var self = this;\n self.callActions(\"beforeConfigure\", arguments);\n h.extend(self.config, config, true, true);\n self.callActions(\"afterConfigure\", arguments);\n },\n /**\n * Returns an object containing information about the current state of the\n * mixer. See the State Object documentation for more information.\n *\n * NB: State objects are immutable and should therefore be regenerated\n * after any operation.\n *\n * @example\n *\n * .getState();\n *\n * @example Example: Retrieving a state object\n *\n * var state = mixer.getState();\n *\n * console.log(state.totalShow + 'targets are currently shown');\n *\n * @public\n * @instance\n * @since 2.0.0\n * @return {mixitup.State} An object reflecting the current state of the mixer.\n */ getState: function() {\n var self = this, state = null;\n state = new mixitup.State();\n h.extend(state, self.state);\n h.freeze(state);\n return self.callFilters(\"stateGetState\", state, arguments);\n },\n /**\n * Forces the re-indexing all targets within the container.\n *\n * This should only be used if some other piece of code in your application\n * has manipulated the contents of your container, which should be avoided.\n *\n * If you need to add or remove target elements from the container, use\n * the built-in `.insert()` or `.remove()` methods, and MixItUp will keep\n * itself up to date.\n *\n * @example\n *\n * .forceRefresh()\n *\n * @example Example: Force refreshing the mixer after external DOM manipulation\n *\n * console.log(mixer.getState().totalShow); // 3\n *\n * // An element is removed from the container via some external DOM manipulation code:\n *\n * containerEl.removeChild(containerEl.firstElementChild);\n *\n * // The mixer does not know that the number of targets has changed:\n *\n * console.log(mixer.getState().totalShow); // 3\n *\n * mixer.forceRefresh();\n *\n * // After forceRefresh, the mixer is in sync again:\n *\n * console.log(mixer.getState().totalShow); // 2\n *\n * @public\n * @instance\n * @since 2.1.2\n * @return {void}\n */ forceRefresh: function() {\n var self = this;\n self.indexTargets();\n },\n /**\n * Forces the re-rendering of all targets when using the Dataset API.\n *\n * By default, targets are only re-rendered when `data.dirtyCheck` is\n * enabled, and an item's data has changed when `dataset()` is called.\n *\n * The `forceRender()` method allows for the re-rendering of all targets\n * in response to some arbitrary event, such as the changing of the target\n * render function.\n *\n * Targets are rendered against their existing data.\n *\n * @example\n *\n * .forceRender()\n *\n * @example Example: Force render targets after changing the target render function\n *\n * console.log(container.innerHTML); // ... <span class=\"mix\">Foo</span> ...\n *\n * mixer.configure({\n * render: {\n * target: (item) => `<a href=\"/${item.slug}/\" class=\"mix\">${item.title}</a>`\n * }\n * });\n *\n * mixer.forceRender();\n *\n * console.log(container.innerHTML); // ... <a href=\"/foo/\" class=\"mix\">Foo</a> ...\n *\n * @public\n * @instance\n * @since 3.2.1\n * @return {void}\n */ forceRender: function() {\n var self = this, target = null, el = null, id = \"\";\n for(id in self.cache){\n target = self.cache[id];\n el = target.render(target.data);\n if (el !== target.dom.el) {\n // Update target element reference\n if (target.isInDom) {\n target.unbindEvents();\n self.dom.parent.replaceChild(el, target.dom.el);\n }\n if (!target.isShown) el.style.display = \"none\";\n target.dom.el = el;\n if (target.isInDom) target.bindEvents();\n }\n }\n self.state = self.buildState(self.lastOperation);\n },\n /**\n * Removes mixitup functionality from the container, unbinds all control\n * event handlers, and deletes the mixer instance from MixItUp's internal\n * cache.\n *\n * This should be performed whenever a mixer's container is removed from\n * the DOM, such as during a page change in a single page application,\n * or React's `componentWillUnmount()`.\n *\n * @example\n *\n * .destroy([cleanUp])\n *\n * @example Example: Destroying the mixer before removing its container element\n *\n * mixer.destroy();\n *\n * containerEl.parentElement.removeChild(containerEl);\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {boolean} [cleanUp=false]\n * An optional boolean dictating whether or not to clean up any inline `display: none;` styling applied to hidden targets.\n * @return {void}\n */ destroy: function(cleanUp) {\n var self = this, control = null, target = null, i = 0;\n self.callActions(\"beforeDestroy\", arguments);\n for(i = 0; control = self.controls[i]; i++)control.removeBinding(self);\n for(i = 0; target = self.targets[i]; i++){\n if (cleanUp) target.show();\n target.unbindEvents();\n }\n if (self.dom.container.id.match(/^MixItUp/)) self.dom.container.removeAttribute(\"id\");\n delete mixitup.instances[self.id];\n self.callActions(\"afterDestroy\", arguments);\n }\n });\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.IMoveData = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.posIn = null;\n this.posOut = null;\n this.operation = null;\n this.callback = null;\n this.statusChange = \"\";\n this.duration = -1;\n this.staggerIndex = -1;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.IMoveData);\n mixitup.IMoveData.prototype = Object.create(mixitup.Base.prototype);\n mixitup.IMoveData.prototype.constructor = mixitup.IMoveData;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.TargetDom = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.el = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.TargetDom);\n mixitup.TargetDom.prototype = Object.create(mixitup.Base.prototype);\n mixitup.TargetDom.prototype.constructor = mixitup.TargetDom;\n /**\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Target = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.id = \"\";\n this.sortString = \"\";\n this.mixer = null;\n this.callback = null;\n this.isShown = false;\n this.isBound = false;\n this.isExcluded = false;\n this.isInDom = false;\n this.handler = null;\n this.operation = null;\n this.data = null;\n this.dom = new mixitup.TargetDom();\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Target);\n mixitup.Target.prototype = Object.create(mixitup.Base.prototype);\n h.extend(mixitup.Target.prototype, {\n constructor: mixitup.Target,\n /**\n * Initialises a newly instantiated Target.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {(Element|null)} el\n * @param {object} mixer\n * @param {object} [data]\n * @return {void}\n */ init: function(el, mixer, data) {\n var self = this, id = \"\";\n self.callActions(\"beforeInit\", arguments);\n self.mixer = mixer;\n if (!el) // If no element is provided, render it\n el = self.render(data);\n self.cacheDom(el);\n self.bindEvents();\n if (self.dom.el.style.display !== \"none\") self.isShown = true;\n if (data && mixer.config.data.uidKey) {\n if (typeof (id = data[mixer.config.data.uidKey]) === \"undefined\" || id.toString().length < 1) throw new TypeError(mixitup.messages.errorDatasetInvalidUidKey({\n uidKey: mixer.config.data.uidKey\n }));\n self.id = id;\n self.data = data;\n mixer.cache[id] = self;\n }\n self.callActions(\"afterInit\", arguments);\n },\n /**\n * Renders the target element using a user-defined renderer function.\n *\n * @private\n * @instance\n * @since 3.1.4\n * @param {object} data\n * @return {void}\n */ render: function(data) {\n var self = this, render = null, el = null, temp = null, output = \"\";\n self.callActions(\"beforeRender\", arguments);\n render = self.callFilters(\"renderRender\", self.mixer.config.render.target, arguments);\n if (typeof render !== \"function\") throw new TypeError(mixitup.messages.errorDatasetRendererNotSet());\n output = render(data);\n if (output && typeof output === \"object\" && h.isElement(output)) el = output;\n else if (typeof output === \"string\") {\n temp = document.createElement(\"div\");\n temp.innerHTML = output;\n el = temp.firstElementChild;\n }\n return self.callFilters(\"elRender\", el, arguments);\n },\n /**\n * Caches references of DOM elements neccessary for the target's functionality.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {Element} el\n * @return {void}\n */ cacheDom: function(el) {\n var self = this;\n self.callActions(\"beforeCacheDom\", arguments);\n self.dom.el = el;\n self.callActions(\"afterCacheDom\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} attributeName\n * @return {void}\n */ getSortString: function(attributeName) {\n var self = this, value = self.dom.el.getAttribute(\"data-\" + attributeName) || \"\";\n self.callActions(\"beforeGetSortString\", arguments);\n value = isNaN(value * 1) ? value.toLowerCase() : value * 1;\n self.sortString = value;\n self.callActions(\"afterGetSortString\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ show: function() {\n var self = this;\n self.callActions(\"beforeShow\", arguments);\n if (!self.isShown) {\n self.dom.el.style.display = \"\";\n self.isShown = true;\n }\n self.callActions(\"afterShow\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ hide: function() {\n var self = this;\n self.callActions(\"beforeHide\", arguments);\n if (self.isShown) {\n self.dom.el.style.display = \"none\";\n self.isShown = false;\n }\n self.callActions(\"afterHide\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */ move: function(moveData) {\n var self = this;\n self.callActions(\"beforeMove\", arguments);\n if (!self.isExcluded) self.mixer.targetsMoved++;\n self.applyStylesIn(moveData);\n requestAnimationFrame(function() {\n self.applyStylesOut(moveData);\n });\n self.callActions(\"afterMove\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} posData\n * @param {number} multiplier\n * @return {void}\n */ applyTween: function(posData, multiplier) {\n var self = this, propertyName = \"\", tweenData = null, posIn = posData.posIn, currentTransformValues = [], currentValues = new mixitup.StyleData(), i = -1;\n self.callActions(\"beforeApplyTween\", arguments);\n currentValues.x = posIn.x;\n currentValues.y = posIn.y;\n if (multiplier === 0) self.hide();\n else if (!self.isShown) self.show();\n for(i = 0; propertyName = mixitup.features.TWEENABLE[i]; i++){\n tweenData = posData.tweenData[propertyName];\n if (propertyName === \"x\") {\n if (!tweenData) continue;\n currentValues.x = posIn.x + tweenData * multiplier;\n } else if (propertyName === \"y\") {\n if (!tweenData) continue;\n currentValues.y = posIn.y + tweenData * multiplier;\n } else if (tweenData instanceof mixitup.TransformData) {\n if (!tweenData.value) continue;\n currentValues[propertyName].value = posIn[propertyName].value + tweenData.value * multiplier;\n currentValues[propertyName].unit = tweenData.unit;\n currentTransformValues.push(propertyName + \"(\" + currentValues[propertyName].value + tweenData.unit + \")\");\n } else {\n if (!tweenData) continue;\n currentValues[propertyName] = posIn[propertyName] + tweenData * multiplier;\n self.dom.el.style[propertyName] = currentValues[propertyName];\n }\n }\n if (currentValues.x || currentValues.y) currentTransformValues.unshift(\"translate(\" + currentValues.x + \"px, \" + currentValues.y + \"px)\");\n if (currentTransformValues.length) self.dom.el.style[mixitup.features.transformProp] = currentTransformValues.join(\" \");\n self.callActions(\"afterApplyTween\", arguments);\n },\n /**\n * Applies the initial styling to a target element before any transition\n * is applied.\n *\n * @private\n * @instance\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */ applyStylesIn: function(moveData) {\n var self = this, posIn = moveData.posIn, isFading = self.mixer.effectsIn.opacity !== 1, transformValues = [];\n self.callActions(\"beforeApplyStylesIn\", arguments);\n transformValues.push(\"translate(\" + posIn.x + \"px, \" + posIn.y + \"px)\");\n if (self.mixer.config.animation.animateResizeTargets) {\n if (moveData.statusChange !== \"show\") {\n // Don't apply posIn width or height or showing, as will be 0\n self.dom.el.style.width = posIn.width + \"px\";\n self.dom.el.style.height = posIn.height + \"px\";\n }\n self.dom.el.style.marginRight = posIn.marginRight + \"px\";\n self.dom.el.style.marginBottom = posIn.marginBottom + \"px\";\n }\n isFading && (self.dom.el.style.opacity = posIn.opacity);\n if (moveData.statusChange === \"show\") transformValues = transformValues.concat(self.mixer.transformIn);\n self.dom.el.style[mixitup.features.transformProp] = transformValues.join(\" \");\n self.callActions(\"afterApplyStylesIn\", arguments);\n },\n /**\n * Applies a transition followed by the final styles for the element to\n * transition towards.\n *\n * @private\n * @instance\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */ applyStylesOut: function(moveData) {\n var self = this, transitionRules = [], transformValues = [], isResizing = self.mixer.config.animation.animateResizeTargets, isFading = typeof self.mixer.effectsIn.opacity !== \"undefined\";\n self.callActions(\"beforeApplyStylesOut\", arguments);\n // Build the transition rules\n transitionRules.push(self.writeTransitionRule(mixitup.features.transformRule, moveData.staggerIndex));\n if (moveData.statusChange !== \"none\") transitionRules.push(self.writeTransitionRule(\"opacity\", moveData.staggerIndex, moveData.duration));\n if (isResizing) {\n transitionRules.push(self.writeTransitionRule(\"width\", moveData.staggerIndex, moveData.duration));\n transitionRules.push(self.writeTransitionRule(\"height\", moveData.staggerIndex, moveData.duration));\n transitionRules.push(self.writeTransitionRule(\"margin\", moveData.staggerIndex, moveData.duration));\n }\n // If no callback was provided, the element will\n // not transition in any way so tag it as \"immovable\"\n if (!moveData.callback) {\n self.mixer.targetsImmovable++;\n if (self.mixer.targetsMoved === self.mixer.targetsImmovable) // If the total targets moved is equal to the\n // number of immovable targets, the operation\n // should be considered finished\n self.mixer.cleanUp(moveData.operation);\n return;\n }\n // If the target will transition in some fasion,\n // assign a callback function\n self.operation = moveData.operation;\n self.callback = moveData.callback;\n // As long as the target is not excluded, increment\n // the total number of targets bound\n !self.isExcluded && self.mixer.targetsBound++;\n // Tag the target as bound to differentiate from transitionEnd\n // events that may come from stylesheet driven effects\n self.isBound = true;\n // Apply the transition\n self.applyTransition(transitionRules);\n // Apply width, height and margin negation\n if (isResizing && moveData.posOut.width > 0 && moveData.posOut.height > 0) {\n self.dom.el.style.width = moveData.posOut.width + \"px\";\n self.dom.el.style.height = moveData.posOut.height + \"px\";\n self.dom.el.style.marginRight = moveData.posOut.marginRight + \"px\";\n self.dom.el.style.marginBottom = moveData.posOut.marginBottom + \"px\";\n }\n if (!self.mixer.config.animation.nudge && moveData.statusChange === \"hide\") // If we're not nudging, the translation should be\n // applied before any other transforms to prevent\n // lateral movement\n transformValues.push(\"translate(\" + moveData.posOut.x + \"px, \" + moveData.posOut.y + \"px)\");\n // Apply fade\n switch(moveData.statusChange){\n case \"hide\":\n isFading && (self.dom.el.style.opacity = self.mixer.effectsOut.opacity);\n transformValues = transformValues.concat(self.mixer.transformOut);\n break;\n case \"show\":\n isFading && (self.dom.el.style.opacity = 1);\n }\n if (self.mixer.config.animation.nudge || !self.mixer.config.animation.nudge && moveData.statusChange !== \"hide\") // Opposite of above - apply translate after\n // other transform\n transformValues.push(\"translate(\" + moveData.posOut.x + \"px, \" + moveData.posOut.y + \"px)\");\n // Apply transforms\n self.dom.el.style[mixitup.features.transformProp] = transformValues.join(\" \");\n self.callActions(\"afterApplyStylesOut\", arguments);\n },\n /**\n * Combines the name of a CSS property with the appropriate duration and delay\n * values to created a valid transition rule.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} property\n * @param {number} staggerIndex\n * @param {number} duration\n * @return {string}\n */ writeTransitionRule: function(property, staggerIndex, duration) {\n var self = this, delay = self.getDelay(staggerIndex), rule = \"\";\n rule = property + \" \" + (duration > 0 ? duration : self.mixer.config.animation.duration) + \"ms \" + delay + \"ms \" + (property === \"opacity\" ? \"linear\" : self.mixer.config.animation.easing);\n return self.callFilters(\"ruleWriteTransitionRule\", rule, arguments);\n },\n /**\n * Calculates the transition delay for each target element based on its index, if\n * staggering is applied. If defined, A custom `animation.staggerSeqeuence`\n * function can be used to manipulate the order of indices to produce custom\n * stagger effects (e.g. for use in a grid with irregular row lengths).\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {number} index\n * @return {number}\n */ getDelay: function(index) {\n var self = this, delay = -1;\n if (typeof self.mixer.config.animation.staggerSequence === \"function\") index = self.mixer.config.animation.staggerSequence.call(self, index, self.state);\n delay = !!self.mixer.staggerDuration ? index * self.mixer.staggerDuration : 0;\n return self.callFilters(\"delayGetDelay\", delay, arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {string[]} rules\n * @return {void}\n */ applyTransition: function(rules) {\n var self = this, transitionString = rules.join(\", \");\n self.callActions(\"beforeApplyTransition\", arguments);\n self.dom.el.style[mixitup.features.transitionProp] = transitionString;\n self.callActions(\"afterApplyTransition\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Event} e\n * @return {void}\n */ handleTransitionEnd: function(e) {\n var self = this, propName = e.propertyName, canResize = self.mixer.config.animation.animateResizeTargets;\n self.callActions(\"beforeHandleTransitionEnd\", arguments);\n if (self.isBound && e.target.matches(self.mixer.config.selectors.target) && (propName.indexOf(\"transform\") > -1 || propName.indexOf(\"opacity\") > -1 || canResize && propName.indexOf(\"height\") > -1 || canResize && propName.indexOf(\"width\") > -1 || canResize && propName.indexOf(\"margin\") > -1)) {\n self.callback.call(self, self.operation);\n self.isBound = false;\n self.callback = null;\n self.operation = null;\n }\n self.callActions(\"afterHandleTransitionEnd\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Event} e\n * @return {void}\n */ eventBus: function(e) {\n var self = this;\n self.callActions(\"beforeEventBus\", arguments);\n switch(e.type){\n case \"webkitTransitionEnd\":\n case \"transitionend\":\n self.handleTransitionEnd(e);\n }\n self.callActions(\"afterEventBus\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ unbindEvents: function() {\n var self = this;\n self.callActions(\"beforeUnbindEvents\", arguments);\n h.off(self.dom.el, \"webkitTransitionEnd\", self.handler);\n h.off(self.dom.el, \"transitionend\", self.handler);\n self.callActions(\"afterUnbindEvents\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ bindEvents: function() {\n var self = this, transitionEndEvent = \"\";\n self.callActions(\"beforeBindEvents\", arguments);\n transitionEndEvent = mixitup.features.transitionPrefix === \"webkit\" ? \"webkitTransitionEnd\" : \"transitionend\";\n self.handler = function(e) {\n return self.eventBus(e);\n };\n h.on(self.dom.el, transitionEndEvent, self.handler);\n self.callActions(\"afterBindEvents\", arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {boolean} [getBox]\n * @return {PosData}\n */ getPosData: function(getBox) {\n var self = this, styles = {}, rect = null, posData = new mixitup.StyleData();\n self.callActions(\"beforeGetPosData\", arguments);\n posData.x = self.dom.el.offsetLeft;\n posData.y = self.dom.el.offsetTop;\n if (self.mixer.config.animation.animateResizeTargets || getBox) {\n rect = self.dom.el.getBoundingClientRect();\n posData.top = rect.top;\n posData.right = rect.right;\n posData.bottom = rect.bottom;\n posData.left = rect.left;\n posData.width = rect.width;\n posData.height = rect.height;\n }\n if (self.mixer.config.animation.animateResizeTargets) {\n styles = window1.getComputedStyle(self.dom.el);\n posData.marginBottom = parseFloat(styles.marginBottom);\n posData.marginRight = parseFloat(styles.marginRight);\n }\n return self.callFilters(\"posDataGetPosData\", posData, arguments);\n },\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */ cleanUp: function() {\n var self = this;\n self.callActions(\"beforeCleanUp\", arguments);\n self.dom.el.style[mixitup.features.transformProp] = \"\";\n self.dom.el.style[mixitup.features.transitionProp] = \"\";\n self.dom.el.style.opacity = \"\";\n if (self.mixer.config.animation.animateResizeTargets) {\n self.dom.el.style.width = \"\";\n self.dom.el.style.height = \"\";\n self.dom.el.style.marginRight = \"\";\n self.dom.el.style.marginBottom = \"\";\n }\n self.callActions(\"afterCleanUp\", arguments);\n }\n });\n /**\n * A jQuery-collection-like wrapper around one or more `mixitup.Mixer` instances\n * allowing simultaneous control of said instances similar to the MixItUp 2 API.\n *\n * @example\n * new mixitup.Collection(instances)\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {mixitup.Mixer[]} instances\n */ mixitup.Collection = function(instances) {\n var instance = null, i = -1;\n this.callActions(\"beforeConstruct\");\n for(i = 0; instance = instances[i]; i++)this[i] = instance;\n this.length = instances.length;\n this.callActions(\"afterConstruct\");\n h.freeze(this);\n };\n mixitup.BaseStatic.call(mixitup.Collection);\n mixitup.Collection.prototype = Object.create(mixitup.Base.prototype);\n h.extend(mixitup.Collection.prototype, /** @lends mixitup.Collection */ {\n constructor: mixitup.Collection,\n /**\n * Calls a method on all instances in the collection by passing the method\n * name as a string followed by any applicable parameters to be curried into\n * to the method.\n *\n * @example\n * .mixitup(methodName[,arg1][,arg2..]);\n *\n * @example\n * var collection = new Collection([mixer1, mixer2]);\n *\n * return collection.mixitup('filter', '.category-a')\n * .then(function(states) {\n * state.forEach(function(state) {\n * console.log(state.activeFilter.selector); // .category-a\n * });\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} methodName\n * @return {Promise>}\n */ mixitup: function(methodName) {\n var self = this, instance = null, args = Array.prototype.slice.call(arguments), tasks = [], i = -1;\n this.callActions(\"beforeMixitup\");\n args.shift();\n for(i = 0; instance = self[i]; i++)tasks.push(instance[methodName].apply(instance, args));\n return self.callFilters(\"promiseMixitup\", h.all(tasks, mixitup.libraries), arguments);\n }\n });\n /**\n * `mixitup.Operation` objects contain all data neccessary to describe the full\n * lifecycle of any MixItUp operation. They can be used to compute and store an\n * operation for use at a later time (e.g. programmatic tweening).\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Operation = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.id = \"\";\n this.args = [];\n this.command = null;\n this.showPosData = [];\n this.toHidePosData = [];\n this.startState = null;\n this.newState = null;\n this.docState = null;\n this.willSort = false;\n this.willChangeLayout = false;\n this.hasEffect = false;\n this.hasFailed = false;\n this.triggerElement = null;\n this.show = [];\n this.hide = [];\n this.matching = [];\n this.toShow = [];\n this.toHide = [];\n this.toMove = [];\n this.toRemove = [];\n this.startOrder = [];\n this.newOrder = [];\n this.startSort = null;\n this.newSort = null;\n this.startFilter = null;\n this.newFilter = null;\n this.startDataset = null;\n this.newDataset = null;\n this.viewportDeltaX = 0;\n this.viewportDeltaY = 0;\n this.startX = 0;\n this.startY = 0;\n this.startHeight = 0;\n this.startWidth = 0;\n this.newX = 0;\n this.newY = 0;\n this.newHeight = 0;\n this.newWidth = 0;\n this.startContainerClassName = \"\";\n this.startDisplay = \"\";\n this.newContainerClassName = \"\";\n this.newDisplay = \"\";\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Operation);\n mixitup.Operation.prototype = Object.create(mixitup.Base.prototype);\n mixitup.Operation.prototype.constructor = mixitup.Operation;\n /**\n * `mixitup.State` objects expose various pieces of data detailing the state of\n * a MixItUp instance. They are provided at the start and end of any operation via\n * callbacks and events, with the most recent state stored between operations\n * for retrieval at any time via the API.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */ mixitup.State = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /**\n * The ID of the mixer instance.\n *\n * @name id\n * @memberof mixitup.State\n * @instance\n * @type {string}\n * @default ''\n */ this.id = \"\";\n /**\n * The currently active filter command as set by a control click or API call.\n *\n * @name activeFilter\n * @memberof mixitup.State\n * @instance\n * @type {mixitup.CommandFilter}\n * @default null\n */ this.activeFilter = null;\n /**\n * The currently active sort command as set by a control click or API call.\n *\n * @name activeSort\n * @memberof mixitup.State\n * @instance\n * @type {mixitup.CommandSort}\n * @default null\n */ this.activeSort = null;\n /**\n * The current layout-specific container class name, if applied.\n *\n * @name activeContainerClassName\n * @memberof mixitup.State\n * @instance\n * @type {string}\n * @default ''\n */ this.activeContainerClassName = \"\";\n /**\n * A reference to the container element that the mixer is instantiated on.\n *\n * @name container\n * @memberof mixitup.State\n * @instance\n * @type {Element}\n * @default null\n */ this.container = null;\n /**\n * An array of all target elements indexed by the mixer.\n *\n * @name targets\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */ this.targets = [];\n /**\n * An array of all target elements not matching the current filter.\n *\n * @name hide\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */ this.hide = [];\n /**\n * An array of all target elements matching the current filter and any additional\n * limits applied such as pagination.\n *\n * @name show\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */ this.show = [];\n /**\n * An array of all target elements matching the current filter irrespective of\n * any additional limits applied such as pagination.\n *\n * @name matching\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */ this.matching = [];\n /**\n * An integer representing the total number of target elements indexed by the\n * mixer. Equivalent to `state.targets.length`.\n *\n * @name totalTargets\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */ this.totalTargets = -1;\n /**\n * An integer representing the total number of target elements matching the\n * current filter and any additional limits applied such as pagination.\n * Equivalent to `state.show.length`.\n *\n * @name totalShow\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */ this.totalShow = -1;\n /**\n * An integer representing the total number of target elements not matching\n * the current filter. Equivalent to `state.hide.length`.\n *\n * @name totalHide\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */ this.totalHide = -1;\n /**\n * An integer representing the total number of target elements matching the\n * current filter irrespective of any other limits applied such as pagination.\n * Equivalent to `state.matching.length`.\n *\n * @name totalMatching\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */ this.totalMatching = -1;\n /**\n * A boolean indicating whether the last operation \"failed\", i.e. no targets\n * could be found matching the filter.\n *\n * @name hasFailed\n * @memberof mixitup.State\n * @instance\n * @type {boolean}\n * @default false\n */ this.hasFailed = false;\n /**\n * The DOM element that was clicked if the last operation was triggered by the\n * clicking of a control and not an API call.\n *\n * @name triggerElement\n * @memberof mixitup.State\n * @instance\n * @type {Element|null}\n * @default null\n */ this.triggerElement = null;\n /**\n * The currently active dataset underlying the rendered targets, if the\n * dataset API is in use.\n *\n * @name activeDataset\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default null\n */ this.activeDataset = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.State);\n mixitup.State.prototype = Object.create(mixitup.Base.prototype);\n mixitup.State.prototype.constructor = mixitup.State;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.UserInstruction = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n this.command = {};\n this.animate = false;\n this.callback = null;\n this.callActions(\"afterConstruct\");\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.UserInstruction);\n mixitup.UserInstruction.prototype = Object.create(mixitup.Base.prototype);\n mixitup.UserInstruction.prototype.constructor = mixitup.UserInstruction;\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */ mixitup.Messages = function() {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\");\n /* Errors\n ----------------------------------------------------------------------------- */ this.ERROR_FACTORY_INVALID_CONTAINER = \"[MixItUp] An invalid selector or element reference was passed to the mixitup factory function\";\n this.ERROR_FACTORY_CONTAINER_NOT_FOUND = \"[MixItUp] The provided selector yielded no container element\";\n this.ERROR_CONFIG_INVALID_ANIMATION_EFFECTS = \"[MixItUp] Invalid value for `animation.effects`\";\n this.ERROR_CONFIG_INVALID_CONTROLS_SCOPE = \"[MixItUp] Invalid value for `controls.scope`\";\n this.ERROR_CONFIG_INVALID_PROPERTY = '[MixitUp] Invalid configuration object property \"${erroneous}\"${suggestion}';\n this.ERROR_CONFIG_INVALID_PROPERTY_SUGGESTION = '. Did you mean \"${probableMatch}\"?';\n this.ERROR_CONFIG_DATA_UID_KEY_NOT_SET = \"[MixItUp] To use the dataset API, a UID key must be specified using `data.uidKey`\";\n this.ERROR_DATASET_INVALID_UID_KEY = '[MixItUp] The specified UID key \"${uidKey}\" is not present on one or more dataset items';\n this.ERROR_DATASET_DUPLICATE_UID = '[MixItUp] The UID \"${uid}\" was found on two or more dataset items. UIDs must be unique.';\n this.ERROR_INSERT_INVALID_ARGUMENTS = \"[MixItUp] Please provider either an index or a sibling and position to insert, not both\";\n this.ERROR_INSERT_PREEXISTING_ELEMENT = \"[MixItUp] An element to be inserted already exists in the container\";\n this.ERROR_FILTER_INVALID_ARGUMENTS = \"[MixItUp] Please provide either a selector or collection `.filter()`, not both\";\n this.ERROR_DATASET_NOT_SET = \"[MixItUp] To use the dataset API with pre-rendered targets, a starting dataset must be set using `load.dataset`\";\n this.ERROR_DATASET_PRERENDERED_MISMATCH = \"[MixItUp] `load.dataset` does not match pre-rendered targets\";\n this.ERROR_DATASET_RENDERER_NOT_SET = \"[MixItUp] To insert an element via the dataset API, a target renderer function must be provided to `render.target`\";\n this.ERROR_SORT_NON_EXISTENT_ELEMENT = \"[MixItUp] An element to be sorted does not already exist in the container\";\n /* Warnings\n ----------------------------------------------------------------------------- */ this.WARNING_FACTORY_PREEXISTING_INSTANCE = \"[MixItUp] WARNING: This element already has an active MixItUp instance. The provided configuration object will be ignored. If you wish to perform additional methods on this instance, please create a reference.\";\n this.WARNING_INSERT_NO_ELEMENTS = \"[MixItUp] WARNING: No valid elements were passed to `.insert()`\";\n this.WARNING_REMOVE_NO_ELEMENTS = \"[MixItUp] WARNING: No valid elements were passed to `.remove()`\";\n this.WARNING_MULTIMIX_INSTANCE_QUEUE_FULL = \"[MixItUp] WARNING: An operation was requested but the MixItUp instance was busy. The operation was rejected because the queue is full or queuing is disabled.\";\n this.WARNING_GET_OPERATION_INSTANCE_BUSY = \"[MixItUp] WARNING: Operations can be be created while the MixItUp instance is busy.\";\n this.WARNING_NO_PROMISE_IMPLEMENTATION = \"[MixItUp] WARNING: No Promise implementations could be found. If you wish to use promises with MixItUp please install an ES6 Promise polyfill.\";\n this.WARNING_INCONSISTENT_SORTING_ATTRIBUTES = '[MixItUp] WARNING: The requested sorting data attribute \"${attribute}\" was not present on one or more target elements which may product unexpected sort output';\n this.callActions(\"afterConstruct\");\n this.compileTemplates();\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Messages);\n mixitup.Messages.prototype = Object.create(mixitup.Base.prototype);\n mixitup.Messages.prototype.constructor = mixitup.Messages;\n /**\n * @return {void}\n */ mixitup.Messages.prototype.compileTemplates = function() {\n var errorKey = \"\";\n var errorMessage = \"\";\n for(errorKey in this){\n if (typeof (errorMessage = this[errorKey]) !== \"string\") continue;\n this[h.camelCase(errorKey)] = h.template(errorMessage);\n }\n };\n mixitup.messages = new mixitup.Messages();\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {mixitup.Mixer} mixer\n */ mixitup.Facade = function Mixer(mixer) {\n mixitup.Base.call(this);\n this.callActions(\"beforeConstruct\", arguments);\n this.configure = mixer.configure.bind(mixer);\n this.show = mixer.show.bind(mixer);\n this.hide = mixer.hide.bind(mixer);\n this.filter = mixer.filter.bind(mixer);\n this.toggleOn = mixer.toggleOn.bind(mixer);\n this.toggleOff = mixer.toggleOff.bind(mixer);\n this.sort = mixer.sort.bind(mixer);\n this.changeLayout = mixer.changeLayout.bind(mixer);\n this.multimix = mixer.multimix.bind(mixer);\n this.dataset = mixer.dataset.bind(mixer);\n this.tween = mixer.tween.bind(mixer);\n this.insert = mixer.insert.bind(mixer);\n this.insertBefore = mixer.insertBefore.bind(mixer);\n this.insertAfter = mixer.insertAfter.bind(mixer);\n this.prepend = mixer.prepend.bind(mixer);\n this.append = mixer.append.bind(mixer);\n this.remove = mixer.remove.bind(mixer);\n this.destroy = mixer.destroy.bind(mixer);\n this.forceRefresh = mixer.forceRefresh.bind(mixer);\n this.forceRender = mixer.forceRender.bind(mixer);\n this.isMixing = mixer.isMixing.bind(mixer);\n this.getOperation = mixer.getOperation.bind(mixer);\n this.getConfig = mixer.getConfig.bind(mixer);\n this.getState = mixer.getState.bind(mixer);\n this.callActions(\"afterConstruct\", arguments);\n h.freeze(this);\n h.seal(this);\n };\n mixitup.BaseStatic.call(mixitup.Facade);\n mixitup.Facade.prototype = Object.create(mixitup.Base.prototype);\n mixitup.Facade.prototype.constructor = mixitup.Facade;\n module.exports = mixitup;\n mixitup.BaseStatic.call(mixitup.constructor);\n mixitup.NAME = \"mixitup\";\n mixitup.CORE_VERSION = \"3.3.1\";\n})(window);\n\n});\n\nparcelRegister(\"eqT6r\", function(module, exports) {\n/**!\r\n * MixItUp MultiFilter v3.3.6\r\n * A UI-builder for powerful multidimensional filtering\r\n * Build 293e0dda-087e-4a76-aadf-e3e8b311b81f\r\n *\r\n * Requires mixitup.js >= v^3.1.2\r\n *\r\n * @copyright Copyright 2014-2020 KunkaLabs Limited.\r\n * @author KunkaLabs Limited.\r\n * @link https://www.kunkalabs.com/mixitup-multifilter/\r\n *\r\n * @license Commercial use requires a commercial license.\r\n * https://www.kunkalabs.com/mixitup-multifilter/licenses/\r\n *\r\n * Non-commercial use permitted under same terms as license.\r\n * http://creativecommons.org/licenses/by-nc/3.0/\r\n */ !function(u) {\n \"use strict\";\n var e = function(u) {\n var t, i = u.h;\n if (t = [\n [\n \"A\",\n /[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g\n ],\n [\n \"AA\",\n /[\\uA732]/g\n ],\n [\n \"AE\",\n /[\\u00C6\\u01FC\\u01E2]/g\n ],\n [\n \"AO\",\n /[\\uA734]/g\n ],\n [\n \"AU\",\n /[\\uA736]/g\n ],\n [\n \"AV\",\n /[\\uA738\\uA73A]/g\n ],\n [\n \"AY\",\n /[\\uA73C]/g\n ],\n [\n \"B\",\n /[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g\n ],\n [\n \"C\",\n /[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g\n ],\n [\n \"D\",\n /[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g\n ],\n [\n \"DZ\",\n /[\\u01F1\\u01C4]/g\n ],\n [\n \"Dz\",\n /[\\u01F2\\u01C5]/g\n ],\n [\n \"E\",\n /[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g\n ],\n [\n \"F\",\n /[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g\n ],\n [\n \"G\",\n /[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g\n ],\n [\n \"H\",\n /[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g\n ],\n [\n \"I\",\n /[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g\n ],\n [\n \"J\",\n /[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g\n ],\n [\n \"K\",\n /[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g\n ],\n [\n \"L\",\n /[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g\n ],\n [\n \"LJ\",\n /[\\u01C7]/g\n ],\n [\n \"Lj\",\n /[\\u01C8]/g\n ],\n [\n \"M\",\n /[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g\n ],\n [\n \"N\",\n /[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g\n ],\n [\n \"NJ\",\n /[\\u01CA]/g\n ],\n [\n \"Nj\",\n /[\\u01CB]/g\n ],\n [\n \"O\",\n /[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g\n ],\n [\n \"OI\",\n /[\\u01A2]/g\n ],\n [\n \"OO\",\n /[\\uA74E]/g\n ],\n [\n \"OU\",\n /[\\u0222]/g\n ],\n [\n \"P\",\n /[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g\n ],\n [\n \"Q\",\n /[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g\n ],\n [\n \"R\",\n /[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g\n ],\n [\n \"S\",\n /[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g\n ],\n [\n \"T\",\n /[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g\n ],\n [\n \"TZ\",\n /[\\uA728]/g\n ],\n [\n \"U\",\n /[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g\n ],\n [\n \"V\",\n /[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g\n ],\n [\n \"VY\",\n /[\\uA760]/g\n ],\n [\n \"W\",\n /[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g\n ],\n [\n \"X\",\n /[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g\n ],\n [\n \"Y\",\n /[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g\n ],\n [\n \"Z\",\n /[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g\n ],\n [\n \"a\",\n /[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g\n ],\n [\n \"aa\",\n /[\\uA733]/g\n ],\n [\n \"ae\",\n /[\\u00E6\\u01FD\\u01E3]/g\n ],\n [\n \"ao\",\n /[\\uA735]/g\n ],\n [\n \"au\",\n /[\\uA737]/g\n ],\n [\n \"av\",\n /[\\uA739\\uA73B]/g\n ],\n [\n \"ay\",\n /[\\uA73D]/g\n ],\n [\n \"b\",\n /[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g\n ],\n [\n \"c\",\n /[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g\n ],\n [\n \"d\",\n /[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g\n ],\n [\n \"dz\",\n /[\\u01F3\\u01C6]/g\n ],\n [\n \"e\",\n /[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g\n ],\n [\n \"f\",\n /[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g\n ],\n [\n \"g\",\n /[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g\n ],\n [\n \"h\",\n /[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g\n ],\n [\n \"hv\",\n /[\\u0195]/g\n ],\n [\n \"i\",\n /[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g\n ],\n [\n \"j\",\n /[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g\n ],\n [\n \"k\",\n /[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g\n ],\n [\n \"l\",\n /[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g\n ],\n [\n \"lj\",\n /[\\u01C9]/g\n ],\n [\n \"m\",\n /[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g\n ],\n [\n \"n\",\n /[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g\n ],\n [\n \"nj\",\n /[\\u01CC]/g\n ],\n [\n \"o\",\n /[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g\n ],\n [\n \"oi\",\n /[\\u01A3]/g\n ],\n [\n \"ou\",\n /[\\u0223]/g\n ],\n [\n \"oo\",\n /[\\uA74F]/g\n ],\n [\n \"p\",\n /[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g\n ],\n [\n \"q\",\n /[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g\n ],\n [\n \"r\",\n /[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g\n ],\n [\n \"s\",\n /[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g\n ],\n [\n \"t\",\n /[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g\n ],\n [\n \"tz\",\n /[\\uA729]/g\n ],\n [\n \"u\",\n /[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g\n ],\n [\n \"v\",\n /[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g\n ],\n [\n \"vy\",\n /[\\uA761]/g\n ],\n [\n \"w\",\n /[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g\n ],\n [\n \"x\",\n /[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g\n ],\n [\n \"y\",\n /[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g\n ],\n [\n \"z\",\n /[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g\n ]\n ], !u.CORE_VERSION || !i.compareVersions(e.REQUIRE_CORE_VERSION, u.CORE_VERSION)) throw new Error(\"[MixItUp Multifilter] MixItUp Multifilter v\" + e.EXTENSION_VERSION + \" requires at least MixItUp v\" + e.REQUIRE_CORE_VERSION);\n u.ConfigCallbacks.registerAction(\"afterConstruct\", \"multifilter\", function() {\n this.onParseFilterGroups = null;\n }), u.ConfigMultifilter = function() {\n this.enable = !1, this.logicWithinGroup = \"or\", this.logicBetweenGroups = \"and\", this.minSearchLength = 3, this.parseOn = \"change\", this.keyupThrottleDuration = 350, i.seal(this);\n }, u.Config.registerAction(\"beforeConstruct\", \"multifilter\", function() {\n this.multifilter = new u.ConfigMultifilter;\n }), u.MultifilterFormEventTracker = function() {\n this.form = null, this.totalBound = 0, this.totalHandled = 0, i.seal(this);\n }, u.FilterGroupDom = function() {\n this.el = null, this.form = null, i.seal(this);\n }, u.FilterGroup = function() {\n this.name = \"\", this.dom = new u.FilterGroupDom, this.activeSelectors = [], this.activeFilters = [], this.activeToggles = [], this.handler = null, this.mixer = null, this.logic = \"or\", this.parseOn = \"change\", this.keyupTimeout = -1, i.seal(this);\n }, i.extend(u.FilterGroup.prototype, {\n init: function(u, e) {\n var t = this, i = u.getAttribute(\"data-logic\");\n t.dom.el = u, this.name = t.dom.el.getAttribute(\"data-filter-group\") || \"\", t.cacheDom(), t.dom.form && t.enableButtons(), t.mixer = e, (i && \"and\" === i.toLowerCase() || \"and\" === e.config.multifilter.logicWithinGroup) && (t.logic = \"and\"), t.bindEvents();\n },\n cacheDom: function() {\n var u = this;\n u.dom.form = i.closestParent(u.dom.el, \"form\", !0);\n },\n enableButtons: function() {\n var u = this, e = u.dom.form.querySelectorAll('button[type=\"submit\"]:disabled'), t = null, i = -1;\n for(i = 0; t = e[i]; i++)t.disabled && (t.disabled = !1);\n },\n bindEvents: function() {\n var u = this;\n u.handler = function(e) {\n switch(e.type){\n case \"reset\":\n case \"submit\":\n u.handleFormEvent(e);\n break;\n default:\n u[\"handle\" + i.pascalCase(e.type)](e);\n }\n }, i.on(u.dom.el, \"click\", u.handler), i.on(u.dom.el, \"change\", u.handler), i.on(u.dom.el, \"keyup\", u.handler), u.dom.form && (i.on(u.dom.form, \"reset\", u.handler), i.on(u.dom.form, \"submit\", u.handler));\n },\n unbindEvents: function() {\n var u = this;\n i.off(u.dom.el, \"click\", u.handler), i.off(u.dom.el, \"change\", u.handler), i.off(u.dom.el, \"keyup\", u.handler), u.dom.form && (i.off(u.dom.form, \"reset\", u.handler), i.off(u.dom.form, \"submit\", u.handler)), u.handler = null;\n },\n handleClick: function(u) {\n var e = this, t = e.mixer, r = null, l = i.closestParent(u.target, \"[data-filter], [data-toggle]\", !0), o = \"\", n = -1, E = \"\";\n l && ((o = e.mixer.config.selectors.control) && !l.matches(o) || (u.stopPropagation(), t.lastClicked || (t.lastClicked = l), \"function\" == typeof t.config.callbacks.onMixClick && (r = t.config.callbacks.onMixClick.call(t.lastClicked, t.state, u, e), r === !1) || (l.matches(\"[data-filter]\") ? (E = l.getAttribute(\"data-filter\"), e.activeToggles = [], e.activeSelectors = e.activeFilters = [\n E\n ]) : l.matches(\"[data-toggle]\") && (E = l.getAttribute(\"data-toggle\"), e.activeFilters = [], (n = e.activeToggles.indexOf(E)) > -1 ? e.activeToggles.splice(n, 1) : e.activeToggles.push(E), \"and\" === e.logic ? e.activeSelectors = [\n e.activeToggles\n ] : e.activeSelectors = e.activeToggles), e.updateControls(), \"change\" === e.mixer.config.multifilter.parseOn && e.mixer.parseFilterGroups())));\n },\n handleChange: function(u) {\n var e = this, t = u.target;\n switch(u.stopPropagation(), t.type){\n case \"text\":\n case \"search\":\n case \"email\":\n case \"select-one\":\n case \"radio\":\n e.getSingleValue(t);\n break;\n case \"checkbox\":\n case \"select-multiple\":\n e.getMultipleValues(t);\n }\n \"change\" === e.mixer.config.multifilter.parseOn && e.mixer.parseFilterGroups();\n },\n handleKeyup: function(u) {\n var e = this, t = u.target;\n if (!([\n \"text\",\n \"search\",\n \"email\"\n ].indexOf(t.type) < 0)) {\n if (\"change\" !== e.mixer.config.multifilter.parseOn) return void e.mixer.getSingleValue(t);\n clearTimeout(e.keyupTimeout), e.keyupTimeout = setTimeout(function() {\n e.getSingleValue(t), e.mixer.parseFilterGroups();\n }, e.mixer.config.multifilter.keyupThrottleDuration);\n }\n },\n handleFormEvent: function(e) {\n var t = this, i = null, r = null, l = -1;\n if (\"submit\" === e.type && e.preventDefault(), \"reset\" === e.type && (t.activeFilters = t.activeToggles = t.activeSelectors = [], t.updateControls()), t.mixer.multifilterFormEventTracker) i = t.mixer.multifilterFormEventTracker;\n else for(i = t.mixer.multifilterFormEventTracker = new u.MultifilterFormEventTracker, i.form = e.target, l = 0; r = t.mixer.filterGroups[l]; l++)r.dom.form === e.target && i.totalBound++;\n e.target === i.form && (i.totalHandled++, i.totalHandled === i.totalBound && (t.mixer.multifilterFormEventTracker = null, \"submit\" !== e.type && \"change\" !== t.mixer.config.multifilter.parseOn || t.mixer.parseFilterGroups()));\n },\n getSingleValue: function(u) {\n var e = this, i = null, r = \"\", l = \"\", o = \"\", n = -1;\n if (u.type.match(/text|search|email/g)) {\n if (r = u.getAttribute(\"data-search-attribute\"), !r) throw new Error(\"[MixItUp MultiFilter] A valid `data-search-attribute` must be present on text inputs\");\n if (u.value.length < e.mixer.config.multifilter.minSearchLength) return void (e.activeSelectors = e.activeFilters = e.activeToggles = [\n \"\"\n ]);\n for(o = u.value.toLowerCase().trim(), n = 0; i = t[n]; n++)o = o.replace(i[1], i[0]);\n o = o.replace(/\\W+/g, \" \"), l = \"[\" + r + '*=\"' + o + '\"]';\n } else l = u.value;\n \"string\" == typeof u.value && (e.activeSelectors = e.activeToggles = e.activeFilters = l ? [\n l\n ] : []);\n },\n getMultipleValues: function(u) {\n var e = this, t = [], i = \"\", r = null, l = null, o = -1;\n switch(u.type){\n case \"checkbox\":\n i = 'input[type=\"checkbox\"]';\n break;\n case \"select-multiple\":\n i = \"option\";\n }\n for(l = e.dom.el.querySelectorAll(i), o = 0; r = l[o]; o++)(r.checked || r.selected) && r.value && t.push(r.value);\n e.activeFilters = [], e.activeToggles = t, \"and\" === e.logic ? e.activeSelectors = [\n t\n ] : e.activeSelectors = t;\n },\n updateControls: function(u) {\n var e = this, t = null, i = \"\", r = \"\", l = \"\", o = -1;\n for(i = e.mixer.config.selectors.control.trim(), r = [\n \"[data-filter]\" + i,\n \"[data-toggle]\" + i\n ].join(\", \"), u = u || e.dom.el.querySelectorAll(r), o = 0; t = u[o]; o++)l = Boolean(t.getAttribute(\"data-toggle\")) ? \"toggle\" : \"filter\", e.updateControl(t, l);\n },\n updateControl: function(u, e) {\n var t = this, r = u.getAttribute(\"data-\" + e), l = t.activeToggles.concat(t.activeFilters), o = \"\";\n o = i.getClassname(t.mixer.config.classNames, e, t.mixer.config.classNames.modifierActive), l.indexOf(r) > -1 ? i.addClass(u, o) : i.removeClass(u, o);\n },\n updateUi: function() {\n var u = this, e = u.dom.el.querySelectorAll(\"[data-filter], [data-toggle]\"), t = u.dom.el.querySelectorAll('input[type=\"radio\"], input[type=\"checkbox\"], option'), i = u.activeToggles.concat(u.activeFilters), r = !1, l = null, o = -1;\n for(e.length && u.updateControls(e, !0), o = 0; l = t[o]; o++)switch(r = i.indexOf(l.value) > -1, l.tagName.toLowerCase()){\n case \"option\":\n l.selected = r;\n break;\n case \"input\":\n l.checked = r;\n }\n }\n }), u.MixerDom.registerAction(\"afterConstruct\", \"multifilter\", function() {\n this.filterGroups = [];\n }), u.Mixer.registerAction(\"afterConstruct\", \"multifilter\", function() {\n this.filterGroups = [], this.filterGroupsHash = {}, this.multifilterFormEventTracker = null;\n }), u.Mixer.registerAction(\"afterCacheDom\", \"multifilter\", function() {\n var e = this, t = null;\n if (e.config.multifilter.enable) {\n switch(e.config.controls.scope){\n case \"local\":\n t = e.dom.container;\n break;\n case \"global\":\n t = e.dom.document;\n break;\n default:\n throw new Error(u.messages.ERROR_CONFIG_INVALID_CONTROLS_SCOPE);\n }\n e.dom.filterGroups = t.querySelectorAll(\"[data-filter-group]\");\n }\n }), u.Mixer.registerAction(\"beforeInitControls\", \"multifilter\", function() {\n var u = this;\n u.config.multifilter.enable && (u.config.controls.live = !0);\n }), u.Mixer.registerAction(\"afterSanitizeConfig\", \"multifilter\", function() {\n var u = this;\n u.config.multifilter.logicBetweenGroups = u.config.multifilter.logicBetweenGroups.toLowerCase().trim(), u.config.multifilter.logicWithinGroup = u.config.multifilter.logicWithinGroup.toLowerCase().trim();\n }), u.Mixer.registerAction(\"afterAttach\", \"multifilter\", function() {\n var u = this;\n u.dom.filterGroups.length && u.indexFilterGroups();\n }), u.Mixer.registerAction(\"afterUpdateControls\", \"multifilter\", function() {\n var u = this, e = null, t = -1;\n for(t = 0; e = u.filterGroups[t]; t++)e.updateControls();\n }), u.Mixer.registerAction(\"beforeDestroy\", \"multifilter\", function() {\n var u = this, e = null, t = -1;\n for(t = 0; e = u.filterGroups[t]; t++)e.unbindEvents();\n }), u.Mixer.extend({\n indexFilterGroups: function() {\n var e = this, t = null, i = null, r = -1;\n for(r = 0; i = e.dom.filterGroups[r]; r++)if (t = new u.FilterGroup, t.init(i, e), e.filterGroups.push(t), t.name) {\n if (\"undefined\" != typeof e.filterGroupsHash[t.name]) throw new Error('[MixItUp MultiFilter] A filter group with name \"' + t.name + '\" already exists');\n e.filterGroupsHash[t.name] = t;\n }\n },\n parseParseFilterGroupsArgs: function(e) {\n var t = this, r = new u.UserInstruction, l = null, o = -1;\n for(r.animate = t.config.animation.enable, r.command = new u.CommandFilter, o = 0; o < e.length; o++)l = e[o], \"boolean\" == typeof l ? r.animate = l : \"function\" == typeof l && (r.callback = l);\n return i.freeze(r), r;\n },\n getFilterGroupPaths: function() {\n var u = this, e = null, t = null, r = null, l = [], o = [], n = [], E = -1;\n for(E = 0; E < u.filterGroups.length; E++)(r = u.filterGroups[E].activeSelectors).length && (l.push(r), n.push(0));\n return e = function() {\n var u = null, e = [], t = -1;\n for(t = 0; t < l.length; t++)u = l[t][n[t]], Array.isArray(u) && (u = u.join(\"\")), e.push(u);\n e = i.clean(e), o.push(e);\n }, t = function(u) {\n u = u || 0;\n for(var i = l[u]; n[u] < i.length;)u < l.length - 1 ? t(u + 1) : e(), n[u]++;\n n[u] = 0;\n }, l.length ? (t(), o) : \"\";\n },\n buildSelectorFromPaths: function(u) {\n var e = this, t = null, i = [], r = \"\", l = \"\", o = -1;\n if (!u.length) return \"\";\n if (\"or\" === e.config.multifilter.logicBetweenGroups && (l = \", \"), u.length > 1) {\n for(o = 0; o < u.length; o++)t = u[o], r = t.join(l), i.indexOf(r) < 0 && i.push(r);\n return i.join(\", \");\n }\n return u[0].join(l);\n },\n parseFilterGroups: function() {\n var u = this, e = u.parseFilterArgs(arguments), t = u.getFilterGroupPaths(), i = u.buildSelectorFromPaths(t), r = null, l = {};\n return \"\" === i && (i = u.config.controls.toggleDefault), e.command.selector = i, l.filter = e.command, \"function\" == typeof (r = u.config.callbacks.onParseFilterGroups) && (l = r(l)), u.multimix(l, e.animate, e.callback);\n },\n setFilterGroupSelectors: function(u, e) {\n var t = this, i = null;\n if (e = Array.isArray(e) ? e : [\n e\n ], \"undefined\" == typeof (i = t.filterGroupsHash[u])) throw new Error('[MixItUp MultiFilter] No filter group could be found with the name \"' + u + '\"');\n i.activeToggles = e.slice(), \"and\" === i.logic ? i.activeSelectors = [\n i.activeToggles\n ] : i.activeSelectors = i.activeToggles, i.updateUi(i.activeToggles);\n },\n getFilterGroupSelectors: function(u) {\n var e = this, t = null;\n if (\"undefined\" == typeof (t = e.filterGroupsHash[u])) throw new Error('[MixItUp MultiFilter] No filter group could be found with the name \"' + u + '\"');\n return t.activeSelectors.slice();\n }\n }), u.Facade.registerAction(\"afterConstruct\", \"multifilter\", function(u) {\n this.parseFilterGroups = u.parseFilterGroups.bind(u), this.setFilterGroupSelectors = u.setFilterGroupSelectors.bind(u), this.getFilterGroupSelectors = u.getFilterGroupSelectors.bind(u);\n });\n };\n e.TYPE = \"mixitup-extension\", e.NAME = \"mixitup-multifilter\", e.EXTENSION_VERSION = \"3.3.6\", e.REQUIRE_CORE_VERSION = \"^3.1.2\";\n module.exports = e;\n}(window);\n\n});\n\n})();\n//# sourceMappingURL=newsArchiveMixItUp.437390c0.js.map\n","/**!\n * MixItUp v3.3.1\n * A high-performance, dependency-free library for animated filtering, sorting and more\n * Build 94e0fbf6-cd0b-4987-b3c0-14b59b67b8a0\n *\n * @copyright Copyright 2014-2018 KunkaLabs Limited.\n * @author KunkaLabs Limited.\n * @link https://www.kunkalabs.com/mixitup/\n *\n * @license Commercial use requires a commercial license.\n * https://www.kunkalabs.com/mixitup/licenses/\n *\n * Non-commercial use permitted under same terms as CC BY-NC 3.0 license.\n * http://creativecommons.org/licenses/by-nc/3.0/\n */\n\n(function(window) {\n 'use strict';\n\n var mixitup = null,\n h = null;\n\n (function() {\n var VENDORS = ['webkit', 'moz', 'o', 'ms'],\n canary = window.document.createElement('div'),\n i = -1;\n\n // window.requestAnimationFrame\n\n for (i = 0; i < VENDORS.length && !window.requestAnimationFrame; i++) {\n window.requestAnimationFrame = window[VENDORS[i] + 'RequestAnimationFrame'];\n }\n\n // Element.nextElementSibling\n\n if (typeof canary.nextElementSibling === 'undefined') {\n Object.defineProperty(window.Element.prototype, 'nextElementSibling', {\n get: function() {\n var el = this.nextSibling;\n\n while (el) {\n if (el.nodeType === 1) {\n return el;\n }\n\n el = el.nextSibling;\n }\n\n return null;\n }\n });\n }\n\n // Element.matches\n\n (function(ElementPrototype) {\n ElementPrototype.matches =\n ElementPrototype.matches ||\n ElementPrototype.machesSelector ||\n ElementPrototype.mozMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n ElementPrototype.oMatchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n function (selector) {\n return Array.prototype.indexOf.call(this.parentElement.querySelectorAll(selector), this) > -1;\n };\n })(window.Element.prototype);\n\n // Object.keys\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\n\n if (!Object.keys) {\n Object.keys = (function() {\n var hasOwnProperty = Object.prototype.hasOwnProperty,\n hasDontEnumBug = false,\n dontEnums = [],\n dontEnumsLength = -1;\n\n hasDontEnumBug = !({\n toString: null\n })\n .propertyIsEnumerable('toString');\n\n dontEnums = [\n 'toString',\n 'toLocaleString',\n 'valueOf',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'constructor'\n ];\n\n dontEnumsLength = dontEnums.length;\n\n return function(obj) {\n var result = [],\n prop = '',\n i = -1;\n\n if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n throw new TypeError('Object.keys called on non-object');\n }\n\n for (prop in obj) {\n if (hasOwnProperty.call(obj, prop)) {\n result.push(prop);\n }\n }\n\n if (hasDontEnumBug) {\n for (i = 0; i < dontEnumsLength; i++) {\n if (hasOwnProperty.call(obj, dontEnums[i])) {\n result.push(dontEnums[i]);\n }\n }\n }\n\n return result;\n };\n }());\n }\n\n // Array.isArray\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n\n if (!Array.isArray) {\n Array.isArray = function(arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n };\n }\n\n // Object.create\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create\n\n if (typeof Object.create !== 'function') {\n Object.create = (function(undefined) {\n var Temp = function() {};\n\n return function (prototype, propertiesObject) {\n if (prototype !== Object(prototype) && prototype !== null) {\n throw TypeError('Argument must be an object, or null');\n }\n\n Temp.prototype = prototype || {};\n\n var result = new Temp();\n\n Temp.prototype = null;\n\n if (propertiesObject !== undefined) {\n Object.defineProperties(result, propertiesObject);\n }\n\n if (prototype === null) {\n /* jshint ignore:start */\n result.__proto__ = null;\n /* jshint ignore:end */\n }\n\n return result;\n };\n })();\n }\n\n // String.prototyoe.trim\n\n if (!String.prototype.trim) {\n String.prototype.trim = function() {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n };\n }\n\n // Array.prototype.indexOf\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\n\n if (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function(searchElement) {\n var n, k, t, len;\n\n if (this === null) {\n throw new TypeError();\n }\n\n t = Object(this);\n\n len = t.length >>> 0;\n\n if (len === 0) {\n return -1;\n }\n\n n = 0;\n\n if (arguments.length > 1) {\n n = Number(arguments[1]);\n\n if (n !== n) {\n n = 0;\n } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n }\n\n if (n >= len) {\n return -1;\n }\n\n for (k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++) {\n if (k in t && t[k] === searchElement) {\n return k;\n }\n }\n\n return -1;\n };\n }\n\n // Function.prototype.bind\n // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind\n\n if (!Function.prototype.bind) {\n Function.prototype.bind = function(oThis) {\n var aArgs, self, FNOP, fBound;\n\n if (typeof this !== 'function') {\n throw new TypeError();\n }\n\n aArgs = Array.prototype.slice.call(arguments, 1);\n\n self = this;\n\n FNOP = function() {};\n\n fBound = function() {\n return self.apply(this instanceof FNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));\n };\n\n if (this.prototype) {\n FNOP.prototype = this.prototype;\n }\n\n fBound.prototype = new FNOP();\n\n return fBound;\n };\n }\n\n // Element.prototype.dispatchEvent\n\n if (!window.Element.prototype.dispatchEvent) {\n window.Element.prototype.dispatchEvent = function(event) {\n try {\n return this.fireEvent('on' + event.type, event);\n } catch (err) {}\n };\n }\n })();\n\n /**\n * The `mixitup()` \"factory\" function creates and returns individual instances\n * of MixItUp, known as \"mixers\", on which API methods can be called.\n *\n * When loading MixItUp via a script tag, the factory function is accessed\n * via the global variable `mixitup`. When using a module loading\n * system (e.g. ES2015, CommonJS, RequireJS), the factory function is\n * exported into your module when you require the MixItUp library.\n *\n * @example\n * mixitup(container [,config] [,foreignDoc])\n *\n * @example Example 1: Creating a mixer instance with an element reference\n * var containerEl = document.querySelector('.container');\n *\n * var mixer = mixitup(containerEl);\n *\n * @example Example 2: Creating a mixer instance with a selector string\n * var mixer = mixitup('.container');\n *\n * @example Example 3: Passing a configuration object\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade scale(0.5)'\n * }\n * });\n *\n * @example Example 4: Passing an iframe reference\n * var mixer = mixitup(containerEl, config, foreignDocument);\n *\n * @global\n * @namespace\n * @public\n * @kind function\n * @since 3.0.0\n * @param {(Element|string)} container\n * A DOM element or selector string representing the container(s) on which to instantiate MixItUp.\n * @param {object} [config]\n * An optional \"configuration object\" used to customize the behavior of the MixItUp instance.\n * @param {object} [foreignDoc]\n * An optional reference to a `document`, which can be used to control a MixItUp instance in an iframe.\n * @return {mixitup.Mixer}\n * A \"mixer\" object holding the MixItUp instance.\n */\n\n mixitup = function(container, config, foreignDoc) {\n var el = null,\n returnCollection = false,\n instance = null,\n facade = null,\n doc = null,\n output = null,\n instances = [],\n id = '',\n elements = [],\n i = -1;\n\n doc = foreignDoc || window.document;\n\n if (returnCollection = arguments[3]) {\n // A non-documented 4th paramater enabling control of multiple instances\n\n returnCollection = typeof returnCollection === 'boolean';\n }\n\n if (typeof container === 'string') {\n elements = doc.querySelectorAll(container);\n } else if (container && typeof container === 'object' && h.isElement(container, doc)) {\n elements = [container];\n } else if (container && typeof container === 'object' && container.length) {\n // Although not documented, the container may also be an array-like list of\n // elements such as a NodeList or jQuery collection, is returnCollection is true\n\n elements = container;\n } else {\n throw new Error(mixitup.messages.errorFactoryInvalidContainer());\n }\n\n if (elements.length < 1) {\n throw new Error(mixitup.messages.errorFactoryContainerNotFound());\n }\n\n for (i = 0; el = elements[i]; i++) {\n if (i > 0 && !returnCollection) break;\n\n if (!el.id) {\n id = 'MixItUp' + h.randomHex();\n\n el.id = id;\n } else {\n id = el.id;\n }\n\n if (mixitup.instances[id] instanceof mixitup.Mixer) {\n instance = mixitup.instances[id];\n\n if (!config || (config && config.debug && config.debug.showWarnings !== false)) {\n console.warn(mixitup.messages.warningFactoryPreexistingInstance());\n }\n } else {\n instance = new mixitup.Mixer();\n\n instance.attach(el, doc, id, config);\n\n mixitup.instances[id] = instance;\n }\n\n facade = new mixitup.Facade(instance);\n\n if (config && config.debug && config.debug.enable) {\n instances.push(instance);\n } else {\n instances.push(facade);\n }\n }\n\n if (returnCollection) {\n output = new mixitup.Collection(instances);\n } else {\n // Return the first instance regardless\n\n output = instances[0];\n }\n\n return output;\n };\n\n /**\n * The `.use()` static method is used to extend the functionality of mixitup with compatible\n * extensions and libraries in an environment with modular scoping e.g. ES2015, CommonJS, or RequireJS.\n *\n * You need only call the `.use()` function once per project, per extension, as module loaders\n * will cache a single reference to MixItUp inclusive of all changes made.\n *\n * @example\n * mixitup.use(extension)\n *\n * @example Example 1: Extending MixItUp with the Pagination Extension\n *\n * import mixitup from 'mixitup';\n * import mixitupPagination from 'mixitup-pagination';\n *\n * mixitup.use(mixitupPagination);\n *\n * // All mixers created by the factory function in all modules will now\n * // have pagination functionality\n *\n * var mixer = mixitup('.container');\n *\n * @public\n * @name use\n * @memberof mixitup\n * @kind function\n * @static\n * @since 3.0.0\n * @param {*} extension A reference to the extension or library to be used.\n * @return {void}\n */\n\n mixitup.use = function(extension) {\n mixitup.Base.prototype.callActions.call(mixitup, 'beforeUse', arguments);\n\n // Call the extension's factory function, passing\n // the mixitup factory as a paramater\n\n if (typeof extension === 'function' && extension.TYPE === 'mixitup-extension') {\n // Mixitup extension\n\n if (typeof mixitup.extensions[extension.NAME] === 'undefined') {\n extension(mixitup);\n\n mixitup.extensions[extension.NAME] = extension;\n }\n } else if (extension.fn && extension.fn.jquery) {\n // jQuery\n\n mixitup.libraries.$ = extension;\n }\n\n mixitup.Base.prototype.callActions.call(mixitup, 'afterUse', arguments);\n };\n\n mixitup.instances = {};\n mixitup.extensions = {};\n mixitup.libraries = {};\n\n /**\n * @private\n */\n\n h = {\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {boolean}\n */\n\n hasClass: function(el, cls) {\n return !!el.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {void}\n */\n\n addClass: function(el, cls) {\n if (!this.hasClass(el, cls)) el.className += el.className ? ' ' + cls : cls;\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} cls\n * @return {void}\n */\n\n removeClass: function(el, cls) {\n if (this.hasClass(el, cls)) {\n var reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n\n el.className = el.className.replace(reg, ' ').trim();\n }\n },\n\n /**\n * Merges the properties of the source object onto the\n * target object. Alters the target object.\n *\n * @private\n * @param {object} destination\n * @param {object} source\n * @param {boolean} [deep=false]\n * @param {boolean} [handleErrors=false]\n * @return {void}\n */\n\n extend: function(destination, source, deep, handleErrors) {\n var sourceKeys = [],\n key = '',\n i = -1;\n\n deep = deep || false;\n handleErrors = handleErrors || false;\n\n try {\n if (Array.isArray(source)) {\n for (i = 0; i < source.length; i++) {\n sourceKeys.push(i);\n }\n } else if (source) {\n sourceKeys = Object.keys(source);\n }\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n\n if (!deep || typeof source[key] !== 'object' || this.isElement(source[key])) {\n // All non-object properties, or all properties if shallow extend\n\n destination[key] = source[key];\n } else if (Array.isArray(source[key])) {\n // Arrays\n\n if (!destination[key]) {\n destination[key] = [];\n }\n\n this.extend(destination[key], source[key], deep, handleErrors);\n } else {\n // Objects\n\n if (!destination[key]) {\n destination[key] = {};\n }\n\n this.extend(destination[key], source[key], deep, handleErrors);\n }\n }\n } catch(err) {\n if (handleErrors) {\n this.handleExtendError(err, destination);\n } else {\n throw err;\n }\n }\n\n return destination;\n },\n\n /**\n * @private\n * @param {Error} err\n * @param {object} destination\n * @return {void}\n */\n\n handleExtendError: function(err, destination) {\n var re = /property \"?(\\w*)\"?[,:] object/i,\n matches = null,\n erroneous = '',\n message = '',\n suggestion = '',\n probableMatch = '',\n key = '',\n mostMatchingChars = -1,\n i = -1;\n\n if (err instanceof TypeError && (matches = re.exec(err.message))) {\n erroneous = matches[1];\n\n for (key in destination) {\n i = 0;\n\n while (i < erroneous.length && erroneous.charAt(i) === key.charAt(i)) {\n i++;\n }\n\n if (i > mostMatchingChars) {\n mostMatchingChars = i;\n probableMatch = key;\n }\n }\n\n if (mostMatchingChars > 1) {\n suggestion = mixitup.messages.errorConfigInvalidPropertySuggestion({\n probableMatch: probableMatch\n });\n }\n\n message = mixitup.messages.errorConfigInvalidProperty({\n erroneous: erroneous,\n suggestion: suggestion\n });\n\n throw new TypeError(message);\n }\n\n throw err;\n },\n\n /**\n * @private\n * @param {string} str\n * @return {function}\n */\n\n template: function(str) {\n var re = /\\${([\\w]*)}/g,\n dynamics = {},\n matches = null;\n\n while ((matches = re.exec(str))) {\n dynamics[matches[1]] = new RegExp('\\\\${' + matches[1] + '}', 'g');\n }\n\n return function(data) {\n var key = '',\n output = str;\n\n data = data || {};\n\n for (key in dynamics) {\n output = output.replace(dynamics[key], typeof data[key] !== 'undefined' ? data[key] : '');\n }\n\n return output;\n };\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {function} fn\n * @param {boolean} useCapture\n * @return {void}\n */\n\n on: function(el, type, fn, useCapture) {\n if (!el) return;\n\n if (el.addEventListener) {\n el.addEventListener(type, fn, useCapture);\n } else if (el.attachEvent) {\n el['e' + type + fn] = fn;\n\n el[type + fn] = function() {\n el['e' + type + fn](window.event);\n };\n\n el.attachEvent('on' + type, el[type + fn]);\n }\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {function} fn\n * @return {void}\n */\n\n off: function(el, type, fn) {\n if (!el) return;\n\n if (el.removeEventListener) {\n el.removeEventListener(type, fn, false);\n } else if (el.detachEvent) {\n el.detachEvent('on' + type, el[type + fn]);\n el[type + fn] = null;\n }\n },\n\n /**\n * @private\n * @param {string} eventType\n * @param {object} detail\n * @param {Document} [doc]\n * @return {CustomEvent}\n */\n\n getCustomEvent: function(eventType, detail, doc) {\n var event = null;\n\n doc = doc || window.document;\n\n if (typeof window.CustomEvent === 'function') {\n event = new window.CustomEvent(eventType, {\n detail: detail,\n bubbles: true,\n cancelable: true\n });\n } else if (typeof doc.createEvent === 'function') {\n event = doc.createEvent('CustomEvent');\n event.initCustomEvent(eventType, true, true, detail);\n } else {\n event = doc.createEventObject(),\n event.type = eventType;\n\n event.returnValue = false;\n event.cancelBubble = false;\n event.detail = detail;\n }\n\n return event;\n },\n\n /**\n * @private\n * @param {Event} e\n * @return {Event}\n */\n\n getOriginalEvent: function(e) {\n if (e.touches && e.touches.length) {\n return e.touches[0];\n } else if (e.changedTouches && e.changedTouches.length) {\n return e.changedTouches[0];\n } else {\n return e;\n }\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} selector\n * @return {Number}\n */\n\n index: function(el, selector) {\n var i = 0;\n\n while ((el = el.previousElementSibling) !== null) {\n if (!selector || el.matches(selector)) {\n ++i;\n }\n }\n\n return i;\n },\n\n /**\n * Converts a dash or snake-case string to camel case.\n *\n * @private\n * @param {string} str\n * @param {boolean} [isPascal]\n * @return {string}\n */\n\n camelCase: function(str) {\n return str.toLowerCase().replace(/([_-][a-z])/g, function($1) {\n return $1.toUpperCase().replace(/[_-]/, '');\n });\n },\n\n /**\n * Converts a dash or snake-case string to pascal case.\n *\n * @private\n * @param {string} str\n * @param {boolean} [isPascal]\n * @return {string}\n */\n\n pascalCase: function(str) {\n return (str = this.camelCase(str)).charAt(0).toUpperCase() + str.slice(1);\n },\n\n /**\n * Converts a camel or pascal-case string to dash case.\n *\n * @private\n * @param {string} str\n * @return {string}\n */\n\n dashCase: function(str) {\n return str.replace(/([A-Z])/g, '-$1').replace(/^-/, '').toLowerCase();\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {HTMLHtmlElement} [doc]\n * @return {boolean}\n */\n\n isElement: function(el, doc) {\n doc = doc || window.document;\n\n if (\n window.HTMLElement &&\n el instanceof window.HTMLElement\n ) {\n return true;\n } else if (\n doc.defaultView &&\n doc.defaultView.HTMLElement &&\n el instanceof doc.defaultView.HTMLElement\n ) {\n return true;\n } else {\n return (\n el !== null &&\n el.nodeType === 1 &&\n typeof el.nodeName === 'string'\n );\n }\n },\n\n /**\n * @private\n * @param {string} htmlString\n * @param {HTMLHtmlElement} [doc]\n * @return {DocumentFragment}\n */\n\n createElement: function(htmlString, doc) {\n var frag = null,\n temp = null;\n\n doc = doc || window.document;\n\n frag = doc.createDocumentFragment();\n temp = doc.createElement('div');\n\n temp.innerHTML = htmlString.trim();\n\n while (temp.firstChild) {\n frag.appendChild(temp.firstChild);\n }\n\n return frag;\n },\n\n /**\n * @private\n * @param {Node} node\n * @return {void}\n */\n\n removeWhitespace: function(node) {\n var deleting;\n\n while (node && node.nodeName === '#text') {\n deleting = node;\n\n node = node.previousSibling;\n\n deleting.parentElement && deleting.parentElement.removeChild(deleting);\n }\n },\n\n /**\n * @private\n * @param {Array<*>} a\n * @param {Array<*>} b\n * @return {boolean}\n */\n\n isEqualArray: function(a, b) {\n var i = a.length;\n\n if (i !== b.length) return false;\n\n while (i--) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n },\n\n /**\n * @private\n * @param {object} a\n * @param {object} b\n * @return {boolean}\n */\n\n deepEquals: function(a, b) {\n var key;\n\n if (typeof a === 'object' && a && typeof b === 'object' && b) {\n if (Object.keys(a).length !== Object.keys(b).length) return false;\n\n for (key in a) {\n if (!b.hasOwnProperty(key) || !this.deepEquals(a[key], b[key])) return false;\n }\n } else if (a !== b) {\n return false;\n }\n\n return true;\n },\n\n /**\n * @private\n * @param {Array<*>} oldArray\n * @return {Array<*>}\n */\n\n arrayShuffle: function(oldArray) {\n var newArray = oldArray.slice(),\n len = newArray.length,\n i = len,\n p = -1,\n t = [];\n\n while (i--) {\n p = ~~(Math.random() * len);\n t = newArray[i];\n\n newArray[i] = newArray[p];\n newArray[p] = t;\n }\n\n return newArray;\n },\n\n /**\n * @private\n * @param {object} list\n */\n\n arrayFromList: function(list) {\n var output, i;\n\n try {\n return Array.prototype.slice.call(list);\n } catch(err) {\n output = [];\n\n for (i = 0; i < list.length; i++) {\n output.push(list[i]);\n }\n\n return output;\n }\n },\n\n /**\n * @private\n * @param {function} func\n * @param {Number} wait\n * @param {boolean} immediate\n * @return {function}\n */\n\n debounce: function(func, wait, immediate) {\n var timeout;\n\n return function() {\n var self = this,\n args = arguments,\n callNow = immediate && !timeout,\n later = null;\n\n later = function() {\n timeout = null;\n\n if (!immediate) {\n func.apply(self, args);\n }\n };\n\n clearTimeout(timeout);\n\n timeout = setTimeout(later, wait);\n\n if (callNow) func.apply(self, args);\n };\n },\n\n /**\n * @private\n * @param {HTMLElement} element\n * @return {object}\n */\n\n position: function(element) {\n var xPosition = 0,\n yPosition = 0,\n offsetParent = element;\n\n while (element) {\n xPosition -= element.scrollLeft;\n yPosition -= element.scrollTop;\n\n if (element === offsetParent) {\n xPosition += element.offsetLeft;\n yPosition += element.offsetTop;\n\n offsetParent = element.offsetParent;\n }\n\n element = element.parentElement;\n }\n\n return {\n x: xPosition,\n y: yPosition\n };\n },\n\n /**\n * @private\n * @param {object} node1\n * @param {object} node2\n * @return {Number}\n */\n\n getHypotenuse: function(node1, node2) {\n var distanceX = node1.x - node2.x,\n distanceY = node1.y - node2.y;\n\n distanceX = distanceX < 0 ? distanceX * -1 : distanceX,\n distanceY = distanceY < 0 ? distanceY * -1 : distanceY;\n\n return Math.sqrt(Math.pow(distanceX, 2) + Math.pow(distanceY, 2));\n },\n\n /**\n * Calcuates the area of intersection between two rectangles and expresses it as\n * a ratio in comparison to the area of the first rectangle.\n *\n * @private\n * @param {Rect} box1\n * @param {Rect} box2\n * @return {number}\n */\n\n getIntersectionRatio: function(box1, box2) {\n var controlArea = box1.width * box1.height,\n intersectionX = -1,\n intersectionY = -1,\n intersectionArea = -1,\n ratio = -1;\n\n intersectionX =\n Math.max(0, Math.min(box1.left + box1.width, box2.left + box2.width) - Math.max(box1.left, box2.left));\n\n intersectionY =\n Math.max(0, Math.min(box1.top + box1.height, box2.top + box2.height) - Math.max(box1.top, box2.top));\n\n intersectionArea = intersectionY * intersectionX;\n\n ratio = intersectionArea / controlArea;\n\n return ratio;\n },\n\n /**\n * @private\n * @param {object} el\n * @param {string} selector\n * @param {boolean} [includeSelf]\n * @param {HTMLHtmlElement} [doc]\n * @return {Element|null}\n */\n\n closestParent: function(el, selector, includeSelf, doc) {\n var parent = el.parentNode;\n\n doc = doc || window.document;\n\n if (includeSelf && el.matches(selector)) {\n return el;\n }\n\n while (parent && parent != doc.body) {\n if (parent.matches && parent.matches(selector)) {\n return parent;\n } else if (parent.parentNode) {\n parent = parent.parentNode;\n } else {\n return null;\n }\n }\n\n return null;\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} selector\n * @param {HTMLHtmlElement} [doc]\n * @return {NodeList}\n */\n\n children: function(el, selector, doc) {\n var children = [],\n tempId = '';\n\n doc = doc || window.doc;\n\n if (el) {\n if (!el.id) {\n tempId = 'Temp' + this.randomHexKey();\n\n el.id = tempId;\n }\n\n children = doc.querySelectorAll('#' + el.id + ' > ' + selector);\n\n if (tempId) {\n el.removeAttribute('id');\n }\n }\n\n return children;\n },\n\n /**\n * Creates a clone of a provided array, with any empty strings removed.\n *\n * @private\n * @param {Array<*>} originalArray\n * @return {Array<*>}\n */\n\n clean: function(originalArray) {\n var cleanArray = [],\n i = -1;\n\n for (i = 0; i < originalArray.length; i++) {\n if (originalArray[i] !== '') {\n cleanArray.push(originalArray[i]);\n }\n }\n\n return cleanArray;\n },\n\n /**\n * Abstracts an ES6 promise into a q-like deferred interface for storage and deferred resolution.\n *\n * @private\n * @param {object} libraries\n * @return {h.Deferred}\n */\n\n defer: function(libraries) {\n var deferred = null,\n promiseWrapper = null,\n $ = null;\n\n promiseWrapper = new this.Deferred();\n\n if (mixitup.features.has.promises) {\n // ES6 native promise or polyfill\n\n promiseWrapper.promise = new Promise(function(resolve, reject) {\n promiseWrapper.resolve = resolve;\n promiseWrapper.reject = reject;\n });\n } else if (($ = (window.jQuery || libraries.$)) && typeof $.Deferred === 'function') {\n // jQuery\n\n deferred = $.Deferred();\n\n promiseWrapper.promise = deferred.promise();\n promiseWrapper.resolve = deferred.resolve;\n promiseWrapper.reject = deferred.reject;\n } else if (window.console) {\n // No implementation\n\n console.warn(mixitup.messages.warningNoPromiseImplementation());\n }\n\n return promiseWrapper;\n },\n\n /**\n * @private\n * @param {Array} tasks\n * @param {object} libraries\n * @return {Promise}\n */\n\n all: function(tasks, libraries) {\n var $ = null;\n\n if (mixitup.features.has.promises) {\n return Promise.all(tasks);\n } else if (($ = (window.jQuery || libraries.$)) && typeof $.when === 'function') {\n return $.when.apply($, tasks)\n .done(function() {\n // jQuery when returns spread arguments rather than an array or resolutions\n\n return arguments;\n });\n }\n\n // No implementation\n\n if (window.console) {\n console.warn(mixitup.messages.warningNoPromiseImplementation());\n }\n\n return [];\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} property\n * @param {Array} vendors\n * @return {string}\n */\n\n getPrefix: function(el, property, vendors) {\n var i = -1,\n prefix = '';\n\n if (h.dashCase(property) in el.style) return '';\n\n for (i = 0; prefix = vendors[i]; i++) {\n if (prefix + property in el.style) {\n return prefix.toLowerCase();\n }\n }\n\n return 'unsupported';\n },\n\n /**\n * @private\n * @return {string}\n */\n\n randomHex: function() {\n return ('00000' + (Math.random() * 16777216 << 0).toString(16)).substr(-6).toUpperCase();\n },\n\n /**\n * @private\n * @param {HTMLDocument} [doc]\n * @return {object}\n */\n\n getDocumentState: function(doc) {\n doc = typeof doc.body === 'object' ? doc : window.document;\n\n return {\n scrollTop: window.pageYOffset,\n scrollLeft: window.pageXOffset,\n docHeight: doc.documentElement.scrollHeight,\n docWidth: doc.documentElement.scrollWidth,\n viewportHeight: doc.documentElement.clientHeight,\n viewportWidth: doc.documentElement.clientWidth\n };\n },\n\n /**\n * @private\n * @param {object} obj\n * @param {function} fn\n * @return {function}\n */\n\n bind: function(obj, fn) {\n return function() {\n return fn.apply(obj, arguments);\n };\n },\n\n /**\n * @private\n * @param {HTMLElement} el\n * @return {boolean}\n */\n\n isVisible: function(el) {\n var styles = null;\n\n if (el.offsetParent) return true;\n\n styles = window.getComputedStyle(el);\n\n if (\n styles.position === 'fixed' &&\n styles.visibility !== 'hidden' &&\n styles.opacity !== '0'\n ) {\n // Fixed elements report no offsetParent,\n // but may still be invisible\n\n return true;\n }\n\n return false;\n },\n\n /**\n * @private\n * @param {object} obj\n */\n\n seal: function(obj) {\n if (typeof Object.seal === 'function') {\n Object.seal(obj);\n }\n },\n\n /**\n * @private\n * @param {object} obj\n */\n\n freeze: function(obj) {\n if (typeof Object.freeze === 'function') {\n Object.freeze(obj);\n }\n },\n\n /**\n * @private\n * @param {string} control\n * @param {string} specimen\n * @return {boolean}\n */\n\n compareVersions: function(control, specimen) {\n var controlParts = control.split('.'),\n specimenParts = specimen.split('.'),\n controlPart = -1,\n specimenPart = -1,\n i = -1;\n\n for (i = 0; i < controlParts.length; i++) {\n controlPart = parseInt(controlParts[i].replace(/[^\\d.]/g, ''));\n specimenPart = parseInt(specimenParts[i].replace(/[^\\d.]/g, '') || 0);\n\n if (specimenPart < controlPart) {\n return false;\n } else if (specimenPart > controlPart) {\n return true;\n }\n }\n\n return true;\n },\n\n /**\n * @private\n * @constructor\n */\n\n Deferred: function() {\n this.promise = null;\n this.resolve = null;\n this.reject = null;\n this.id = h.randomHex();\n },\n\n /**\n * @private\n * @param {object} obj\n * @return {boolean}\n */\n\n isEmptyObject: function(obj) {\n var key = '';\n\n if (typeof Object.keys === 'function') {\n return Object.keys(obj).length === 0;\n }\n\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * @param {mixitup.Config.ClassNames} classNames\n * @param {string} elementName\n * @param {string} [modifier]\n * @return {string}\n */\n\n getClassname: function(classNames, elementName, modifier) {\n var classname = '';\n\n classname += classNames.block;\n\n if (classname.length) {\n classname += classNames.delineatorElement;\n }\n\n classname += classNames['element' + this.pascalCase(elementName)];\n\n if (!modifier) return classname;\n\n if (classname.length) {\n classname += classNames.delineatorModifier;\n }\n\n classname += modifier;\n\n return classname;\n },\n\n /**\n * Returns the value of a property on a given object via its string key.\n *\n * @param {object} obj\n * @param {string} stringKey\n * @return {*} value\n */\n\n getProperty: function(obj, stringKey) {\n var parts = stringKey.split('.'),\n returnCurrent = null,\n current = '',\n i = 0;\n\n if (!stringKey) {\n return obj;\n }\n\n returnCurrent = function(obj) {\n if (!obj) {\n return null;\n } else {\n return obj[current];\n }\n };\n\n while (i < parts.length) {\n current = parts[i];\n\n obj = returnCurrent(obj);\n\n i++;\n }\n\n if (typeof obj !== 'undefined') {\n return obj;\n } else {\n return null;\n }\n }\n };\n\n mixitup.h = h;\n\n /**\n * The Base class adds instance methods to all other extensible MixItUp classes,\n * enabling the calling of any registered hooks.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Base = function() {};\n\n mixitup.Base.prototype = {\n constructor: mixitup.Base,\n\n /**\n * Calls any registered hooks for the provided action.\n *\n * @memberof mixitup.Base\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} actionName\n * @param {Array<*>} args\n * @return {void}\n */\n\n callActions: function(actionName, args) {\n var self = this,\n hooks = self.constructor.actions[actionName],\n extensionName = '';\n\n if (!hooks || h.isEmptyObject(hooks)) return;\n\n for (extensionName in hooks) {\n hooks[extensionName].apply(self, args);\n }\n },\n\n /**\n * Calls any registered hooks for the provided filter.\n *\n * @memberof mixitup.Base\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} filterName\n * @param {*} input\n * @param {Array<*>} args\n * @return {*}\n */\n\n callFilters: function(filterName, input, args) {\n var self = this,\n hooks = self.constructor.filters[filterName],\n output = input,\n extensionName = '';\n\n if (!hooks || h.isEmptyObject(hooks)) return output;\n\n args = args || [];\n\n for (extensionName in hooks) {\n args = h.arrayFromList(args);\n\n args.unshift(output);\n\n output = hooks[extensionName].apply(self, args);\n }\n\n return output;\n }\n };\n\n /**\n * The BaseStatic class holds a set of static methods which are then added to all other\n * extensible MixItUp classes as a means of integrating extensions via the addition of new\n * methods and/or actions and hooks.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.BaseStatic = function() {\n this.actions = {};\n this.filters = {};\n\n /**\n * Performs a shallow extend on the class's prototype, adding one or more new members to\n * the class in a single operation.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {object} extension\n * @return {void}\n */\n\n this.extend = function(extension) {\n h.extend(this.prototype, extension);\n };\n\n /**\n * Registers a function to be called on the action hook of the provided name.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {string} hookName\n * @param {string} extensionName\n * @param {function} func\n * @return {void}\n */\n\n this.registerAction = function(hookName, extensionName, func) {\n (this.actions[hookName] = this.actions[hookName] || {})[extensionName] = func;\n };\n\n /**\n * Registers a function to be called on the filter of the provided name.\n *\n * @memberof mixitup.BaseStatic\n * @public\n * @static\n * @since 2.1.0\n * @param {string} hookName\n * @param {string} extensionName\n * @param {function} func\n * @return {void}\n */\n\n this.registerFilter = function(hookName, extensionName, func) {\n (this.filters[hookName] = this.filters[hookName] || {})[extensionName] = func;\n };\n };\n\n /**\n * The `mixitup.Features` class performs all feature and CSS prefix detection\n * neccessary for MixItUp to function correctly, as well as storing various\n * string and array constants. All feature decection is on evaluation of the\n * library and stored in a singleton instance for use by other internal classes.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Features = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.boxSizingPrefix = '';\n this.transformPrefix = '';\n this.transitionPrefix = '';\n\n this.boxSizingPrefix = '';\n this.transformProp = '';\n this.transformRule = '';\n this.transitionProp = '';\n this.perspectiveProp = '';\n this.perspectiveOriginProp = '';\n\n this.has = new mixitup.Has();\n\n this.canary = null;\n\n this.BOX_SIZING_PROP = 'boxSizing';\n this.TRANSITION_PROP = 'transition';\n this.TRANSFORM_PROP = 'transform';\n this.PERSPECTIVE_PROP = 'perspective';\n this.PERSPECTIVE_ORIGIN_PROP = 'perspectiveOrigin';\n this.VENDORS = ['Webkit', 'moz', 'O', 'ms'];\n\n this.TWEENABLE = [\n 'opacity',\n 'width', 'height',\n 'marginRight', 'marginBottom',\n 'x', 'y',\n 'scale',\n 'translateX', 'translateY', 'translateZ',\n 'rotateX', 'rotateY', 'rotateZ'\n ];\n\n this.callActions('afterConstruct');\n };\n\n mixitup.BaseStatic.call(mixitup.Features);\n\n mixitup.Features.prototype = Object.create(mixitup.Base.prototype);\n\n h.extend(mixitup.Features.prototype,\n /** @lends mixitup.Features */\n {\n constructor: mixitup.Features,\n\n /**\n * @private\n * @return {void}\n */\n\n init: function() {\n var self = this;\n\n self.callActions('beforeInit', arguments);\n\n self.canary = document.createElement('div');\n\n self.setPrefixes();\n self.runTests();\n\n self.callActions('beforeInit', arguments);\n },\n\n /**\n * @private\n * @return {void}\n */\n\n runTests: function() {\n var self = this;\n\n self.callActions('beforeRunTests', arguments);\n\n self.has.promises = typeof window.Promise === 'function';\n self.has.transitions = self.transitionPrefix !== 'unsupported';\n\n self.callActions('afterRunTests', arguments);\n\n h.freeze(self.has);\n },\n\n /**\n * @private\n * @return {void}\n */\n\n setPrefixes: function() {\n var self = this;\n\n self.callActions('beforeSetPrefixes', arguments);\n\n self.transitionPrefix = h.getPrefix(self.canary, 'Transition', self.VENDORS);\n self.transformPrefix = h.getPrefix(self.canary, 'Transform', self.VENDORS);\n self.boxSizingPrefix = h.getPrefix(self.canary, 'BoxSizing', self.VENDORS);\n\n self.boxSizingProp = self.boxSizingPrefix ?\n self.boxSizingPrefix + h.pascalCase(self.BOX_SIZING_PROP) : self.BOX_SIZING_PROP;\n\n self.transitionProp = self.transitionPrefix ?\n self.transitionPrefix + h.pascalCase(self.TRANSITION_PROP) : self.TRANSITION_PROP;\n\n self.transformProp = self.transformPrefix ?\n self.transformPrefix + h.pascalCase(self.TRANSFORM_PROP) : self.TRANSFORM_PROP;\n\n self.transformRule = self.transformPrefix ?\n '-' + self.transformPrefix + '-' + self.TRANSFORM_PROP : self.TRANSFORM_PROP;\n\n self.perspectiveProp = self.transformPrefix ?\n self.transformPrefix + h.pascalCase(self.PERSPECTIVE_PROP) : self.PERSPECTIVE_PROP;\n\n self.perspectiveOriginProp = self.transformPrefix ?\n self.transformPrefix + h.pascalCase(self.PERSPECTIVE_ORIGIN_PROP) :\n self.PERSPECTIVE_ORIGIN_PROP;\n\n self.callActions('afterSetPrefixes', arguments);\n }\n });\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Has = function() {\n this.transitions = false;\n this.promises = false;\n\n h.seal(this);\n };\n\n // Assign a singleton instance to `mixitup.features` and initialise:\n\n mixitup.features = new mixitup.Features();\n\n mixitup.features.init();\n\n /**\n * A group of properties defining the mixer's animation and effects settings.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name animation\n * @namespace\n * @public\n * @since 2.0.0\n */\n\n mixitup.ConfigAnimation = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A boolean dictating whether or not animation should be enabled for the MixItUp instance.\n * If `false`, all operations will occur instantly and syncronously, although callback\n * functions and any returned promises will still be fulfilled.\n *\n * @example Example: Create a mixer with all animations disabled\n * var mixer = mixitup(containerEl, {\n * animation: {\n * enable: false\n * }\n * });\n *\n * @name enable\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.enable = true;\n\n /**\n * A string of one or more space-seperated properties to which transitions will be\n * applied for all filtering animations.\n *\n * Properties can be listed any order or combination, although they will be applied in a specific\n * predefined order to produce consistent results.\n *\n * To learn more about available effects, experiment with our \n * sandbox demo and try out the \"Export config\" button in the Animation options drop down.\n *\n * @example Example: Apply \"fade\" and \"translateZ\" effects to all animations\n * // As targets are filtered in and out, they will fade between\n * // opacity 1 and 0 and transform between translateZ(-100px) and\n * // translateZ(0).\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade translateZ(-100px)'\n * }\n * });\n *\n * @name effects\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default 'fade scale'\n */\n\n this.effects = 'fade scale';\n\n /**\n * A string of one or more space-seperated effects to be applied only to filter-in\n * animations, overriding `config.animation.effects` if set.\n *\n * @example Example: Apply downwards vertical translate to targets being filtered in\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effectsIn: 'fade translateY(-100%)'\n * }\n * });\n *\n * @name effectsIn\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.effectsIn = '';\n\n /**\n * A string of one or more space-seperated effects to be applied only to filter-out\n * animations, overriding `config.animation.effects` if set.\n *\n * @example Example: Apply upwards vertical translate to targets being filtered out\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effectsOut: 'fade translateY(-100%)'\n * }\n * });\n *\n * @name effectsOut\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.effectsOut = '';\n\n /**\n * An integer dictating the duration of all MixItUp animations in milliseconds, not\n * including any additional delay apllied via the `'stagger'` effect.\n *\n * @example Example: Apply an animation duration of 200ms to all mixitup animations\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * duration: 200\n * }\n * });\n *\n * @name duration\n * @memberof mixitup.Config.animation\n * @instance\n * @type {number}\n * @default 600\n */\n\n this.duration = 600;\n\n /**\n * A valid CSS3 transition-timing function or shorthand. For a full list of accepted\n * values, visit easings.net.\n *\n * @example Example 1: Apply \"ease-in-out\" easing to all animations\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * easing: 'ease-in-out'\n * }\n * });\n *\n * @example Example 2: Apply a custom \"cubic-bezier\" easing function to all animations\n * var mixer = mixitup(containerEl, {\n * animation: {\n * easing: 'cubic-bezier(0.645, 0.045, 0.355, 1)'\n * }\n * });\n *\n * @name easing\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default 'ease'\n */\n\n this.easing = 'ease';\n\n /**\n * A boolean dictating whether or not to apply perspective to the MixItUp container\n * during animations. By default, perspective is always applied and creates the\n * illusion of three-dimensional space for effects such as `translateZ`, `rotateX`,\n * and `rotateY`.\n *\n * You may wish to disable this and define your own perspective settings via CSS.\n *\n * @example Example: Prevent perspective from being applied to any 3D transforms\n * var mixer = mixitup(containerEl, {\n * animation: {\n * applyPerspective: false\n * }\n * });\n *\n * @name applyPerspective\n * @memberof mixitup.Config.animation\n * @instance\n * @type {bolean}\n * @default true\n */\n\n this.applyPerspective = true;\n\n /**\n * The perspective distance value to be applied to the container during animations,\n * affecting any 3D-transform-based effects.\n *\n * @example Example: Set a perspective distance of 2000px\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'rotateY(-25deg)',\n * perspectiveDistance: '2000px'\n * }\n * });\n *\n * @name perspectiveDistance\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default '3000px'\n */\n\n this.perspectiveDistance = '3000px';\n\n /**\n * The perspective-origin value to be applied to the container during animations,\n * affecting any 3D-transform-based effects.\n *\n * @example Example: Set a perspective origin in the top-right of the container\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'transateZ(-200px)',\n * perspectiveOrigin: '100% 0'\n * }\n * });\n *\n * @name perspectiveOrigin\n * @memberof mixitup.Config.animation\n * @instance\n * @type {string}\n * @default '50% 50%'\n */\n\n this.perspectiveOrigin = '50% 50%';\n\n /**\n * A boolean dictating whether or not to enable the queuing of operations.\n *\n * If `true` (default), and a control is clicked or an API call is made while another\n * operation is progress, the operation will go into the queue and will be automatically exectuted\n * when the previous operaitons is finished.\n *\n * If `false`, any requested operations will be ignored, and the `onMixBusy` callback and `mixBusy`\n * event will be fired. If `debug.showWarnings` is enabled, a console warning will also occur.\n *\n * @example Example: Disable queuing\n * var mixer = mixitup(containerEl, {\n * animation: {\n * queue: false\n * }\n * });\n *\n * @name queue\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.queue = true;\n\n /**\n * An integer dictacting the maximum number of operations allowed in the queue at\n * any time, when queuing is enabled.\n *\n * @example Example: Allow a maximum of 5 operations in the queue at any time\n * var mixer = mixitup(containerEl, {\n * animation: {\n * queueLimit: 5\n * }\n * });\n *\n * @name queueLimit\n * @memberof mixitup.Config.animation\n * @instance\n * @type {number}\n * @default 3\n */\n\n this.queueLimit = 3;\n\n /**\n * A boolean dictating whether or not to transition the height and width of the\n * container as elements are filtered in and out. If disabled, the container height\n * will change abruptly.\n *\n * It may be desirable to disable this on mobile devices as the CSS `height` and\n * `width` properties do not receive GPU-acceleration and can therefore cause stuttering.\n *\n * @example Example 1: Disable the transitioning of the container height and/or width\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeContainer: false\n * }\n * });\n *\n * @example Example 2: Disable the transitioning of the container height and/or width for mobile devices only\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeContainer: myFeatureTests.isMobile ? false : true\n * }\n * });\n *\n * @name animateResizeContainer\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.animateResizeContainer = true;\n\n /**\n * A boolean dictating whether or not to transition the height and width of target\n * elements as they change throughout the course of an animation.\n *\n * This is often a must for flex-box grid layouts where the size of target elements may change\n * depending on final their position in relation to their siblings, or for `.changeLayout()`\n * operations where the size of targets change between layouts.\n *\n * NB: This feature requires additional calculations and manipulation to non-hardware-accelerated\n * properties which may adversely affect performance on slower devices, and is therefore\n * disabled by default.\n *\n * @example Example: Enable the transitioning of target widths and heights\n * var mixer = mixitup(containerEl, {\n * animation: {\n * animateResizeTargets: true\n * }\n * });\n *\n * @name animateResizeTargets\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.animateResizeTargets = false;\n\n /**\n * A custom function used to manipulate the order in which the stagger delay is\n * incremented when using the ‘stagger’ effect.\n *\n * When using the 'stagger' effect, the delay applied to each target element is incremented\n * based on its index. You may create a custom function to manipulate the order in which the\n * delay is incremented and create engaging non-linear stagger effects.\n *\n * The function receives the index of the target element as a parameter, and must\n * return an integer which serves as the multiplier for the stagger delay.\n *\n * @example Example 1: Stagger target elements by column in a 3-column grid\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade stagger(100ms)',\n * staggerSequence: function(i) {\n * return i % 3;\n * }\n * }\n * });\n *\n * @example Example 2: Using an algorithm to produce a more complex sequence\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade stagger(100ms)',\n * staggerSequence: function(i) {\n * return (2*i) - (5*((i/3) - ((1/3) * (i%3))));\n * }\n * }\n * });\n *\n * @name staggerSequence\n * @memberof mixitup.Config.animation\n * @instance\n * @type {function}\n * @default null\n */\n\n this.staggerSequence = null;\n\n /**\n * A boolean dictating whether or not to reverse the direction of `translate`\n * and `rotate` transforms for elements being filtered out.\n *\n * It can be used to create carousel-like animations where elements enter and exit\n * from opposite directions. If enabled, the effect `translateX(-100%)` for elements\n * being filtered in would become `translateX(100%)` for targets being filtered out.\n *\n * This functionality can also be achieved by providing seperate effects\n * strings for `config.animation.effectsIn` and `config.animation.effectsOut`.\n *\n * @example Example: Reverse the desired direction on any translate/rotate effect for targets being filtered out\n * // Elements being filtered in will be translated from '100%' to '0' while\n * // elements being filtered out will be translated from 0 to '-100%'\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * effects: 'fade translateX(100%)',\n * reverseOut: true,\n * nudge: false // Disable nudging to create a carousel-like effect\n * }\n * });\n *\n * @name reverseOut\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.reverseOut = false;\n\n /**\n * A boolean dictating whether or not to \"nudge\" the animation path of targets\n * when they are being filtered in and out simulatenously.\n *\n * This has been the default behavior of MixItUp since version 1, but it\n * may be desirable to disable this effect when filtering directly from\n * one exclusive set of targets to a different exclusive set of targets,\n * to create a carousel-like effect, or a generally more subtle animation.\n *\n * @example Example: Disable the \"nudging\" of targets being filtered in and out simulatenously\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * nudge: false\n * }\n * });\n *\n * @name nudge\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.nudge = true;\n\n /**\n * A boolean dictating whether or not to clamp the height of the container while MixItUp's\n * geometry tests are carried out before an operation.\n *\n * To prevent scroll-bar flicker, clamping is turned on by default. But in the case where the\n * height of the container might affect its vertical positioning in the viewport\n * (e.g. a vertically-centered container), this should be turned off to ensure accurate\n * test results and a smooth animation.\n *\n * @example Example: Disable container height-clamping\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * clampHeight: false\n * }\n * });\n *\n * @name clampHeight\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.clampHeight = true;\n\n /**\n * A boolean dictating whether or not to clamp the width of the container while MixItUp's\n * geometry tests are carried out before an operation.\n *\n * To prevent scroll-bar flicker, clamping is turned on by default. But in the case where the\n * width of the container might affect its horitzontal positioning in the viewport\n * (e.g. a horizontall-centered container), this should be turned off to ensure accurate\n * test results and a smooth animation.\n *\n * @example Example: Disable container width-clamping\n *\n * var mixer = mixitup(containerEl, {\n * animation: {\n * clampWidth: false\n * }\n * });\n *\n * @name clampWidth\n * @memberof mixitup.Config.animation\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.clampWidth = true;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigAnimation);\n\n mixitup.ConfigAnimation.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigAnimation.prototype.constructor = mixitup.ConfigAnimation;\n\n /**\n * A group of properties relating to the behavior of the Mixer.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name behavior\n * @namespace\n * @public\n * @since 3.1.12\n */\n\n mixitup.ConfigBehavior = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A boolean dictating whether to allow \"live\" sorting of the mixer.\n *\n * Because of the expensive nature of sorting, MixItUp makes use of several\n * internal optimizations to skip redundant sorting operations, such as when\n * the newly requested sort command is the same as the active one. The caveat\n * to this optimization is that \"live\" edits to the value of a target's sorting\n * attribute will be ignored when requesting a re-sort by the same attribute.\n *\n * By setting to `behavior.liveSort` to `true`, the mixer will always re-sort\n * regardless of whether or not the sorting attribute and order have changed.\n *\n * @example Example: Enabling `liveSort` to allow for re-sorting\n *\n * var mixer = mixitup(containerEl, {\n * behavior: {\n * liveSort: true\n * },\n * load: {\n * sort: 'edited:desc'\n * }\n * });\n *\n * var target = containerEl.children[3];\n *\n * console.log(target.getAttribute('data-edited')); // '2015-04-24'\n *\n * target.setAttribute('data-edited', '2017-08-10'); // Update the target's edited date\n *\n * mixer.sort('edited:desc')\n * .then(function(state) {\n * // The target is now at the top of the list\n *\n * console.log(state.targets[0] === target); // true\n * });\n *\n * @name liveSort\n * @memberof mixitup.Config.behavior\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.liveSort = false;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigBehavior);\n\n mixitup.ConfigBehavior.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigBehavior.prototype.constructor = mixitup.ConfigBehavior;\n\n /**\n * A group of optional callback functions to be invoked at various\n * points within the lifecycle of a mixer operation.\n *\n * Each function is analogous to an event of the same name triggered from the\n * container element, and is invoked immediately after it.\n *\n * All callback functions receive the current `state` object as their first\n * argument, as well as other more specific arguments described below.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name callbacks\n * @namespace\n * @public\n * @since 2.0.0\n */\n\n mixitup.ConfigCallbacks = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A callback function invoked immediately after any MixItUp operation is requested\n * and before animations have begun.\n *\n * A second `futureState` argument is passed to the function which represents the final\n * state of the mixer once the requested operation has completed.\n *\n * @example Example: Adding an `onMixStart` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixStart: function(state, futureState) {\n * console.log('Starting operation...');\n * }\n * }\n * });\n *\n * @name onMixStart\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */\n\n this.onMixStart = null;\n\n /**\n * A callback function invoked when a MixItUp operation is requested while another\n * operation is in progress, and the animation queue is full, or queueing\n * is disabled.\n *\n * @example Example: Adding an `onMixBusy` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixBusy: function(state) {\n * console.log('Mixer busy');\n * }\n * }\n * });\n *\n * @name onMixBusy\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */\n\n this.onMixBusy = null;\n\n /**\n * A callback function invoked after any MixItUp operation has completed, and the\n * state has been updated.\n *\n * @example Example: Adding an `onMixEnd` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixEnd: function(state) {\n * console.log('Operation complete');\n * }\n * }\n * });\n *\n * @name onMixEnd\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */\n\n this.onMixEnd = null;\n\n /**\n * A callback function invoked whenever an operation \"fails\", i.e. no targets\n * could be found matching the requested filter.\n *\n * @example Example: Adding an `onMixFail` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixFail: function(state) {\n * console.log('No items could be found matching the requested filter');\n * }\n * }\n * });\n *\n * @name onMixFail\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */\n\n this.onMixFail = null;\n\n /**\n * A callback function invoked whenever a MixItUp control is clicked, and before its\n * respective operation is requested.\n *\n * The clicked element is assigned to the `this` keyword within the function. The original\n * click event is passed to the function as the second argument, which can be useful if\n * using `` tags as controls where the default behavior needs to be prevented.\n *\n * Returning `false` from the callback will prevent the control click from triggering\n * an operation.\n *\n * @example Example 1: Adding an `onMixClick` callback function\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * console.log('The control \"' + this.innerText + '\" was clicked');\n * }\n * }\n * });\n *\n * @example Example 2: Using `onMixClick` to manipulate the original click event\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * // Prevent original click event from bubbling up:\n * originalEvent.stopPropagation();\n *\n * // Prevent default behavior of clicked element:\n * originalEvent.preventDefault();\n * }\n * }\n * });\n *\n * @example Example 3: Using `onMixClick` to conditionally cancel operations\n * var mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixClick: function(state, originalEvent) {\n * // Perform some conditional check:\n *\n * if (myApp.isLoading) {\n * // By returning false, we can prevent the control click from triggering an operation.\n *\n * return false;\n * }\n * }\n * }\n * });\n *\n * @name onMixClick\n * @memberof mixitup.Config.callbacks\n * @instance\n * @type {function}\n * @default null\n */\n\n this.onMixClick = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigCallbacks);\n\n mixitup.ConfigCallbacks.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigCallbacks.prototype.constructor = mixitup.ConfigCallbacks;\n\n /**\n * A group of properties relating to clickable control elements.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name controls\n * @namespace\n * @public\n * @since 2.0.0\n */\n\n mixitup.ConfigControls = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A boolean dictating whether or not controls should be enabled for the mixer instance.\n *\n * If `true` (default behavior), MixItUp will search the DOM for any clickable elements with\n * `data-filter`, `data-sort` or `data-toggle` attributes, and bind them for click events.\n *\n * If `false`, no click handlers will be bound, and all functionality must therefore be performed\n * via the mixer's API methods.\n *\n * If you do not intend to use the default controls, setting this property to `false` will\n * marginally improve the startup time of your mixer instance, and will also prevent any other active\n * mixer instances in the DOM which are bound to controls from controlling the instance.\n *\n * @example Example: Disabling controls\n * var mixer = mixitup(containerEl, {\n * controls: {\n * enable: false\n * }\n * });\n *\n * // With the default controls disabled, we can only control\n * // the mixer via its API methods, e.g.:\n *\n * mixer.filter('.cat-1');\n *\n * @name enable\n * @memberof mixitup.Config.controls\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.enable = true;\n\n /**\n * A boolean dictating whether or not to use event delegation when binding click events\n * to the default controls.\n *\n * If `false` (default behavior), each control button in the DOM will be found and\n * individually bound when a mixer is instantiated, with their corresponding actions\n * cached for performance.\n *\n * If `true`, a single click handler will be applied to the `window` (or container element - see\n * `config.controls.scope`), and any click events triggered by elements with `data-filter`,\n * `data-sort` or `data-toggle` attributes present will be handled as they propagate upwards.\n *\n * If you require a user interface where control buttons may be added, removed, or changed during the\n * lifetime of a mixer, `controls.live` should be set to `true`. There is a marginal but unavoidable\n * performance deficit when using live controls, as the value of each control button must be read\n * from the DOM in real time once the click event has propagated.\n *\n * @example Example: Setting live controls\n * var mixer = mixitup(containerEl, {\n * controls: {\n * live: true\n * }\n * });\n *\n * // Control buttons can now be added, remove and changed without breaking\n * // the mixer's UI\n *\n * @name live\n * @memberof mixitup.Config.controls\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.live = false;\n\n /**\n * A string dictating the \"scope\" to use when binding or querying the default controls. The available\n * values are `'global'` or `'local'`.\n *\n * When set to `'global'` (default behavior), MixItUp will query the entire document for control buttons\n * to bind, or delegate click events from (see `config.controls.live`).\n *\n * When set to `'local'`, MixItUp will only query (or bind click events to) its own container element.\n * This may be desireable if you require multiple active mixer instances within the same document, with\n * controls that would otherwise intefere with each other if scoped globally.\n *\n * Conversely, if you wish to control multiple instances with a single UI, you would create one\n * set of controls and keep the controls scope of each mixer set to `global`.\n *\n * @example Example: Setting 'local' scoped controls\n * var mixerOne = mixitup(containerOne, {\n * controls: {\n * scope: 'local'\n * }\n * });\n *\n * var mixerTwo = mixitup(containerTwo, {\n * controls: {\n * scope: 'local'\n * }\n * });\n *\n * // Both mixers can now exist within the same document with\n * // isolated controls placed within their container elements.\n *\n * @name scope\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'global'\n */\n\n this.scope = 'global'; // enum: ['local' ,'global']\n\n /**\n * A string dictating the type of logic to apply when concatenating the filter selectors of\n * active toggle buttons (i.e. any clickable element with a `data-toggle` attribute).\n *\n * If set to `'or'` (default behavior), selectors will be concatenated together as\n * a comma-seperated list. For example:\n *\n * `'.cat-1, .cat-2'` (shows any elements matching `'.cat-1'` OR `'.cat-2'`)\n *\n * If set to `'and'`, selectors will be directly concatenated together. For example:\n *\n * `'.cat-1.cat-2'` (shows any elements which match both `'.cat-1'` AND `'.cat-2'`)\n *\n * @example Example: Setting \"and\" toggle logic\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleLogic: 'and'\n * }\n * });\n *\n * @name toggleLogic\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'or'\n */\n\n this.toggleLogic = 'or'; // enum: ['or', 'and']\n\n /**\n * A string dictating the filter behavior when all toggles are inactive.\n *\n * When set to `'all'` (default behavior), *all* targets will be shown by default\n * when no toggles are active, or at the moment all active toggles are toggled off.\n *\n * When set to `'none'`, no targets will be shown by default when no toggles are\n * active, or at the moment all active toggles are toggled off.\n *\n * @example Example 1: Setting the default toggle behavior to `'all'`\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleDefault: 'all'\n * }\n * });\n *\n * mixer.toggleOn('.cat-2')\n * .then(function() {\n * // Deactivate all active toggles\n *\n * return mixer.toggleOff('.cat-2')\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // 'all'\n * console.log(state.totalShow); // 12\n * });\n *\n * @example Example 2: Setting the default toggle behavior to `'none'`\n * var mixer = mixitup(containerEl, {\n * controls: {\n * toggleDefault: 'none'\n * }\n * });\n *\n * mixer.toggleOn('.cat-2')\n * .then(function() {\n * // Deactivate all active toggles\n *\n * return mixer.toggleOff('.cat-2')\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // 'none'\n * console.log(state.totalShow); // 0\n * });\n *\n * @name toggleDefault\n * @memberof mixitup.Config.controls\n * @instance\n * @type {string}\n * @default 'all'\n */\n\n this.toggleDefault = 'all'; // enum: ['all', 'none']\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigControls);\n\n mixitup.ConfigControls.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigControls.prototype.constructor = mixitup.ConfigControls;\n\n /**\n * A group of properties defining the output and structure of class names programmatically\n * added to controls and containers to reflect the state of the mixer.\n *\n * Most commonly, class names are added to controls by MixItUp to indicate that\n * the control is active so that it can be styled accordingly - `'mixitup-control-active'` by default.\n *\n * Using a \"BEM\" like structure, each classname is broken into the three parts:\n * a block namespace (`'mixitup'`), an element name (e.g. `'control'`), and an optional modifier\n * name (e.g. `'active'`) reflecting the state of the element.\n *\n * By default, each part of the classname is concatenated together using single hyphens as\n * delineators, but this can be easily customised to match the naming convention and style of\n * your project.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name classNames\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigClassNames = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * The \"block\" portion, or top-level namespace added to the start of any class names created by MixItUp.\n *\n * @example Example 1: changing the `config.classNames.block` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio'\n * }\n * });\n *\n * // Active control output: \"portfolio-control-active\"\n *\n * @example Example 2: Removing `config.classNames.block`\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: ''\n * }\n * });\n *\n * // Active control output: \"control-active\"\n *\n * @name block\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'mixitup'\n */\n\n this.block = 'mixitup';\n\n /**\n * The \"element\" portion of the class name added to container.\n *\n * @name elementContainer\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'container'\n */\n\n this.elementContainer = 'container';\n\n /**\n * The \"element\" portion of the class name added to filter controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementFilter` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementFilter: 'filter'\n * }\n * });\n *\n * // Active filter output: \"mixitup-filter-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementFilter` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementFilter: 'filter'\n * }\n * });\n *\n * // Active filter output: \"portfolio-filter-active\"\n *\n * @name elementFilter\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */\n\n this.elementFilter = 'control';\n\n /**\n * The \"element\" portion of the class name added to sort controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementSort` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementSort: 'sort'\n * }\n * });\n *\n * // Active sort output: \"mixitup-sort-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementSort` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementSort: 'sort'\n * }\n * });\n *\n * // Active sort output: \"portfolio-sort-active\"\n *\n * @name elementSort\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */\n\n this.elementSort = 'control';\n\n /**\n * The \"element\" portion of the class name added to multimix controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementMultimix` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementMultimix: 'multimix'\n * }\n * });\n *\n * // Active multimix output: \"mixitup-multimix-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementMultimix` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementSort: 'multimix'\n * }\n * });\n *\n * // Active multimix output: \"portfolio-multimix-active\"\n *\n * @name elementMultimix\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */\n\n this.elementMultimix = 'control';\n\n /**\n * The \"element\" portion of the class name added to toggle controls.\n *\n * By default, all filter, sort, multimix and toggle controls take the same element value of `'control'`, but\n * each type's element value can be individually overwritten to match the unique classNames of your controls as needed.\n *\n * @example Example 1: changing the `config.classNames.elementToggle` value\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * elementToggle: 'toggle'\n * }\n * });\n *\n * // Active toggle output: \"mixitup-toggle-active\"\n *\n * @example Example 2: changing the `config.classNames.block` and `config.classNames.elementToggle` values\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * block: 'portfolio',\n * elementToggle: 'toggle'\n * }\n * });\n *\n * // Active toggle output: \"portfolio-toggle-active\"\n *\n * @name elementToggle\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'control'\n */\n\n this.elementToggle = 'control';\n\n /**\n * The \"modifier\" portion of the class name added to active controls.\n * @name modifierActive\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'active'\n */\n\n this.modifierActive = 'active';\n\n /**\n * The \"modifier\" portion of the class name added to disabled controls.\n *\n * @name modifierDisabled\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'disabled'\n */\n\n this.modifierDisabled = 'disabled';\n\n /**\n * The \"modifier\" portion of the class name added to the container when in a \"failed\" state.\n *\n * @name modifierFailed\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default 'failed'\n */\n\n this.modifierFailed = 'failed';\n\n /**\n * The delineator used between the \"block\" and \"element\" portions of any class name added by MixItUp.\n *\n * If the block portion is ommited by setting it to an empty string, no delineator will be added.\n *\n * @example Example: changing the delineator to match BEM convention\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * delineatorElement: '__'\n * }\n * });\n *\n * // example active control output: \"mixitup__control-active\"\n *\n * @name delineatorElement\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default '-'\n */\n\n this.delineatorElement = '-';\n\n /**\n * The delineator used between the \"element\" and \"modifier\" portions of any class name added by MixItUp.\n *\n * If the element portion is ommited by setting it to an empty string, no delineator will be added.\n *\n * @example Example: changing both delineators to match BEM convention\n * var mixer = mixitup(containerEl, {\n * classNames: {\n * delineatorElement: '__'\n * delineatorModifier: '--'\n * }\n * });\n *\n * // Active control output: \"mixitup__control--active\"\n *\n * @name delineatorModifier\n * @memberof mixitup.Config.classNames\n * @instance\n * @type {string}\n * @default '-'\n */\n\n this.delineatorModifier = '-';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigClassNames);\n\n mixitup.ConfigClassNames.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigClassNames.prototype.constructor = mixitup.ConfigClassNames;\n\n /**\n * A group of properties relating to MixItUp's dataset API.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name data\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigData = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A string specifying the name of the key containing your data model's unique\n * identifier (UID). To use the dataset API, a UID key must be specified and\n * be present and unique on all objects in the dataset you provide to MixItUp.\n *\n * For example, if your dataset is made up of MongoDB documents, the UID\n * key would be `'id'` or `'_id'`.\n *\n * @example Example: Setting the UID to `'id'`\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id'\n * }\n * });\n *\n * @name uidKey\n * @memberof mixitup.Config.data\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.uidKey = '';\n\n /**\n * A boolean dictating whether or not MixItUp should \"dirty check\" each object in\n * your dataset for changes whenever `.dataset()` is called, and re-render any targets\n * for which a change is found.\n *\n * Depending on the complexity of your data model, dirty checking can be expensive\n * and is therefore disabled by default.\n *\n * NB: For changes to be detected, a new immutable instance of the edited model must be\n * provided to mixitup, rather than manipulating properties on the existing instance.\n * If your changes are a result of a DB write and read, you will most likely be calling\n * `.dataset()` with a clean set of objects each time, so this will not be an issue.\n *\n * @example Example: Enabling dirty checking\n *\n * var myDataset = [\n * {\n * id: 0,\n * title: \"Blog Post Title 0\"\n * ...\n * },\n * {\n * id: 1,\n * title: \"Blog Post Title 1\"\n * ...\n * }\n * ];\n *\n * // Instantiate a mixer with a pre-loaded dataset, and a target renderer\n * // function defined\n *\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id',\n * dirtyCheck: true\n * },\n * load: {\n * dataset: myDataset\n * },\n * render: {\n * target: function() { ... }\n * }\n * });\n *\n * // For illustration, we will clone and edit the second object in the dataset.\n * // NB: this would typically be done server-side in response to a DB update,\n * and then re-queried via an API.\n *\n * myDataset[1] = Object.assign({}, myDataset[1]);\n *\n * myDataset[1].title = 'Blog Post Title 11';\n *\n * mixer.dataset(myDataset)\n * .then(function() {\n * // the target with ID \"1\", will be re-rendered reflecting its new title\n * });\n *\n * @name dirtyCheck\n * @memberof mixitup.Config.data\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.dirtyCheck = false;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigData);\n\n mixitup.ConfigData.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigData.prototype.constructor = mixitup.ConfigData;\n\n /**\n * A group of properties allowing the toggling of various debug features.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name debug\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigDebug = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A boolean dictating whether or not the mixer instance returned by the\n * `mixitup()` factory function should expose private properties and methods.\n *\n * By default, mixer instances only expose their public API, but enabling\n * debug mode will give you access to various mixer internals which may aid\n * in debugging, or the authoring of extensions.\n *\n * @example Example: Enabling debug mode\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * enable: true\n * }\n * });\n *\n * // Private properties and methods will now be visible on the mixer instance:\n *\n * console.log(mixer);\n *\n * @name enable\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.enable = false;\n\n /**\n * A boolean dictating whether or not warnings should be shown when various\n * common gotchas occur.\n *\n * Warnings are intended to provide insights during development when something\n * occurs that is not a fatal, but may indicate an issue with your integration,\n * and are therefore turned on by default. However, you may wish to disable\n * them in production.\n *\n * @example Example 1: Disabling warnings\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * showWarnings: false\n * }\n * });\n *\n * @example Example 2: Disabling warnings based on environment\n *\n * var showWarnings = myAppConfig.environment === 'development' ? true : false;\n *\n * var mixer = mixitup(containerEl, {\n * debug: {\n * showWarnings: showWarnings\n * }\n * });\n *\n * @name showWarnings\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.showWarnings = true;\n\n /**\n * Used for server-side testing only.\n *\n * @private\n * @name fauxAsync\n * @memberof mixitup.Config.debug\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.fauxAsync = false;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigDebug);\n\n mixitup.ConfigDebug.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigDebug.prototype.constructor = mixitup.ConfigDebug;\n\n /**\n * A group of properties relating to the layout of the container.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name layout\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigLayout = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A boolean dictating whether or not mixitup should query all descendants\n * of the container for targets, or only immediate children.\n *\n * By default, mixitup will query all descendants matching the\n * `selectors.target` selector when indexing targets upon instantiation.\n * This allows for targets to be nested inside a sub-container which is\n * useful when ring-fencing targets from locally scoped controls in your\n * markup (see `controls.scope`).\n *\n * However, if you are building a more complex UI requiring the nesting\n * of mixers within mixers, you will most likely want to limit targets to\n * immediate children of the container by setting this property to `false`.\n *\n * @example Example: Restricting targets to immediate children\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * allowNestedTargets: false\n * }\n * });\n *\n * @name allowNestedTargets\n * @memberof mixitup.Config.layout\n * @instance\n * @type {boolean}\n * @default true\n */\n\n this.allowNestedTargets = true;\n\n /**\n * A string specifying an optional class name to apply to the container when in\n * its default state.\n *\n * By changing this class name or adding a class name to the container via the\n * `.changeLayout()` API method, the CSS layout of the container can be changed,\n * and MixItUp will attemp to gracefully animate the container and its targets\n * between states.\n *\n * @example Example 1: Specifying a container class name\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * containerClassName: 'grid'\n * }\n * });\n *\n * @example Example 2: Changing the default class name with `.changeLayout()`\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * containerClassName: 'grid'\n * }\n * });\n *\n * mixer.changeLayout('list')\n * .then(function(state) {\n * console.log(state.activeContainerClass); // \"list\"\n * });\n *\n * @name containerClassName\n * @memberof mixitup.Config.layout\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.containerClassName = '';\n\n /**\n * A reference to a non-target sibling element after which to insert targets\n * when there are no targets in the container.\n *\n * @example Example: Setting a `siblingBefore` reference element\n *\n * var addButton = containerEl.querySelector('button');\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * siblingBefore: addButton\n * }\n * });\n *\n * @name siblingBefore\n * @memberof mixitup.Config.layout\n * @instance\n * @type {HTMLElement}\n * @default null\n */\n\n this.siblingBefore = null;\n\n /**\n * A reference to a non-target sibling element before which to insert targets\n * when there are no targets in the container.\n *\n * @example Example: Setting an `siblingAfter` reference element\n *\n * var gap = containerEl.querySelector('.gap');\n *\n * var mixer = mixitup(containerEl, {\n * layout: {\n * siblingAfter: gap\n * }\n * });\n *\n * @name siblingAfter\n * @memberof mixitup.Config.layout\n * @instance\n * @type {HTMLElement}\n * @default null\n */\n\n this.siblingAfter = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigLayout);\n\n mixitup.ConfigLayout.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigLayout.prototype.constructor = mixitup.ConfigLayout;\n\n /**\n * A group of properties defining the initial state of the mixer on load (instantiation).\n *\n * @constructor\n * @memberof mixitup.Config\n * @name load\n * @namespace\n * @public\n * @since 2.0.0\n */\n\n mixitup.ConfigLoad = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A string defining any filtering to be statically applied to the mixer on load.\n * As per the `.filter()` API, this can be any valid selector string, or the\n * values `'all'` or `'none'`.\n *\n * @example Example 1: Defining an initial filter selector to be applied on load\n *\n * // The mixer will show only those targets matching '.category-a' on load.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * filter: '.category-a'\n * }\n * });\n *\n * @example Example 2: Hiding all targets on load\n *\n * // The mixer will show hide all targets on load.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * filter: 'none'\n * }\n * });\n *\n * @name filter\n * @memberof mixitup.Config.load\n * @instance\n * @type {string}\n * @default 'all'\n */\n\n this.filter = 'all';\n\n /**\n * A string defining any sorting to be statically applied to the mixer on load.\n * As per the `.sort()` API, this should be a valid \"sort string\" made up of\n * an attribute to sort by (or `'default'`) followed by an optional sorting\n * order, or the value `'random'`;\n *\n * @example Example: Defining sorting to be applied on load\n *\n * // The mixer will sort the container by the value of the `data-published-date`\n * // attribute, in descending order.\n *\n * var mixer = mixitup(containerEl, {\n * load: {\n * sort: 'published-date:desc'\n * }\n * });\n *\n * @name sort\n * @memberof mixitup.Config.load\n * @instance\n * @type {string}\n * @default 'default:asc'\n */\n\n this.sort = 'default:asc';\n\n /**\n * An array of objects representing the underlying data of any pre-rendered targets,\n * when using the `.dataset()` API.\n *\n * NB: If targets are pre-rendered when the mixer is instantiated, this must be set.\n *\n * @example Example: Defining the initial underyling dataset\n *\n * var myDataset = [\n * {\n * id: 0,\n * title: \"Blog Post Title 0\",\n * ...\n * },\n * {\n * id: 1,\n * title: \"Blog Post Title 1\",\n * ...\n * }\n * ];\n *\n * var mixer = mixitup(containerEl, {\n * data: {\n * uidKey: 'id'\n * },\n * load: {\n * dataset: myDataset\n * }\n * });\n *\n * @name dataset\n * @memberof mixitup.Config.load\n * @instance\n * @type {Array.}\n * @default null\n */\n\n this.dataset = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigLoad);\n\n mixitup.ConfigLoad.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigLoad.prototype.constructor = mixitup.ConfigLoad;\n\n /**\n * A group of properties defining the selectors used to query elements within a mixitup container.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name selectors\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigSelectors = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A selector string used to query and index target elements within the container.\n *\n * By default, the class selector `'.mix'` is used, but this can be changed to an\n * attribute or element selector to match the style of your project.\n *\n * @example Example 1: Changing the target selector\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * target: '.portfolio-item'\n * }\n * });\n *\n * @example Example 2: Using an attribute selector as a target selector\n *\n * // The mixer will search for any children with the attribute `data-ref=\"mix\"`\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * target: '[data-ref=\"mix\"]'\n * }\n * });\n *\n * @name target\n * @memberof mixitup.Config.selectors\n * @instance\n * @type {string}\n * @default '.mix'\n */\n\n this.target = '.mix';\n\n /**\n * A optional selector string used to add further specificity to the querying of control elements,\n * in addition to their mandatory data attribute (e.g. `data-filter`, `data-toggle`, `data-sort`).\n *\n * This can be used if other elements in your document must contain the above attributes\n * (e.g. for use in third-party scripts), and would otherwise interfere with MixItUp. Adding\n * an additional `control` selector of your choice allows MixItUp to restrict event handling\n * to only those elements matching the defined selector.\n *\n * @name control\n * @memberof mixitup.Config.selectors\n * @instance\n * @type {string}\n * @default ''\n *\n * @example Example 1: Adding a `selectors.control` selector\n *\n * var mixer = mixitup(containerEl, {\n * selectors: {\n * control: '.mixitup-control'\n * }\n * });\n *\n * // Will not be handled:\n * // \n *\n * // Will be handled:\n * // \n */\n\n this.control = '';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigSelectors);\n\n mixitup.ConfigSelectors.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigSelectors.prototype.constructor = mixitup.ConfigSelectors;\n\n /**\n * A group of optional render functions for creating and updating elements.\n *\n * All render functions receive a data object, and should return a valid HTML string.\n *\n * @constructor\n * @memberof mixitup.Config\n * @name render\n * @namespace\n * @public\n * @since 3.0.0\n */\n\n mixitup.ConfigRender = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A function returning an HTML string representing a target element, or a reference to a\n * single DOM element.\n *\n * The function is invoked as part of the `.dataset()` API, whenever a new item is added\n * to the dataset, or an item in the dataset changes (if `dataset.dirtyCheck` is enabled).\n *\n * The function receives the relevant dataset item as its first parameter.\n *\n * @example Example 1: Using string concatenation\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * return (\n * '<div class=\"mix\">' +\n * '<h2>' + item.title + '</h2>' +\n * '</div>'\n * );\n * }\n * }\n * });\n *\n * @example Example 2: Using an ES2015 template literal\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * return (\n * `<div class=\"mix\">\n * <h2>${item.title}</h2>\n * </div>`\n * );\n * }\n * }\n * });\n *\n * @example Example 3: Using a Handlebars template\n *\n * var targetTemplate = Handlebars.compile('<div class=\"mix\"><h2>{{title}}</h2></div>');\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: targetTemplate\n * }\n * });\n *\n * @example Example 4: Returning a DOM element\n *\n * var mixer = mixitup(containerEl, {\n * render: {\n * target: function(item) {\n * // Create a single element using your framework's built-in renderer\n *\n * var el = ...\n *\n * return el;\n * }\n * }\n * });\n *\n * @name target\n * @memberof mixitup.Config.render\n * @instance\n * @type {function}\n * @default 'null'\n */\n\n this.target = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigRender);\n\n mixitup.ConfigRender.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigRender.prototype.constructor = mixitup.ConfigRender;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.ConfigTemplates = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ConfigTemplates);\n\n mixitup.ConfigTemplates.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ConfigTemplates.prototype.constructor = mixitup.ConfigTemplates;\n\n /**\n * `mixitup.Config` is an interface used for customising the functionality of a\n * mixer instance. It is organised into several semantically distinct sub-objects,\n * each one pertaining to a particular aspect of MixItUp functionality.\n *\n * An object literal containing any or all of the available properies,\n * known as the \"configuration object\", can be passed as the second parameter to\n * the `mixitup` factory function when creating a mixer instance to customise its\n * functionality as needed.\n *\n * If no configuration object is passed, the mixer instance will take on the default\n * configuration values detailed below.\n *\n * @example Example 1: Creating and passing the configuration object\n * // Create a configuration object with desired values\n *\n * var config = {\n * animation: {\n * enable: false\n * },\n * selectors: {\n * target: '.item'\n * }\n * };\n *\n * // Pass the configuration object to the mixitup factory function\n *\n * var mixer = mixitup(containerEl, config);\n *\n * @example Example 2: Passing the configuration object inline\n * // Typically, the configuration object is passed inline for brevity.\n *\n * var mixer = mixitup(containerEl, {\n * controls: {\n * live: true,\n * toggleLogic: 'and'\n * }\n * });\n *\n *\n * @constructor\n * @memberof mixitup\n * @namespace\n * @public\n * @since 2.0.0\n */\n\n mixitup.Config = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.animation = new mixitup.ConfigAnimation();\n this.behavior = new mixitup.ConfigBehavior();\n this.callbacks = new mixitup.ConfigCallbacks();\n this.controls = new mixitup.ConfigControls();\n this.classNames = new mixitup.ConfigClassNames();\n this.data = new mixitup.ConfigData();\n this.debug = new mixitup.ConfigDebug();\n this.layout = new mixitup.ConfigLayout();\n this.load = new mixitup.ConfigLoad();\n this.selectors = new mixitup.ConfigSelectors();\n this.render = new mixitup.ConfigRender();\n this.templates = new mixitup.ConfigTemplates();\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Config);\n\n mixitup.Config.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.Config.prototype.constructor = mixitup.Config;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.MixerDom = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.document = null;\n this.body = null;\n this.container = null;\n this.parent = null;\n this.targets = [];\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.MixerDom);\n\n mixitup.MixerDom.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.MixerDom.prototype.constructor = mixitup.MixerDom;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.UiClassNames = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.base = '';\n this.active = '';\n this.disabled = '';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.UiClassNames);\n\n mixitup.UiClassNames.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.UiClassNames.prototype.constructor = mixitup.UiClassNames;\n\n /**\n * An object into which all arbitrary arguments sent to '.dataset()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandDataset = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.dataset = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandDataset);\n\n mixitup.CommandDataset.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandDataset.prototype.constructor = mixitup.CommandDataset;\n\n /**\n * An object into which all arbitrary arguments sent to '.multimix()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandMultimix = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.filter = null;\n this.sort = null;\n this.insert = null;\n this.remove = null;\n this.changeLayout = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandMultimix);\n\n mixitup.CommandMultimix.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandMultimix.prototype.constructor = mixitup.CommandMultimix;\n\n /**\n * An object into which all arbitrary arguments sent to '.filter()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandFilter = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.selector = '';\n this.collection = null;\n this.action = 'show'; // enum: ['show', 'hide']\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandFilter);\n\n mixitup.CommandFilter.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandFilter.prototype.constructor = mixitup.CommandFilter;\n\n /**\n * An object into which all arbitrary arguments sent to '.sort()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandSort = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.sortString = '';\n this.attribute = '';\n this.order = 'asc';\n this.collection = null;\n this.next = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandSort);\n\n mixitup.CommandSort.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandSort.prototype.constructor = mixitup.CommandSort;\n\n /**\n * An object into which all arbitrary arguments sent to '.insert()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandInsert = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.index = 0;\n this.collection = [];\n this.position = 'before'; // enum: ['before', 'after']\n this.sibling = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandInsert);\n\n mixitup.CommandInsert.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandInsert.prototype.constructor = mixitup.CommandInsert;\n\n /**\n * An object into which all arbitrary arguments sent to '.remove()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandRemove = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.targets = [];\n this.collection = [];\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandRemove);\n\n mixitup.CommandRemove.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandRemove.prototype.constructor = mixitup.CommandRemove;\n\n /**\n * An object into which all arbitrary arguments sent to '.changeLayout()' are mapped.\n *\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.CommandChangeLayout = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.containerClassName = '';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.CommandChangeLayout);\n\n mixitup.CommandChangeLayout.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.CommandChangeLayout.prototype.constructor = mixitup.CommandChangeLayout;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {string} type\n * @param {string} selector\n * @param {boolean} [live]\n * @param {string} [parent]\n * An optional string representing the name of the mixer.dom property containing a reference to a parent element.\n */\n\n mixitup.ControlDefinition = function(type, selector, live, parent) {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.type = type;\n this.selector = selector;\n this.live = live || false;\n this.parent = parent || '';\n\n this.callActions('afterConstruct');\n\n h.freeze(this);\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.ControlDefinition);\n\n mixitup.ControlDefinition.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.ControlDefinition.prototype.constructor = mixitup.ControlDefinition;\n\n mixitup.controlDefinitions = [];\n\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition('multimix', '[data-filter][data-sort]'));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition('filter', '[data-filter]'));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition('sort', '[data-sort]'));\n mixitup.controlDefinitions.push(new mixitup.ControlDefinition('toggle', '[data-toggle]'));\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Control = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.el = null;\n this.selector = '';\n this.bound = [];\n this.pending = -1;\n this.type = '';\n this.status = 'inactive'; // enum: ['inactive', 'active', 'disabled', 'live']\n this.filter = '';\n this.sort = '';\n this.canDisable = false;\n this.handler = null;\n this.classNames = new mixitup.UiClassNames();\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Control);\n\n mixitup.Control.prototype = Object.create(mixitup.Base.prototype);\n\n h.extend(mixitup.Control.prototype,\n /** @lends mixitup.Control */\n {\n constructor: mixitup.Control,\n\n /**\n * @private\n * @param {HTMLElement} el\n * @param {string} type\n * @param {string} selector\n */\n\n init: function(el, type, selector) {\n var self = this;\n\n this.callActions('beforeInit', arguments);\n\n self.el = el;\n self.type = type;\n self.selector = selector;\n\n if (self.selector) {\n self.status = 'live';\n } else {\n self.canDisable = typeof self.el.disable === 'boolean';\n\n switch (self.type) {\n case 'filter':\n self.filter = self.el.getAttribute('data-filter');\n\n break;\n case 'toggle':\n self.filter = self.el.getAttribute('data-toggle');\n\n break;\n case 'sort':\n self.sort = self.el.getAttribute('data-sort');\n\n break;\n case 'multimix':\n self.filter = self.el.getAttribute('data-filter');\n self.sort = self.el.getAttribute('data-sort');\n\n break;\n }\n }\n\n self.bindClick();\n\n mixitup.controls.push(self);\n\n this.callActions('afterInit', arguments);\n },\n\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {boolean}\n */\n\n isBound: function(mixer) {\n var self = this,\n isBound = false;\n\n this.callActions('beforeIsBound', arguments);\n\n isBound = self.bound.indexOf(mixer) > -1;\n\n return self.callFilters('afterIsBound', isBound, arguments);\n },\n\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {void}\n */\n\n addBinding: function(mixer) {\n var self = this;\n\n this.callActions('beforeAddBinding', arguments);\n\n if (!self.isBound()) {\n self.bound.push(mixer);\n }\n\n this.callActions('afterAddBinding', arguments);\n },\n\n /**\n * @private\n * @param {mixitup.Mixer} mixer\n * @return {void}\n */\n\n removeBinding: function(mixer) {\n var self = this,\n removeIndex = -1;\n\n this.callActions('beforeRemoveBinding', arguments);\n\n if ((removeIndex = self.bound.indexOf(mixer)) > -1) {\n self.bound.splice(removeIndex, 1);\n }\n\n if (self.bound.length < 1) {\n // No bindings exist, unbind event click handlers\n\n self.unbindClick();\n\n // Remove from `mixitup.controls` list\n\n removeIndex = mixitup.controls.indexOf(self);\n\n mixitup.controls.splice(removeIndex, 1);\n\n if (self.status === 'active') {\n self.renderStatus(self.el, 'inactive');\n }\n }\n\n this.callActions('afterRemoveBinding', arguments);\n },\n\n /**\n * @private\n * @return {void}\n */\n\n bindClick: function() {\n var self = this;\n\n this.callActions('beforeBindClick', arguments);\n\n self.handler = function(e) {\n self.handleClick(e);\n };\n\n h.on(self.el, 'click', self.handler);\n\n this.callActions('afterBindClick', arguments);\n },\n\n /**\n * @private\n * @return {void}\n */\n\n unbindClick: function() {\n var self = this;\n\n this.callActions('beforeUnbindClick', arguments);\n\n h.off(self.el, 'click', self.handler);\n\n self.handler = null;\n\n this.callActions('afterUnbindClick', arguments);\n },\n\n /**\n * @private\n * @param {MouseEvent} e\n * @return {void}\n */\n\n handleClick: function(e) {\n var self = this,\n button = null,\n mixer = null,\n isActive = false,\n returnValue = void(0),\n command = {},\n clone = null,\n commands = [],\n i = -1;\n\n this.callActions('beforeHandleClick', arguments);\n\n this.pending = 0;\n\n mixer = self.bound[0];\n\n if (!self.selector) {\n button = self.el;\n } else {\n button = h.closestParent(e.target, mixer.config.selectors.control + self.selector, true, mixer.dom.document);\n }\n\n if (!button) {\n self.callActions('afterHandleClick', arguments);\n\n return;\n }\n\n switch (self.type) {\n case 'filter':\n command.filter = self.filter || button.getAttribute('data-filter');\n\n break;\n case 'sort':\n command.sort = self.sort || button.getAttribute('data-sort');\n\n break;\n case 'multimix':\n command.filter = self.filter || button.getAttribute('data-filter');\n command.sort = self.sort || button.getAttribute('data-sort');\n\n break;\n case 'toggle':\n command.filter = self.filter || button.getAttribute('data-toggle');\n\n if (self.status === 'live') {\n isActive = h.hasClass(button, self.classNames.active);\n } else {\n isActive = self.status === 'active';\n }\n\n break;\n }\n\n for (i = 0; i < self.bound.length; i++) {\n // Create a clone of the command for each bound mixer instance\n\n clone = new mixitup.CommandMultimix();\n\n h.extend(clone, command);\n\n commands.push(clone);\n }\n\n commands = self.callFilters('commandsHandleClick', commands, arguments);\n\n self.pending = self.bound.length;\n\n for (i = 0; mixer = self.bound[i]; i++) {\n command = commands[i];\n\n if (!command) {\n // An extension may set a command null to indicate that the click should not be handled\n\n continue;\n }\n\n if (!mixer.lastClicked) {\n mixer.lastClicked = button;\n }\n\n mixitup.events.fire('mixClick', mixer.dom.container, {\n state: mixer.state,\n instance: mixer,\n originalEvent: e,\n control: mixer.lastClicked\n }, mixer.dom.document);\n\n if (typeof mixer.config.callbacks.onMixClick === 'function') {\n returnValue = mixer.config.callbacks.onMixClick.call(mixer.lastClicked, mixer.state, e, mixer);\n\n if (returnValue === false) {\n // User has returned `false` from the callback, so do not handle click\n\n continue;\n }\n }\n\n if (self.type === 'toggle') {\n isActive ? mixer.toggleOff(command.filter) : mixer.toggleOn(command.filter);\n } else {\n mixer.multimix(command);\n }\n }\n\n this.callActions('afterHandleClick', arguments);\n },\n\n /**\n * @param {object} command\n * @param {Array} toggleArray\n * @return {void}\n */\n\n update: function(command, toggleArray) {\n var self = this,\n actions = new mixitup.CommandMultimix();\n\n self.callActions('beforeUpdate', arguments);\n\n self.pending--;\n\n self.pending = Math.max(0, self.pending);\n\n if (self.pending > 0) return;\n\n if (self.status === 'live') {\n // Live control (status unknown)\n\n self.updateLive(command, toggleArray);\n } else {\n // Static control\n\n actions.sort = self.sort;\n actions.filter = self.filter;\n\n self.callFilters('actionsUpdate', actions, arguments);\n\n self.parseStatusChange(self.el, command, actions, toggleArray);\n }\n\n self.callActions('afterUpdate', arguments);\n },\n\n /**\n * @param {mixitup.CommandMultimix} command\n * @param {Array} toggleArray\n * @return {void}\n */\n\n updateLive: function(command, toggleArray) {\n var self = this,\n controlButtons = null,\n actions = null,\n button = null,\n i = -1;\n\n self.callActions('beforeUpdateLive', arguments);\n\n if (!self.el) return;\n\n controlButtons = self.el.querySelectorAll(self.selector);\n\n for (i = 0; button = controlButtons[i]; i++) {\n actions = new mixitup.CommandMultimix();\n\n switch (self.type) {\n case 'filter':\n actions.filter = button.getAttribute('data-filter');\n\n break;\n case 'sort':\n actions.sort = button.getAttribute('data-sort');\n\n break;\n case 'multimix':\n actions.filter = button.getAttribute('data-filter');\n actions.sort = button.getAttribute('data-sort');\n\n break;\n case 'toggle':\n actions.filter = button.getAttribute('data-toggle');\n\n break;\n }\n\n actions = self.callFilters('actionsUpdateLive', actions, arguments);\n\n self.parseStatusChange(button, command, actions, toggleArray);\n }\n\n self.callActions('afterUpdateLive', arguments);\n },\n\n /**\n * @param {HTMLElement} button\n * @param {mixitup.CommandMultimix} command\n * @param {mixitup.CommandMultimix} actions\n * @param {Array} toggleArray\n * @return {void}\n */\n\n parseStatusChange: function(button, command, actions, toggleArray) {\n var self = this,\n alias = '',\n toggle = '',\n i = -1;\n\n self.callActions('beforeParseStatusChange', arguments);\n\n switch (self.type) {\n case 'filter':\n if (command.filter === actions.filter) {\n self.renderStatus(button, 'active');\n } else {\n self.renderStatus(button, 'inactive');\n }\n\n break;\n case 'multimix':\n if (command.sort === actions.sort && command.filter === actions.filter) {\n self.renderStatus(button, 'active');\n } else {\n self.renderStatus(button, 'inactive');\n }\n\n break;\n case 'sort':\n if (command.sort.match(/:asc/g)) {\n alias = command.sort.replace(/:asc/g, '');\n }\n\n if (command.sort === actions.sort || alias === actions.sort) {\n self.renderStatus(button, 'active');\n } else {\n self.renderStatus(button, 'inactive');\n }\n\n break;\n case 'toggle':\n if (toggleArray.length < 1) self.renderStatus(button, 'inactive');\n\n if (command.filter === actions.filter) {\n self.renderStatus(button, 'active');\n }\n\n for (i = 0; i < toggleArray.length; i++) {\n toggle = toggleArray[i];\n\n if (toggle === actions.filter) {\n // Button matches one active toggle\n\n self.renderStatus(button, 'active');\n\n break;\n }\n\n self.renderStatus(button, 'inactive');\n }\n\n break;\n }\n\n self.callActions('afterParseStatusChange', arguments);\n },\n\n /**\n * @param {HTMLElement} button\n * @param {string} status\n * @return {void}\n */\n\n renderStatus: function(button, status) {\n var self = this;\n\n self.callActions('beforeRenderStatus', arguments);\n\n switch (status) {\n case 'active':\n h.addClass(button, self.classNames.active);\n h.removeClass(button, self.classNames.disabled);\n\n if (self.canDisable) self.el.disabled = false;\n\n break;\n case 'inactive':\n h.removeClass(button, self.classNames.active);\n h.removeClass(button, self.classNames.disabled);\n\n if (self.canDisable) self.el.disabled = false;\n\n break;\n case 'disabled':\n if (self.canDisable) self.el.disabled = true;\n\n h.addClass(button, self.classNames.disabled);\n h.removeClass(button, self.classNames.active);\n\n break;\n }\n\n if (self.status !== 'live') {\n // Update the control's status propery if not live\n\n self.status = status;\n }\n\n self.callActions('afterRenderStatus', arguments);\n }\n });\n\n mixitup.controls = [];\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.StyleData = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.x = 0;\n this.y = 0;\n this.top = 0;\n this.right = 0;\n this.bottom = 0;\n this.left = 0;\n this.width = 0;\n this.height = 0;\n this.marginRight = 0;\n this.marginBottom = 0;\n this.opacity = 0;\n this.scale = new mixitup.TransformData();\n this.translateX = new mixitup.TransformData();\n this.translateY = new mixitup.TransformData();\n this.translateZ = new mixitup.TransformData();\n this.rotateX = new mixitup.TransformData();\n this.rotateY = new mixitup.TransformData();\n this.rotateZ = new mixitup.TransformData();\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.StyleData);\n\n mixitup.StyleData.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.StyleData.prototype.constructor = mixitup.StyleData;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.TransformData = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.value = 0;\n this.unit = '';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.TransformData);\n\n mixitup.TransformData.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.TransformData.prototype.constructor = mixitup.TransformData;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.TransformDefaults = function() {\n mixitup.StyleData.apply(this);\n\n this.callActions('beforeConstruct');\n\n this.scale.value = 0.01;\n this.scale.unit = '';\n\n this.translateX.value = 20;\n this.translateX.unit = 'px';\n\n this.translateY.value = 20;\n this.translateY.unit = 'px';\n\n this.translateZ.value = 20;\n this.translateZ.unit = 'px';\n\n this.rotateX.value = 90;\n this.rotateX.unit = 'deg';\n\n this.rotateY.value = 90;\n this.rotateY.unit = 'deg';\n\n this.rotateX.value = 90;\n this.rotateX.unit = 'deg';\n\n this.rotateZ.value = 180;\n this.rotateZ.unit = 'deg';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.TransformDefaults);\n\n mixitup.TransformDefaults.prototype = Object.create(mixitup.StyleData.prototype);\n\n mixitup.TransformDefaults.prototype.constructor = mixitup.TransformDefaults;\n\n /**\n * @private\n * @static\n * @since 3.0.0\n * @type {mixitup.TransformDefaults}\n */\n\n mixitup.transformDefaults = new mixitup.TransformDefaults();\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.EventDetail = function() {\n this.state = null;\n this.futureState = null;\n this.instance = null;\n this.originalEvent = null;\n };\n\n /**\n * The `mixitup.Events` class contains all custom events dispatched by MixItUp at various\n * points within the lifecycle of a mixer operation.\n *\n * Each event is analogous to the callback function of the same name defined in\n * the `callbacks` configuration object, and is triggered immediately before it.\n *\n * Events are always triggered from the container element on which MixItUp is instantiated\n * upon.\n *\n * As with any event, registered event handlers receive the event object as a parameter\n * which includes a `detail` property containting references to the current `state`,\n * the `mixer` instance, and other event-specific properties described below.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */\n\n mixitup.Events = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * A custom event triggered immediately after any MixItUp operation is requested\n * and before animations have begun.\n *\n * The `mixStart` event also exposes a `futureState` property via the\n * `event.detail` object, which represents the final state of the mixer once\n * the requested operation has completed.\n *\n * @name mixStart\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */\n\n this.mixStart = null;\n\n /**\n * A custom event triggered when a MixItUp operation is requested while another\n * operation is in progress, and the animation queue is full, or queueing\n * is disabled.\n *\n * @name mixBusy\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */\n\n this.mixBusy = null;\n\n /**\n * A custom event triggered after any MixItUp operation has completed, and the\n * state has been updated.\n *\n * @name mixEnd\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */\n\n this.mixEnd = null;\n\n /**\n * A custom event triggered whenever a filter operation \"fails\", i.e. no targets\n * could be found matching the requested filter.\n *\n * @name mixFail\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */\n\n this.mixFail = null;\n\n /**\n * A custom event triggered whenever a MixItUp control is clicked, and before its\n * respective operation is requested.\n *\n * This event also exposes an `originalEvent` property via the `event.detail`\n * object, which holds a reference to the original click event.\n *\n * @name mixClick\n * @memberof mixitup.Events\n * @static\n * @type {CustomEvent}\n */\n\n this.mixClick = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Events);\n\n mixitup.Events.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.Events.prototype.constructor = mixitup.Events;\n\n /**\n * @private\n * @param {string} eventType\n * @param {Element} el\n * @param {object} detail\n * @param {Document} [doc]\n */\n\n mixitup.Events.prototype.fire = function(eventType, el, detail, doc) {\n var self = this,\n event = null,\n eventDetail = new mixitup.EventDetail();\n\n self.callActions('beforeFire', arguments);\n\n if (typeof self[eventType] === 'undefined') {\n throw new Error('Event type \"' + eventType + '\" not found.');\n }\n\n eventDetail.state = new mixitup.State();\n\n h.extend(eventDetail.state, detail.state);\n\n if (detail.futureState) {\n eventDetail.futureState = new mixitup.State();\n\n h.extend(eventDetail.futureState, detail.futureState);\n }\n\n eventDetail.instance = detail.instance;\n\n if (detail.originalEvent) {\n eventDetail.originalEvent = detail.originalEvent;\n }\n\n event = h.getCustomEvent(eventType, eventDetail, doc);\n\n self.callFilters('eventFire', event, arguments);\n\n el.dispatchEvent(event);\n };\n\n // Asign a singleton instance to `mixitup.events`:\n\n mixitup.events = new mixitup.Events();\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.QueueItem = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.args = [];\n this.instruction = null;\n this.triggerElement = null;\n this.deferred = null;\n this.isToggling = false;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.QueueItem);\n\n mixitup.QueueItem.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.QueueItem.prototype.constructor = mixitup.QueueItem;\n\n /**\n * The `mixitup.Mixer` class is used to hold discreet, user-configured\n * instances of MixItUp on a provided container element.\n *\n * Mixer instances are returned whenever the `mixitup()` factory function is called,\n * which expose a range of methods enabling API-based filtering, sorting,\n * insertion, removal and more.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */\n\n mixitup.Mixer = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.config = new mixitup.Config();\n\n this.id = '';\n\n this.isBusy = false;\n this.isToggling = false;\n this.incPadding = true;\n\n this.controls = [];\n this.targets = [];\n this.origOrder = [];\n this.cache = {};\n\n this.toggleArray = [];\n\n this.targetsMoved = 0;\n this.targetsImmovable = 0;\n this.targetsBound = 0;\n this.targetsDone = 0;\n\n this.staggerDuration = 0;\n this.effectsIn = null;\n this.effectsOut = null;\n this.transformIn = [];\n this.transformOut = [];\n this.queue = [];\n\n this.state = null;\n this.lastOperation = null;\n this.lastClicked = null;\n this.userCallback = null;\n this.userDeferred = null;\n\n this.dom = new mixitup.MixerDom();\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Mixer);\n\n mixitup.Mixer.prototype = Object.create(mixitup.Base.prototype);\n\n h.extend(mixitup.Mixer.prototype,\n /** @lends mixitup.Mixer */\n {\n constructor: mixitup.Mixer,\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} container\n * @param {HTMLElement} document\n * @param {string} id\n * @param {object} [config]\n */\n\n attach: function(container, document, id, config) {\n var self = this,\n target = null,\n i = -1;\n\n self.callActions('beforeAttach', arguments);\n\n self.id = id;\n\n if (config) {\n h.extend(self.config, config, true, true);\n }\n\n self.sanitizeConfig();\n\n self.cacheDom(container, document);\n\n if (self.config.layout.containerClassName) {\n h.addClass(self.dom.container, self.config.layout.containerClassName);\n }\n\n if (!mixitup.features.has.transitions) {\n self.config.animation.enable = false;\n }\n\n if (typeof window.console === 'undefined') {\n self.config.debug.showWarnings = false;\n }\n\n if (self.config.data.uidKey) {\n // If the dataset API is in use, force disable controls\n\n self.config.controls.enable = false;\n }\n\n self.indexTargets();\n\n self.state = self.getInitialState();\n\n for (i = 0; target = self.lastOperation.toHide[i]; i++) {\n target.hide();\n }\n\n if (self.config.controls.enable) {\n self.initControls();\n\n self.buildToggleArray(null, self.state);\n\n self.updateControls({\n filter: self.state.activeFilter,\n sort: self.state.activeSort\n });\n }\n\n self.parseEffects();\n\n self.callActions('afterAttach', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n sanitizeConfig: function() {\n var self = this;\n\n self.callActions('beforeSanitizeConfig', arguments);\n\n // Sanitize enum/string config options\n\n self.config.controls.scope = self.config.controls.scope.toLowerCase().trim();\n self.config.controls.toggleLogic = self.config.controls.toggleLogic.toLowerCase().trim();\n self.config.controls.toggleDefault = self.config.controls.toggleDefault.toLowerCase().trim();\n\n self.config.animation.effects = self.config.animation.effects.trim();\n\n self.callActions('afterSanitizeConfig', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {mixitup.State}\n */\n\n getInitialState: function() {\n var self = this,\n state = new mixitup.State(),\n operation = new mixitup.Operation();\n\n self.callActions('beforeGetInitialState', arguments);\n\n // Map initial values into a mock state object in order to construct an operation\n\n state.activeContainerClassName = self.config.layout.containerClassName;\n\n if (self.config.load.dataset) {\n // Dataset API\n\n if (!self.config.data.uidKey || typeof self.config.data.uidKey !== 'string') {\n throw new TypeError(mixitup.messages.errorConfigDataUidKeyNotSet());\n }\n\n operation.startDataset = operation.newDataset = state.activeDataset = self.config.load.dataset.slice();\n operation.startContainerClassName = operation.newContainerClassName = state.activeContainerClassName;\n operation.show = self.targets.slice();\n\n state = self.callFilters('stateGetInitialState', state, arguments);\n } else {\n // DOM API\n\n state.activeFilter = self.parseFilterArgs([self.config.load.filter]).command;\n state.activeSort = self.parseSortArgs([self.config.load.sort]).command;\n state.totalTargets = self.targets.length;\n\n state = self.callFilters('stateGetInitialState', state, arguments);\n\n if (\n state.activeSort.collection || state.activeSort.attribute ||\n state.activeSort.order === 'random' || state.activeSort.order === 'desc'\n ) {\n // Sorting on load\n\n operation.newSort = state.activeSort;\n\n self.sortOperation(operation);\n\n self.printSort(false, operation);\n\n self.targets = operation.newOrder;\n } else {\n operation.startOrder = operation.newOrder = self.targets;\n }\n\n operation.startFilter = operation.newFilter = state.activeFilter;\n operation.startSort = operation.newSort = state.activeSort;\n operation.startContainerClassName = operation.newContainerClassName = state.activeContainerClassName;\n\n if (operation.newFilter.selector === 'all') {\n operation.newFilter.selector = self.config.selectors.target;\n } else if (operation.newFilter.selector === 'none') {\n operation.newFilter.selector = '';\n }\n }\n\n operation = self.callFilters('operationGetInitialState', operation, [state]);\n\n self.lastOperation = operation;\n\n if (operation.newFilter) {\n self.filterOperation(operation);\n }\n\n state = self.buildState(operation);\n\n return state;\n },\n\n /**\n * Caches references of DOM elements neccessary for the mixer's functionality.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} el\n * @param {HTMLHtmlElement} document\n * @return {void}\n */\n\n cacheDom: function(el, document) {\n var self = this;\n\n self.callActions('beforeCacheDom', arguments);\n\n self.dom.document = document;\n self.dom.body = self.dom.document.querySelector('body');\n self.dom.container = el;\n self.dom.parent = el;\n\n self.callActions('afterCacheDom', arguments);\n },\n\n /**\n * Indexes all child elements of the mixer matching the `selectors.target`\n * selector, instantiating a mixitup.Target for each one.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n indexTargets: function() {\n var self = this,\n target = null,\n el = null,\n dataset = null,\n i = -1;\n\n self.callActions('beforeIndexTargets', arguments);\n\n self.dom.targets = self.config.layout.allowNestedTargets ?\n self.dom.container.querySelectorAll(self.config.selectors.target) :\n h.children(self.dom.container, self.config.selectors.target, self.dom.document);\n\n self.dom.targets = h.arrayFromList(self.dom.targets);\n\n self.targets = [];\n\n if ((dataset = self.config.load.dataset) && dataset.length !== self.dom.targets.length) {\n throw new Error(mixitup.messages.errorDatasetPrerenderedMismatch());\n }\n\n if (self.dom.targets.length) {\n for (i = 0; el = self.dom.targets[i]; i++) {\n target = new mixitup.Target();\n\n target.init(el, self, dataset ? dataset[i] : void(0));\n\n target.isInDom = true;\n\n self.targets.push(target);\n }\n\n self.dom.parent = self.dom.targets[0].parentElement === self.dom.container ?\n self.dom.container :\n self.dom.targets[0].parentElement;\n }\n\n self.origOrder = self.targets;\n\n self.callActions('afterIndexTargets', arguments);\n },\n\n initControls: function() {\n var self = this,\n definition = '',\n controlElements = null,\n el = null,\n parent = null,\n delagators = null,\n control = null,\n i = -1,\n j = -1;\n\n self.callActions('beforeInitControls', arguments);\n\n switch (self.config.controls.scope) {\n case 'local':\n parent = self.dom.container;\n\n break;\n case 'global':\n parent = self.dom.document;\n\n break;\n default:\n throw new Error(mixitup.messages.errorConfigInvalidControlsScope());\n }\n\n for (i = 0; definition = mixitup.controlDefinitions[i]; i++) {\n if (self.config.controls.live || definition.live) {\n if (definition.parent) {\n delagators = self.dom[definition.parent];\n\n if (!delagators || delagators.length < 0) continue;\n\n if (typeof delagators.length !== 'number') {\n delagators = [delagators];\n }\n } else {\n delagators = [parent];\n }\n\n for (j = 0; (el = delagators[j]); j++) {\n control = self.getControl(el, definition.type, definition.selector);\n\n self.controls.push(control);\n }\n } else {\n controlElements = parent.querySelectorAll(self.config.selectors.control + definition.selector);\n\n for (j = 0; (el = controlElements[j]); j++) {\n control = self.getControl(el, definition.type, '');\n\n if (!control) continue;\n\n self.controls.push(control);\n }\n }\n }\n\n self.callActions('afterInitControls', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {HTMLElement} el\n * @param {string} type\n * @param {string} selector\n * @return {mixitup.Control|null}\n */\n\n getControl: function(el, type, selector) {\n var self = this,\n control = null,\n i = -1;\n\n self.callActions('beforeGetControl', arguments);\n\n if (!selector) {\n // Static controls only\n\n for (i = 0; control = mixitup.controls[i]; i++) {\n if (control.el === el && control.isBound(self)) {\n // Control already bound to this mixer (as another type).\n\n // NB: This prevents duplicate controls from being registered where a selector\n // might collide, eg: \"[data-filter]\" and \"[data-filter][data-sort]\"\n\n return self.callFilters('controlGetControl', null, arguments);\n } else if (control.el === el && control.type === type && control.selector === selector) {\n // Another mixer is already using this control, add this mixer as a binding\n\n control.addBinding(self);\n\n return self.callFilters('controlGetControl', control, arguments);\n }\n }\n }\n\n // Create new control\n\n control = new mixitup.Control();\n\n control.init(el, type, selector);\n\n control.classNames.base = h.getClassname(self.config.classNames, type);\n control.classNames.active = h.getClassname(self.config.classNames, type, self.config.classNames.modifierActive);\n control.classNames.disabled = h.getClassname(self.config.classNames, type, self.config.classNames.modifierDisabled);\n\n // Add a reference to this mixer as a binding\n\n control.addBinding(self);\n\n return self.callFilters('controlGetControl', control, arguments);\n },\n\n /**\n * Creates a compound selector by joining the `toggleArray` value as per the\n * defined toggle logic.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @return {string}\n */\n\n getToggleSelector: function() {\n var self = this,\n delineator = self.config.controls.toggleLogic === 'or' ? ', ' : '',\n toggleSelector = '';\n\n self.callActions('beforeGetToggleSelector', arguments);\n\n self.toggleArray = h.clean(self.toggleArray);\n\n toggleSelector = self.toggleArray.join(delineator);\n\n if (toggleSelector === '') {\n toggleSelector = self.config.controls.toggleDefault;\n }\n\n return self.callFilters('selectorGetToggleSelector', toggleSelector, arguments);\n },\n\n /**\n * Breaks compound selector strings in an array of discreet selectors,\n * as per the active `controls.toggleLogic` configuration option. Accepts\n * either a dynamic command object, or a state object.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {object} [command]\n * @param {mixitup.State} [state]\n * @return {void}\n */\n\n buildToggleArray: function(command, state) {\n var self = this,\n activeFilterSelector = '';\n\n self.callActions('beforeBuildToggleArray', arguments);\n\n if (command && command.filter) {\n activeFilterSelector = command.filter.selector.replace(/\\s/g, '');\n } else if (state) {\n activeFilterSelector = state.activeFilter.selector.replace(/\\s/g, '');\n } else {\n return;\n }\n\n if (activeFilterSelector === self.config.selectors.target || activeFilterSelector === 'all') {\n activeFilterSelector = '';\n }\n\n if (self.config.controls.toggleLogic === 'or') {\n self.toggleArray = activeFilterSelector.split(',');\n } else {\n self.toggleArray = self.splitCompoundSelector(activeFilterSelector);\n }\n\n self.toggleArray = h.clean(self.toggleArray);\n\n self.callActions('afterBuildToggleArray', arguments);\n },\n\n /**\n * Takes a compound selector (e.g. `.cat-1.cat-2`, `[data-cat=\"1\"][data-cat=\"2\"]`)\n * and breaks into its individual selectors.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} compoundSelector\n * @return {string[]}\n */\n\n splitCompoundSelector: function(compoundSelector) {\n // Break at a `.` or `[`, capturing the delineator\n\n var partials = compoundSelector.split(/([\\.\\[])/g),\n toggleArray = [],\n selector = '',\n i = -1;\n\n if (partials[0] === '') {\n partials.shift();\n }\n\n for (i = 0; i < partials.length; i++) {\n if (i % 2 === 0) {\n selector = '';\n }\n\n selector += partials[i];\n\n if (i % 2 !== 0) {\n toggleArray.push(selector);\n }\n }\n\n return toggleArray;\n },\n\n /**\n * Updates controls to their active/inactive state based on the command or\n * current state of the mixer.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {object} command\n * @return {void}\n */\n\n updateControls: function(command) {\n var self = this,\n control = null,\n output = new mixitup.CommandMultimix(),\n i = -1;\n\n self.callActions('beforeUpdateControls', arguments);\n\n // Sanitise to defaults\n\n if (command.filter) {\n output.filter = command.filter.selector;\n } else {\n output.filter = self.state.activeFilter.selector;\n }\n\n if (command.sort) {\n output.sort = self.buildSortString(command.sort);\n } else {\n output.sort = self.buildSortString(self.state.activeSort);\n }\n\n if (output.filter === self.config.selectors.target) {\n output.filter = 'all';\n }\n\n if (output.filter === '') {\n output.filter = 'none';\n }\n\n h.freeze(output);\n\n for (i = 0; control = self.controls[i]; i++) {\n control.update(output, self.toggleArray);\n }\n\n self.callActions('afterUpdateControls', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.CommandSort} command\n * @return {string}\n */\n\n buildSortString: function(command) {\n var self = this;\n var output = '';\n\n output += command.sortString;\n\n if (command.next) {\n output += ' ' + self.buildSortString(command.next);\n }\n\n return output;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} command\n * @param {Operation} operation\n * @return {Promise.}\n */\n\n insertTargets: function(command, operation) {\n var self = this,\n nextSibling = null,\n insertionIndex = -1,\n frag = null,\n target = null,\n el = null,\n i = -1;\n\n self.callActions('beforeInsertTargets', arguments);\n\n if (typeof command.index === 'undefined') command.index = 0;\n\n nextSibling = self.getNextSibling(command.index, command.sibling, command.position);\n frag = self.dom.document.createDocumentFragment();\n\n if (nextSibling) {\n insertionIndex = h.index(nextSibling, self.config.selectors.target);\n } else {\n insertionIndex = self.targets.length;\n }\n\n if (command.collection) {\n for (i = 0; el = command.collection[i]; i++) {\n if (self.dom.targets.indexOf(el) > -1) {\n throw new Error(mixitup.messages.errorInsertPreexistingElement());\n }\n\n // Ensure elements are hidden when they are added to the DOM, so they can\n // be animated in gracefully\n\n el.style.display = 'none';\n\n frag.appendChild(el);\n frag.appendChild(self.dom.document.createTextNode(' '));\n\n if (!h.isElement(el, self.dom.document) || !el.matches(self.config.selectors.target)) continue;\n\n target = new mixitup.Target();\n\n target.init(el, self);\n\n target.isInDom = true;\n\n self.targets.splice(insertionIndex, 0, target);\n\n insertionIndex++;\n }\n\n self.dom.parent.insertBefore(frag, nextSibling);\n }\n\n // Since targets have been added, the original order must be updated\n\n operation.startOrder = self.origOrder = self.targets;\n\n self.callActions('afterInsertTargets', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Number} [index]\n * @param {Element} [sibling]\n * @param {string} [position]\n * @return {Element}\n */\n\n getNextSibling: function(index, sibling, position) {\n var self = this,\n element = null;\n\n index = Math.max(index, 0);\n\n if (sibling && position === 'before') {\n // Explicit sibling\n\n element = sibling;\n } else if (sibling && position === 'after') {\n // Explicit sibling\n\n element = sibling.nextElementSibling || null;\n } else if (self.targets.length > 0 && typeof index !== 'undefined') {\n // Index and targets exist\n\n element = (index < self.targets.length || !self.targets.length) ?\n self.targets[index].dom.el :\n self.targets[self.targets.length - 1].dom.el.nextElementSibling;\n } else if (self.targets.length === 0 && self.dom.parent.children.length > 0) {\n // No targets but other siblings\n\n if (self.config.layout.siblingAfter) {\n element = self.config.layout.siblingAfter;\n } else if (self.config.layout.siblingBefore) {\n element = self.config.layout.siblingBefore.nextElementSibling;\n } else {\n self.dom.parent.children[0];\n }\n } else {\n element === null;\n }\n\n return self.callFilters('elementGetNextSibling', element, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n filterOperation: function(operation) {\n var self = this,\n testResult = false,\n index = -1,\n action = '',\n target = null,\n i = -1;\n\n self.callActions('beforeFilterOperation', arguments);\n\n action = operation.newFilter.action;\n\n for (i = 0; target = operation.newOrder[i]; i++) {\n if (operation.newFilter.collection) {\n // show via collection\n\n testResult = operation.newFilter.collection.indexOf(target.dom.el) > -1;\n } else {\n // show via selector\n\n if (operation.newFilter.selector === '') {\n testResult = false;\n } else {\n testResult = target.dom.el.matches(operation.newFilter.selector);\n }\n }\n\n self.evaluateHideShow(testResult, target, action, operation);\n }\n\n if (operation.toRemove.length) {\n for (i = 0; target = operation.show[i]; i++) {\n if (operation.toRemove.indexOf(target) > -1) {\n // If any shown targets should be removed, move them into the toHide array\n\n operation.show.splice(i, 1);\n\n if ((index = operation.toShow.indexOf(target)) > -1) {\n operation.toShow.splice(index, 1);\n }\n\n operation.toHide.push(target);\n operation.hide.push(target);\n\n i--;\n }\n }\n }\n\n operation.matching = operation.show.slice();\n\n if (operation.show.length === 0 && operation.newFilter.selector !== '' && self.targets.length !== 0) {\n operation.hasFailed = true;\n }\n\n self.callActions('afterFilterOperation', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {boolean} testResult\n * @param {Element} target\n * @param {string} action\n * @param {Operation} operation\n * @return {void}\n */\n\n evaluateHideShow: function(testResult, target, action, operation) {\n var self = this,\n filteredTestResult = false,\n args = Array.prototype.slice.call(arguments, 1);\n\n filteredTestResult = self.callFilters('testResultEvaluateHideShow', testResult, args);\n\n self.callActions('beforeEvaluateHideShow', arguments);\n\n if (\n filteredTestResult === true && action === 'show' ||\n filteredTestResult === false && action === 'hide'\n ) {\n operation.show.push(target);\n\n !target.isShown && operation.toShow.push(target);\n } else {\n operation.hide.push(target);\n\n target.isShown && operation.toHide.push(target);\n }\n\n self.callActions('afterEvaluateHideShow', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n sortOperation: function(operation) {\n var self = this,\n newOrder = [],\n target = null,\n el = null,\n i = -1;\n\n self.callActions('beforeSortOperation', arguments);\n\n operation.startOrder = self.targets;\n\n if (operation.newSort.collection) {\n // Sort by collection\n\n newOrder = [];\n\n for (i = 0; (el = operation.newSort.collection[i]); i++) {\n if (self.dom.targets.indexOf(el) < 0) {\n throw new Error(mixitup.messages.errorSortNonExistentElement());\n }\n\n target = new mixitup.Target();\n\n target.init(el, self);\n\n target.isInDom = true;\n\n newOrder.push(target);\n }\n\n operation.newOrder = newOrder;\n } else if (operation.newSort.order === 'random') {\n // Sort random\n\n operation.newOrder = h.arrayShuffle(operation.startOrder);\n } else if (operation.newSort.attribute === '') {\n // Sort by default\n\n operation.newOrder = self.origOrder.slice();\n\n if (operation.newSort.order === 'desc') {\n operation.newOrder.reverse();\n }\n } else {\n // Sort by attribute\n\n operation.newOrder = operation.startOrder.slice();\n\n operation.newOrder.sort(function(a, b) {\n return self.compare(a, b, operation.newSort);\n });\n }\n\n if (h.isEqualArray(operation.newOrder, operation.startOrder)) {\n operation.willSort = false;\n }\n\n self.callActions('afterSortOperation', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {mixitup.Target} a\n * @param {mixitup.Target} b\n * @param {mixitup.CommandSort} command\n * @return {Number}\n */\n\n compare: function(a, b, command) {\n var self = this,\n order = command.order,\n attrA = self.getAttributeValue(a, command.attribute),\n attrB = self.getAttributeValue(b, command.attribute);\n\n if (isNaN(attrA * 1) || isNaN(attrB * 1)) {\n attrA = attrA.toLowerCase();\n attrB = attrB.toLowerCase();\n } else {\n attrA = attrA * 1;\n attrB = attrB * 1;\n }\n\n if (attrA < attrB) {\n return order === 'asc' ? -1 : 1;\n }\n\n if (attrA > attrB) {\n return order === 'asc' ? 1 : -1;\n }\n\n if (attrA === attrB && command.next) {\n return self.compare(a, b, command.next);\n }\n\n return 0;\n },\n\n /**\n * Reads the values of any data attributes present the provided target element\n * which match the current sort command.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Target} target\n * @param {string} [attribute]\n * @return {(String|Number)}\n */\n\n getAttributeValue: function(target, attribute) {\n var self = this,\n value = '';\n\n value = target.dom.el.getAttribute('data-' + attribute);\n\n if (value === null) {\n if (self.config.debug.showWarnings) {\n // Encourage users to assign values to all targets to avoid erroneous sorting\n // when types are mixed\n\n console.warn(mixitup.messages.warningInconsistentSortingAttributes({\n attribute: 'data-' + attribute\n }));\n }\n }\n\n // If an attribute is not present, return 0 as a safety value\n\n return self.callFilters('valueGetAttributeValue', value || 0, arguments);\n },\n\n /**\n * Inserts elements into the DOM in the appropriate\n * order using a document fragment for minimal\n * DOM thrashing\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {boolean} isResetting\n * @param {Operation} operation\n * @return {void}\n */\n\n printSort: function(isResetting, operation) {\n var self = this,\n startOrder = isResetting ? operation.newOrder : operation.startOrder,\n newOrder = isResetting ? operation.startOrder : operation.newOrder,\n nextSibling = startOrder.length ? startOrder[startOrder.length - 1].dom.el.nextElementSibling : null,\n frag = window.document.createDocumentFragment(),\n whitespace = null,\n target = null,\n el = null,\n i = -1;\n\n self.callActions('beforePrintSort', arguments);\n\n // Empty the container\n\n for (i = 0; target = startOrder[i]; i++) {\n el = target.dom.el;\n\n if (el.style.position === 'absolute') continue;\n\n h.removeWhitespace(el.previousSibling);\n\n el.parentElement.removeChild(el);\n }\n\n whitespace = nextSibling ? nextSibling.previousSibling : self.dom.parent.lastChild;\n\n if (whitespace && whitespace.nodeName === '#text') {\n h.removeWhitespace(whitespace);\n }\n\n for (i = 0; target = newOrder[i]; i++) {\n // Add targets into a document fragment\n\n el = target.dom.el;\n\n if (h.isElement(frag.lastChild)) {\n frag.appendChild(window.document.createTextNode(' '));\n }\n\n frag.appendChild(el);\n }\n\n // Insert the document fragment into the container\n // before any other non-target elements\n\n if (self.dom.parent.firstChild && self.dom.parent.firstChild !== nextSibling) {\n frag.insertBefore(window.document.createTextNode(' '), frag.childNodes[0]);\n }\n\n if (nextSibling) {\n frag.appendChild(window.document.createTextNode(' '));\n\n self.dom.parent.insertBefore(frag, nextSibling);\n } else {\n self.dom.parent.appendChild(frag);\n }\n\n self.callActions('afterPrintSort', arguments);\n },\n\n /**\n * Parses user-defined sort strings (i.e. `default:asc`) into sort commands objects.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} sortString\n * @param {mixitup.CommandSort} command\n * @return {mixitup.CommandSort}\n */\n\n parseSortString: function(sortString, command) {\n var self = this,\n rules = sortString.split(' '),\n current = command,\n rule = [],\n i = -1;\n\n // command.sortString = sortString;\n\n for (i = 0; i < rules.length; i++) {\n rule = rules[i].split(':');\n\n current.sortString = rules[i];\n current.attribute = h.dashCase(rule[0]);\n current.order = rule[1] || 'asc';\n\n switch (current.attribute) {\n case 'default':\n // treat \"default\" as sorting by no attribute\n\n current.attribute = '';\n\n break;\n case 'random':\n // treat \"random\" as an order not an attribute\n\n current.attribute = '';\n current.order = 'random';\n\n break;\n }\n\n if (!current.attribute || current.order === 'random') break;\n\n if (i < rules.length - 1) {\n // Embed reference to the next command\n\n current.next = new mixitup.CommandSort();\n\n h.freeze(current);\n\n current = current.next;\n }\n }\n\n return self.callFilters('commandsParseSort', command, arguments);\n },\n\n /**\n * Parses all effects out of the user-defined `animation.effects` string into\n * their respective properties and units.\n *\n * @private\n * @instance\n * @since 2.0.0\n * @return {void}\n */\n\n parseEffects: function() {\n var self = this,\n transformName = '',\n effectsIn = self.config.animation.effectsIn || self.config.animation.effects,\n effectsOut = self.config.animation.effectsOut || self.config.animation.effects;\n\n self.callActions('beforeParseEffects', arguments);\n\n self.effectsIn = new mixitup.StyleData();\n self.effectsOut = new mixitup.StyleData();\n self.transformIn = [];\n self.transformOut = [];\n\n self.effectsIn.opacity = self.effectsOut.opacity = 1;\n\n self.parseEffect('fade', effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect('fade', effectsOut, self.effectsOut, self.transformOut, true);\n\n for (transformName in mixitup.transformDefaults) {\n if (!(mixitup.transformDefaults[transformName] instanceof mixitup.TransformData)) {\n continue;\n }\n\n self.parseEffect(transformName, effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect(transformName, effectsOut, self.effectsOut, self.transformOut, true);\n }\n\n self.parseEffect('stagger', effectsIn, self.effectsIn, self.transformIn);\n self.parseEffect('stagger', effectsOut, self.effectsOut, self.transformOut, true);\n\n self.callActions('afterParseEffects', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {string} effectName\n * @param {string} effectString\n * @param {StyleData} effects\n * @param {String[]} transform\n * @param {boolean} [isOut]\n */\n\n parseEffect: function(effectName, effectString, effects, transform, isOut) {\n var self = this,\n re = /\\(([^)]+)\\)/,\n propIndex = -1,\n str = '',\n match = [],\n val = '',\n units = ['%', 'px', 'em', 'rem', 'vh', 'vw', 'deg'],\n unit = '',\n i = -1;\n\n self.callActions('beforeParseEffect', arguments);\n\n if (typeof effectString !== 'string') {\n throw new TypeError(mixitup.messages.errorConfigInvalidAnimationEffects());\n }\n\n if (effectString.indexOf(effectName) < 0) {\n // The effect is not present in the effects string\n\n if (effectName === 'stagger') {\n // Reset stagger to 0\n\n self.staggerDuration = 0;\n }\n\n return;\n }\n\n // The effect is present\n\n propIndex = effectString.indexOf(effectName + '(');\n\n if (propIndex > -1) {\n // The effect has a user defined value in parentheses\n\n // Extract from the first parenthesis to the end of string\n\n str = effectString.substring(propIndex);\n\n // Match any number of characters between \"(\" and \")\"\n\n match = re.exec(str);\n\n val = match[1];\n }\n\n switch (effectName) {\n case 'fade':\n effects.opacity = val ? parseFloat(val) : 0;\n\n break;\n case 'stagger':\n self.staggerDuration = val ? parseFloat(val) : 100;\n\n // TODO: Currently stagger must be applied globally, but\n // if seperate values are specified for in/out, this should\n // be respected\n\n break;\n default:\n // All other effects are transforms following the same structure\n\n if (isOut && self.config.animation.reverseOut && effectName !== 'scale') {\n effects[effectName].value =\n (val ? parseFloat(val) : mixitup.transformDefaults[effectName].value) * -1;\n } else {\n effects[effectName].value =\n (val ? parseFloat(val) : mixitup.transformDefaults[effectName].value);\n }\n\n if (val) {\n for (i = 0; unit = units[i]; i++) {\n if (val.indexOf(unit) > -1) {\n effects[effectName].unit = unit;\n\n break;\n }\n }\n } else {\n effects[effectName].unit = mixitup.transformDefaults[effectName].unit;\n }\n\n transform.push(\n effectName +\n '(' +\n effects[effectName].value +\n effects[effectName].unit +\n ')'\n );\n }\n\n self.callActions('afterParseEffect', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {State}\n */\n\n buildState: function(operation) {\n var self = this,\n state = new mixitup.State(),\n target = null,\n i = -1;\n\n self.callActions('beforeBuildState', arguments);\n\n // Map target elements into state arrays.\n // the real target objects should never be exposed\n\n for (i = 0; target = self.targets[i]; i++) {\n if (!operation.toRemove.length || operation.toRemove.indexOf(target) < 0) {\n state.targets.push(target.dom.el);\n }\n }\n\n for (i = 0; target = operation.matching[i]; i++) {\n state.matching.push(target.dom.el);\n }\n\n for (i = 0; target = operation.show[i]; i++) {\n state.show.push(target.dom.el);\n }\n\n for (i = 0; target = operation.hide[i]; i++) {\n if (!operation.toRemove.length || operation.toRemove.indexOf(target) < 0) {\n state.hide.push(target.dom.el);\n }\n }\n\n state.id = self.id;\n state.container = self.dom.container;\n state.activeFilter = operation.newFilter;\n state.activeSort = operation.newSort;\n state.activeDataset = operation.newDataset;\n state.activeContainerClassName = operation.newContainerClassName;\n state.hasFailed = operation.hasFailed;\n state.totalTargets = self.targets.length;\n state.totalShow = operation.show.length;\n state.totalHide = operation.hide.length;\n state.totalMatching = operation.matching.length;\n state.triggerElement = operation.triggerElement;\n\n return self.callFilters('stateBuildState', state, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {boolean} shouldAnimate\n * @param {Operation} operation\n * @return {void}\n */\n\n goMix: function(shouldAnimate, operation) {\n var self = this,\n deferred = null;\n\n self.callActions('beforeGoMix', arguments);\n\n // If the animation duration is set to 0ms,\n // or no effects specified,\n // or the container is hidden\n // then abort animation\n\n if (\n !self.config.animation.duration || !self.config.animation.effects || !h.isVisible(self.dom.container)\n ) {\n shouldAnimate = false;\n }\n\n if (\n !operation.toShow.length &&\n !operation.toHide.length &&\n !operation.willSort &&\n !operation.willChangeLayout\n ) {\n // If nothing to show or hide, and not sorting or\n // changing layout\n\n shouldAnimate = false;\n }\n\n if (\n !operation.startState.show.length &&\n !operation.show.length\n ) {\n // If nothing currently shown, nothing to show\n\n shouldAnimate = false;\n }\n\n mixitup.events.fire('mixStart', self.dom.container, {\n state: operation.startState,\n futureState: operation.newState,\n instance: self\n }, self.dom.document);\n\n if (typeof self.config.callbacks.onMixStart === 'function') {\n self.config.callbacks.onMixStart.call(\n self.dom.container,\n operation.startState,\n operation.newState,\n self\n );\n }\n\n h.removeClass(self.dom.container, h.getClassname(self.config.classNames, 'container', self.config.classNames.modifierFailed));\n\n if (!self.userDeferred) {\n // Queue empty, no pending operations\n\n deferred = self.userDeferred = h.defer(mixitup.libraries);\n } else {\n // Use existing deferred\n\n deferred = self.userDeferred;\n }\n\n self.isBusy = true;\n\n if (!shouldAnimate || !mixitup.features.has.transitions) {\n // Abort\n\n if (self.config.debug.fauxAsync) {\n setTimeout(function() {\n self.cleanUp(operation);\n }, self.config.animation.duration);\n } else {\n self.cleanUp(operation);\n }\n\n return self.callFilters('promiseGoMix', deferred.promise, arguments);\n }\n\n // If we should animate and the platform supports transitions, go for it\n\n if (window.pageYOffset !== operation.docState.scrollTop) {\n window.scrollTo(operation.docState.scrollLeft, operation.docState.scrollTop);\n }\n\n if (self.config.animation.applyPerspective) {\n self.dom.parent.style[mixitup.features.perspectiveProp] =\n self.config.animation.perspectiveDistance;\n\n self.dom.parent.style[mixitup.features.perspectiveOriginProp] =\n self.config.animation.perspectiveOrigin;\n }\n\n if (\n self.config.animation.animateResizeContainer &&\n operation.startHeight !== operation.newHeight &&\n operation.viewportDeltaY !== operation.startHeight - operation.newHeight\n ) {\n self.dom.parent.style.height = operation.startHeight + 'px';\n }\n\n if (\n self.config.animation.animateResizeContainer &&\n operation.startWidth !== operation.newWidth &&\n operation.viewportDeltaX !== operation.startWidth - operation.newWidth\n ) {\n self.dom.parent.style.width = operation.startWidth + 'px';\n }\n\n if (operation.startHeight === operation.newHeight) {\n self.dom.parent.style.height = operation.startHeight + 'px';\n }\n\n if (operation.startWidth === operation.newWidth) {\n self.dom.parent.style.width = operation.startWidth + 'px';\n }\n\n if (operation.startHeight === operation.newHeight && operation.startWidth === operation.newWidth) {\n self.dom.parent.style.overflow = 'hidden';\n }\n\n requestAnimationFrame(function() {\n self.moveTargets(operation);\n });\n\n return self.callFilters('promiseGoMix', deferred.promise, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n getStartMixData: function(operation) {\n var self = this,\n parentStyle = window.getComputedStyle(self.dom.parent),\n parentRect = self.dom.parent.getBoundingClientRect(),\n target = null,\n data = {},\n i = -1,\n boxSizing = parentStyle[mixitup.features.boxSizingProp];\n\n self.incPadding = (boxSizing === 'border-box');\n\n self.callActions('beforeGetStartMixData', arguments);\n\n for (i = 0; target = operation.show[i]; i++) {\n data = target.getPosData();\n\n operation.showPosData[i] = {\n startPosData: data\n };\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n data = target.getPosData();\n\n operation.toHidePosData[i] = {\n startPosData: data\n };\n }\n\n operation.startX = parentRect.left;\n operation.startY = parentRect.top;\n\n operation.startHeight = self.incPadding ?\n parentRect.height :\n parentRect.height -\n parseFloat(parentStyle.paddingTop) -\n parseFloat(parentStyle.paddingBottom) -\n parseFloat(parentStyle.borderTop) -\n parseFloat(parentStyle.borderBottom);\n\n operation.startWidth = self.incPadding ?\n parentRect.width :\n parentRect.width -\n parseFloat(parentStyle.paddingLeft) -\n parseFloat(parentStyle.paddingRight) -\n parseFloat(parentStyle.borderLeft) -\n parseFloat(parentStyle.borderRight);\n\n self.callActions('afterGetStartMixData', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n setInter: function(operation) {\n var self = this,\n target = null,\n i = -1;\n\n self.callActions('beforeSetInter', arguments);\n\n // Prevent scrollbar flicker on non-inertial scroll platforms by clamping height/width\n\n if (self.config.animation.clampHeight) {\n self.dom.parent.style.height = operation.startHeight + 'px';\n self.dom.parent.style.overflow = 'hidden';\n }\n\n if (self.config.animation.clampWidth) {\n self.dom.parent.style.width = operation.startWidth + 'px';\n self.dom.parent.style.overflow = 'hidden';\n }\n\n for (i = 0; target = operation.toShow[i]; i++) {\n target.show();\n }\n\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.startContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n\n self.callActions('afterSetInter', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n getInterMixData: function(operation) {\n var self = this,\n target = null,\n i = -1;\n\n self.callActions('beforeGetInterMixData', arguments);\n\n for (i = 0; target = operation.show[i]; i++) {\n operation.showPosData[i].interPosData = target.getPosData();\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n operation.toHidePosData[i].interPosData = target.getPosData();\n }\n\n self.callActions('afterGetInterMixData', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n setFinal: function(operation) {\n var self = this,\n target = null,\n i = -1;\n\n self.callActions('beforeSetFinal', arguments);\n\n operation.willSort && self.printSort(false, operation);\n\n for (i = 0; target = operation.toHide[i]; i++) {\n target.hide();\n }\n\n self.callActions('afterSetFinal', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n getFinalMixData: function(operation) {\n var self = this,\n parentStyle = null,\n parentRect = null,\n target = null,\n i = -1;\n\n self.callActions('beforeGetFinalMixData', arguments);\n\n for (i = 0; target = operation.show[i]; i++) {\n operation.showPosData[i].finalPosData = target.getPosData();\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n operation.toHidePosData[i].finalPosData = target.getPosData();\n }\n\n // Remove clamping\n\n if (self.config.animation.clampHeight || self.config.animation.clampWidth) {\n self.dom.parent.style.height =\n self.dom.parent.style.width =\n self.dom.parent.style.overflow = '';\n }\n\n if (!self.incPadding) {\n parentStyle = window.getComputedStyle(self.dom.parent);\n }\n\n parentRect = self.dom.parent.getBoundingClientRect();\n\n operation.newX = parentRect.left;\n operation.newY = parentRect.top;\n\n operation.newHeight = self.incPadding ?\n parentRect.height :\n parentRect.height -\n parseFloat(parentStyle.paddingTop) -\n parseFloat(parentStyle.paddingBottom) -\n parseFloat(parentStyle.borderTop) -\n parseFloat(parentStyle.borderBottom);\n\n operation.newWidth = self.incPadding ?\n parentRect.width :\n parentRect.width -\n parseFloat(parentStyle.paddingLeft) -\n parseFloat(parentStyle.paddingRight) -\n parseFloat(parentStyle.borderLeft) -\n parseFloat(parentStyle.borderRight);\n\n operation.viewportDeltaX = operation.docState.viewportWidth - this.dom.document.documentElement.clientWidth;\n operation.viewportDeltaY = operation.docState.viewportHeight - this.dom.document.documentElement.clientHeight;\n\n if (operation.willSort) {\n self.printSort(true, operation);\n }\n\n for (i = 0; target = operation.toShow[i]; i++) {\n target.hide();\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n target.show();\n }\n\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.newContainerClassName);\n h.addClass(self.dom.container, self.config.layout.containerClassName);\n }\n\n self.callActions('afterGetFinalMixData', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Operation} operation\n */\n\n getTweenData: function(operation) {\n var self = this,\n target = null,\n posData = null,\n effectNames = Object.getOwnPropertyNames(self.effectsIn),\n effectName = '',\n effect = null,\n widthChange = -1,\n heightChange = -1,\n i = -1,\n j = -1;\n\n self.callActions('beforeGetTweenData', arguments);\n\n for (i = 0; target = operation.show[i]; i++) {\n posData = operation.showPosData[i];\n posData.posIn = new mixitup.StyleData();\n posData.posOut = new mixitup.StyleData();\n posData.tweenData = new mixitup.StyleData();\n\n // Process x and y\n\n if (target.isShown) {\n posData.posIn.x = posData.startPosData.x - posData.interPosData.x;\n posData.posIn.y = posData.startPosData.y - posData.interPosData.y;\n } else {\n posData.posIn.x = posData.posIn.y = 0;\n }\n\n posData.posOut.x = posData.finalPosData.x - posData.interPosData.x;\n posData.posOut.y = posData.finalPosData.y - posData.interPosData.y;\n\n // Process opacity\n\n posData.posIn.opacity = target.isShown ? 1 : self.effectsIn.opacity;\n posData.posOut.opacity = 1;\n posData.tweenData.opacity = posData.posOut.opacity - posData.posIn.opacity;\n\n // Adjust x and y if not nudging\n\n if (!target.isShown && !self.config.animation.nudge) {\n posData.posIn.x = posData.posOut.x;\n posData.posIn.y = posData.posOut.y;\n }\n\n posData.tweenData.x = posData.posOut.x - posData.posIn.x;\n posData.tweenData.y = posData.posOut.y - posData.posIn.y;\n\n // Process width, height, and margins\n\n if (self.config.animation.animateResizeTargets) {\n posData.posIn.width = posData.startPosData.width;\n posData.posIn.height = posData.startPosData.height;\n\n // \"||\" Prevents width/height change from including 0 width/height if hiding or showing\n\n widthChange = (posData.startPosData.width || posData.finalPosData.width) - posData.interPosData.width;\n\n posData.posIn.marginRight = posData.startPosData.marginRight - widthChange;\n\n heightChange = (posData.startPosData.height || posData.finalPosData.height) - posData.interPosData.height;\n\n posData.posIn.marginBottom = posData.startPosData.marginBottom - heightChange;\n\n posData.posOut.width = posData.finalPosData.width;\n posData.posOut.height = posData.finalPosData.height;\n\n widthChange = (posData.finalPosData.width || posData.startPosData.width) - posData.interPosData.width;\n\n posData.posOut.marginRight = posData.finalPosData.marginRight - widthChange;\n\n heightChange = (posData.finalPosData.height || posData.startPosData.height) - posData.interPosData.height;\n\n posData.posOut.marginBottom = posData.finalPosData.marginBottom - heightChange;\n\n posData.tweenData.width = posData.posOut.width - posData.posIn.width;\n posData.tweenData.height = posData.posOut.height - posData.posIn.height;\n posData.tweenData.marginRight = posData.posOut.marginRight - posData.posIn.marginRight;\n posData.tweenData.marginBottom = posData.posOut.marginBottom - posData.posIn.marginBottom;\n }\n\n // Process transforms\n\n for (j = 0; effectName = effectNames[j]; j++) {\n effect = self.effectsIn[effectName];\n\n if (!(effect instanceof mixitup.TransformData) || !effect.value) continue;\n\n posData.posIn[effectName].value = effect.value;\n posData.posOut[effectName].value = 0;\n\n posData.tweenData[effectName].value =\n posData.posOut[effectName].value - posData.posIn[effectName].value;\n\n posData.posIn[effectName].unit =\n posData.posOut[effectName].unit =\n posData.tweenData[effectName].unit =\n effect.unit;\n }\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n posData = operation.toHidePosData[i];\n posData.posIn = new mixitup.StyleData();\n posData.posOut = new mixitup.StyleData();\n posData.tweenData = new mixitup.StyleData();\n\n // Process x and y\n\n posData.posIn.x = target.isShown ? posData.startPosData.x - posData.interPosData.x : 0;\n posData.posIn.y = target.isShown ? posData.startPosData.y - posData.interPosData.y : 0;\n posData.posOut.x = self.config.animation.nudge ? 0 : posData.posIn.x;\n posData.posOut.y = self.config.animation.nudge ? 0 : posData.posIn.y;\n posData.tweenData.x = posData.posOut.x - posData.posIn.x;\n posData.tweenData.y = posData.posOut.y - posData.posIn.y;\n\n // Process width, height, and margins\n\n if (self.config.animation.animateResizeTargets) {\n posData.posIn.width = posData.startPosData.width;\n posData.posIn.height = posData.startPosData.height;\n\n widthChange = posData.startPosData.width - posData.interPosData.width;\n\n posData.posIn.marginRight = posData.startPosData.marginRight - widthChange;\n\n heightChange = posData.startPosData.height - posData.interPosData.height;\n\n posData.posIn.marginBottom = posData.startPosData.marginBottom - heightChange;\n }\n\n // Process opacity\n\n posData.posIn.opacity = 1;\n posData.posOut.opacity = self.effectsOut.opacity;\n posData.tweenData.opacity = posData.posOut.opacity - posData.posIn.opacity;\n\n // Process transforms\n\n for (j = 0; effectName = effectNames[j]; j++) {\n effect = self.effectsOut[effectName];\n\n if (!(effect instanceof mixitup.TransformData) || !effect.value) continue;\n\n posData.posIn[effectName].value = 0;\n posData.posOut[effectName].value = effect.value;\n\n posData.tweenData[effectName].value =\n posData.posOut[effectName].value - posData.posIn[effectName].value;\n\n posData.posIn[effectName].unit =\n posData.posOut[effectName].unit =\n posData.tweenData[effectName].unit =\n effect.unit;\n }\n }\n\n self.callActions('afterGetTweenData', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n moveTargets: function(operation) {\n var self = this,\n target = null,\n moveData = null,\n posData = null,\n statusChange = '',\n willTransition = false,\n staggerIndex = -1,\n i = -1,\n checkProgress = self.checkProgress.bind(self);\n\n self.callActions('beforeMoveTargets', arguments);\n\n // TODO: this is an extra loop in addition to the calcs\n // done in getOperation, could some of this be done there?\n\n for (i = 0; target = operation.show[i]; i++) {\n moveData = new mixitup.IMoveData();\n posData = operation.showPosData[i];\n\n statusChange = target.isShown ? 'none' : 'show';\n\n willTransition = self.willTransition(\n statusChange,\n operation.hasEffect,\n posData.posIn,\n posData.posOut\n );\n\n if (willTransition) {\n // Prevent non-transitioning targets from incrementing the staggerIndex\n\n staggerIndex++;\n }\n\n target.show();\n\n moveData.posIn = posData.posIn;\n moveData.posOut = posData.posOut;\n moveData.statusChange = statusChange;\n moveData.staggerIndex = staggerIndex;\n moveData.operation = operation;\n moveData.callback = willTransition ? checkProgress : null;\n\n target.move(moveData);\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n posData = operation.toHidePosData[i];\n moveData = new mixitup.IMoveData();\n\n statusChange = 'hide';\n\n willTransition = self.willTransition(statusChange, posData.posIn, posData.posOut);\n\n moveData.posIn = posData.posIn;\n moveData.posOut = posData.posOut;\n moveData.statusChange = statusChange;\n moveData.staggerIndex = i;\n moveData.operation = operation;\n moveData.callback = willTransition ? checkProgress : null;\n\n target.move(moveData);\n }\n\n if (self.config.animation.animateResizeContainer) {\n self.dom.parent.style[mixitup.features.transitionProp] =\n 'height ' + self.config.animation.duration + 'ms ease, ' +\n 'width ' + self.config.animation.duration + 'ms ease ';\n\n requestAnimationFrame(function() {\n if (\n operation.startHeight !== operation.newHeight &&\n operation.viewportDeltaY !== operation.startHeight - operation.newHeight\n ) {\n self.dom.parent.style.height = operation.newHeight + 'px';\n }\n\n if (\n operation.startWidth !== operation.newWidth &&\n operation.viewportDeltaX !== operation.startWidth - operation.newWidth\n ) {\n self.dom.parent.style.width = operation.newWidth + 'px';\n }\n });\n }\n\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, self.config.layout.ContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n\n self.callActions('afterMoveTargets', arguments);\n },\n\n /**\n * @private\n * @instance\n * @return {boolean}\n */\n\n hasEffect: function() {\n var self = this,\n EFFECTABLES = [\n 'scale',\n 'translateX', 'translateY', 'translateZ',\n 'rotateX', 'rotateY', 'rotateZ'\n ],\n effectName = '',\n effect = null,\n result = false,\n value = -1,\n i = -1;\n\n if (self.effectsIn.opacity !== 1) {\n return self.callFilters('resultHasEffect', true, arguments);\n }\n\n for (i = 0; effectName = EFFECTABLES[i]; i++) {\n effect = self.effectsIn[effectName];\n value = (typeof effect && effect.value !== 'undefined') ?\n effect.value : effect;\n\n if (value !== 0) {\n result = true;\n\n break;\n }\n }\n\n return self.callFilters('resultHasEffect', result, arguments);\n },\n\n /**\n * Determines if a target element will transition in\n * some fasion and therefore requires binding of\n * transitionEnd\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} statusChange\n * @param {boolean} hasEffect\n * @param {StyleData} posIn\n * @param {StyleData} posOut\n * @return {boolean}\n */\n\n willTransition: function(statusChange, hasEffect, posIn, posOut) {\n var self = this,\n result = false;\n\n if (!h.isVisible(self.dom.container)) {\n // If the container is not visible, the transitionEnd\n // event will not occur and MixItUp will hang\n\n result = false;\n } else if (\n (statusChange !== 'none' && hasEffect) ||\n posIn.x !== posOut.x ||\n posIn.y !== posOut.y\n ) {\n // If opacity and/or translate will change\n\n result = true;\n } else if (self.config.animation.animateResizeTargets) {\n // Check if width, height or margins will change\n\n result = (\n posIn.width !== posOut.width ||\n posIn.height !== posOut.height ||\n posIn.marginRight !== posOut.marginRight ||\n posIn.marginTop !== posOut.marginTop\n );\n } else {\n result = false;\n }\n\n return self.callFilters('resultWillTransition', result, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n checkProgress: function(operation) {\n var self = this;\n\n self.targetsDone++;\n\n if (self.targetsBound === self.targetsDone) {\n self.cleanUp(operation);\n }\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Operation} operation\n * @return {void}\n */\n\n cleanUp: function(operation) {\n var self = this,\n target = null,\n whitespaceBefore = null,\n whitespaceAfter = null,\n nextInQueue = null,\n i = -1;\n\n self.callActions('beforeCleanUp', arguments);\n\n self.targetsMoved =\n self.targetsImmovable =\n self.targetsBound =\n self.targetsDone = 0;\n\n for (i = 0; target = operation.show[i]; i++) {\n target.cleanUp();\n\n target.show();\n }\n\n for (i = 0; target = operation.toHide[i]; i++) {\n target.cleanUp();\n\n target.hide();\n }\n\n if (operation.willSort) {\n self.printSort(false, operation);\n }\n\n // Remove any styles applied to the parent container\n\n self.dom.parent.style[mixitup.features.transitionProp] =\n self.dom.parent.style.height =\n self.dom.parent.style.width =\n self.dom.parent.style.overflow =\n self.dom.parent.style[mixitup.features.perspectiveProp] =\n self.dom.parent.style[mixitup.features.perspectiveOriginProp] = '';\n\n if (operation.willChangeLayout) {\n h.removeClass(self.dom.container, operation.startContainerClassName);\n h.addClass(self.dom.container, operation.newContainerClassName);\n }\n\n if (operation.toRemove.length) {\n for (i = 0; target = self.targets[i]; i++) {\n if (operation.toRemove.indexOf(target) > -1) {\n if (\n (whitespaceBefore = target.dom.el.previousSibling) && whitespaceBefore.nodeName === '#text' &&\n (whitespaceAfter = target.dom.el.nextSibling) && whitespaceAfter.nodeName === '#text'\n ) {\n h.removeWhitespace(whitespaceBefore);\n }\n\n if (!operation.willSort) {\n // NB: Sorting will remove targets as a bi-product of `printSort()`\n\n self.dom.parent.removeChild(target.dom.el);\n }\n\n self.targets.splice(i, 1);\n\n target.isInDom = false;\n\n i--;\n }\n }\n\n // Since targets have been removed, the original order must be updated\n\n self.origOrder = self.targets;\n }\n\n if (operation.willSort) {\n self.targets = operation.newOrder;\n }\n\n self.state = operation.newState;\n self.lastOperation = operation;\n\n self.dom.targets = self.state.targets;\n\n // mixEnd\n\n mixitup.events.fire('mixEnd', self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n\n if (typeof self.config.callbacks.onMixEnd === 'function') {\n self.config.callbacks.onMixEnd.call(self.dom.container, self.state, self);\n }\n\n if (operation.hasFailed) {\n // mixFail\n\n mixitup.events.fire('mixFail', self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n\n if (typeof self.config.callbacks.onMixFail === 'function') {\n self.config.callbacks.onMixFail.call(self.dom.container, self.state, self);\n }\n\n h.addClass(self.dom.container, h.getClassname(self.config.classNames, 'container', self.config.classNames.modifierFailed));\n }\n\n // User-defined callback function\n\n if (typeof self.userCallback === 'function') {\n self.userCallback.call(self.dom.container, self.state, self);\n }\n\n if (typeof self.userDeferred.resolve === 'function') {\n self.userDeferred.resolve(self.state);\n }\n\n self.userCallback = null;\n self.userDeferred = null;\n self.lastClicked = null;\n self.isToggling = false;\n self.isBusy = false;\n\n if (self.queue.length) {\n self.callActions('beforeReadQueueCleanUp', arguments);\n\n nextInQueue = self.queue.shift();\n\n // Update non-public API properties stored in queue\n\n self.userDeferred = nextInQueue.deferred;\n self.isToggling = nextInQueue.isToggling;\n self.lastClicked = nextInQueue.triggerElement;\n\n if (nextInQueue.instruction.command instanceof mixitup.CommandMultimix) {\n self.multimix.apply(self, nextInQueue.args);\n } else {\n self.dataset.apply(self, nextInQueue.args);\n }\n }\n\n self.callActions('afterCleanUp', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseMultimixArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandMultimix();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n if (typeof arg === 'object') {\n h.extend(instruction.command, arg);\n } else if (typeof arg === 'boolean') {\n instruction.animate = arg;\n } else if (typeof arg === 'function') {\n instruction.callback = arg;\n }\n }\n\n // Coerce arbitrary command arguments into typed command objects\n\n if (instruction.command.insert && !(instruction.command.insert instanceof mixitup.CommandInsert)) {\n instruction.command.insert = self.parseInsertArgs([instruction.command.insert]).command;\n }\n\n if (instruction.command.remove && !(instruction.command.remove instanceof mixitup.CommandRemove)) {\n instruction.command.remove = self.parseRemoveArgs([instruction.command.remove]).command;\n }\n\n if (instruction.command.filter && !(instruction.command.filter instanceof mixitup.CommandFilter)) {\n instruction.command.filter = self.parseFilterArgs([instruction.command.filter]).command;\n }\n\n if (instruction.command.sort && !(instruction.command.sort instanceof mixitup.CommandSort)) {\n instruction.command.sort = self.parseSortArgs([instruction.command.sort]).command;\n }\n\n if (instruction.command.changeLayout && !(instruction.command.changeLayout instanceof mixitup.CommandChangeLayout)) {\n instruction.command.changeLayout = self.parseChangeLayoutArgs([instruction.command.changeLayout]).command;\n }\n\n instruction = self.callFilters('instructionParseMultimixArgs', instruction, arguments);\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseFilterArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandFilter();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (typeof arg === 'string') {\n // Selector\n\n instruction.command.selector = arg;\n } else if (arg === null) {\n instruction.command.collection = [];\n } else if (typeof arg === 'object' && h.isElement(arg, self.dom.document)) {\n // Single element\n\n instruction.command.collection = [arg];\n } else if (typeof arg === 'object' && typeof arg.length !== 'undefined') {\n // Multiple elements in array, NodeList or jQuery collection\n\n instruction.command.collection = h.arrayFromList(arg);\n } else if (typeof arg === 'object') {\n // Filter command\n\n h.extend(instruction.command, arg);\n } else if (typeof arg === 'boolean') {\n instruction.animate = arg;\n } else if (typeof arg === 'function') {\n instruction.callback = arg;\n }\n }\n\n if (instruction.command.selector && instruction.command.collection) {\n throw new Error(mixitup.messages.errorFilterInvalidArguments());\n }\n\n instruction = self.callFilters('instructionParseFilterArgs', instruction, arguments);\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n parseSortArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n sortString = '',\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandSort();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n switch (typeof arg) {\n case 'string':\n // Sort string\n\n sortString = arg;\n\n break;\n case 'object':\n // Array of element references\n\n if (arg.length) {\n instruction.command.collection = h.arrayFromList(arg);\n }\n\n break;\n case 'boolean':\n instruction.animate = arg;\n\n break;\n case 'function':\n instruction.callback = arg;\n\n break;\n }\n }\n\n if (sortString) {\n instruction.command = self.parseSortString(sortString, instruction.command);\n }\n\n instruction = self.callFilters('instructionParseSortArgs', instruction, arguments);\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 2.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseInsertArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandInsert();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n if (typeof arg === 'number') {\n // Insert index\n\n instruction.command.index = arg;\n } else if (typeof arg === 'string' && ['before', 'after'].indexOf(arg) > -1) {\n // 'before'/'after'\n\n instruction.command.position = arg;\n } else if (typeof arg === 'string') {\n // Markup\n\n instruction.command.collection =\n h.arrayFromList(h.createElement(arg).childNodes);\n } else if (typeof arg === 'object' && h.isElement(arg, self.dom.document)) {\n // Single element\n\n !instruction.command.collection.length ?\n (instruction.command.collection = [arg]) :\n (instruction.command.sibling = arg);\n } else if (typeof arg === 'object' && arg.length) {\n // Multiple elements in array or jQuery collection\n\n !instruction.command.collection.length ?\n (instruction.command.collection = arg) :\n instruction.command.sibling = arg[0];\n } else if (typeof arg === 'object' && arg.childNodes && arg.childNodes.length) {\n // Document fragment\n\n !instruction.command.collection.length ?\n instruction.command.collection = h.arrayFromList(arg.childNodes) :\n instruction.command.sibling = arg.childNodes[0];\n } else if (typeof arg === 'object') {\n // Insert command\n\n h.extend(instruction.command, arg);\n } else if (typeof arg === 'boolean') {\n instruction.animate = arg;\n } else if (typeof arg === 'function') {\n instruction.callback = arg;\n }\n }\n\n if (instruction.command.index && instruction.command.sibling) {\n throw new Error(mixitup.messages.errorInsertInvalidArguments());\n }\n\n if (!instruction.command.collection.length && self.config.debug.showWarnings) {\n console.warn(mixitup.messages.warningInsertNoElements());\n }\n\n instruction = self.callFilters('instructionParseInsertArgs', instruction, arguments);\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseRemoveArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n target = null,\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandRemove();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n switch (typeof arg) {\n case 'number':\n if (self.targets[arg]) {\n instruction.command.targets[0] = self.targets[arg];\n }\n\n break;\n case 'string':\n instruction.command.collection = h.arrayFromList(self.dom.parent.querySelectorAll(arg));\n\n break;\n case 'object':\n if (arg && arg.length) {\n instruction.command.collection = arg;\n } else if (h.isElement(arg, self.dom.document)) {\n instruction.command.collection = [arg];\n } else {\n // Remove command\n\n h.extend(instruction.command, arg);\n }\n\n break;\n case 'boolean':\n instruction.animate = arg;\n\n break;\n case 'function':\n instruction.callback = arg;\n\n break;\n }\n }\n\n if (instruction.command.collection.length) {\n for (i = 0; target = self.targets[i]; i++) {\n if (instruction.command.collection.indexOf(target.dom.el) > -1) {\n instruction.command.targets.push(target);\n }\n }\n }\n\n if (!instruction.command.targets.length && self.config.debug.showWarnings) {\n console.warn(mixitup.messages.warningRemoveNoElements());\n }\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseDatasetArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandDataset();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n switch (typeof arg) {\n case 'object':\n if (Array.isArray(arg) || typeof arg.length === 'number') {\n instruction.command.dataset = arg;\n } else {\n // Change layout command\n\n h.extend(instruction.command, arg);\n }\n\n break;\n case 'boolean':\n instruction.animate = arg;\n\n break;\n case 'function':\n instruction.callback = arg;\n\n break;\n }\n }\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array<*>} args\n * @return {mixitup.UserInstruction}\n */\n\n parseChangeLayoutArgs: function(args) {\n var self = this,\n instruction = new mixitup.UserInstruction(),\n arg = null,\n i = -1;\n\n instruction.animate = self.config.animation.enable;\n instruction.command = new mixitup.CommandChangeLayout();\n\n for (i = 0; i < args.length; i++) {\n arg = args[i];\n\n if (arg === null) continue;\n\n switch (typeof arg) {\n case 'string':\n instruction.command.containerClassName = arg;\n\n break;\n case 'object':\n // Change layout command\n\n h.extend(instruction.command, arg);\n\n break;\n case 'boolean':\n instruction.animate = arg;\n\n break;\n case 'function':\n instruction.callback = arg;\n\n break;\n }\n }\n\n h.freeze(instruction);\n\n return instruction;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.QueueItem} queueItem\n * @return {Promise.}\n */\n\n queueMix: function(queueItem) {\n var self = this,\n deferred = null,\n toggleSelector = '';\n\n self.callActions('beforeQueueMix', arguments);\n\n deferred = h.defer(mixitup.libraries);\n\n if (self.config.animation.queue && self.queue.length < self.config.animation.queueLimit) {\n queueItem.deferred = deferred;\n\n self.queue.push(queueItem);\n\n // Keep controls in sync with user interactions. Mixer will catch up as it drains the queue.\n\n if (self.config.controls.enable) {\n if (self.isToggling) {\n self.buildToggleArray(queueItem.instruction.command);\n\n toggleSelector = self.getToggleSelector();\n\n self.updateControls({\n filter: {\n selector: toggleSelector\n }\n });\n } else {\n self.updateControls(queueItem.instruction.command);\n }\n }\n } else {\n if (self.config.debug.showWarnings) {\n console.warn(mixitup.messages.warningMultimixInstanceQueueFull());\n }\n\n deferred.resolve(self.state);\n\n mixitup.events.fire('mixBusy', self.dom.container, {\n state: self.state,\n instance: self\n }, self.dom.document);\n\n if (typeof self.config.callbacks.onMixBusy === 'function') {\n self.config.callbacks.onMixBusy.call(self.dom.container, self.state, self);\n }\n }\n\n return self.callFilters('promiseQueueMix', deferred.promise, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Array.} newDataset\n * @return {Operation}\n */\n\n getDataOperation: function(newDataset) {\n var self = this,\n operation = new mixitup.Operation(),\n startDataset = [];\n\n operation = self.callFilters('operationUnmappedGetDataOperation', operation, arguments);\n\n if (self.dom.targets.length && !(startDataset = (self.state.activeDataset || [])).length) {\n throw new Error(mixitup.messages.errorDatasetNotSet());\n }\n\n operation.id = h.randomHex();\n operation.startState = self.state;\n operation.startDataset = startDataset;\n operation.newDataset = newDataset.slice();\n\n self.diffDatasets(operation);\n\n operation.startOrder = self.targets;\n operation.newOrder = operation.show;\n\n if (self.config.animation.enable) {\n self.getStartMixData(operation);\n self.setInter(operation);\n\n operation.docState = h.getDocumentState(self.dom.document);\n\n self.getInterMixData(operation);\n self.setFinal(operation);\n self.getFinalMixData(operation);\n\n self.parseEffects();\n\n operation.hasEffect = self.hasEffect();\n\n self.getTweenData(operation);\n }\n\n self.targets = operation.show.slice();\n\n operation.newState = self.buildState(operation);\n\n // NB: Targets to be removed must be included in `self.targets` for removal during clean up,\n // but are added after state is built so that state is accurate\n\n Array.prototype.push.apply(self.targets, operation.toRemove);\n\n operation = self.callFilters('operationMappedGetDataOperation', operation, arguments);\n\n return operation;\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Operation} operation\n * @return {void}\n */\n\n diffDatasets: function(operation) {\n var self = this,\n persistantStartIds = [],\n persistantNewIds = [],\n insertedTargets = [],\n data = null,\n target = null,\n el = null,\n frag = null,\n nextEl = null,\n uids = {},\n id = '',\n i = -1;\n\n self.callActions('beforeDiffDatasets', arguments);\n\n for (i = 0; data = operation.newDataset[i]; i++) {\n if (typeof (id = data[self.config.data.uidKey]) === 'undefined' || id.toString().length < 1) {\n throw new TypeError(mixitup.messages.errorDatasetInvalidUidKey({\n uidKey: self.config.data.uidKey\n }));\n }\n\n if (!uids[id]) {\n uids[id] = true;\n } else {\n throw new Error(mixitup.messages.errorDatasetDuplicateUid({\n uid: id\n }));\n }\n\n if ((target = self.cache[id]) instanceof mixitup.Target) {\n // Already in cache\n\n if (self.config.data.dirtyCheck && !h.deepEquals(data, target.data)) {\n // change detected\n\n el = target.render(data);\n\n target.data = data;\n\n if (el !== target.dom.el) {\n // Update target element reference\n\n if (target.isInDom) {\n target.unbindEvents();\n\n self.dom.parent.replaceChild(el, target.dom.el);\n }\n\n if (!target.isShown) {\n el.style.display = 'none';\n }\n\n target.dom.el = el;\n\n if (target.isInDom) {\n target.bindEvents();\n }\n }\n }\n\n el = target.dom.el;\n } else {\n // New target\n\n target = new mixitup.Target();\n\n target.init(null, self, data);\n\n target.hide();\n }\n\n if (!target.isInDom) {\n // Adding to DOM\n\n if (!frag) {\n // Open frag\n\n frag = self.dom.document.createDocumentFragment();\n }\n\n if (frag.lastElementChild) {\n frag.appendChild(self.dom.document.createTextNode(' '));\n }\n\n frag.appendChild(target.dom.el);\n\n target.isInDom = true;\n\n target.unbindEvents();\n target.bindEvents();\n target.hide();\n\n operation.toShow.push(target);\n\n insertedTargets.push(target);\n } else {\n // Already in DOM\n\n nextEl = target.dom.el.nextElementSibling;\n\n persistantNewIds.push(id);\n\n if (frag) {\n // Close and insert previously opened frag\n\n if (frag.lastElementChild) {\n frag.appendChild(self.dom.document.createTextNode(' '));\n }\n\n self.insertDatasetFrag(frag, target.dom.el, insertedTargets);\n\n frag = null;\n }\n }\n\n operation.show.push(target);\n }\n\n if (frag) {\n // Unclosed frag remaining\n\n nextEl = nextEl || self.config.layout.siblingAfter;\n\n if (nextEl) {\n frag.appendChild(self.dom.document.createTextNode(' '));\n }\n\n self.insertDatasetFrag(frag, nextEl, insertedTargets);\n }\n\n for (i = 0; data = operation.startDataset[i]; i++) {\n id = data[self.config.data.uidKey];\n\n target = self.cache[id];\n\n if (operation.show.indexOf(target) < 0) {\n // Previously shown but now absent\n\n operation.hide.push(target);\n operation.toHide.push(target);\n operation.toRemove.push(target);\n } else {\n persistantStartIds.push(id);\n }\n }\n\n if (!h.isEqualArray(persistantStartIds, persistantNewIds)) {\n operation.willSort = true;\n }\n\n self.callActions('afterDiffDatasets', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.1.5\n * @param {DocumentFragment} frag\n * @param {(HTMLElement|null)} nextEl\n * @param {Array.} targets\n * @return {void}\n */\n\n insertDatasetFrag: function(frag, nextEl, targets) {\n var self = this;\n var insertAt = nextEl ? h.arrayFromList(self.dom.parent.children).indexOf(nextEl) : self.targets.length;\n\n self.dom.parent.insertBefore(frag, nextEl);\n\n while (targets.length) {\n self.targets.splice(insertAt, 0, targets.shift());\n\n insertAt++;\n }\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.CommandSort} sortCommandA\n * @param {mixitup.CommandSort} sortCommandB\n * @return {boolean}\n */\n\n willSort: function(sortCommandA, sortCommandB) {\n var self = this,\n result = false;\n\n if (\n self.config.behavior.liveSort ||\n sortCommandA.order === 'random' ||\n sortCommandA.attribute !== sortCommandB.attribute ||\n sortCommandA.order !== sortCommandB.order ||\n sortCommandA.collection !== sortCommandB.collection ||\n (sortCommandA.next === null && sortCommandB.next) ||\n (sortCommandA.next && sortCommandB.next === null)\n ) {\n result = true;\n } else if (sortCommandA.next && sortCommandB.next) {\n result = self.willSort(sortCommandA.next, sortCommandB.next);\n } else {\n result = false;\n }\n\n return self.callFilters('resultWillSort', result, arguments);\n },\n\n /**\n * A shorthand method for `.filter('all')`. Shows all targets in the container.\n *\n * @example\n *\n * .show()\n *\n * @example Example: Showing all targets\n *\n * mixer.show()\n * .then(function(state) {\n * console.log(state.totalShow === state.totalTargets); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @return {Promise.}\n */\n\n show: function() {\n var self = this;\n\n return self.filter('all');\n },\n\n /**\n * A shorthand method for `.filter('none')`. Hides all targets in the container.\n *\n * @example\n *\n * .hide()\n *\n * @example Example: Hiding all targets\n *\n * mixer.hide()\n * .then(function(state) {\n * console.log(state.totalShow === 0); // true\n * console.log(state.totalHide === state.totalTargets); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @return {Promise.}\n */\n\n hide: function() {\n var self = this;\n\n return self.filter('none');\n },\n\n /**\n * Returns a boolean indicating whether or not a MixItUp operation is\n * currently in progress.\n *\n * @example\n *\n * .isMixing()\n *\n * @example Example: Checking the status of a mixer\n *\n * mixer.sort('random', function() {\n * console.log(mixer.isMixing()) // false\n * });\n *\n * console.log(mixer.isMixing()) // true\n *\n * @public\n * @instance\n * @since 2.0.0\n * @return {boolean}\n */\n\n isMixing: function() {\n var self = this;\n\n return self.isBusy;\n },\n\n /**\n * Filters all targets in the container by a provided selector string, or the values `'all'`\n * or `'none'`. Only targets matching the selector will be shown.\n *\n * @example\n *\n * .filter(selector [, animate] [, callback])\n *\n * @example Example 1: Filtering targets by a class selector\n *\n * mixer.filter('.category-a')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('.category-a').length); // true\n * });\n *\n * @example Example 2: Filtering targets by an attribute selector\n *\n * mixer.filter('[data-category~=\"a\"]')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('[data-category~=\"a\"]').length); // true\n * });\n *\n * @example Example 3: Filtering targets by a compound selector\n *\n * // Show only those targets with the classes 'category-a' AND 'category-b'\n *\n * mixer.filter('.category-a.category-c')\n * .then(function(state) {\n * console.log(state.totalShow === containerEl.querySelectorAll('.category-a.category-c').length); // true\n * });\n *\n * @example Example 4: Filtering via an element collection\n *\n * var collection = Array.from(container.querySelectorAll('.mix'));\n *\n * console.log(collection.length); // 34\n *\n * // Filter the collection manually using Array.prototype.filter\n *\n * var filtered = collection.filter(function(target) {\n * return parseInt(target.getAttribute('data-price')) > 10;\n * });\n *\n * console.log(filtered.length); // 22\n *\n * // Pass the filtered collection to MixItUp\n *\n * mixer.filter(filtered)\n * .then(function(state) {\n * console.log(state.activeFilter.collection.length === 22); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(string|HTMLElement|Array.)} selector\n * Any valid CSS selector (i.e. `'.category-a'`), or the values `'all'` or `'none'`. The filter method also accepts a reference to single target element or a collection of target elements to show.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n filter: function() {\n var self = this,\n instruction = self.parseFilterArgs(arguments);\n\n return self.multimix({\n filter: instruction.command\n }, instruction.animate, instruction.callback);\n },\n\n /**\n * Adds an additional selector to the currently active filter selector, concatenating\n * as per the logic defined in `controls.toggleLogic`.\n *\n * @example\n *\n * .toggleOn(selector [, animate] [, callback])\n *\n * @example Example: Toggling on a filter selector\n *\n * console.log(mixer.getState().activeFilter.selector); // '.category-a'\n *\n * mixer.toggleOn('.category-b')\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // '.category-a, .category-b'\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} selector\n * Any valid CSS selector (i.e. `'.category-a'`)\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n toggleOn: function() {\n var self = this,\n instruction = self.parseFilterArgs(arguments),\n selector = instruction.command.selector,\n toggleSelector = '';\n\n self.isToggling = true;\n\n if (self.toggleArray.indexOf(selector) < 0) {\n self.toggleArray.push(selector);\n }\n\n toggleSelector = self.getToggleSelector();\n\n return self.multimix({\n filter: toggleSelector\n }, instruction.animate, instruction.callback);\n },\n\n /**\n * Removes a selector from the active filter selector.\n *\n * @example\n *\n * .toggleOff(selector [, animate] [, callback])\n *\n * @example Example: Toggling off a filter selector\n *\n * console.log(mixer.getState().activeFilter.selector); // '.category-a, .category-b'\n *\n * mixer.toggleOff('.category-b')\n * .then(function(state) {\n * console.log(state.activeFilter.selector); // '.category-a'\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} selector\n * Any valid CSS selector (i.e. `'.category-a'`)\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n toggleOff: function() {\n var self = this,\n instruction = self.parseFilterArgs(arguments),\n selector = instruction.command.selector,\n selectorIndex = self.toggleArray.indexOf(selector),\n toggleSelector = '';\n\n self.isToggling = true;\n\n if (selectorIndex > -1) {\n self.toggleArray.splice(selectorIndex, 1);\n }\n\n toggleSelector = self.getToggleSelector();\n\n return self.multimix({\n filter: toggleSelector\n }, instruction.animate, instruction.callback);\n },\n\n /**\n * Sorts all targets in the container according to a provided sort string.\n *\n * @example\n *\n * .sort(sortString [, animate] [, callback])\n *\n * @example Example 1: Sorting by the default DOM order\n *\n * // Reverse the default order of the targets\n *\n * mixer.sort('default:desc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'default'); // true\n * console.log(state.activeSort.order === 'desc'); // true\n * });\n *\n * @example Example 2: Sorting by a custom data-attribute\n *\n * // Sort the targets by the value of a `data-published-date` attribute\n *\n * mixer.sort('published-date:asc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.activeSort.order === 'asc'); // true\n * });\n *\n * @example Example 3: Sorting by multiple attributes\n *\n * // Sort the targets by the value of a `data-published-date` attribute, then by `data-title`\n *\n * mixer.sort('published-date:desc data-title:asc')\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.activeSort.order === 'desc'); // true\n *\n * console.log(state.activeSort.next.attribute === 'title'); // true\n * console.log(state.activeSort.next.order === 'asc'); // true\n * });\n *\n * @example Example 4: Sorting by random\n *\n * mixer.sort('random')\n * .then(function(state) {\n * console.log(state.activeSort.order === 'random') // true\n * });\n *\n * @example Example 5: Sorting via an element collection\n *\n * var collection = Array.from(container.querySelectorAll('.mix'));\n *\n * // Swap the position of two elements in the collection:\n *\n * var temp = collection[1];\n *\n * collection[1] = collection[0];\n * collection[0] = temp;\n *\n * // Pass the sorted collection to MixItUp\n *\n * mixer.sort(collection)\n * .then(function(state) {\n * console.log(state.targets[0] === collection[0]); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(string|Array.)} sortString\n * A valid sort string (e.g. `'default'`, `'published-date:asc'`, or `'random'`). The sort method also accepts an array of all target elements in a user-defined order.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n sort: function() {\n var self = this,\n instruction = self.parseSortArgs(arguments);\n\n return self.multimix({\n sort: instruction.command\n }, instruction.animate, instruction.callback);\n },\n\n /**\n * Changes the layout of the container by adding, removing or updating a\n * layout-specific class name. If `animation.animateResizetargets` is\n * enabled, MixItUp will attempt to gracefully animate the width, height,\n * and position of targets between layout states.\n *\n * @example\n *\n * .changeLayout(containerClassName [, animate] [, callback])\n *\n * @example Example 1: Adding a new class name to the container\n *\n * mixer.changeLayout('container-list')\n * .then(function(state) {\n * console.log(state.activeContainerClass === 'container-list'); // true\n * });\n *\n * @example Example 2: Removing a previously added class name from the container\n *\n * mixer.changeLayout('')\n * .then(function(state) {\n * console.log(state.activeContainerClass === ''); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {string} containerClassName\n * A layout-specific class name to add to the container.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n changeLayout: function() {\n var self = this,\n instruction = self.parseChangeLayoutArgs(arguments);\n\n return self.multimix({\n changeLayout: instruction.command\n }, instruction.animate, instruction.callback);\n },\n\n /**\n * Updates the contents and order of the container to reflect the provided dataset,\n * if the dataset API is in use.\n *\n * The dataset API is designed for use in API-driven JavaScript applications, and\n * can be used instead of DOM-based methods such as `.filter()`, `.sort()`,\n * `.insert()`, etc. When used, insertion, removal, sorting and pagination can be\n * achieved purely via changes to your data model, without the uglyness of having\n * to interact with or query the DOM directly.\n *\n * @example\n *\n * .dataset(dataset [, animate] [, callback])\n *\n * @example Example 1: Rendering a dataset\n *\n * var myDataset = [\n * {id: 1, ...},\n * {id: 2, ...},\n * {id: 3, ...}\n * ];\n *\n * mixer.dataset(myDataset)\n * .then(function(state) {\n * console.log(state.totalShow === 3); // true\n * });\n *\n * @example Example 2: Sorting a dataset\n *\n * // Create a new dataset in reverse order\n *\n * var newDataset = myDataset.slice().reverse();\n *\n * mixer.dataset(newDataset)\n * .then(function(state) {\n * console.log(state.activeDataset[0] === myDataset[2]); // true\n * });\n *\n * @example Example 3: Removing an item from the dataset\n *\n * console.log(myDataset.length); // 3\n *\n * // Create a new dataset with the last item removed.\n *\n * var newDataset = myDataset.slice().pop();\n *\n * mixer.dataset(newDataset)\n * .then(function(state) {\n * console.log(state.totalShow === 2); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {Array.} dataset\n * An array of objects, each one representing the underlying data model of a target to be rendered.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n dataset: function() {\n var self = this,\n instruction = self.parseDatasetArgs(arguments),\n operation = null,\n queueItem = null,\n animate = false;\n\n self.callActions('beforeDataset', arguments);\n\n if (!self.isBusy) {\n if (instruction.callback) self.userCallback = instruction.callback;\n\n animate = (instruction.animate ^ self.config.animation.enable) ? instruction.animate : self.config.animation.enable;\n\n operation = self.getDataOperation(instruction.command.dataset);\n\n return self.goMix(animate, operation);\n } else {\n queueItem = new mixitup.QueueItem();\n\n queueItem.args = arguments;\n queueItem.instruction = instruction;\n\n return self.queueMix(queueItem);\n }\n },\n\n /**\n * Performs simultaneous `filter`, `sort`, `insert`, `remove` and `changeLayout`\n * operations as requested.\n *\n * @example\n *\n * .multimix(multimixCommand [, animate] [, callback])\n *\n * @example Example 1: Performing simultaneous filtering and sorting\n *\n * mixer.multimix({\n * filter: '.category-b',\n * sort: 'published-date:desc'\n * })\n * .then(function(state) {\n * console.log(state.activeFilter.selector === '.category-b'); // true\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * });\n *\n * @example Example 2: Performing simultaneous sorting, insertion, and removal\n *\n * console.log(mixer.getState().totalShow); // 6\n *\n * // NB: When inserting via `multimix()`, an object should be provided as the value\n * // for the `insert` portion of the command, allowing for a collection of elements\n * // and an insertion index to be specified.\n *\n * mixer.multimix({\n * sort: 'published-date:desc', // Sort the container, including any new elements\n * insert: {\n * collection: [newElementReferenceA, newElementReferenceB], // Add 2 new elements at index 5\n * index: 5\n * },\n * remove: existingElementReference // Remove 1 existing element\n * })\n * .then(function(state) {\n * console.log(state.activeSort.attribute === 'published-date'); // true\n * console.log(state.totalShow === 7); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {object} multimixCommand\n * An object containing one or more things to do\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n multimix: function() {\n var self = this,\n operation = null,\n animate = false,\n queueItem = null,\n instruction = self.parseMultimixArgs(arguments);\n\n self.callActions('beforeMultimix', arguments);\n\n if (!self.isBusy) {\n operation = self.getOperation(instruction.command);\n\n if (self.config.controls.enable) {\n // Update controls for API calls\n\n if (instruction.command.filter && !self.isToggling) {\n // As we are not toggling, reset the toggle array\n // so new filter overrides existing toggles\n\n self.toggleArray.length = 0;\n self.buildToggleArray(operation.command);\n }\n\n if (self.queue.length < 1) {\n self.updateControls(operation.command);\n }\n }\n\n if (instruction.callback) self.userCallback = instruction.callback;\n\n // Always allow the instruction to override the instance setting\n\n animate = (instruction.animate ^ self.config.animation.enable) ?\n instruction.animate :\n self.config.animation.enable;\n\n self.callFilters('operationMultimix', operation, arguments);\n\n return self.goMix(animate, operation);\n } else {\n queueItem = new mixitup.QueueItem();\n\n queueItem.args = arguments;\n queueItem.instruction = instruction;\n queueItem.triggerElement = self.lastClicked;\n queueItem.isToggling = self.isToggling;\n\n return self.queueMix(queueItem);\n }\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} multimixCommand\n * @param {boolean} [isPreFetch]\n * An optional boolean indicating that the operation is being pre-fetched for execution at a later time.\n * @return {Operation|null}\n */\n\n getOperation: function(multimixCommand) {\n var self = this,\n sortCommand = multimixCommand.sort,\n filterCommand = multimixCommand.filter,\n changeLayoutCommand = multimixCommand.changeLayout,\n removeCommand = multimixCommand.remove,\n insertCommand = multimixCommand.insert,\n operation = new mixitup.Operation();\n\n operation = self.callFilters('operationUnmappedGetOperation', operation, arguments);\n\n operation.id = h.randomHex();\n operation.command = multimixCommand;\n operation.startState = self.state;\n operation.triggerElement = self.lastClicked;\n\n if (self.isBusy) {\n if (self.config.debug.showWarnings) {\n console.warn(mixitup.messages.warningGetOperationInstanceBusy());\n }\n\n return null;\n }\n\n if (insertCommand) {\n self.insertTargets(insertCommand, operation);\n }\n\n if (removeCommand) {\n operation.toRemove = removeCommand.targets;\n }\n\n operation.startSort = operation.newSort = operation.startState.activeSort;\n operation.startOrder = operation.newOrder = self.targets;\n\n if (sortCommand) {\n operation.startSort = operation.startState.activeSort;\n operation.newSort = sortCommand;\n\n operation.willSort = self.willSort(sortCommand, operation.startState.activeSort);\n\n if (operation.willSort) {\n self.sortOperation(operation);\n }\n }\n\n operation.startFilter = operation.startState.activeFilter;\n\n if (filterCommand) {\n operation.newFilter = filterCommand;\n } else {\n operation.newFilter = h.extend(new mixitup.CommandFilter(), operation.startFilter);\n }\n\n if (operation.newFilter.selector === 'all') {\n operation.newFilter.selector = self.config.selectors.target;\n } else if (operation.newFilter.selector === 'none') {\n operation.newFilter.selector = '';\n }\n\n self.filterOperation(operation);\n\n operation.startContainerClassName = operation.startState.activeContainerClassName;\n\n if (changeLayoutCommand) {\n operation.newContainerClassName = changeLayoutCommand.containerClassName;\n\n if (operation.newContainerClassName !== operation.startContainerClassName) {\n operation.willChangeLayout = true;\n }\n } else {\n operation.newContainerClassName = operation.startContainerClassName;\n }\n\n if (self.config.animation.enable) {\n // Populate the operation's position data\n\n self.getStartMixData(operation);\n self.setInter(operation);\n\n operation.docState = h.getDocumentState(self.dom.document);\n\n self.getInterMixData(operation);\n self.setFinal(operation);\n self.getFinalMixData(operation);\n\n self.parseEffects();\n\n operation.hasEffect = self.hasEffect();\n\n self.getTweenData(operation);\n }\n\n if (operation.willSort) {\n self.targets = operation.newOrder;\n }\n\n operation.newState = self.buildState(operation);\n\n return self.callFilters('operationMappedGetOperation', operation, arguments);\n },\n\n /**\n * Renders a previously created operation at a specific point in its path, as\n * determined by a multiplier between 0 and 1.\n *\n * @example\n * .tween(operation, multiplier)\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.Operation} operation\n * An operation object created via the `getOperation` method\n *\n * @param {Float} multiplier\n * Any number between 0 and 1 representing the percentage complete of the operation\n * @return {void}\n */\n\n tween: function(operation, multiplier) {\n var target = null,\n posData = null,\n toHideIndex = -1,\n i = -1;\n\n multiplier = Math.min(multiplier, 1);\n multiplier = Math.max(multiplier, 0);\n\n for (i = 0; target = operation.show[i]; i++) {\n posData = operation.showPosData[i];\n\n target.applyTween(posData, multiplier);\n }\n\n for (i = 0; target = operation.hide[i]; i++) {\n if (target.isShown) {\n target.hide();\n }\n\n if ((toHideIndex = operation.toHide.indexOf(target)) > -1) {\n posData = operation.toHidePosData[toHideIndex];\n\n if (!target.isShown) {\n target.show();\n }\n\n target.applyTween(posData, multiplier);\n }\n }\n },\n\n /**\n * Inserts one or more new target elements into the container at a specified\n * index.\n *\n * To be indexed as targets, new elements must match the `selectors.target`\n * selector (`'.mix'` by default).\n *\n * @example\n *\n * .insert(newElements [, index] [, animate], [, callback])\n *\n * @example Example 1: Inserting a single element via reference\n *\n * console.log(mixer.getState().totalShow); // 0\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insert(newElement)\n * .then(function(state) {\n * console.log(state.totalShow === 1); // true\n * });\n *\n * @example Example 2: Inserting a single element via HTML string\n *\n * console.log(mixer.getState().totalShow); // 1\n *\n * // Create a new element via reference\n *\n * var newElementHtml = '<div class=\"mix\"></div>';\n *\n * // Create and insert the new element at index 1\n *\n * mixer.insert(newElementHtml, 1)\n * .then(function(state) {\n * console.log(state.totalShow === 2); // true\n * console.log(state.show[1].outerHTML === newElementHtml); // true\n * });\n *\n * @example Example 3: Inserting multiple elements via reference\n *\n * console.log(mixer.getState().totalShow); // 2\n *\n * // Create an array of new elements to insert.\n *\n * var newElement1 = document.createElement('div');\n * var newElement2 = document.createElement('div');\n *\n * newElement1.classList.add('mix');\n * newElement2.classList.add('mix');\n *\n * var newElementsCollection = [newElement1, newElement2];\n *\n * // Insert the new elements starting at index 1\n *\n * mixer.insert(newElementsCollection, 1)\n * .then(function(state) {\n * console.log(state.totalShow === 4); // true\n * console.log(state.show[1] === newElement1); // true\n * console.log(state.show[2] === newElement2); // true\n * });\n *\n * @example Example 4: Inserting a jQuery collection object containing one or more elements\n *\n * console.log(mixer.getState().totalShow); // 4\n *\n * var $newElement = $('<div class=\"mix\"></div>');\n *\n * // Insert the new elements starting at index 3\n *\n * mixer.insert($newElement, 3)\n * .then(function(state) {\n * console.log(state.totalShow === 5); // true\n * console.log(state.show[3] === $newElement[0]); // true\n * });\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {number} index=0\n * The index at which to insert the new element(s). `0` by default.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n insert: function() {\n var self = this,\n args = self.parseInsertArgs(arguments);\n\n return self.multimix({\n insert: args.command\n }, args.animate, args.callback);\n },\n\n /**\n * Inserts one or more new elements before a provided reference element.\n *\n * @example\n *\n * .insertBefore(newElements, referenceElement [, animate] [, callback])\n *\n * @example Example: Inserting a new element before a reference element\n *\n * // An existing reference element is chosen at index 2\n *\n * var referenceElement = mixer.getState().show[2];\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insertBefore(newElement, referenceElement)\n * .then(function(state) {\n * // The new element is inserted into the container at index 2, before the reference element\n *\n * console.log(state.show[2] === newElement); // true\n *\n * // The reference element is now at index 3\n *\n * console.log(state.show[3] === referenceElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {HTMLElement} referenceElement\n * A reference to an existing element in the container to insert new elements before.\n *@param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n insertBefore: function() {\n var self = this,\n args = self.parseInsertArgs(arguments);\n\n return self.insert(args.command.collection, 'before', args.command.sibling, args.animate, args.callback);\n },\n\n /**\n * Inserts one or more new elements after a provided reference element.\n *\n * @example\n *\n * .insertAfter(newElements, referenceElement [, animate] [, callback])\n *\n * @example Example: Inserting a new element after a reference element\n *\n * // An existing reference element is chosen at index 2\n *\n * var referenceElement = mixer.getState().show[2];\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * mixer.insertAfter(newElement, referenceElement)\n * .then(function(state) {\n * // The new element is inserted into the container at index 3, after the reference element\n *\n * console.log(state.show[3] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {HTMLElement} referenceElement\n * A reference to an existing element in the container to insert new elements after.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n insertAfter: function() {\n var self = this,\n args = self.parseInsertArgs(arguments);\n\n return self.insert(args.command.collection, 'after', args.command.sibling, args.animate, args.callback);\n },\n\n /**\n * Inserts one or more new elements into the container before all existing targets.\n *\n * @example\n *\n * .prepend(newElements [,animate] [,callback])\n *\n * @example Example: Prepending a new element\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * // Insert the element into the container\n *\n * mixer.prepend(newElement)\n * .then(function(state) {\n * console.log(state.show[0] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n prepend: function() {\n var self = this,\n args = self.parseInsertArgs(arguments);\n\n return self.insert(0, args.command.collection, args.animate, args.callback);\n },\n\n /**\n * Inserts one or more new elements into the container after all existing targets.\n *\n * @example\n *\n * .append(newElements [,animate] [,callback])\n *\n * @example Example: Appending a new element\n *\n * // Create a new element\n *\n * var newElement = document.createElement('div');\n * newElement.classList.add('mix');\n *\n * // Insert the element into the container\n *\n * mixer.append(newElement)\n * .then(function(state) {\n * console.log(state.show[state.show.length - 1] === newElement); // true\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string)} newElements\n * A reference to a single element to insert, an array-like collection of elements, or an HTML string representing a single element.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n append: function() {\n var self = this,\n args = self.parseInsertArgs(arguments);\n\n return self.insert(self.state.totalTargets, args.command.collection, args.animate, args.callback);\n },\n\n /**\n * Removes one or more existing target elements from the container.\n *\n * @example\n *\n * .remove(elements [, animate] [, callback])\n *\n * @example Example 1: Removing an element by reference\n *\n * var elementToRemove = containerEl.firstElementChild;\n *\n * mixer.remove(elementToRemove)\n * .then(function(state) {\n * console.log(state.targets.indexOf(elementToRemove) === -1); // true\n * });\n *\n * @example Example 2: Removing a collection of elements by reference\n *\n * var elementsToRemove = containerEl.querySelectorAll('.category-a');\n *\n * console.log(elementsToRemove.length) // 3\n *\n * mixer.remove(elementsToRemove)\n * .then(function() {\n * console.log(containerEl.querySelectorAll('.category-a').length); // 0\n * });\n *\n * @example Example 3: Removing one or more elements by selector\n *\n * mixer.remove('.category-a')\n * .then(function() {\n * console.log(containerEl.querySelectorAll('.category-a').length); // 0\n * });\n *\n * @example Example 4: Removing an element by index\n *\n * console.log(mixer.getState.totalShow); // 4\n *\n * // Remove the element at index 3\n *\n * mixer.remove(3)\n * .then(function(state) {\n * console.log(state.totalShow); // 3\n * console.log(state.show[3]); // undefined\n * });\n *\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {(HTMLElement|Array.|string|number)} elements\n * A reference to a single element to remove, an array-like collection of elements, a selector string, or the index of an element to remove.\n * @param {boolean} [animate=true]\n * An optional boolean dictating whether the operation should animate, or occur syncronously with no animation. `true` by default.\n * @param {function} [callback=null]\n * An optional callback function to be invoked after the operation has completed.\n * @return {Promise.}\n * A promise resolving with the current state object.\n */\n\n remove: function() {\n var self = this,\n args = self.parseRemoveArgs(arguments);\n\n return self.multimix({\n remove: args.command\n }, args.animate, args.callback);\n },\n\n /**\n * Retrieves the the value of any property or sub-object within the current\n * mixitup configuration, or the whole configuration object.\n *\n * @example\n *\n * .getConfig([stringKey])\n *\n * @example Example 1: retrieve the entire configuration object\n *\n * var config = mixer.getConfig(); // Config { ... }\n *\n * @example Example 2: retrieve a named sub-object of configuration object\n *\n * var animation = mixer.getConfig('animation'); // ConfigAnimation { ... }\n *\n * @example Example 3: retrieve a value of configuration object via a dot-notation string key\n *\n * var effects = mixer.getConfig('animation.effects'); // 'fade scale'\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {string} [stringKey] A \"dot-notation\" string key\n * @return {*}\n */\n\n getConfig: function(stringKey) {\n var self = this,\n value = null;\n\n if (!stringKey) {\n value = self.config;\n } else {\n value = h.getProperty(self.config, stringKey);\n }\n\n return self.callFilters('valueGetConfig', value, arguments);\n },\n\n /**\n * Updates the configuration of the mixer, after it has been instantiated.\n *\n * See the Configuration Object documentation for a full list of avilable\n * configuration options.\n *\n * @example\n *\n * .configure(config)\n *\n * @example Example 1: Updating animation options\n *\n * mixer.configure({\n * animation: {\n * effects: 'fade translateX(-100%)',\n * duration: 300\n * }\n * });\n *\n * @example Example 2: Removing a callback after it has been set\n *\n * var mixer;\n *\n * function handleMixEndOnce() {\n * // Do something ..\n *\n * // Then nullify the callback\n *\n * mixer.configure({\n * callbacks: {\n * onMixEnd: null\n * }\n * });\n * };\n *\n * // Instantiate a mixer with a callback defined\n *\n * mixer = mixitup(containerEl, {\n * callbacks: {\n * onMixEnd: handleMixEndOnce\n * }\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {object} config\n * An object containing one of more configuration options.\n * @return {void}\n */\n\n configure: function(config) {\n var self = this;\n\n self.callActions('beforeConfigure', arguments);\n\n h.extend(self.config, config, true, true);\n\n self.callActions('afterConfigure', arguments);\n },\n\n /**\n * Returns an object containing information about the current state of the\n * mixer. See the State Object documentation for more information.\n *\n * NB: State objects are immutable and should therefore be regenerated\n * after any operation.\n *\n * @example\n *\n * .getState();\n *\n * @example Example: Retrieving a state object\n *\n * var state = mixer.getState();\n *\n * console.log(state.totalShow + 'targets are currently shown');\n *\n * @public\n * @instance\n * @since 2.0.0\n * @return {mixitup.State} An object reflecting the current state of the mixer.\n */\n\n getState: function() {\n var self = this,\n state = null;\n\n state = new mixitup.State();\n\n h.extend(state, self.state);\n\n h.freeze(state);\n\n return self.callFilters('stateGetState', state, arguments);\n },\n\n /**\n * Forces the re-indexing all targets within the container.\n *\n * This should only be used if some other piece of code in your application\n * has manipulated the contents of your container, which should be avoided.\n *\n * If you need to add or remove target elements from the container, use\n * the built-in `.insert()` or `.remove()` methods, and MixItUp will keep\n * itself up to date.\n *\n * @example\n *\n * .forceRefresh()\n *\n * @example Example: Force refreshing the mixer after external DOM manipulation\n *\n * console.log(mixer.getState().totalShow); // 3\n *\n * // An element is removed from the container via some external DOM manipulation code:\n *\n * containerEl.removeChild(containerEl.firstElementChild);\n *\n * // The mixer does not know that the number of targets has changed:\n *\n * console.log(mixer.getState().totalShow); // 3\n *\n * mixer.forceRefresh();\n *\n * // After forceRefresh, the mixer is in sync again:\n *\n * console.log(mixer.getState().totalShow); // 2\n *\n * @public\n * @instance\n * @since 2.1.2\n * @return {void}\n */\n\n forceRefresh: function() {\n var self = this;\n\n self.indexTargets();\n },\n\n /**\n * Forces the re-rendering of all targets when using the Dataset API.\n *\n * By default, targets are only re-rendered when `data.dirtyCheck` is\n * enabled, and an item's data has changed when `dataset()` is called.\n *\n * The `forceRender()` method allows for the re-rendering of all targets\n * in response to some arbitrary event, such as the changing of the target\n * render function.\n *\n * Targets are rendered against their existing data.\n *\n * @example\n *\n * .forceRender()\n *\n * @example Example: Force render targets after changing the target render function\n *\n * console.log(container.innerHTML); // ... <span class=\"mix\">Foo</span> ...\n *\n * mixer.configure({\n * render: {\n * target: (item) => `<a href=\"/${item.slug}/\" class=\"mix\">${item.title}</a>`\n * }\n * });\n *\n * mixer.forceRender();\n *\n * console.log(container.innerHTML); // ... <a href=\"/foo/\" class=\"mix\">Foo</a> ...\n *\n * @public\n * @instance\n * @since 3.2.1\n * @return {void}\n */\n\n forceRender: function() {\n var self = this,\n target = null,\n el = null,\n id = '';\n\n for (id in self.cache) {\n target = self.cache[id];\n\n el = target.render(target.data);\n\n if (el !== target.dom.el) {\n // Update target element reference\n\n if (target.isInDom) {\n target.unbindEvents();\n\n self.dom.parent.replaceChild(el, target.dom.el);\n }\n\n if (!target.isShown) {\n el.style.display = 'none';\n }\n\n target.dom.el = el;\n\n if (target.isInDom) {\n target.bindEvents();\n }\n }\n }\n\n self.state = self.buildState(self.lastOperation);\n },\n\n /**\n * Removes mixitup functionality from the container, unbinds all control\n * event handlers, and deletes the mixer instance from MixItUp's internal\n * cache.\n *\n * This should be performed whenever a mixer's container is removed from\n * the DOM, such as during a page change in a single page application,\n * or React's `componentWillUnmount()`.\n *\n * @example\n *\n * .destroy([cleanUp])\n *\n * @example Example: Destroying the mixer before removing its container element\n *\n * mixer.destroy();\n *\n * containerEl.parentElement.removeChild(containerEl);\n *\n * @public\n * @instance\n * @since 2.0.0\n * @param {boolean} [cleanUp=false]\n * An optional boolean dictating whether or not to clean up any inline `display: none;` styling applied to hidden targets.\n * @return {void}\n */\n\n destroy: function(cleanUp) {\n var self = this,\n control = null,\n target = null,\n i = 0;\n\n self.callActions('beforeDestroy', arguments);\n\n for (i = 0; control = self.controls[i]; i++) {\n control.removeBinding(self);\n }\n\n for (i = 0; target = self.targets[i]; i++) {\n if (cleanUp) {\n target.show();\n }\n\n target.unbindEvents();\n }\n\n if (self.dom.container.id.match(/^MixItUp/)) {\n self.dom.container.removeAttribute('id');\n }\n\n delete mixitup.instances[self.id];\n\n self.callActions('afterDestroy', arguments);\n }\n });\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.IMoveData = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.posIn = null;\n this.posOut = null;\n this.operation = null;\n this.callback = null;\n this.statusChange = '';\n this.duration = -1;\n this.staggerIndex = -1;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.IMoveData);\n\n mixitup.IMoveData.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.IMoveData.prototype.constructor = mixitup.IMoveData;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.TargetDom = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.el = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.TargetDom);\n\n mixitup.TargetDom.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.TargetDom.prototype.constructor = mixitup.TargetDom;\n\n /**\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Target = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.id = '';\n this.sortString = '';\n this.mixer = null;\n this.callback = null;\n this.isShown = false;\n this.isBound = false;\n this.isExcluded = false;\n this.isInDom = false;\n this.handler = null;\n this.operation = null;\n this.data = null;\n this.dom = new mixitup.TargetDom();\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Target);\n\n mixitup.Target.prototype = Object.create(mixitup.Base.prototype);\n\n h.extend(mixitup.Target.prototype, {\n constructor: mixitup.Target,\n\n /**\n * Initialises a newly instantiated Target.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {(Element|null)} el\n * @param {object} mixer\n * @param {object} [data]\n * @return {void}\n */\n\n init: function(el, mixer, data) {\n var self = this,\n id = '';\n\n self.callActions('beforeInit', arguments);\n\n self.mixer = mixer;\n\n if (!el) {\n // If no element is provided, render it\n\n el = self.render(data);\n }\n\n self.cacheDom(el);\n\n self.bindEvents();\n\n if (self.dom.el.style.display !== 'none') {\n self.isShown = true;\n }\n\n if (data && mixer.config.data.uidKey) {\n if (typeof (id = data[mixer.config.data.uidKey]) === 'undefined' || id.toString().length < 1) {\n throw new TypeError(mixitup.messages.errorDatasetInvalidUidKey({\n uidKey: mixer.config.data.uidKey\n }));\n }\n\n self.id = id;\n self.data = data;\n\n mixer.cache[id] = self;\n }\n\n self.callActions('afterInit', arguments);\n },\n\n /**\n * Renders the target element using a user-defined renderer function.\n *\n * @private\n * @instance\n * @since 3.1.4\n * @param {object} data\n * @return {void}\n */\n\n render: function(data) {\n var self = this,\n render = null,\n el = null,\n temp = null,\n output = '';\n\n self.callActions('beforeRender', arguments);\n\n render = self.callFilters('renderRender', self.mixer.config.render.target, arguments);\n\n if (typeof render !== 'function') {\n throw new TypeError(mixitup.messages.errorDatasetRendererNotSet());\n }\n\n output = render(data);\n\n if (output && typeof output === 'object' && h.isElement(output)) {\n el = output;\n } else if (typeof output === 'string') {\n temp = document.createElement('div');\n temp.innerHTML = output;\n\n el = temp.firstElementChild;\n }\n\n return self.callFilters('elRender', el, arguments);\n },\n\n /**\n * Caches references of DOM elements neccessary for the target's functionality.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {Element} el\n * @return {void}\n */\n\n cacheDom: function(el) {\n var self = this;\n\n self.callActions('beforeCacheDom', arguments);\n\n self.dom.el = el;\n\n self.callActions('afterCacheDom', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} attributeName\n * @return {void}\n */\n\n getSortString: function(attributeName) {\n var self = this,\n value = self.dom.el.getAttribute('data-' + attributeName) || '';\n\n self.callActions('beforeGetSortString', arguments);\n\n value = isNaN(value * 1) ?\n value.toLowerCase() :\n value * 1;\n\n self.sortString = value;\n\n self.callActions('afterGetSortString', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n show: function() {\n var self = this;\n\n self.callActions('beforeShow', arguments);\n\n if (!self.isShown) {\n self.dom.el.style.display = '';\n\n self.isShown = true;\n }\n\n self.callActions('afterShow', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n hide: function() {\n var self = this;\n\n self.callActions('beforeHide', arguments);\n\n if (self.isShown) {\n self.dom.el.style.display = 'none';\n\n self.isShown = false;\n }\n\n self.callActions('afterHide', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */\n\n move: function(moveData) {\n var self = this;\n\n self.callActions('beforeMove', arguments);\n\n if (!self.isExcluded) {\n self.mixer.targetsMoved++;\n }\n\n self.applyStylesIn(moveData);\n\n requestAnimationFrame(function() {\n self.applyStylesOut(moveData);\n });\n\n self.callActions('afterMove', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {object} posData\n * @param {number} multiplier\n * @return {void}\n */\n\n applyTween: function(posData, multiplier) {\n var self = this,\n propertyName = '',\n tweenData = null,\n posIn = posData.posIn,\n currentTransformValues = [],\n currentValues = new mixitup.StyleData(),\n i = -1;\n\n self.callActions('beforeApplyTween', arguments);\n\n currentValues.x = posIn.x;\n currentValues.y = posIn.y;\n\n if (multiplier === 0) {\n self.hide();\n } else if (!self.isShown) {\n self.show();\n }\n\n for (i = 0; propertyName = mixitup.features.TWEENABLE[i]; i++) {\n tweenData = posData.tweenData[propertyName];\n\n if (propertyName === 'x') {\n if (!tweenData) continue;\n\n currentValues.x = posIn.x + (tweenData * multiplier);\n } else if (propertyName === 'y') {\n if (!tweenData) continue;\n\n currentValues.y = posIn.y + (tweenData * multiplier);\n } else if (tweenData instanceof mixitup.TransformData) {\n if (!tweenData.value) continue;\n\n currentValues[propertyName].value =\n posIn[propertyName].value + (tweenData.value * multiplier);\n\n currentValues[propertyName].unit = tweenData.unit;\n\n currentTransformValues.push(\n propertyName + '(' + currentValues[propertyName].value + tweenData.unit + ')'\n );\n } else {\n if (!tweenData) continue;\n\n currentValues[propertyName] = posIn[propertyName] + (tweenData * multiplier);\n\n self.dom.el.style[propertyName] = currentValues[propertyName];\n }\n }\n\n if (currentValues.x || currentValues.y) {\n currentTransformValues.unshift('translate(' + currentValues.x + 'px, ' + currentValues.y + 'px)');\n }\n\n if (currentTransformValues.length) {\n self.dom.el.style[mixitup.features.transformProp] = currentTransformValues.join(' ');\n }\n\n self.callActions('afterApplyTween', arguments);\n },\n\n /**\n * Applies the initial styling to a target element before any transition\n * is applied.\n *\n * @private\n * @instance\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */\n\n applyStylesIn: function(moveData) {\n var self = this,\n posIn = moveData.posIn,\n isFading = self.mixer.effectsIn.opacity !== 1,\n transformValues = [];\n\n self.callActions('beforeApplyStylesIn', arguments);\n\n transformValues.push('translate(' + posIn.x + 'px, ' + posIn.y + 'px)');\n\n if (self.mixer.config.animation.animateResizeTargets) {\n if (moveData.statusChange !== 'show') {\n // Don't apply posIn width or height or showing, as will be 0\n\n self.dom.el.style.width = posIn.width + 'px';\n self.dom.el.style.height = posIn.height + 'px';\n }\n\n self.dom.el.style.marginRight = posIn.marginRight + 'px';\n self.dom.el.style.marginBottom = posIn.marginBottom + 'px';\n }\n\n isFading && (self.dom.el.style.opacity = posIn.opacity);\n\n if (moveData.statusChange === 'show') {\n transformValues = transformValues.concat(self.mixer.transformIn);\n }\n\n self.dom.el.style[mixitup.features.transformProp] = transformValues.join(' ');\n\n self.callActions('afterApplyStylesIn', arguments);\n },\n\n /**\n * Applies a transition followed by the final styles for the element to\n * transition towards.\n *\n * @private\n * @instance\n * @param {mixitup.IMoveData} moveData\n * @return {void}\n */\n\n applyStylesOut: function(moveData) {\n var self = this,\n transitionRules = [],\n transformValues = [],\n isResizing = self.mixer.config.animation.animateResizeTargets,\n isFading = typeof self.mixer.effectsIn.opacity !== 'undefined';\n\n self.callActions('beforeApplyStylesOut', arguments);\n\n // Build the transition rules\n\n transitionRules.push(self.writeTransitionRule(\n mixitup.features.transformRule,\n moveData.staggerIndex\n ));\n\n if (moveData.statusChange !== 'none') {\n transitionRules.push(self.writeTransitionRule(\n 'opacity',\n moveData.staggerIndex,\n moveData.duration\n ));\n }\n\n if (isResizing) {\n transitionRules.push(self.writeTransitionRule(\n 'width',\n moveData.staggerIndex,\n moveData.duration\n ));\n\n transitionRules.push(self.writeTransitionRule(\n 'height',\n moveData.staggerIndex,\n moveData.duration\n ));\n\n transitionRules.push(self.writeTransitionRule(\n 'margin',\n moveData.staggerIndex,\n moveData.duration\n ));\n }\n\n // If no callback was provided, the element will\n // not transition in any way so tag it as \"immovable\"\n\n if (!moveData.callback) {\n self.mixer.targetsImmovable++;\n\n if (self.mixer.targetsMoved === self.mixer.targetsImmovable) {\n // If the total targets moved is equal to the\n // number of immovable targets, the operation\n // should be considered finished\n\n self.mixer.cleanUp(moveData.operation);\n }\n\n return;\n }\n\n // If the target will transition in some fasion,\n // assign a callback function\n\n self.operation = moveData.operation;\n self.callback = moveData.callback;\n\n // As long as the target is not excluded, increment\n // the total number of targets bound\n\n !self.isExcluded && self.mixer.targetsBound++;\n\n // Tag the target as bound to differentiate from transitionEnd\n // events that may come from stylesheet driven effects\n\n self.isBound = true;\n\n // Apply the transition\n\n self.applyTransition(transitionRules);\n\n // Apply width, height and margin negation\n\n if (isResizing && moveData.posOut.width > 0 && moveData.posOut.height > 0) {\n self.dom.el.style.width = moveData.posOut.width + 'px';\n self.dom.el.style.height = moveData.posOut.height + 'px';\n self.dom.el.style.marginRight = moveData.posOut.marginRight + 'px';\n self.dom.el.style.marginBottom = moveData.posOut.marginBottom + 'px';\n }\n\n if (!self.mixer.config.animation.nudge && moveData.statusChange === 'hide') {\n // If we're not nudging, the translation should be\n // applied before any other transforms to prevent\n // lateral movement\n\n transformValues.push('translate(' + moveData.posOut.x + 'px, ' + moveData.posOut.y + 'px)');\n }\n\n // Apply fade\n\n switch (moveData.statusChange) {\n case 'hide':\n isFading && (self.dom.el.style.opacity = self.mixer.effectsOut.opacity);\n\n transformValues = transformValues.concat(self.mixer.transformOut);\n\n break;\n case 'show':\n isFading && (self.dom.el.style.opacity = 1);\n }\n\n if (\n self.mixer.config.animation.nudge ||\n (!self.mixer.config.animation.nudge && moveData.statusChange !== 'hide')\n ) {\n // Opposite of above - apply translate after\n // other transform\n\n transformValues.push('translate(' + moveData.posOut.x + 'px, ' + moveData.posOut.y + 'px)');\n }\n\n // Apply transforms\n\n self.dom.el.style[mixitup.features.transformProp] = transformValues.join(' ');\n\n self.callActions('afterApplyStylesOut', arguments);\n },\n\n /**\n * Combines the name of a CSS property with the appropriate duration and delay\n * values to created a valid transition rule.\n *\n * @private\n * @instance\n * @since 3.0.0\n * @param {string} property\n * @param {number} staggerIndex\n * @param {number} duration\n * @return {string}\n */\n\n writeTransitionRule: function(property, staggerIndex, duration) {\n var self = this,\n delay = self.getDelay(staggerIndex),\n rule = '';\n\n rule = property + ' ' +\n (duration > 0 ? duration : self.mixer.config.animation.duration) + 'ms ' +\n delay + 'ms ' +\n (property === 'opacity' ? 'linear' : self.mixer.config.animation.easing);\n\n return self.callFilters('ruleWriteTransitionRule', rule, arguments);\n },\n\n /**\n * Calculates the transition delay for each target element based on its index, if\n * staggering is applied. If defined, A custom `animation.staggerSeqeuence`\n * function can be used to manipulate the order of indices to produce custom\n * stagger effects (e.g. for use in a grid with irregular row lengths).\n *\n * @private\n * @instance\n * @since 2.0.0\n * @param {number} index\n * @return {number}\n */\n\n getDelay: function(index) {\n var self = this,\n delay = -1;\n\n if (typeof self.mixer.config.animation.staggerSequence === 'function') {\n index = self.mixer.config.animation.staggerSequence.call(self, index, self.state);\n }\n\n delay = !!self.mixer.staggerDuration ? index * self.mixer.staggerDuration : 0;\n\n return self.callFilters('delayGetDelay', delay, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {string[]} rules\n * @return {void}\n */\n\n applyTransition: function(rules) {\n var self = this,\n transitionString = rules.join(', ');\n\n self.callActions('beforeApplyTransition', arguments);\n\n self.dom.el.style[mixitup.features.transitionProp] = transitionString;\n\n self.callActions('afterApplyTransition', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Event} e\n * @return {void}\n */\n\n handleTransitionEnd: function(e) {\n var self = this,\n propName = e.propertyName,\n canResize = self.mixer.config.animation.animateResizeTargets;\n\n self.callActions('beforeHandleTransitionEnd', arguments);\n\n if (\n self.isBound &&\n e.target.matches(self.mixer.config.selectors.target) &&\n (\n propName.indexOf('transform') > -1 ||\n propName.indexOf('opacity') > -1 ||\n canResize && propName.indexOf('height') > -1 ||\n canResize && propName.indexOf('width') > -1 ||\n canResize && propName.indexOf('margin') > -1\n )\n ) {\n self.callback.call(self, self.operation);\n\n self.isBound = false;\n self.callback = null;\n self.operation = null;\n }\n\n self.callActions('afterHandleTransitionEnd', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {Event} e\n * @return {void}\n */\n\n eventBus: function(e) {\n var self = this;\n\n self.callActions('beforeEventBus', arguments);\n\n switch (e.type) {\n case 'webkitTransitionEnd':\n case 'transitionend':\n self.handleTransitionEnd(e);\n }\n\n self.callActions('afterEventBus', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n unbindEvents: function() {\n var self = this;\n\n self.callActions('beforeUnbindEvents', arguments);\n\n h.off(self.dom.el, 'webkitTransitionEnd', self.handler);\n h.off(self.dom.el, 'transitionend', self.handler);\n\n self.callActions('afterUnbindEvents', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n bindEvents: function() {\n var self = this,\n transitionEndEvent = '';\n\n self.callActions('beforeBindEvents', arguments);\n\n transitionEndEvent = mixitup.features.transitionPrefix === 'webkit' ? 'webkitTransitionEnd' : 'transitionend';\n\n self.handler = function(e) {\n return self.eventBus(e);\n };\n\n h.on(self.dom.el, transitionEndEvent, self.handler);\n\n self.callActions('afterBindEvents', arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @param {boolean} [getBox]\n * @return {PosData}\n */\n\n getPosData: function(getBox) {\n var self = this,\n styles = {},\n rect = null,\n posData = new mixitup.StyleData();\n\n self.callActions('beforeGetPosData', arguments);\n\n posData.x = self.dom.el.offsetLeft;\n posData.y = self.dom.el.offsetTop;\n\n if (self.mixer.config.animation.animateResizeTargets || getBox) {\n rect = self.dom.el.getBoundingClientRect();\n\n posData.top = rect.top;\n posData.right = rect.right;\n posData.bottom = rect.bottom;\n posData.left = rect.left;\n\n posData.width = rect.width;\n posData.height = rect.height;\n }\n\n if (self.mixer.config.animation.animateResizeTargets) {\n styles = window.getComputedStyle(self.dom.el);\n\n posData.marginBottom = parseFloat(styles.marginBottom);\n posData.marginRight = parseFloat(styles.marginRight);\n }\n\n return self.callFilters('posDataGetPosData', posData, arguments);\n },\n\n /**\n * @private\n * @instance\n * @since 3.0.0\n * @return {void}\n */\n\n cleanUp: function() {\n var self = this;\n\n self.callActions('beforeCleanUp', arguments);\n\n self.dom.el.style[mixitup.features.transformProp] = '';\n self.dom.el.style[mixitup.features.transitionProp] = '';\n self.dom.el.style.opacity = '';\n\n if (self.mixer.config.animation.animateResizeTargets) {\n self.dom.el.style.width = '';\n self.dom.el.style.height = '';\n self.dom.el.style.marginRight = '';\n self.dom.el.style.marginBottom = '';\n }\n\n self.callActions('afterCleanUp', arguments);\n }\n });\n\n /**\n * A jQuery-collection-like wrapper around one or more `mixitup.Mixer` instances\n * allowing simultaneous control of said instances similar to the MixItUp 2 API.\n *\n * @example\n * new mixitup.Collection(instances)\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {mixitup.Mixer[]} instances\n */\n\n mixitup.Collection = function(instances) {\n var instance = null,\n i = -1;\n\n this.callActions('beforeConstruct');\n\n for (i = 0; instance = instances[i]; i++) {\n this[i] = instance;\n }\n\n this.length = instances.length;\n\n this.callActions('afterConstruct');\n\n h.freeze(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Collection);\n\n mixitup.Collection.prototype = Object.create(mixitup.Base.prototype);\n\n h.extend(mixitup.Collection.prototype,\n /** @lends mixitup.Collection */\n {\n constructor: mixitup.Collection,\n\n /**\n * Calls a method on all instances in the collection by passing the method\n * name as a string followed by any applicable parameters to be curried into\n * to the method.\n *\n * @example\n * .mixitup(methodName[,arg1][,arg2..]);\n *\n * @example\n * var collection = new Collection([mixer1, mixer2]);\n *\n * return collection.mixitup('filter', '.category-a')\n * .then(function(states) {\n * state.forEach(function(state) {\n * console.log(state.activeFilter.selector); // .category-a\n * });\n * });\n *\n * @public\n * @instance\n * @since 3.0.0\n * @param {string} methodName\n * @return {Promise>}\n */\n\n mixitup: function(methodName) {\n var self = this,\n instance = null,\n args = Array.prototype.slice.call(arguments),\n tasks = [],\n i = -1;\n\n this.callActions('beforeMixitup');\n\n args.shift();\n\n for (i = 0; instance = self[i]; i++) {\n tasks.push(instance[methodName].apply(instance, args));\n }\n\n return self.callFilters('promiseMixitup', h.all(tasks, mixitup.libraries), arguments);\n }\n });\n\n /**\n * `mixitup.Operation` objects contain all data neccessary to describe the full\n * lifecycle of any MixItUp operation. They can be used to compute and store an\n * operation for use at a later time (e.g. programmatic tweening).\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Operation = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.id = '';\n\n this.args = [];\n this.command = null;\n this.showPosData = [];\n this.toHidePosData = [];\n\n this.startState = null;\n this.newState = null;\n this.docState = null;\n\n this.willSort = false;\n this.willChangeLayout = false;\n this.hasEffect = false;\n this.hasFailed = false;\n\n this.triggerElement = null;\n\n this.show = [];\n this.hide = [];\n this.matching = [];\n this.toShow = [];\n this.toHide = [];\n this.toMove = [];\n this.toRemove = [];\n this.startOrder = [];\n this.newOrder = [];\n this.startSort = null;\n this.newSort = null;\n this.startFilter = null;\n this.newFilter = null;\n this.startDataset = null;\n this.newDataset = null;\n this.viewportDeltaX = 0;\n this.viewportDeltaY = 0;\n this.startX = 0;\n this.startY = 0;\n this.startHeight = 0;\n this.startWidth = 0;\n this.newX = 0;\n this.newY = 0;\n this.newHeight = 0;\n this.newWidth = 0;\n this.startContainerClassName = '';\n this.startDisplay = '';\n this.newContainerClassName = '';\n this.newDisplay = '';\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Operation);\n\n mixitup.Operation.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.Operation.prototype.constructor = mixitup.Operation;\n\n /**\n * `mixitup.State` objects expose various pieces of data detailing the state of\n * a MixItUp instance. They are provided at the start and end of any operation via\n * callbacks and events, with the most recent state stored between operations\n * for retrieval at any time via the API.\n *\n * @constructor\n * @namespace\n * @memberof mixitup\n * @public\n * @since 3.0.0\n */\n\n mixitup.State = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /**\n * The ID of the mixer instance.\n *\n * @name id\n * @memberof mixitup.State\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.id = '';\n\n /**\n * The currently active filter command as set by a control click or API call.\n *\n * @name activeFilter\n * @memberof mixitup.State\n * @instance\n * @type {mixitup.CommandFilter}\n * @default null\n */\n\n this.activeFilter = null;\n\n /**\n * The currently active sort command as set by a control click or API call.\n *\n * @name activeSort\n * @memberof mixitup.State\n * @instance\n * @type {mixitup.CommandSort}\n * @default null\n */\n\n this.activeSort = null;\n\n /**\n * The current layout-specific container class name, if applied.\n *\n * @name activeContainerClassName\n * @memberof mixitup.State\n * @instance\n * @type {string}\n * @default ''\n */\n\n this.activeContainerClassName = '';\n\n /**\n * A reference to the container element that the mixer is instantiated on.\n *\n * @name container\n * @memberof mixitup.State\n * @instance\n * @type {Element}\n * @default null\n */\n\n this.container = null;\n\n /**\n * An array of all target elements indexed by the mixer.\n *\n * @name targets\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */\n\n this.targets = [];\n\n /**\n * An array of all target elements not matching the current filter.\n *\n * @name hide\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */\n\n this.hide = [];\n\n /**\n * An array of all target elements matching the current filter and any additional\n * limits applied such as pagination.\n *\n * @name show\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */\n\n this.show = [];\n\n /**\n * An array of all target elements matching the current filter irrespective of\n * any additional limits applied such as pagination.\n *\n * @name matching\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default []\n */\n\n this.matching = [];\n\n /**\n * An integer representing the total number of target elements indexed by the\n * mixer. Equivalent to `state.targets.length`.\n *\n * @name totalTargets\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */\n\n this.totalTargets = -1;\n\n /**\n * An integer representing the total number of target elements matching the\n * current filter and any additional limits applied such as pagination.\n * Equivalent to `state.show.length`.\n *\n * @name totalShow\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */\n\n this.totalShow = -1;\n\n /**\n * An integer representing the total number of target elements not matching\n * the current filter. Equivalent to `state.hide.length`.\n *\n * @name totalHide\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */\n\n this.totalHide = -1;\n\n /**\n * An integer representing the total number of target elements matching the\n * current filter irrespective of any other limits applied such as pagination.\n * Equivalent to `state.matching.length`.\n *\n * @name totalMatching\n * @memberof mixitup.State\n * @instance\n * @type {number}\n * @default -1\n */\n\n this.totalMatching = -1;\n\n /**\n * A boolean indicating whether the last operation \"failed\", i.e. no targets\n * could be found matching the filter.\n *\n * @name hasFailed\n * @memberof mixitup.State\n * @instance\n * @type {boolean}\n * @default false\n */\n\n this.hasFailed = false;\n\n /**\n * The DOM element that was clicked if the last operation was triggered by the\n * clicking of a control and not an API call.\n *\n * @name triggerElement\n * @memberof mixitup.State\n * @instance\n * @type {Element|null}\n * @default null\n */\n\n this.triggerElement = null;\n\n /**\n * The currently active dataset underlying the rendered targets, if the\n * dataset API is in use.\n *\n * @name activeDataset\n * @memberof mixitup.State\n * @instance\n * @type {Array.}\n * @default null\n */\n\n this.activeDataset = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.State);\n\n mixitup.State.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.State.prototype.constructor = mixitup.State;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.UserInstruction = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n this.command = {};\n this.animate = false;\n this.callback = null;\n\n this.callActions('afterConstruct');\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.UserInstruction);\n\n mixitup.UserInstruction.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.UserInstruction.prototype.constructor = mixitup.UserInstruction;\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n */\n\n mixitup.Messages = function() {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct');\n\n /* Errors\n ----------------------------------------------------------------------------- */\n\n this.ERROR_FACTORY_INVALID_CONTAINER =\n '[MixItUp] An invalid selector or element reference was passed to the mixitup factory function';\n\n this.ERROR_FACTORY_CONTAINER_NOT_FOUND =\n '[MixItUp] The provided selector yielded no container element';\n\n this.ERROR_CONFIG_INVALID_ANIMATION_EFFECTS =\n '[MixItUp] Invalid value for `animation.effects`';\n\n this.ERROR_CONFIG_INVALID_CONTROLS_SCOPE =\n '[MixItUp] Invalid value for `controls.scope`';\n\n this.ERROR_CONFIG_INVALID_PROPERTY =\n '[MixitUp] Invalid configuration object property \"${erroneous}\"${suggestion}';\n\n this.ERROR_CONFIG_INVALID_PROPERTY_SUGGESTION =\n '. Did you mean \"${probableMatch}\"?';\n\n this.ERROR_CONFIG_DATA_UID_KEY_NOT_SET =\n '[MixItUp] To use the dataset API, a UID key must be specified using `data.uidKey`';\n\n this.ERROR_DATASET_INVALID_UID_KEY =\n '[MixItUp] The specified UID key \"${uidKey}\" is not present on one or more dataset items';\n\n this.ERROR_DATASET_DUPLICATE_UID =\n '[MixItUp] The UID \"${uid}\" was found on two or more dataset items. UIDs must be unique.';\n\n this.ERROR_INSERT_INVALID_ARGUMENTS =\n '[MixItUp] Please provider either an index or a sibling and position to insert, not both';\n\n this.ERROR_INSERT_PREEXISTING_ELEMENT =\n '[MixItUp] An element to be inserted already exists in the container';\n\n this.ERROR_FILTER_INVALID_ARGUMENTS =\n '[MixItUp] Please provide either a selector or collection `.filter()`, not both';\n\n this.ERROR_DATASET_NOT_SET =\n '[MixItUp] To use the dataset API with pre-rendered targets, a starting dataset must be set using `load.dataset`';\n\n this.ERROR_DATASET_PRERENDERED_MISMATCH =\n '[MixItUp] `load.dataset` does not match pre-rendered targets';\n\n this.ERROR_DATASET_RENDERER_NOT_SET =\n '[MixItUp] To insert an element via the dataset API, a target renderer function must be provided to `render.target`';\n\n this.ERROR_SORT_NON_EXISTENT_ELEMENT =\n '[MixItUp] An element to be sorted does not already exist in the container';\n\n /* Warnings\n ----------------------------------------------------------------------------- */\n\n this.WARNING_FACTORY_PREEXISTING_INSTANCE =\n '[MixItUp] WARNING: This element already has an active MixItUp instance. The provided configuration object will be ignored.' +\n ' If you wish to perform additional methods on this instance, please create a reference.';\n\n this.WARNING_INSERT_NO_ELEMENTS =\n '[MixItUp] WARNING: No valid elements were passed to `.insert()`';\n\n this.WARNING_REMOVE_NO_ELEMENTS =\n '[MixItUp] WARNING: No valid elements were passed to `.remove()`';\n\n this.WARNING_MULTIMIX_INSTANCE_QUEUE_FULL =\n '[MixItUp] WARNING: An operation was requested but the MixItUp instance was busy. The operation was rejected because the ' +\n 'queue is full or queuing is disabled.';\n\n this.WARNING_GET_OPERATION_INSTANCE_BUSY =\n '[MixItUp] WARNING: Operations can be be created while the MixItUp instance is busy.';\n\n this.WARNING_NO_PROMISE_IMPLEMENTATION =\n '[MixItUp] WARNING: No Promise implementations could be found. If you wish to use promises with MixItUp please install' +\n ' an ES6 Promise polyfill.';\n\n this.WARNING_INCONSISTENT_SORTING_ATTRIBUTES =\n '[MixItUp] WARNING: The requested sorting data attribute \"${attribute}\" was not present on one or more target elements' +\n ' which may product unexpected sort output';\n\n this.callActions('afterConstruct');\n\n this.compileTemplates();\n\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Messages);\n\n mixitup.Messages.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.Messages.prototype.constructor = mixitup.Messages;\n\n /**\n * @return {void}\n */\n\n mixitup.Messages.prototype.compileTemplates = function() {\n var errorKey = '';\n var errorMessage = '';\n\n for (errorKey in this) {\n if (typeof (errorMessage = this[errorKey]) !== 'string') continue;\n\n this[h.camelCase(errorKey)] = h.template(errorMessage);\n }\n };\n\n mixitup.messages = new mixitup.Messages();\n\n /**\n * @constructor\n * @memberof mixitup\n * @private\n * @since 3.0.0\n * @param {mixitup.Mixer} mixer\n */\n\n mixitup.Facade = function Mixer(mixer) {\n mixitup.Base.call(this);\n\n this.callActions('beforeConstruct', arguments);\n\n this.configure = mixer.configure.bind(mixer);\n this.show = mixer.show.bind(mixer);\n this.hide = mixer.hide.bind(mixer);\n this.filter = mixer.filter.bind(mixer);\n this.toggleOn = mixer.toggleOn.bind(mixer);\n this.toggleOff = mixer.toggleOff.bind(mixer);\n this.sort = mixer.sort.bind(mixer);\n this.changeLayout = mixer.changeLayout.bind(mixer);\n this.multimix = mixer.multimix.bind(mixer);\n this.dataset = mixer.dataset.bind(mixer);\n this.tween = mixer.tween.bind(mixer);\n this.insert = mixer.insert.bind(mixer);\n this.insertBefore = mixer.insertBefore.bind(mixer);\n this.insertAfter = mixer.insertAfter.bind(mixer);\n this.prepend = mixer.prepend.bind(mixer);\n this.append = mixer.append.bind(mixer);\n this.remove = mixer.remove.bind(mixer);\n this.destroy = mixer.destroy.bind(mixer);\n this.forceRefresh = mixer.forceRefresh.bind(mixer);\n this.forceRender = mixer.forceRender.bind(mixer);\n this.isMixing = mixer.isMixing.bind(mixer);\n this.getOperation = mixer.getOperation.bind(mixer);\n this.getConfig = mixer.getConfig.bind(mixer);\n this.getState = mixer.getState.bind(mixer);\n\n this.callActions('afterConstruct', arguments);\n\n h.freeze(this);\n h.seal(this);\n };\n\n mixitup.BaseStatic.call(mixitup.Facade);\n\n mixitup.Facade.prototype = Object.create(mixitup.Base.prototype);\n\n mixitup.Facade.prototype.constructor = mixitup.Facade;\n\n if (typeof exports === 'object' && typeof module === 'object') {\n module.exports = mixitup;\n } else if (typeof define === 'function' && define.amd) {\n define(function() {\n return mixitup;\n });\n } else if (typeof window.mixitup === 'undefined' || typeof window.mixitup !== 'function') {\n window.mixitup = mixitup;\n }\n mixitup.BaseStatic.call(mixitup.constructor);\n\n mixitup.NAME = 'mixitup';\n mixitup.CORE_VERSION = '3.3.1';\n})(window);","/**!\r\n * MixItUp MultiFilter v3.3.6\r\n * A UI-builder for powerful multidimensional filtering\r\n * Build 293e0dda-087e-4a76-aadf-e3e8b311b81f\r\n *\r\n * Requires mixitup.js >= v^3.1.2\r\n *\r\n * @copyright Copyright 2014-2020 KunkaLabs Limited.\r\n * @author KunkaLabs Limited.\r\n * @link https://www.kunkalabs.com/mixitup-multifilter/\r\n *\r\n * @license Commercial use requires a commercial license.\r\n * https://www.kunkalabs.com/mixitup-multifilter/licenses/\r\n *\r\n * Non-commercial use permitted under same terms as license.\r\n * http://creativecommons.org/licenses/by-nc/3.0/\r\n */\r\n!function(u){\"use strict\";var e=function(u){var t,i=u.h;if(t=[[\"A\",/[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g],[\"AA\",/[\\uA732]/g],[\"AE\",/[\\u00C6\\u01FC\\u01E2]/g],[\"AO\",/[\\uA734]/g],[\"AU\",/[\\uA736]/g],[\"AV\",/[\\uA738\\uA73A]/g],[\"AY\",/[\\uA73C]/g],[\"B\",/[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g],[\"C\",/[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g],[\"D\",/[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g],[\"DZ\",/[\\u01F1\\u01C4]/g],[\"Dz\",/[\\u01F2\\u01C5]/g],[\"E\",/[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g],[\"F\",/[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g],[\"G\",/[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g],[\"H\",/[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g],[\"I\",/[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g],[\"J\",/[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g],[\"K\",/[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g],[\"L\",/[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g],[\"LJ\",/[\\u01C7]/g],[\"Lj\",/[\\u01C8]/g],[\"M\",/[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g],[\"N\",/[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g],[\"NJ\",/[\\u01CA]/g],[\"Nj\",/[\\u01CB]/g],[\"O\",/[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g],[\"OI\",/[\\u01A2]/g],[\"OO\",/[\\uA74E]/g],[\"OU\",/[\\u0222]/g],[\"P\",/[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g],[\"Q\",/[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g],[\"R\",/[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g],[\"S\",/[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g],[\"T\",/[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g],[\"TZ\",/[\\uA728]/g],[\"U\",/[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g],[\"V\",/[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g],[\"VY\",/[\\uA760]/g],[\"W\",/[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g],[\"X\",/[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g],[\"Y\",/[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g],[\"Z\",/[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g],[\"a\",/[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g],[\"aa\",/[\\uA733]/g],[\"ae\",/[\\u00E6\\u01FD\\u01E3]/g],[\"ao\",/[\\uA735]/g],[\"au\",/[\\uA737]/g],[\"av\",/[\\uA739\\uA73B]/g],[\"ay\",/[\\uA73D]/g],[\"b\",/[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g],[\"c\",/[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g],[\"d\",/[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g],[\"dz\",/[\\u01F3\\u01C6]/g],[\"e\",/[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g],[\"f\",/[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g],[\"g\",/[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g],[\"h\",/[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g],[\"hv\",/[\\u0195]/g],[\"i\",/[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g],[\"j\",/[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g],[\"k\",/[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g],[\"l\",/[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g],[\"lj\",/[\\u01C9]/g],[\"m\",/[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g],[\"n\",/[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g],[\"nj\",/[\\u01CC]/g],[\"o\",/[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g],[\"oi\",/[\\u01A3]/g],[\"ou\",/[\\u0223]/g],[\"oo\",/[\\uA74F]/g],[\"p\",/[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g],[\"q\",/[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g],[\"r\",/[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g],[\"s\",/[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g],[\"t\",/[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g],[\"tz\",/[\\uA729]/g],[\"u\",/[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g],[\"v\",/[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g],[\"vy\",/[\\uA761]/g],[\"w\",/[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g],[\"x\",/[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g],[\"y\",/[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g],[\"z\",/[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g]],!u.CORE_VERSION||!i.compareVersions(e.REQUIRE_CORE_VERSION,u.CORE_VERSION))throw new Error(\"[MixItUp Multifilter] MixItUp Multifilter v\"+e.EXTENSION_VERSION+\" requires at least MixItUp v\"+e.REQUIRE_CORE_VERSION);u.ConfigCallbacks.registerAction(\"afterConstruct\",\"multifilter\",function(){this.onParseFilterGroups=null}),u.ConfigMultifilter=function(){this.enable=!1,this.logicWithinGroup=\"or\",this.logicBetweenGroups=\"and\",this.minSearchLength=3,this.parseOn=\"change\",this.keyupThrottleDuration=350,i.seal(this)},u.Config.registerAction(\"beforeConstruct\",\"multifilter\",function(){this.multifilter=new u.ConfigMultifilter}),u.MultifilterFormEventTracker=function(){this.form=null,this.totalBound=0,this.totalHandled=0,i.seal(this)},u.FilterGroupDom=function(){this.el=null,this.form=null,i.seal(this)},u.FilterGroup=function(){this.name=\"\",this.dom=new u.FilterGroupDom,this.activeSelectors=[],this.activeFilters=[],this.activeToggles=[],this.handler=null,this.mixer=null,this.logic=\"or\",this.parseOn=\"change\",this.keyupTimeout=-1,i.seal(this)},i.extend(u.FilterGroup.prototype,{init:function(u,e){var t=this,i=u.getAttribute(\"data-logic\");t.dom.el=u,this.name=t.dom.el.getAttribute(\"data-filter-group\")||\"\",t.cacheDom(),t.dom.form&&t.enableButtons(),t.mixer=e,(i&&\"and\"===i.toLowerCase()||\"and\"===e.config.multifilter.logicWithinGroup)&&(t.logic=\"and\"),t.bindEvents()},cacheDom:function(){var u=this;u.dom.form=i.closestParent(u.dom.el,\"form\",!0)},enableButtons:function(){var u=this,e=u.dom.form.querySelectorAll('button[type=\"submit\"]:disabled'),t=null,i=-1;for(i=0;t=e[i];i++)t.disabled&&(t.disabled=!1)},bindEvents:function(){var u=this;u.handler=function(e){switch(e.type){case\"reset\":case\"submit\":u.handleFormEvent(e);break;default:u[\"handle\"+i.pascalCase(e.type)](e)}},i.on(u.dom.el,\"click\",u.handler),i.on(u.dom.el,\"change\",u.handler),i.on(u.dom.el,\"keyup\",u.handler),u.dom.form&&(i.on(u.dom.form,\"reset\",u.handler),i.on(u.dom.form,\"submit\",u.handler))},unbindEvents:function(){var u=this;i.off(u.dom.el,\"click\",u.handler),i.off(u.dom.el,\"change\",u.handler),i.off(u.dom.el,\"keyup\",u.handler),u.dom.form&&(i.off(u.dom.form,\"reset\",u.handler),i.off(u.dom.form,\"submit\",u.handler)),u.handler=null},handleClick:function(u){var e=this,t=e.mixer,r=null,l=i.closestParent(u.target,\"[data-filter], [data-toggle]\",!0),o=\"\",n=-1,E=\"\";l&&((o=e.mixer.config.selectors.control)&&!l.matches(o)||(u.stopPropagation(),t.lastClicked||(t.lastClicked=l),\"function\"==typeof t.config.callbacks.onMixClick&&(r=t.config.callbacks.onMixClick.call(t.lastClicked,t.state,u,e),r===!1)||(l.matches(\"[data-filter]\")?(E=l.getAttribute(\"data-filter\"),e.activeToggles=[],e.activeSelectors=e.activeFilters=[E]):l.matches(\"[data-toggle]\")&&(E=l.getAttribute(\"data-toggle\"),e.activeFilters=[],(n=e.activeToggles.indexOf(E))>-1?e.activeToggles.splice(n,1):e.activeToggles.push(E),\"and\"===e.logic?e.activeSelectors=[e.activeToggles]:e.activeSelectors=e.activeToggles),e.updateControls(),\"change\"===e.mixer.config.multifilter.parseOn&&e.mixer.parseFilterGroups())))},handleChange:function(u){var e=this,t=u.target;switch(u.stopPropagation(),t.type){case\"text\":case\"search\":case\"email\":case\"select-one\":case\"radio\":e.getSingleValue(t);break;case\"checkbox\":case\"select-multiple\":e.getMultipleValues(t)}\"change\"===e.mixer.config.multifilter.parseOn&&e.mixer.parseFilterGroups()},handleKeyup:function(u){var e=this,t=u.target;if(!([\"text\",\"search\",\"email\"].indexOf(t.type)<0)){if(\"change\"!==e.mixer.config.multifilter.parseOn)return void e.mixer.getSingleValue(t);clearTimeout(e.keyupTimeout),e.keyupTimeout=setTimeout(function(){e.getSingleValue(t),e.mixer.parseFilterGroups()},e.mixer.config.multifilter.keyupThrottleDuration)}},handleFormEvent:function(e){var t=this,i=null,r=null,l=-1;if(\"submit\"===e.type&&e.preventDefault(),\"reset\"===e.type&&(t.activeFilters=t.activeToggles=t.activeSelectors=[],t.updateControls()),t.mixer.multifilterFormEventTracker)i=t.mixer.multifilterFormEventTracker;else for(i=t.mixer.multifilterFormEventTracker=new u.MultifilterFormEventTracker,i.form=e.target,l=0;r=t.mixer.filterGroups[l];l++)r.dom.form===e.target&&i.totalBound++;e.target===i.form&&(i.totalHandled++,i.totalHandled===i.totalBound&&(t.mixer.multifilterFormEventTracker=null,\"submit\"!==e.type&&\"change\"!==t.mixer.config.multifilter.parseOn||t.mixer.parseFilterGroups()))},getSingleValue:function(u){var e=this,i=null,r=\"\",l=\"\",o=\"\",n=-1;if(u.type.match(/text|search|email/g)){if(r=u.getAttribute(\"data-search-attribute\"),!r)throw new Error(\"[MixItUp MultiFilter] A valid `data-search-attribute` must be present on text inputs\");if(u.value.length-1?i.addClass(u,o):i.removeClass(u,o)},updateUi:function(){var u=this,e=u.dom.el.querySelectorAll(\"[data-filter], [data-toggle]\"),t=u.dom.el.querySelectorAll('input[type=\"radio\"], input[type=\"checkbox\"], option'),i=u.activeToggles.concat(u.activeFilters),r=!1,l=null,o=-1;for(e.length&&u.updateControls(e,!0),o=0;l=t[o];o++)switch(r=i.indexOf(l.value)>-1,l.tagName.toLowerCase()){case\"option\":l.selected=r;break;case\"input\":l.checked=r}}}),u.MixerDom.registerAction(\"afterConstruct\",\"multifilter\",function(){this.filterGroups=[]}),u.Mixer.registerAction(\"afterConstruct\",\"multifilter\",function(){this.filterGroups=[],this.filterGroupsHash={},this.multifilterFormEventTracker=null}),u.Mixer.registerAction(\"afterCacheDom\",\"multifilter\",function(){var e=this,t=null;if(e.config.multifilter.enable){switch(e.config.controls.scope){case\"local\":t=e.dom.container;break;case\"global\":t=e.dom.document;break;default:throw new Error(u.messages.ERROR_CONFIG_INVALID_CONTROLS_SCOPE)}e.dom.filterGroups=t.querySelectorAll(\"[data-filter-group]\")}}),u.Mixer.registerAction(\"beforeInitControls\",\"multifilter\",function(){var u=this;u.config.multifilter.enable&&(u.config.controls.live=!0)}),u.Mixer.registerAction(\"afterSanitizeConfig\",\"multifilter\",function(){var u=this;u.config.multifilter.logicBetweenGroups=u.config.multifilter.logicBetweenGroups.toLowerCase().trim(),u.config.multifilter.logicWithinGroup=u.config.multifilter.logicWithinGroup.toLowerCase().trim()}),u.Mixer.registerAction(\"afterAttach\",\"multifilter\",function(){var u=this;u.dom.filterGroups.length&&u.indexFilterGroups()}),u.Mixer.registerAction(\"afterUpdateControls\",\"multifilter\",function(){var u=this,e=null,t=-1;for(t=0;e=u.filterGroups[t];t++)e.updateControls()}),u.Mixer.registerAction(\"beforeDestroy\",\"multifilter\",function(){var u=this,e=null,t=-1;for(t=0;e=u.filterGroups[t];t++)e.unbindEvents()}),u.Mixer.extend({indexFilterGroups:function(){var e=this,t=null,i=null,r=-1;for(r=0;i=e.dom.filterGroups[r];r++)if(t=new u.FilterGroup,t.init(i,e),e.filterGroups.push(t),t.name){if(\"undefined\"!=typeof e.filterGroupsHash[t.name])throw new Error('[MixItUp MultiFilter] A filter group with name \"'+t.name+'\" already exists');e.filterGroupsHash[t.name]=t}},parseParseFilterGroupsArgs:function(e){var t=this,r=new u.UserInstruction,l=null,o=-1;for(r.animate=t.config.animation.enable,r.command=new u.CommandFilter,o=0;o1){for(o=0;o