{"version":3,"file":"./index.js","mappings":"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","sources":["webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./scripts/sortable.js","webpack:///./scripts/lib/utils.js","webpack:///./scripts/app/AttributesConfig.js","webpack:///./scripts/systems.js","webpack:///./scripts/settings.js","webpack:///./scripts/app/AddEvent.js","webpack:///./scripts/app/CombatDock.js","webpack:///./scripts/app/CombatantPortrait.js","webpack:///./scripts/lib/welcome.js","webpack:///./scripts/main.js","webpack:///./scripts/config.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**!\r\n * Sortable 1.15.0\r\n * @author\tRubaXa \r\n * @author\towenm \r\n * @license MIT\r\n */\r\nfunction ownKeys(object, enumerableOnly) {\r\n var keys = Object.keys(object);\r\n \r\n if (Object.getOwnPropertySymbols) {\r\n var symbols = Object.getOwnPropertySymbols(object);\r\n \r\n if (enumerableOnly) {\r\n symbols = symbols.filter(function (sym) {\r\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\r\n });\r\n }\r\n \r\n keys.push.apply(keys, symbols);\r\n }\r\n \r\n return keys;\r\n }\r\n \r\n function _objectSpread2(target) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n var source = arguments[i] != null ? arguments[i] : {};\r\n \r\n if (i % 2) {\r\n ownKeys(Object(source), true).forEach(function (key) {\r\n _defineProperty(target, key, source[key]);\r\n });\r\n } else if (Object.getOwnPropertyDescriptors) {\r\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\r\n } else {\r\n ownKeys(Object(source)).forEach(function (key) {\r\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\r\n });\r\n }\r\n }\r\n \r\n return target;\r\n }\r\n \r\n function _typeof(obj) {\r\n \"@babel/helpers - typeof\";\r\n \r\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\r\n _typeof = function (obj) {\r\n return typeof obj;\r\n };\r\n } else {\r\n _typeof = function (obj) {\r\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\r\n };\r\n }\r\n \r\n return _typeof(obj);\r\n }\r\n \r\n function _defineProperty(obj, key, value) {\r\n if (key in obj) {\r\n Object.defineProperty(obj, key, {\r\n value: value,\r\n enumerable: true,\r\n configurable: true,\r\n writable: true\r\n });\r\n } else {\r\n obj[key] = value;\r\n }\r\n \r\n return obj;\r\n }\r\n \r\n function _extends() {\r\n _extends = Object.assign || function (target) {\r\n for (var i = 1; i < arguments.length; i++) {\r\n var source = arguments[i];\r\n \r\n for (var key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n \r\n return target;\r\n };\r\n \r\n return _extends.apply(this, arguments);\r\n }\r\n \r\n function _objectWithoutPropertiesLoose(source, excluded) {\r\n if (source == null) return {};\r\n var target = {};\r\n var sourceKeys = Object.keys(source);\r\n var key, i;\r\n \r\n for (i = 0; i < sourceKeys.length; i++) {\r\n key = sourceKeys[i];\r\n if (excluded.indexOf(key) >= 0) continue;\r\n target[key] = source[key];\r\n }\r\n \r\n return target;\r\n }\r\n \r\n function _objectWithoutProperties(source, excluded) {\r\n if (source == null) return {};\r\n \r\n var target = _objectWithoutPropertiesLoose(source, excluded);\r\n \r\n var key, i;\r\n \r\n if (Object.getOwnPropertySymbols) {\r\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\r\n \r\n for (i = 0; i < sourceSymbolKeys.length; i++) {\r\n key = sourceSymbolKeys[i];\r\n if (excluded.indexOf(key) >= 0) continue;\r\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\r\n target[key] = source[key];\r\n }\r\n }\r\n \r\n return target;\r\n }\r\n \r\n function _toConsumableArray(arr) {\r\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\r\n }\r\n \r\n function _arrayWithoutHoles(arr) {\r\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\r\n }\r\n \r\n function _iterableToArray(iter) {\r\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\r\n }\r\n \r\n function _unsupportedIterableToArray(o, minLen) {\r\n if (!o) return;\r\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\r\n var n = Object.prototype.toString.call(o).slice(8, -1);\r\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\r\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\r\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\r\n }\r\n \r\n function _arrayLikeToArray(arr, len) {\r\n if (len == null || len > arr.length) len = arr.length;\r\n \r\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\r\n \r\n return arr2;\r\n }\r\n \r\n function _nonIterableSpread() {\r\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\r\n }\r\n \r\n var version = \"1.15.0\";\r\n \r\n function userAgent(pattern) {\r\n if (typeof window !== 'undefined' && window.navigator) {\r\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\r\n }\r\n }\r\n \r\n var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\r\n var Edge = userAgent(/Edge/i);\r\n var FireFox = userAgent(/firefox/i);\r\n var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\r\n var IOS = userAgent(/iP(ad|od|hone)/i);\r\n var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\r\n \r\n var captureMode = {\r\n capture: false,\r\n passive: false\r\n };\r\n \r\n function on(el, event, fn) {\r\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\r\n }\r\n \r\n function off(el, event, fn) {\r\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\r\n }\r\n \r\n function matches(\r\n /**HTMLElement*/\r\n el,\r\n /**String*/\r\n selector) {\r\n if (!selector) return;\r\n selector[0] === '>' && (selector = selector.substring(1));\r\n \r\n if (el) {\r\n try {\r\n if (el.matches) {\r\n return el.matches(selector);\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(selector);\r\n } else if (el.webkitMatchesSelector) {\r\n return el.webkitMatchesSelector(selector);\r\n }\r\n } catch (_) {\r\n return false;\r\n }\r\n }\r\n \r\n return false;\r\n }\r\n \r\n function getParentOrHost(el) {\r\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\r\n }\r\n \r\n function closest(\r\n /**HTMLElement*/\r\n el,\r\n /**String*/\r\n selector,\r\n /**HTMLElement*/\r\n ctx, includeCTX) {\r\n if (el) {\r\n ctx = ctx || document;\r\n \r\n do {\r\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\r\n return el;\r\n }\r\n \r\n if (el === ctx) break;\r\n /* jshint boss:true */\r\n } while (el = getParentOrHost(el));\r\n }\r\n \r\n return null;\r\n }\r\n \r\n var R_SPACE = /\\s+/g;\r\n \r\n function toggleClass(el, name, state) {\r\n if (el && name) {\r\n if (el.classList) {\r\n el.classList[state ? 'add' : 'remove'](name);\r\n } else {\r\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\r\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\r\n }\r\n }\r\n }\r\n \r\n function css(el, prop, val) {\r\n var style = el && el.style;\r\n \r\n if (style) {\r\n if (val === void 0) {\r\n if (document.defaultView && document.defaultView.getComputedStyle) {\r\n val = document.defaultView.getComputedStyle(el, '');\r\n } else if (el.currentStyle) {\r\n val = el.currentStyle;\r\n }\r\n \r\n return prop === void 0 ? val : val[prop];\r\n } else {\r\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\r\n prop = '-webkit-' + prop;\r\n }\r\n \r\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\r\n }\r\n }\r\n }\r\n \r\n function matrix(el, selfOnly) {\r\n var appliedTransforms = '';\r\n \r\n if (typeof el === 'string') {\r\n appliedTransforms = el;\r\n } else {\r\n do {\r\n var transform = css(el, 'transform');\r\n \r\n if (transform && transform !== 'none') {\r\n appliedTransforms = transform + ' ' + appliedTransforms;\r\n }\r\n /* jshint boss:true */\r\n \r\n } while (!selfOnly && (el = el.parentNode));\r\n }\r\n \r\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\r\n /*jshint -W056 */\r\n \r\n return matrixFn && new matrixFn(appliedTransforms);\r\n }\r\n \r\n function find(ctx, tagName, iterator) {\r\n if (ctx) {\r\n var list = ctx.getElementsByTagName(tagName),\r\n i = 0,\r\n n = list.length;\r\n \r\n if (iterator) {\r\n for (; i < n; i++) {\r\n iterator(list[i], i);\r\n }\r\n }\r\n \r\n return list;\r\n }\r\n \r\n return [];\r\n }\r\n \r\n function getWindowScrollingElement() {\r\n var scrollingElement = document.scrollingElement;\r\n \r\n if (scrollingElement) {\r\n return scrollingElement;\r\n } else {\r\n return document.documentElement;\r\n }\r\n }\r\n /**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\r\n \r\n \r\n function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\r\n if (!el.getBoundingClientRect && el !== window) return;\r\n var elRect, top, left, bottom, right, height, width;\r\n \r\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\r\n elRect = el.getBoundingClientRect();\r\n top = elRect.top;\r\n left = elRect.left;\r\n bottom = elRect.bottom;\r\n right = elRect.right;\r\n height = elRect.height;\r\n width = elRect.width;\r\n } else {\r\n top = 0;\r\n left = 0;\r\n bottom = window.innerHeight;\r\n right = window.innerWidth;\r\n height = window.innerHeight;\r\n width = window.innerWidth;\r\n }\r\n \r\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\r\n // Adjust for translate()\r\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\r\n // Not needed on <= IE11\r\n \r\n if (!IE11OrLess) {\r\n do {\r\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\r\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\r\n \r\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\r\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\r\n bottom = top + elRect.height;\r\n right = left + elRect.width;\r\n break;\r\n }\r\n /* jshint boss:true */\r\n \r\n } while (container = container.parentNode);\r\n }\r\n }\r\n \r\n if (undoScale && el !== window) {\r\n // Adjust for scale()\r\n var elMatrix = matrix(container || el),\r\n scaleX = elMatrix && elMatrix.a,\r\n scaleY = elMatrix && elMatrix.d;\r\n \r\n if (elMatrix) {\r\n top /= scaleY;\r\n left /= scaleX;\r\n width /= scaleX;\r\n height /= scaleY;\r\n bottom = top + height;\r\n right = left + width;\r\n }\r\n }\r\n \r\n return {\r\n top: top,\r\n left: left,\r\n bottom: bottom,\r\n right: right,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n /**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\r\n \r\n \r\n function isScrolledPast(el, elSide, parentSide) {\r\n var parent = getParentAutoScrollElement(el, true),\r\n elSideVal = getRect(el)[elSide];\r\n /* jshint boss:true */\r\n \r\n while (parent) {\r\n var parentSideVal = getRect(parent)[parentSide],\r\n visible = void 0;\r\n \r\n if (parentSide === 'top' || parentSide === 'left') {\r\n visible = elSideVal >= parentSideVal;\r\n } else {\r\n visible = elSideVal <= parentSideVal;\r\n }\r\n \r\n if (!visible) return parent;\r\n if (parent === getWindowScrollingElement()) break;\r\n parent = getParentAutoScrollElement(parent, false);\r\n }\r\n \r\n return false;\r\n }\r\n /**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\r\n \r\n \r\n function getChild(el, childNum, options, includeDragEl) {\r\n var currentChild = 0,\r\n i = 0,\r\n children = el.children;\r\n \r\n while (i < children.length) {\r\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\r\n if (currentChild === childNum) {\r\n return children[i];\r\n }\r\n \r\n currentChild++;\r\n }\r\n \r\n i++;\r\n }\r\n \r\n return null;\r\n }\r\n /**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\r\n \r\n \r\n function lastChild(el, selector) {\r\n var last = el.lastElementChild;\r\n \r\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\r\n last = last.previousElementSibling;\r\n }\r\n \r\n return last || null;\r\n }\r\n /**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\r\n \r\n \r\n function index(el, selector) {\r\n var index = 0;\r\n \r\n if (!el || !el.parentNode) {\r\n return -1;\r\n }\r\n /* jshint boss:true */\r\n \r\n \r\n while (el = el.previousElementSibling) {\r\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\r\n index++;\r\n }\r\n }\r\n \r\n return index;\r\n }\r\n /**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\r\n \r\n \r\n function getRelativeScrollOffset(el) {\r\n var offsetLeft = 0,\r\n offsetTop = 0,\r\n winScroller = getWindowScrollingElement();\r\n \r\n if (el) {\r\n do {\r\n var elMatrix = matrix(el),\r\n scaleX = elMatrix.a,\r\n scaleY = elMatrix.d;\r\n offsetLeft += el.scrollLeft * scaleX;\r\n offsetTop += el.scrollTop * scaleY;\r\n } while (el !== winScroller && (el = el.parentNode));\r\n }\r\n \r\n return [offsetLeft, offsetTop];\r\n }\r\n /**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\r\n \r\n \r\n function indexOfObject(arr, obj) {\r\n for (var i in arr) {\r\n if (!arr.hasOwnProperty(i)) continue;\r\n \r\n for (var key in obj) {\r\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\r\n }\r\n }\r\n \r\n return -1;\r\n }\r\n \r\n function getParentAutoScrollElement(el, includeSelf) {\r\n // skip to window\r\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\r\n var elem = el;\r\n var gotSelf = false;\r\n \r\n do {\r\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\r\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\r\n var elemCSS = css(elem);\r\n \r\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\r\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\r\n if (gotSelf || includeSelf) return elem;\r\n gotSelf = true;\r\n }\r\n }\r\n /* jshint boss:true */\r\n \r\n } while (elem = elem.parentNode);\r\n \r\n return getWindowScrollingElement();\r\n }\r\n \r\n function extend(dst, src) {\r\n if (dst && src) {\r\n for (var key in src) {\r\n if (src.hasOwnProperty(key)) {\r\n dst[key] = src[key];\r\n }\r\n }\r\n }\r\n \r\n return dst;\r\n }\r\n \r\n function isRectEqual(rect1, rect2) {\r\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\r\n }\r\n \r\n var _throttleTimeout;\r\n \r\n function throttle(callback, ms) {\r\n return function () {\r\n if (!_throttleTimeout) {\r\n var args = arguments,\r\n _this = this;\r\n \r\n if (args.length === 1) {\r\n callback.call(_this, args[0]);\r\n } else {\r\n callback.apply(_this, args);\r\n }\r\n \r\n _throttleTimeout = setTimeout(function () {\r\n _throttleTimeout = void 0;\r\n }, ms);\r\n }\r\n };\r\n }\r\n \r\n function cancelThrottle() {\r\n clearTimeout(_throttleTimeout);\r\n _throttleTimeout = void 0;\r\n }\r\n \r\n function scrollBy(el, x, y) {\r\n el.scrollLeft += x;\r\n el.scrollTop += y;\r\n }\r\n \r\n function clone(el) {\r\n var Polymer = window.Polymer;\r\n var $ = window.jQuery || window.Zepto;\r\n \r\n if (Polymer && Polymer.dom) {\r\n return Polymer.dom(el).cloneNode(true);\r\n } else if ($) {\r\n return $(el).clone(true)[0];\r\n } else {\r\n return el.cloneNode(true);\r\n }\r\n }\r\n \r\n function setRect(el, rect) {\r\n css(el, 'position', 'absolute');\r\n css(el, 'top', rect.top);\r\n css(el, 'left', rect.left);\r\n css(el, 'width', rect.width);\r\n css(el, 'height', rect.height);\r\n }\r\n \r\n function unsetRect(el) {\r\n css(el, 'position', '');\r\n css(el, 'top', '');\r\n css(el, 'left', '');\r\n css(el, 'width', '');\r\n css(el, 'height', '');\r\n }\r\n \r\n var expando = 'Sortable' + new Date().getTime();\r\n \r\n function AnimationStateManager() {\r\n var animationStates = [],\r\n animationCallbackId;\r\n return {\r\n captureAnimationState: function captureAnimationState() {\r\n animationStates = [];\r\n if (!this.options.animation) return;\r\n var children = [].slice.call(this.el.children);\r\n children.forEach(function (child) {\r\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\r\n animationStates.push({\r\n target: child,\r\n rect: getRect(child)\r\n });\r\n \r\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\r\n \r\n \r\n if (child.thisAnimationDuration) {\r\n var childMatrix = matrix(child, true);\r\n \r\n if (childMatrix) {\r\n fromRect.top -= childMatrix.f;\r\n fromRect.left -= childMatrix.e;\r\n }\r\n }\r\n \r\n child.fromRect = fromRect;\r\n });\r\n },\r\n addAnimationState: function addAnimationState(state) {\r\n animationStates.push(state);\r\n },\r\n removeAnimationState: function removeAnimationState(target) {\r\n animationStates.splice(indexOfObject(animationStates, {\r\n target: target\r\n }), 1);\r\n },\r\n animateAll: function animateAll(callback) {\r\n var _this = this;\r\n \r\n if (!this.options.animation) {\r\n clearTimeout(animationCallbackId);\r\n if (typeof callback === 'function') callback();\r\n return;\r\n }\r\n \r\n var animating = false,\r\n animationTime = 0;\r\n animationStates.forEach(function (state) {\r\n var time = 0,\r\n target = state.target,\r\n fromRect = target.fromRect,\r\n toRect = getRect(target),\r\n prevFromRect = target.prevFromRect,\r\n prevToRect = target.prevToRect,\r\n animatingRect = state.rect,\r\n targetMatrix = matrix(target, true);\r\n \r\n if (targetMatrix) {\r\n // Compensate for current animation\r\n toRect.top -= targetMatrix.f;\r\n toRect.left -= targetMatrix.e;\r\n }\r\n \r\n target.toRect = toRect;\r\n \r\n if (target.thisAnimationDuration) {\r\n // Could also check if animatingRect is between fromRect and toRect\r\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\r\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\r\n // If returning to same place as started from animation and on same axis\r\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\r\n }\r\n } // if fromRect != toRect: animate\r\n \r\n \r\n if (!isRectEqual(toRect, fromRect)) {\r\n target.prevFromRect = fromRect;\r\n target.prevToRect = toRect;\r\n \r\n if (!time) {\r\n time = _this.options.animation;\r\n }\r\n \r\n _this.animate(target, animatingRect, toRect, time);\r\n }\r\n \r\n if (time) {\r\n animating = true;\r\n animationTime = Math.max(animationTime, time);\r\n clearTimeout(target.animationResetTimer);\r\n target.animationResetTimer = setTimeout(function () {\r\n target.animationTime = 0;\r\n target.prevFromRect = null;\r\n target.fromRect = null;\r\n target.prevToRect = null;\r\n target.thisAnimationDuration = null;\r\n }, time);\r\n target.thisAnimationDuration = time;\r\n }\r\n });\r\n clearTimeout(animationCallbackId);\r\n \r\n if (!animating) {\r\n if (typeof callback === 'function') callback();\r\n } else {\r\n animationCallbackId = setTimeout(function () {\r\n if (typeof callback === 'function') callback();\r\n }, animationTime);\r\n }\r\n \r\n animationStates = [];\r\n },\r\n animate: function animate(target, currentRect, toRect, duration) {\r\n if (duration) {\r\n css(target, 'transition', '');\r\n css(target, 'transform', '');\r\n var elMatrix = matrix(this.el),\r\n scaleX = elMatrix && elMatrix.a,\r\n scaleY = elMatrix && elMatrix.d,\r\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\r\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\r\n target.animatingX = !!translateX;\r\n target.animatingY = !!translateY;\r\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\r\n this.forRepaintDummy = repaint(target); // repaint\r\n \r\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\r\n css(target, 'transform', 'translate3d(0,0,0)');\r\n typeof target.animated === 'number' && clearTimeout(target.animated);\r\n target.animated = setTimeout(function () {\r\n css(target, 'transition', '');\r\n css(target, 'transform', '');\r\n target.animated = false;\r\n target.animatingX = false;\r\n target.animatingY = false;\r\n }, duration);\r\n }\r\n }\r\n };\r\n }\r\n \r\n function repaint(target) {\r\n return target.offsetWidth;\r\n }\r\n \r\n function calculateRealTime(animatingRect, fromRect, toRect, options) {\r\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\r\n }\r\n \r\n var plugins = [];\r\n var defaults = {\r\n initializeByDefault: true\r\n };\r\n var PluginManager = {\r\n mount: function mount(plugin) {\r\n // Set default static properties\r\n for (var option in defaults) {\r\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\r\n plugin[option] = defaults[option];\r\n }\r\n }\r\n \r\n plugins.forEach(function (p) {\r\n if (p.pluginName === plugin.pluginName) {\r\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\r\n }\r\n });\r\n plugins.push(plugin);\r\n },\r\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\r\n var _this = this;\r\n \r\n this.eventCanceled = false;\r\n \r\n evt.cancel = function () {\r\n _this.eventCanceled = true;\r\n };\r\n \r\n var eventNameGlobal = eventName + 'Global';\r\n plugins.forEach(function (plugin) {\r\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\r\n \r\n if (sortable[plugin.pluginName][eventNameGlobal]) {\r\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\r\n sortable: sortable\r\n }, evt));\r\n } // Only fire plugin event if plugin is enabled in this sortable,\r\n // and plugin has event defined\r\n \r\n \r\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\r\n sortable[plugin.pluginName][eventName](_objectSpread2({\r\n sortable: sortable\r\n }, evt));\r\n }\r\n });\r\n },\r\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\r\n plugins.forEach(function (plugin) {\r\n var pluginName = plugin.pluginName;\r\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\r\n var initialized = new plugin(sortable, el, sortable.options);\r\n initialized.sortable = sortable;\r\n initialized.options = sortable.options;\r\n sortable[pluginName] = initialized; // Add default options from plugin\r\n \r\n _extends(defaults, initialized.defaults);\r\n });\r\n \r\n for (var option in sortable.options) {\r\n if (!sortable.options.hasOwnProperty(option)) continue;\r\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\r\n \r\n if (typeof modified !== 'undefined') {\r\n sortable.options[option] = modified;\r\n }\r\n }\r\n },\r\n getEventProperties: function getEventProperties(name, sortable) {\r\n var eventProperties = {};\r\n plugins.forEach(function (plugin) {\r\n if (typeof plugin.eventProperties !== 'function') return;\r\n \r\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\r\n });\r\n return eventProperties;\r\n },\r\n modifyOption: function modifyOption(sortable, name, value) {\r\n var modifiedValue;\r\n plugins.forEach(function (plugin) {\r\n // Plugin must exist on the Sortable\r\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\r\n \r\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\r\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\r\n }\r\n });\r\n return modifiedValue;\r\n }\r\n };\r\n \r\n function dispatchEvent(_ref) {\r\n var sortable = _ref.sortable,\r\n rootEl = _ref.rootEl,\r\n name = _ref.name,\r\n targetEl = _ref.targetEl,\r\n cloneEl = _ref.cloneEl,\r\n toEl = _ref.toEl,\r\n fromEl = _ref.fromEl,\r\n oldIndex = _ref.oldIndex,\r\n newIndex = _ref.newIndex,\r\n oldDraggableIndex = _ref.oldDraggableIndex,\r\n newDraggableIndex = _ref.newDraggableIndex,\r\n originalEvent = _ref.originalEvent,\r\n putSortable = _ref.putSortable,\r\n extraEventProperties = _ref.extraEventProperties;\r\n sortable = sortable || rootEl && rootEl[expando];\r\n if (!sortable) return;\r\n var evt,\r\n options = sortable.options,\r\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\r\n \r\n if (window.CustomEvent && !IE11OrLess && !Edge) {\r\n evt = new CustomEvent(name, {\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n } else {\r\n evt = document.createEvent('Event');\r\n evt.initEvent(name, true, true);\r\n }\r\n \r\n evt.to = toEl || rootEl;\r\n evt.from = fromEl || rootEl;\r\n evt.item = targetEl || rootEl;\r\n evt.clone = cloneEl;\r\n evt.oldIndex = oldIndex;\r\n evt.newIndex = newIndex;\r\n evt.oldDraggableIndex = oldDraggableIndex;\r\n evt.newDraggableIndex = newDraggableIndex;\r\n evt.originalEvent = originalEvent;\r\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\r\n \r\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\r\n \r\n for (var option in allEventProperties) {\r\n evt[option] = allEventProperties[option];\r\n }\r\n \r\n if (rootEl) {\r\n rootEl.dispatchEvent(evt);\r\n }\r\n \r\n if (options[onName]) {\r\n options[onName].call(sortable, evt);\r\n }\r\n }\r\n \r\n var _excluded = [\"evt\"];\r\n \r\n var pluginEvent = function pluginEvent(eventName, sortable) {\r\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\r\n originalEvent = _ref.evt,\r\n data = _objectWithoutProperties(_ref, _excluded);\r\n \r\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\r\n dragEl: dragEl,\r\n parentEl: parentEl,\r\n ghostEl: ghostEl,\r\n rootEl: rootEl,\r\n nextEl: nextEl,\r\n lastDownEl: lastDownEl,\r\n cloneEl: cloneEl,\r\n cloneHidden: cloneHidden,\r\n dragStarted: moved,\r\n putSortable: putSortable,\r\n activeSortable: Sortable.active,\r\n originalEvent: originalEvent,\r\n oldIndex: oldIndex,\r\n oldDraggableIndex: oldDraggableIndex,\r\n newIndex: newIndex,\r\n newDraggableIndex: newDraggableIndex,\r\n hideGhostForTarget: _hideGhostForTarget,\r\n unhideGhostForTarget: _unhideGhostForTarget,\r\n cloneNowHidden: function cloneNowHidden() {\r\n cloneHidden = true;\r\n },\r\n cloneNowShown: function cloneNowShown() {\r\n cloneHidden = false;\r\n },\r\n dispatchSortableEvent: function dispatchSortableEvent(name) {\r\n _dispatchEvent({\r\n sortable: sortable,\r\n name: name,\r\n originalEvent: originalEvent\r\n });\r\n }\r\n }, data));\r\n };\r\n \r\n function _dispatchEvent(info) {\r\n dispatchEvent(_objectSpread2({\r\n putSortable: putSortable,\r\n cloneEl: cloneEl,\r\n targetEl: dragEl,\r\n rootEl: rootEl,\r\n oldIndex: oldIndex,\r\n oldDraggableIndex: oldDraggableIndex,\r\n newIndex: newIndex,\r\n newDraggableIndex: newDraggableIndex\r\n }, info));\r\n }\r\n \r\n var dragEl,\r\n parentEl,\r\n ghostEl,\r\n rootEl,\r\n nextEl,\r\n lastDownEl,\r\n cloneEl,\r\n cloneHidden,\r\n oldIndex,\r\n newIndex,\r\n oldDraggableIndex,\r\n newDraggableIndex,\r\n activeGroup,\r\n putSortable,\r\n awaitingDragStarted = false,\r\n ignoreNextClick = false,\r\n sortables = [],\r\n tapEvt,\r\n touchEvt,\r\n lastDx,\r\n lastDy,\r\n tapDistanceLeft,\r\n tapDistanceTop,\r\n moved,\r\n lastTarget,\r\n lastDirection,\r\n pastFirstInvertThresh = false,\r\n isCircumstantialInvert = false,\r\n targetMoveDistance,\r\n // For positioning ghost absolutely\r\n ghostRelativeParent,\r\n ghostRelativeParentInitialScroll = [],\r\n // (left, top)\r\n _silent = false,\r\n savedInputChecked = [];\r\n /** @const */\r\n \r\n var documentExists = typeof document !== 'undefined',\r\n PositionGhostAbsolutely = IOS,\r\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\r\n // This will not pass for IE9, because IE9 DnD only works on anchors\r\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\r\n supportCssPointerEvents = function () {\r\n if (!documentExists) return; // false when <= IE11\r\n \r\n if (IE11OrLess) {\r\n return false;\r\n }\r\n \r\n var el = document.createElement('x');\r\n el.style.cssText = 'pointer-events:auto';\r\n return el.style.pointerEvents === 'auto';\r\n }(),\r\n _detectDirection = function _detectDirection(el, options) {\r\n var elCSS = css(el),\r\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\r\n child1 = getChild(el, 0, options),\r\n child2 = getChild(el, 1, options),\r\n firstChildCSS = child1 && css(child1),\r\n secondChildCSS = child2 && css(child2),\r\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\r\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\r\n \r\n if (elCSS.display === 'flex') {\r\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\r\n }\r\n \r\n if (elCSS.display === 'grid') {\r\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\r\n }\r\n \r\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\r\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\r\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\r\n }\r\n \r\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\r\n },\r\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\r\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\r\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\r\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\r\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\r\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\r\n targetOppLength = vertical ? targetRect.width : targetRect.height;\r\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\r\n },\r\n \r\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\r\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\r\n var ret;\r\n sortables.some(function (sortable) {\r\n var threshold = sortable[expando].options.emptyInsertThreshold;\r\n if (!threshold || lastChild(sortable)) return;\r\n var rect = getRect(sortable),\r\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\r\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\r\n \r\n if (insideHorizontally && insideVertically) {\r\n return ret = sortable;\r\n }\r\n });\r\n return ret;\r\n },\r\n _prepareGroup = function _prepareGroup(options) {\r\n function toFn(value, pull) {\r\n return function (to, from, dragEl, evt) {\r\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\r\n \r\n if (value == null && (pull || sameGroup)) {\r\n // Default pull value\r\n // Default pull and put value if same group\r\n return true;\r\n } else if (value == null || value === false) {\r\n return false;\r\n } else if (pull && value === 'clone') {\r\n return value;\r\n } else if (typeof value === 'function') {\r\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\r\n } else {\r\n var otherGroup = (pull ? to : from).options.group.name;\r\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\r\n }\r\n };\r\n }\r\n \r\n var group = {};\r\n var originalGroup = options.group;\r\n \r\n if (!originalGroup || _typeof(originalGroup) != 'object') {\r\n originalGroup = {\r\n name: originalGroup\r\n };\r\n }\r\n \r\n group.name = originalGroup.name;\r\n group.checkPull = toFn(originalGroup.pull, true);\r\n group.checkPut = toFn(originalGroup.put);\r\n group.revertClone = originalGroup.revertClone;\r\n options.group = group;\r\n },\r\n _hideGhostForTarget = function _hideGhostForTarget() {\r\n if (!supportCssPointerEvents && ghostEl) {\r\n css(ghostEl, 'display', 'none');\r\n }\r\n },\r\n _unhideGhostForTarget = function _unhideGhostForTarget() {\r\n if (!supportCssPointerEvents && ghostEl) {\r\n css(ghostEl, 'display', '');\r\n }\r\n }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\r\n \r\n \r\n if (documentExists && !ChromeForAndroid) {\r\n document.addEventListener('click', function (evt) {\r\n if (ignoreNextClick) {\r\n evt.preventDefault();\r\n evt.stopPropagation && evt.stopPropagation();\r\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\r\n ignoreNextClick = false;\r\n return false;\r\n }\r\n }, true);\r\n }\r\n \r\n var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\r\n if (dragEl) {\r\n evt = evt.touches ? evt.touches[0] : evt;\r\n \r\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\r\n \r\n if (nearest) {\r\n // Create imitation event\r\n var event = {};\r\n \r\n for (var i in evt) {\r\n if (evt.hasOwnProperty(i)) {\r\n event[i] = evt[i];\r\n }\r\n }\r\n \r\n event.target = event.rootEl = nearest;\r\n event.preventDefault = void 0;\r\n event.stopPropagation = void 0;\r\n \r\n nearest[expando]._onDragOver(event);\r\n }\r\n }\r\n };\r\n \r\n var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\r\n if (dragEl) {\r\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\r\n }\r\n };\r\n /**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\r\n \r\n \r\n function Sortable(el, options) {\r\n if (!(el && el.nodeType && el.nodeType === 1)) {\r\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\r\n }\r\n \r\n this.el = el; // root element\r\n \r\n this.options = options = _extends({}, options); // Export instance\r\n \r\n el[expando] = this;\r\n var defaults = {\r\n group: null,\r\n sort: true,\r\n disabled: false,\r\n store: null,\r\n handle: null,\r\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\r\n swapThreshold: 1,\r\n // percentage; 0 <= x <= 1\r\n invertSwap: false,\r\n // invert always\r\n invertedSwapThreshold: null,\r\n // will be set to same as swapThreshold if default\r\n removeCloneOnHide: true,\r\n direction: function direction() {\r\n return _detectDirection(el, this.options);\r\n },\r\n ghostClass: 'sortable-ghost',\r\n chosenClass: 'sortable-chosen',\r\n dragClass: 'sortable-drag',\r\n ignore: 'a, img',\r\n filter: null,\r\n preventOnFilter: true,\r\n animation: 0,\r\n easing: null,\r\n setData: function setData(dataTransfer, dragEl) {\r\n dataTransfer.setData('Text', dragEl.textContent);\r\n },\r\n dropBubble: false,\r\n dragoverBubble: false,\r\n dataIdAttr: 'data-id',\r\n delay: 0,\r\n delayOnTouchOnly: false,\r\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\r\n forceFallback: false,\r\n fallbackClass: 'sortable-fallback',\r\n fallbackOnBody: false,\r\n fallbackTolerance: 0,\r\n fallbackOffset: {\r\n x: 0,\r\n y: 0\r\n },\r\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\r\n emptyInsertThreshold: 5\r\n };\r\n PluginManager.initializePlugins(this, el, defaults); // Set default options\r\n \r\n for (var name in defaults) {\r\n !(name in options) && (options[name] = defaults[name]);\r\n }\r\n \r\n _prepareGroup(options); // Bind all private methods\r\n \r\n \r\n for (var fn in this) {\r\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\r\n this[fn] = this[fn].bind(this);\r\n }\r\n } // Setup drag mode\r\n \r\n \r\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\r\n \r\n if (this.nativeDraggable) {\r\n // Touch start threshold cannot be greater than the native dragstart threshold\r\n this.options.touchStartThreshold = 1;\r\n } // Bind events\r\n \r\n \r\n if (options.supportPointer) {\r\n on(el, 'pointerdown', this._onTapStart);\r\n } else {\r\n on(el, 'mousedown', this._onTapStart);\r\n on(el, 'touchstart', this._onTapStart);\r\n }\r\n \r\n if (this.nativeDraggable) {\r\n on(el, 'dragover', this);\r\n on(el, 'dragenter', this);\r\n }\r\n \r\n sortables.push(this.el); // Restore sorting\r\n \r\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\r\n \r\n _extends(this, AnimationStateManager());\r\n }\r\n \r\n Sortable.prototype =\r\n /** @lends Sortable.prototype */\r\n {\r\n constructor: Sortable,\r\n _isOutsideThisEl: function _isOutsideThisEl(target) {\r\n if (!this.el.contains(target) && target !== this.el) {\r\n lastTarget = null;\r\n }\r\n },\r\n _getDirection: function _getDirection(evt, target) {\r\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\r\n },\r\n _onTapStart: function _onTapStart(\r\n /** Event|TouchEvent */\r\n evt) {\r\n if (!evt.cancelable) return;\r\n \r\n var _this = this,\r\n el = this.el,\r\n options = this.options,\r\n preventOnFilter = options.preventOnFilter,\r\n type = evt.type,\r\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\r\n target = (touch || evt).target,\r\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\r\n filter = options.filter;\r\n \r\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\r\n \r\n \r\n if (dragEl) {\r\n return;\r\n }\r\n \r\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\r\n return; // only left button and enabled\r\n } // cancel dnd if original target is content editable\r\n \r\n \r\n if (originalTarget.isContentEditable) {\r\n return;\r\n } // Safari ignores further event handling after mousedown\r\n \r\n \r\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\r\n return;\r\n }\r\n \r\n target = closest(target, options.draggable, el, false);\r\n \r\n if (target && target.animated) {\r\n return;\r\n }\r\n \r\n if (lastDownEl === target) {\r\n // Ignoring duplicate `down`\r\n return;\r\n } // Get the index of the dragged element within its parent\r\n \r\n \r\n oldIndex = index(target);\r\n oldDraggableIndex = index(target, options.draggable); // Check filter\r\n \r\n if (typeof filter === 'function') {\r\n if (filter.call(this, evt, target, this)) {\r\n _dispatchEvent({\r\n sortable: _this,\r\n rootEl: originalTarget,\r\n name: 'filter',\r\n targetEl: target,\r\n toEl: el,\r\n fromEl: el\r\n });\r\n \r\n pluginEvent('filter', _this, {\r\n evt: evt\r\n });\r\n preventOnFilter && evt.cancelable && evt.preventDefault();\r\n return; // cancel dnd\r\n }\r\n } else if (filter) {\r\n filter = filter.split(',').some(function (criteria) {\r\n criteria = closest(originalTarget, criteria.trim(), el, false);\r\n \r\n if (criteria) {\r\n _dispatchEvent({\r\n sortable: _this,\r\n rootEl: criteria,\r\n name: 'filter',\r\n targetEl: target,\r\n fromEl: el,\r\n toEl: el\r\n });\r\n \r\n pluginEvent('filter', _this, {\r\n evt: evt\r\n });\r\n return true;\r\n }\r\n });\r\n \r\n if (filter) {\r\n preventOnFilter && evt.cancelable && evt.preventDefault();\r\n return; // cancel dnd\r\n }\r\n }\r\n \r\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\r\n return;\r\n } // Prepare `dragstart`\r\n \r\n \r\n this._prepareDragStart(evt, touch, target);\r\n },\r\n _prepareDragStart: function _prepareDragStart(\r\n /** Event */\r\n evt,\r\n /** Touch */\r\n touch,\r\n /** HTMLElement */\r\n target) {\r\n var _this = this,\r\n el = _this.el,\r\n options = _this.options,\r\n ownerDocument = el.ownerDocument,\r\n dragStartFn;\r\n \r\n if (target && !dragEl && target.parentNode === el) {\r\n var dragRect = getRect(target);\r\n rootEl = el;\r\n dragEl = target;\r\n parentEl = dragEl.parentNode;\r\n nextEl = dragEl.nextSibling;\r\n lastDownEl = target;\r\n activeGroup = options.group;\r\n Sortable.dragged = dragEl;\r\n tapEvt = {\r\n target: dragEl,\r\n clientX: (touch || evt).clientX,\r\n clientY: (touch || evt).clientY\r\n };\r\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\r\n tapDistanceTop = tapEvt.clientY - dragRect.top;\r\n this._lastX = (touch || evt).clientX;\r\n this._lastY = (touch || evt).clientY;\r\n dragEl.style['will-change'] = 'all';\r\n \r\n dragStartFn = function dragStartFn() {\r\n pluginEvent('delayEnded', _this, {\r\n evt: evt\r\n });\r\n \r\n if (Sortable.eventCanceled) {\r\n _this._onDrop();\r\n \r\n return;\r\n } // Delayed drag has been triggered\r\n // we can re-enable the events: touchmove/mousemove\r\n \r\n \r\n _this._disableDelayedDragEvents();\r\n \r\n if (!FireFox && _this.nativeDraggable) {\r\n dragEl.draggable = true;\r\n } // Bind the events: dragstart/dragend\r\n \r\n \r\n _this._triggerDragStart(evt, touch); // Drag start event\r\n \r\n \r\n _dispatchEvent({\r\n sortable: _this,\r\n name: 'choose',\r\n originalEvent: evt\r\n }); // Chosen item\r\n \r\n \r\n toggleClass(dragEl, options.chosenClass, true);\r\n }; // Disable \"draggable\"\r\n \r\n \r\n options.ignore.split(',').forEach(function (criteria) {\r\n find(dragEl, criteria.trim(), _disableDraggable);\r\n });\r\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\r\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\r\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\r\n on(ownerDocument, 'mouseup', _this._onDrop);\r\n on(ownerDocument, 'touchend', _this._onDrop);\r\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\r\n \r\n if (FireFox && this.nativeDraggable) {\r\n this.options.touchStartThreshold = 4;\r\n dragEl.draggable = true;\r\n }\r\n \r\n pluginEvent('delayStart', this, {\r\n evt: evt\r\n }); // Delay is impossible for native DnD in Edge or IE\r\n \r\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\r\n if (Sortable.eventCanceled) {\r\n this._onDrop();\r\n \r\n return;\r\n } // If the user moves the pointer or let go the click or touch\r\n // before the delay has been reached:\r\n // disable the delayed drag\r\n \r\n \r\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\r\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\r\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\r\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\r\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\r\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\r\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\r\n } else {\r\n dragStartFn();\r\n }\r\n }\r\n },\r\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\r\n /** TouchEvent|PointerEvent **/\r\n e) {\r\n var touch = e.touches ? e.touches[0] : e;\r\n \r\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\r\n this._disableDelayedDrag();\r\n }\r\n },\r\n _disableDelayedDrag: function _disableDelayedDrag() {\r\n dragEl && _disableDraggable(dragEl);\r\n clearTimeout(this._dragStartTimer);\r\n \r\n this._disableDelayedDragEvents();\r\n },\r\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\r\n var ownerDocument = this.el.ownerDocument;\r\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\r\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\r\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\r\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\r\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\r\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\r\n },\r\n _triggerDragStart: function _triggerDragStart(\r\n /** Event */\r\n evt,\r\n /** Touch */\r\n touch) {\r\n touch = touch || evt.pointerType == 'touch' && evt;\r\n \r\n if (!this.nativeDraggable || touch) {\r\n if (this.options.supportPointer) {\r\n on(document, 'pointermove', this._onTouchMove);\r\n } else if (touch) {\r\n on(document, 'touchmove', this._onTouchMove);\r\n } else {\r\n on(document, 'mousemove', this._onTouchMove);\r\n }\r\n } else {\r\n on(dragEl, 'dragend', this);\r\n on(rootEl, 'dragstart', this._onDragStart);\r\n }\r\n \r\n try {\r\n if (document.selection) {\r\n // Timeout neccessary for IE9\r\n _nextTick(function () {\r\n document.selection.empty();\r\n });\r\n } else {\r\n window.getSelection().removeAllRanges();\r\n }\r\n } catch (err) {}\r\n },\r\n _dragStarted: function _dragStarted(fallback, evt) {\r\n \r\n awaitingDragStarted = false;\r\n \r\n if (rootEl && dragEl) {\r\n pluginEvent('dragStarted', this, {\r\n evt: evt\r\n });\r\n \r\n if (this.nativeDraggable) {\r\n on(document, 'dragover', _checkOutsideTargetEl);\r\n }\r\n \r\n var options = this.options; // Apply effect\r\n \r\n !fallback && toggleClass(dragEl, options.dragClass, false);\r\n toggleClass(dragEl, options.ghostClass, true);\r\n Sortable.active = this;\r\n fallback && this._appendGhost(); // Drag start event\r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'start',\r\n originalEvent: evt\r\n });\r\n } else {\r\n this._nulling();\r\n }\r\n },\r\n _emulateDragOver: function _emulateDragOver() {\r\n if (touchEvt) {\r\n this._lastX = touchEvt.clientX;\r\n this._lastY = touchEvt.clientY;\r\n \r\n _hideGhostForTarget();\r\n \r\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\r\n var parent = target;\r\n \r\n while (target && target.shadowRoot) {\r\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\r\n if (target === parent) break;\r\n parent = target;\r\n }\r\n \r\n dragEl.parentNode[expando]._isOutsideThisEl(target);\r\n \r\n if (parent) {\r\n do {\r\n if (parent[expando]) {\r\n var inserted = void 0;\r\n inserted = parent[expando]._onDragOver({\r\n clientX: touchEvt.clientX,\r\n clientY: touchEvt.clientY,\r\n target: target,\r\n rootEl: parent\r\n });\r\n \r\n if (inserted && !this.options.dragoverBubble) {\r\n break;\r\n }\r\n }\r\n \r\n target = parent; // store last element\r\n }\r\n /* jshint boss:true */\r\n while (parent = parent.parentNode);\r\n }\r\n \r\n _unhideGhostForTarget();\r\n }\r\n },\r\n _onTouchMove: function _onTouchMove(\r\n /**TouchEvent*/\r\n evt) {\r\n if (tapEvt) {\r\n var options = this.options,\r\n fallbackTolerance = options.fallbackTolerance,\r\n fallbackOffset = options.fallbackOffset,\r\n touch = evt.touches ? evt.touches[0] : evt,\r\n ghostMatrix = ghostEl && matrix(ghostEl, true),\r\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\r\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\r\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\r\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\r\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\r\n \r\n if (!Sortable.active && !awaitingDragStarted) {\r\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\r\n return;\r\n }\r\n \r\n this._onDragStart(evt, true);\r\n }\r\n \r\n if (ghostEl) {\r\n if (ghostMatrix) {\r\n ghostMatrix.e += dx - (lastDx || 0);\r\n ghostMatrix.f += dy - (lastDy || 0);\r\n } else {\r\n ghostMatrix = {\r\n a: 1,\r\n b: 0,\r\n c: 0,\r\n d: 1,\r\n e: dx,\r\n f: dy\r\n };\r\n }\r\n \r\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\r\n css(ghostEl, 'webkitTransform', cssMatrix);\r\n css(ghostEl, 'mozTransform', cssMatrix);\r\n css(ghostEl, 'msTransform', cssMatrix);\r\n css(ghostEl, 'transform', cssMatrix);\r\n lastDx = dx;\r\n lastDy = dy;\r\n touchEvt = touch;\r\n }\r\n \r\n evt.cancelable && evt.preventDefault();\r\n }\r\n },\r\n _appendGhost: function _appendGhost() {\r\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\r\n // Not being adjusted for\r\n if (!ghostEl) {\r\n var container = this.options.fallbackOnBody ? document.body : rootEl,\r\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\r\n options = this.options; // Position absolutely\r\n \r\n if (PositionGhostAbsolutely) {\r\n // Get relatively positioned parent\r\n ghostRelativeParent = container;\r\n \r\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\r\n ghostRelativeParent = ghostRelativeParent.parentNode;\r\n }\r\n \r\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\r\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\r\n rect.top += ghostRelativeParent.scrollTop;\r\n rect.left += ghostRelativeParent.scrollLeft;\r\n } else {\r\n ghostRelativeParent = getWindowScrollingElement();\r\n }\r\n \r\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\r\n }\r\n \r\n ghostEl = dragEl.cloneNode(true);\r\n toggleClass(ghostEl, options.ghostClass, false);\r\n toggleClass(ghostEl, options.fallbackClass, true);\r\n toggleClass(ghostEl, options.dragClass, true);\r\n css(ghostEl, 'transition', '');\r\n css(ghostEl, 'transform', '');\r\n css(ghostEl, 'box-sizing', 'border-box');\r\n css(ghostEl, 'margin', 0);\r\n css(ghostEl, 'top', rect.top);\r\n css(ghostEl, 'left', rect.left);\r\n css(ghostEl, 'width', rect.width);\r\n css(ghostEl, 'height', rect.height);\r\n css(ghostEl, 'opacity', '0.8');\r\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\r\n css(ghostEl, 'zIndex', '100000');\r\n css(ghostEl, 'pointerEvents', 'none');\r\n Sortable.ghost = ghostEl;\r\n container.appendChild(ghostEl); // Set transform-origin\r\n \r\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\r\n }\r\n },\r\n _onDragStart: function _onDragStart(\r\n /**Event*/\r\n evt,\r\n /**boolean*/\r\n fallback) {\r\n var _this = this;\r\n \r\n var dataTransfer = evt.dataTransfer;\r\n var options = _this.options;\r\n pluginEvent('dragStart', this, {\r\n evt: evt\r\n });\r\n \r\n if (Sortable.eventCanceled) {\r\n this._onDrop();\r\n \r\n return;\r\n }\r\n \r\n pluginEvent('setupClone', this);\r\n \r\n if (!Sortable.eventCanceled) {\r\n cloneEl = clone(dragEl);\r\n cloneEl.removeAttribute(\"id\");\r\n cloneEl.draggable = false;\r\n cloneEl.style['will-change'] = '';\r\n \r\n this._hideClone();\r\n \r\n toggleClass(cloneEl, this.options.chosenClass, false);\r\n Sortable.clone = cloneEl;\r\n } // #1143: IFrame support workaround\r\n \r\n \r\n _this.cloneId = _nextTick(function () {\r\n pluginEvent('clone', _this);\r\n if (Sortable.eventCanceled) return;\r\n \r\n if (!_this.options.removeCloneOnHide) {\r\n rootEl.insertBefore(cloneEl, dragEl);\r\n }\r\n \r\n _this._hideClone();\r\n \r\n _dispatchEvent({\r\n sortable: _this,\r\n name: 'clone'\r\n });\r\n });\r\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\r\n \r\n if (fallback) {\r\n ignoreNextClick = true;\r\n _this._loopId = setInterval(_this._emulateDragOver, 50);\r\n } else {\r\n // Undo what was set in _prepareDragStart before drag started\r\n off(document, 'mouseup', _this._onDrop);\r\n off(document, 'touchend', _this._onDrop);\r\n off(document, 'touchcancel', _this._onDrop);\r\n \r\n if (dataTransfer) {\r\n dataTransfer.effectAllowed = 'move';\r\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\r\n }\r\n \r\n on(document, 'drop', _this); // #1276 fix:\r\n \r\n css(dragEl, 'transform', 'translateZ(0)');\r\n }\r\n \r\n awaitingDragStarted = true;\r\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\r\n on(document, 'selectstart', _this);\r\n moved = true;\r\n \r\n if (Safari) {\r\n css(document.body, 'user-select', 'none');\r\n }\r\n },\r\n // Returns true - if no further action is needed (either inserted or another condition)\r\n _onDragOver: function _onDragOver(\r\n /**Event*/\r\n evt) {\r\n var el = this.el,\r\n target = evt.target,\r\n dragRect,\r\n targetRect,\r\n revert,\r\n options = this.options,\r\n group = options.group,\r\n activeSortable = Sortable.active,\r\n isOwner = activeGroup === group,\r\n canSort = options.sort,\r\n fromSortable = putSortable || activeSortable,\r\n vertical,\r\n _this = this,\r\n completedFired = false;\r\n \r\n if (_silent) return;\r\n \r\n function dragOverEvent(name, extra) {\r\n pluginEvent(name, _this, _objectSpread2({\r\n evt: evt,\r\n isOwner: isOwner,\r\n axis: vertical ? 'vertical' : 'horizontal',\r\n revert: revert,\r\n dragRect: dragRect,\r\n targetRect: targetRect,\r\n canSort: canSort,\r\n fromSortable: fromSortable,\r\n target: target,\r\n completed: completed,\r\n onMove: function onMove(target, after) {\r\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\r\n },\r\n changed: changed\r\n }, extra));\r\n } // Capture animation state\r\n \r\n \r\n function capture() {\r\n dragOverEvent('dragOverAnimationCapture');\r\n \r\n _this.captureAnimationState();\r\n \r\n if (_this !== fromSortable) {\r\n fromSortable.captureAnimationState();\r\n }\r\n } // Return invocation when dragEl is inserted (or completed)\r\n \r\n \r\n function completed(insertion) {\r\n dragOverEvent('dragOverCompleted', {\r\n insertion: insertion\r\n });\r\n \r\n if (insertion) {\r\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\r\n if (isOwner) {\r\n activeSortable._hideClone();\r\n } else {\r\n activeSortable._showClone(_this);\r\n }\r\n \r\n if (_this !== fromSortable) {\r\n // Set ghost class to new sortable's ghost class\r\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\r\n toggleClass(dragEl, options.ghostClass, true);\r\n }\r\n \r\n if (putSortable !== _this && _this !== Sortable.active) {\r\n putSortable = _this;\r\n } else if (_this === Sortable.active && putSortable) {\r\n putSortable = null;\r\n } // Animation\r\n \r\n \r\n if (fromSortable === _this) {\r\n _this._ignoreWhileAnimating = target;\r\n }\r\n \r\n _this.animateAll(function () {\r\n dragOverEvent('dragOverAnimationComplete');\r\n _this._ignoreWhileAnimating = null;\r\n });\r\n \r\n if (_this !== fromSortable) {\r\n fromSortable.animateAll();\r\n fromSortable._ignoreWhileAnimating = null;\r\n }\r\n } // Null lastTarget if it is not inside a previously swapped element\r\n \r\n \r\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\r\n lastTarget = null;\r\n } // no bubbling and not fallback\r\n \r\n \r\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\r\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\r\n \r\n \r\n !insertion && nearestEmptyInsertDetectEvent(evt);\r\n }\r\n \r\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\r\n return completedFired = true;\r\n } // Call when dragEl has been inserted\r\n \r\n \r\n function changed() {\r\n newIndex = index(dragEl);\r\n newDraggableIndex = index(dragEl, options.draggable);\r\n \r\n _dispatchEvent({\r\n sortable: _this,\r\n name: 'change',\r\n toEl: el,\r\n newIndex: newIndex,\r\n newDraggableIndex: newDraggableIndex,\r\n originalEvent: evt\r\n });\r\n }\r\n \r\n if (evt.preventDefault !== void 0) {\r\n evt.cancelable && evt.preventDefault();\r\n }\r\n \r\n target = closest(target, options.draggable, el, true);\r\n dragOverEvent('dragOver');\r\n if (Sortable.eventCanceled) return completedFired;\r\n \r\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\r\n return completed(false);\r\n }\r\n \r\n ignoreNextClick = false;\r\n \r\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\r\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\r\n vertical = this._getDirection(evt, target) === 'vertical';\r\n dragRect = getRect(dragEl);\r\n dragOverEvent('dragOverValid');\r\n if (Sortable.eventCanceled) return completedFired;\r\n \r\n if (revert) {\r\n parentEl = rootEl; // actualization\r\n \r\n capture();\r\n \r\n this._hideClone();\r\n \r\n dragOverEvent('revert');\r\n \r\n if (!Sortable.eventCanceled) {\r\n if (nextEl) {\r\n rootEl.insertBefore(dragEl, nextEl);\r\n } else {\r\n rootEl.appendChild(dragEl);\r\n }\r\n }\r\n \r\n return completed(true);\r\n }\r\n \r\n var elLastChild = lastChild(el, options.draggable);\r\n \r\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\r\n // Insert to end of list\r\n // If already at end of list: Do not insert\r\n if (elLastChild === dragEl) {\r\n return completed(false);\r\n } // if there is a last element, it is the target\r\n \r\n \r\n if (elLastChild && el === evt.target) {\r\n target = elLastChild;\r\n }\r\n \r\n if (target) {\r\n targetRect = getRect(target);\r\n }\r\n \r\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\r\n capture();\r\n \r\n if (elLastChild && elLastChild.nextSibling) {\r\n // the last draggable element is not the last node\r\n el.insertBefore(dragEl, elLastChild.nextSibling);\r\n } else {\r\n el.appendChild(dragEl);\r\n }\r\n \r\n parentEl = el; // actualization\r\n \r\n changed();\r\n return completed(true);\r\n }\r\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\r\n // Insert to start of list\r\n var firstChild = getChild(el, 0, options, true);\r\n \r\n if (firstChild === dragEl) {\r\n return completed(false);\r\n }\r\n \r\n target = firstChild;\r\n targetRect = getRect(target);\r\n \r\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\r\n capture();\r\n el.insertBefore(dragEl, firstChild);\r\n parentEl = el; // actualization\r\n \r\n changed();\r\n return completed(true);\r\n }\r\n } else if (target.parentNode === el) {\r\n targetRect = getRect(target);\r\n var direction = 0,\r\n targetBeforeFirstSwap,\r\n differentLevel = dragEl.parentNode !== el,\r\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\r\n side1 = vertical ? 'top' : 'left',\r\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\r\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\r\n \r\n if (lastTarget !== target) {\r\n targetBeforeFirstSwap = targetRect[side1];\r\n pastFirstInvertThresh = false;\r\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\r\n }\r\n \r\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\r\n var sibling;\r\n \r\n if (direction !== 0) {\r\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\r\n var dragIndex = index(dragEl);\r\n \r\n do {\r\n dragIndex -= direction;\r\n sibling = parentEl.children[dragIndex];\r\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\r\n } // If dragEl is already beside target: Do not insert\r\n \r\n \r\n if (direction === 0 || sibling === target) {\r\n return completed(false);\r\n }\r\n \r\n lastTarget = target;\r\n lastDirection = direction;\r\n var nextSibling = target.nextElementSibling,\r\n after = false;\r\n after = direction === 1;\r\n \r\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\r\n \r\n if (moveVector !== false) {\r\n if (moveVector === 1 || moveVector === -1) {\r\n after = moveVector === 1;\r\n }\r\n \r\n _silent = true;\r\n setTimeout(_unsilent, 30);\r\n capture();\r\n \r\n if (after && !nextSibling) {\r\n el.appendChild(dragEl);\r\n } else {\r\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\r\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\r\n \r\n \r\n if (scrolledPastTop) {\r\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\r\n }\r\n \r\n parentEl = dragEl.parentNode; // actualization\r\n // must be done before animation\r\n \r\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\r\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\r\n }\r\n \r\n changed();\r\n return completed(true);\r\n }\r\n }\r\n \r\n if (el.contains(dragEl)) {\r\n return completed(false);\r\n }\r\n }\r\n \r\n return false;\r\n },\r\n _ignoreWhileAnimating: null,\r\n _offMoveEvents: function _offMoveEvents() {\r\n off(document, 'mousemove', this._onTouchMove);\r\n off(document, 'touchmove', this._onTouchMove);\r\n off(document, 'pointermove', this._onTouchMove);\r\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\r\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\r\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\r\n },\r\n _offUpEvents: function _offUpEvents() {\r\n var ownerDocument = this.el.ownerDocument;\r\n off(ownerDocument, 'mouseup', this._onDrop);\r\n off(ownerDocument, 'touchend', this._onDrop);\r\n off(ownerDocument, 'pointerup', this._onDrop);\r\n off(ownerDocument, 'touchcancel', this._onDrop);\r\n off(document, 'selectstart', this);\r\n },\r\n _onDrop: function _onDrop(\r\n /**Event*/\r\n evt) {\r\n var el = this.el,\r\n options = this.options; // Get the index of the dragged element within its parent\r\n \r\n newIndex = index(dragEl);\r\n newDraggableIndex = index(dragEl, options.draggable);\r\n pluginEvent('drop', this, {\r\n evt: evt\r\n });\r\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\r\n \r\n newIndex = index(dragEl);\r\n newDraggableIndex = index(dragEl, options.draggable);\r\n \r\n if (Sortable.eventCanceled) {\r\n this._nulling();\r\n \r\n return;\r\n }\r\n \r\n awaitingDragStarted = false;\r\n isCircumstantialInvert = false;\r\n pastFirstInvertThresh = false;\r\n clearInterval(this._loopId);\r\n clearTimeout(this._dragStartTimer);\r\n \r\n _cancelNextTick(this.cloneId);\r\n \r\n _cancelNextTick(this._dragStartId); // Unbind events\r\n \r\n \r\n if (this.nativeDraggable) {\r\n off(document, 'drop', this);\r\n off(el, 'dragstart', this._onDragStart);\r\n }\r\n \r\n this._offMoveEvents();\r\n \r\n this._offUpEvents();\r\n \r\n if (Safari) {\r\n css(document.body, 'user-select', '');\r\n }\r\n \r\n css(dragEl, 'transform', '');\r\n \r\n if (evt) {\r\n if (moved) {\r\n evt.cancelable && evt.preventDefault();\r\n !options.dropBubble && evt.stopPropagation();\r\n }\r\n \r\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\r\n \r\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\r\n // Remove clone(s)\r\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\r\n }\r\n \r\n if (dragEl) {\r\n if (this.nativeDraggable) {\r\n off(dragEl, 'dragend', this);\r\n }\r\n \r\n _disableDraggable(dragEl);\r\n \r\n dragEl.style['will-change'] = ''; // Remove classes\r\n // ghostClass is added in dragStarted\r\n \r\n if (moved && !awaitingDragStarted) {\r\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\r\n }\r\n \r\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'unchoose',\r\n toEl: parentEl,\r\n newIndex: null,\r\n newDraggableIndex: null,\r\n originalEvent: evt\r\n });\r\n \r\n if (rootEl !== parentEl) {\r\n if (newIndex >= 0) {\r\n // Add event\r\n _dispatchEvent({\r\n rootEl: parentEl,\r\n name: 'add',\r\n toEl: parentEl,\r\n fromEl: rootEl,\r\n originalEvent: evt\r\n }); // Remove event\r\n \r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'remove',\r\n toEl: parentEl,\r\n originalEvent: evt\r\n }); // drag from one list and drop into another\r\n \r\n \r\n _dispatchEvent({\r\n rootEl: parentEl,\r\n name: 'sort',\r\n toEl: parentEl,\r\n fromEl: rootEl,\r\n originalEvent: evt\r\n });\r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'sort',\r\n toEl: parentEl,\r\n originalEvent: evt\r\n });\r\n }\r\n \r\n putSortable && putSortable.save();\r\n } else {\r\n if (newIndex !== oldIndex) {\r\n if (newIndex >= 0) {\r\n // drag & drop within the same list\r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'update',\r\n toEl: parentEl,\r\n originalEvent: evt\r\n });\r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'sort',\r\n toEl: parentEl,\r\n originalEvent: evt\r\n });\r\n }\r\n }\r\n }\r\n \r\n if (Sortable.active) {\r\n /* jshint eqnull:true */\r\n if (newIndex == null || newIndex === -1) {\r\n newIndex = oldIndex;\r\n newDraggableIndex = oldDraggableIndex;\r\n }\r\n \r\n _dispatchEvent({\r\n sortable: this,\r\n name: 'end',\r\n toEl: parentEl,\r\n originalEvent: evt\r\n }); // Save sorting\r\n \r\n \r\n this.save();\r\n }\r\n }\r\n }\r\n \r\n this._nulling();\r\n },\r\n _nulling: function _nulling() {\r\n pluginEvent('nulling', this);\r\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\r\n savedInputChecked.forEach(function (el) {\r\n el.checked = true;\r\n });\r\n savedInputChecked.length = lastDx = lastDy = 0;\r\n },\r\n handleEvent: function handleEvent(\r\n /**Event*/\r\n evt) {\r\n switch (evt.type) {\r\n case 'drop':\r\n case 'dragend':\r\n this._onDrop(evt);\r\n \r\n break;\r\n \r\n case 'dragenter':\r\n case 'dragover':\r\n if (dragEl) {\r\n this._onDragOver(evt);\r\n \r\n _globalDragOver(evt);\r\n }\r\n \r\n break;\r\n \r\n case 'selectstart':\r\n evt.preventDefault();\r\n break;\r\n }\r\n },\r\n \r\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\r\n toArray: function toArray() {\r\n var order = [],\r\n el,\r\n children = this.el.children,\r\n i = 0,\r\n n = children.length,\r\n options = this.options;\r\n \r\n for (; i < n; i++) {\r\n el = children[i];\r\n \r\n if (closest(el, options.draggable, this.el, false)) {\r\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\r\n }\r\n }\r\n \r\n return order;\r\n },\r\n \r\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\r\n sort: function sort(order, useAnimation) {\r\n var items = {},\r\n rootEl = this.el;\r\n this.toArray().forEach(function (id, i) {\r\n var el = rootEl.children[i];\r\n \r\n if (closest(el, this.options.draggable, rootEl, false)) {\r\n items[id] = el;\r\n }\r\n }, this);\r\n useAnimation && this.captureAnimationState();\r\n order.forEach(function (id) {\r\n if (items[id]) {\r\n rootEl.removeChild(items[id]);\r\n rootEl.appendChild(items[id]);\r\n }\r\n });\r\n useAnimation && this.animateAll();\r\n },\r\n \r\n /**\r\n * Save the current sorting\r\n */\r\n save: function save() {\r\n var store = this.options.store;\r\n store && store.set && store.set(this);\r\n },\r\n \r\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\r\n closest: function closest$1(el, selector) {\r\n return closest(el, selector || this.options.draggable, this.el, false);\r\n },\r\n \r\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\r\n option: function option(name, value) {\r\n var options = this.options;\r\n \r\n if (value === void 0) {\r\n return options[name];\r\n } else {\r\n var modifiedValue = PluginManager.modifyOption(this, name, value);\r\n \r\n if (typeof modifiedValue !== 'undefined') {\r\n options[name] = modifiedValue;\r\n } else {\r\n options[name] = value;\r\n }\r\n \r\n if (name === 'group') {\r\n _prepareGroup(options);\r\n }\r\n }\r\n },\r\n \r\n /**\r\n * Destroy\r\n */\r\n destroy: function destroy() {\r\n pluginEvent('destroy', this);\r\n var el = this.el;\r\n el[expando] = null;\r\n off(el, 'mousedown', this._onTapStart);\r\n off(el, 'touchstart', this._onTapStart);\r\n off(el, 'pointerdown', this._onTapStart);\r\n \r\n if (this.nativeDraggable) {\r\n off(el, 'dragover', this);\r\n off(el, 'dragenter', this);\r\n } // Remove draggable attributes\r\n \r\n \r\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\r\n el.removeAttribute('draggable');\r\n });\r\n \r\n this._onDrop();\r\n \r\n this._disableDelayedDragEvents();\r\n \r\n sortables.splice(sortables.indexOf(this.el), 1);\r\n this.el = el = null;\r\n },\r\n _hideClone: function _hideClone() {\r\n if (!cloneHidden) {\r\n pluginEvent('hideClone', this);\r\n if (Sortable.eventCanceled) return;\r\n css(cloneEl, 'display', 'none');\r\n \r\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\r\n cloneEl.parentNode.removeChild(cloneEl);\r\n }\r\n \r\n cloneHidden = true;\r\n }\r\n },\r\n _showClone: function _showClone(putSortable) {\r\n if (putSortable.lastPutMode !== 'clone') {\r\n this._hideClone();\r\n \r\n return;\r\n }\r\n \r\n if (cloneHidden) {\r\n pluginEvent('showClone', this);\r\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\r\n \r\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\r\n rootEl.insertBefore(cloneEl, dragEl);\r\n } else if (nextEl) {\r\n rootEl.insertBefore(cloneEl, nextEl);\r\n } else {\r\n rootEl.appendChild(cloneEl);\r\n }\r\n \r\n if (this.options.group.revertClone) {\r\n this.animate(dragEl, cloneEl);\r\n }\r\n \r\n css(cloneEl, 'display', '');\r\n cloneHidden = false;\r\n }\r\n }\r\n };\r\n \r\n function _globalDragOver(\r\n /**Event*/\r\n evt) {\r\n if (evt.dataTransfer) {\r\n evt.dataTransfer.dropEffect = 'move';\r\n }\r\n \r\n evt.cancelable && evt.preventDefault();\r\n }\r\n \r\n function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\r\n var evt,\r\n sortable = fromEl[expando],\r\n onMoveFn = sortable.options.onMove,\r\n retVal; // Support for new CustomEvent feature\r\n \r\n if (window.CustomEvent && !IE11OrLess && !Edge) {\r\n evt = new CustomEvent('move', {\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n } else {\r\n evt = document.createEvent('Event');\r\n evt.initEvent('move', true, true);\r\n }\r\n \r\n evt.to = toEl;\r\n evt.from = fromEl;\r\n evt.dragged = dragEl;\r\n evt.draggedRect = dragRect;\r\n evt.related = targetEl || toEl;\r\n evt.relatedRect = targetRect || getRect(toEl);\r\n evt.willInsertAfter = willInsertAfter;\r\n evt.originalEvent = originalEvent;\r\n fromEl.dispatchEvent(evt);\r\n \r\n if (onMoveFn) {\r\n retVal = onMoveFn.call(sortable, evt, originalEvent);\r\n }\r\n \r\n return retVal;\r\n }\r\n \r\n function _disableDraggable(el) {\r\n el.draggable = false;\r\n }\r\n \r\n function _unsilent() {\r\n _silent = false;\r\n }\r\n \r\n function _ghostIsFirst(evt, vertical, sortable) {\r\n var rect = getRect(getChild(sortable.el, 0, sortable.options, true));\r\n var spacer = 10;\r\n return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;\r\n }\r\n \r\n function _ghostIsLast(evt, vertical, sortable) {\r\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\r\n var spacer = 10;\r\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\r\n }\r\n \r\n function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\r\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\r\n targetLength = vertical ? targetRect.height : targetRect.width,\r\n targetS1 = vertical ? targetRect.top : targetRect.left,\r\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\r\n invert = false;\r\n \r\n if (!invertSwap) {\r\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\r\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\r\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\r\n // check if past first invert threshold on side opposite of lastDirection\r\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\r\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\r\n pastFirstInvertThresh = true;\r\n }\r\n \r\n if (!pastFirstInvertThresh) {\r\n // dragEl shadow (target move distance shadow)\r\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\r\n : mouseOnAxis > targetS2 - targetMoveDistance) {\r\n return -lastDirection;\r\n }\r\n } else {\r\n invert = true;\r\n }\r\n } else {\r\n // Regular\r\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\r\n return _getInsertDirection(target);\r\n }\r\n }\r\n }\r\n \r\n invert = invert || invertSwap;\r\n \r\n if (invert) {\r\n // Invert of regular\r\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\r\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\r\n }\r\n }\r\n \r\n return 0;\r\n }\r\n /**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\r\n \r\n \r\n function _getInsertDirection(target) {\r\n if (index(dragEl) < index(target)) {\r\n return 1;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n /**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\r\n \r\n \r\n function _generateId(el) {\r\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\r\n i = str.length,\r\n sum = 0;\r\n \r\n while (i--) {\r\n sum += str.charCodeAt(i);\r\n }\r\n \r\n return sum.toString(36);\r\n }\r\n \r\n function _saveInputCheckedState(root) {\r\n savedInputChecked.length = 0;\r\n var inputs = root.getElementsByTagName('input');\r\n var idx = inputs.length;\r\n \r\n while (idx--) {\r\n var el = inputs[idx];\r\n el.checked && savedInputChecked.push(el);\r\n }\r\n }\r\n \r\n function _nextTick(fn) {\r\n return setTimeout(fn, 0);\r\n }\r\n \r\n function _cancelNextTick(id) {\r\n return clearTimeout(id);\r\n } // Fixed #973:\r\n \r\n \r\n if (documentExists) {\r\n on(document, 'touchmove', function (evt) {\r\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\r\n evt.preventDefault();\r\n }\r\n });\r\n } // Export utils\r\n \r\n \r\n Sortable.utils = {\r\n on: on,\r\n off: off,\r\n css: css,\r\n find: find,\r\n is: function is(el, selector) {\r\n return !!closest(el, selector, el, false);\r\n },\r\n extend: extend,\r\n throttle: throttle,\r\n closest: closest,\r\n toggleClass: toggleClass,\r\n clone: clone,\r\n index: index,\r\n nextTick: _nextTick,\r\n cancelNextTick: _cancelNextTick,\r\n detectDirection: _detectDirection,\r\n getChild: getChild\r\n };\r\n /**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\r\n \r\n Sortable.get = function (element) {\r\n return element[expando];\r\n };\r\n /**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\r\n \r\n \r\n Sortable.mount = function () {\r\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\r\n plugins[_key] = arguments[_key];\r\n }\r\n \r\n if (plugins[0].constructor === Array) plugins = plugins[0];\r\n plugins.forEach(function (plugin) {\r\n if (!plugin.prototype || !plugin.prototype.constructor) {\r\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\r\n }\r\n \r\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\r\n PluginManager.mount(plugin);\r\n });\r\n };\r\n /**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\r\n \r\n \r\n Sortable.create = function (el, options) {\r\n return new Sortable(el, options);\r\n }; // Export\r\n \r\n \r\n Sortable.version = version;\r\n \r\n var autoScrolls = [],\r\n scrollEl,\r\n scrollRootEl,\r\n scrolling = false,\r\n lastAutoScrollX,\r\n lastAutoScrollY,\r\n touchEvt$1,\r\n pointerElemChangedInterval;\r\n \r\n function AutoScrollPlugin() {\r\n function AutoScroll() {\r\n this.defaults = {\r\n scroll: true,\r\n forceAutoScrollFallback: false,\r\n scrollSensitivity: 30,\r\n scrollSpeed: 10,\r\n bubbleScroll: true\r\n }; // Bind all private methods\r\n \r\n for (var fn in this) {\r\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\r\n this[fn] = this[fn].bind(this);\r\n }\r\n }\r\n }\r\n \r\n AutoScroll.prototype = {\r\n dragStarted: function dragStarted(_ref) {\r\n var originalEvent = _ref.originalEvent;\r\n \r\n if (this.sortable.nativeDraggable) {\r\n on(document, 'dragover', this._handleAutoScroll);\r\n } else {\r\n if (this.options.supportPointer) {\r\n on(document, 'pointermove', this._handleFallbackAutoScroll);\r\n } else if (originalEvent.touches) {\r\n on(document, 'touchmove', this._handleFallbackAutoScroll);\r\n } else {\r\n on(document, 'mousemove', this._handleFallbackAutoScroll);\r\n }\r\n }\r\n },\r\n dragOverCompleted: function dragOverCompleted(_ref2) {\r\n var originalEvent = _ref2.originalEvent;\r\n \r\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\r\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\r\n this._handleAutoScroll(originalEvent);\r\n }\r\n },\r\n drop: function drop() {\r\n if (this.sortable.nativeDraggable) {\r\n off(document, 'dragover', this._handleAutoScroll);\r\n } else {\r\n off(document, 'pointermove', this._handleFallbackAutoScroll);\r\n off(document, 'touchmove', this._handleFallbackAutoScroll);\r\n off(document, 'mousemove', this._handleFallbackAutoScroll);\r\n }\r\n \r\n clearPointerElemChangedInterval();\r\n clearAutoScrolls();\r\n cancelThrottle();\r\n },\r\n nulling: function nulling() {\r\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\r\n autoScrolls.length = 0;\r\n },\r\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\r\n this._handleAutoScroll(evt, true);\r\n },\r\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\r\n var _this = this;\r\n \r\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\r\n y = (evt.touches ? evt.touches[0] : evt).clientY,\r\n elem = document.elementFromPoint(x, y);\r\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\r\n // Edge's autoscroll seems too conditional,\r\n // MACOS Safari does not have autoscroll,\r\n // Firefox and Chrome are good\r\n \r\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\r\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\r\n \r\n var ogElemScroller = getParentAutoScrollElement(elem, true);\r\n \r\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\r\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\r\n \r\n pointerElemChangedInterval = setInterval(function () {\r\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\r\n \r\n if (newElem !== ogElemScroller) {\r\n ogElemScroller = newElem;\r\n clearAutoScrolls();\r\n }\r\n \r\n autoScroll(evt, _this.options, newElem, fallback);\r\n }, 10);\r\n lastAutoScrollX = x;\r\n lastAutoScrollY = y;\r\n }\r\n } else {\r\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\r\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\r\n clearAutoScrolls();\r\n return;\r\n }\r\n \r\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\r\n }\r\n }\r\n };\r\n return _extends(AutoScroll, {\r\n pluginName: 'scroll',\r\n initializeByDefault: true\r\n });\r\n }\r\n \r\n function clearAutoScrolls() {\r\n autoScrolls.forEach(function (autoScroll) {\r\n clearInterval(autoScroll.pid);\r\n });\r\n autoScrolls = [];\r\n }\r\n \r\n function clearPointerElemChangedInterval() {\r\n clearInterval(pointerElemChangedInterval);\r\n }\r\n \r\n var autoScroll = throttle(function (evt, options, rootEl, isFallback) {\r\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\r\n if (!options.scroll) return;\r\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\r\n y = (evt.touches ? evt.touches[0] : evt).clientY,\r\n sens = options.scrollSensitivity,\r\n speed = options.scrollSpeed,\r\n winScroller = getWindowScrollingElement();\r\n var scrollThisInstance = false,\r\n scrollCustomFn; // New scroll root, set scrollEl\r\n \r\n if (scrollRootEl !== rootEl) {\r\n scrollRootEl = rootEl;\r\n clearAutoScrolls();\r\n scrollEl = options.scroll;\r\n scrollCustomFn = options.scrollFn;\r\n \r\n if (scrollEl === true) {\r\n scrollEl = getParentAutoScrollElement(rootEl, true);\r\n }\r\n }\r\n \r\n var layersOut = 0;\r\n var currentParent = scrollEl;\r\n \r\n do {\r\n var el = currentParent,\r\n rect = getRect(el),\r\n top = rect.top,\r\n bottom = rect.bottom,\r\n left = rect.left,\r\n right = rect.right,\r\n width = rect.width,\r\n height = rect.height,\r\n canScrollX = void 0,\r\n canScrollY = void 0,\r\n scrollWidth = el.scrollWidth,\r\n scrollHeight = el.scrollHeight,\r\n elCSS = css(el),\r\n scrollPosX = el.scrollLeft,\r\n scrollPosY = el.scrollTop;\r\n \r\n if (el === winScroller) {\r\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\r\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\r\n } else {\r\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\r\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\r\n }\r\n \r\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\r\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\r\n \r\n if (!autoScrolls[layersOut]) {\r\n for (var i = 0; i <= layersOut; i++) {\r\n if (!autoScrolls[i]) {\r\n autoScrolls[i] = {};\r\n }\r\n }\r\n }\r\n \r\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\r\n autoScrolls[layersOut].el = el;\r\n autoScrolls[layersOut].vx = vx;\r\n autoScrolls[layersOut].vy = vy;\r\n clearInterval(autoScrolls[layersOut].pid);\r\n \r\n if (vx != 0 || vy != 0) {\r\n scrollThisInstance = true;\r\n /* jshint loopfunc:true */\r\n \r\n autoScrolls[layersOut].pid = setInterval(function () {\r\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\r\n if (isFallback && this.layer === 0) {\r\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\r\n \r\n }\r\n \r\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\r\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\r\n \r\n if (typeof scrollCustomFn === 'function') {\r\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\r\n return;\r\n }\r\n }\r\n \r\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\r\n }.bind({\r\n layer: layersOut\r\n }), 24);\r\n }\r\n }\r\n \r\n layersOut++;\r\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\r\n \r\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\r\n }, 30);\r\n \r\n var drop = function drop(_ref) {\r\n var originalEvent = _ref.originalEvent,\r\n putSortable = _ref.putSortable,\r\n dragEl = _ref.dragEl,\r\n activeSortable = _ref.activeSortable,\r\n dispatchSortableEvent = _ref.dispatchSortableEvent,\r\n hideGhostForTarget = _ref.hideGhostForTarget,\r\n unhideGhostForTarget = _ref.unhideGhostForTarget;\r\n if (!originalEvent) return;\r\n var toSortable = putSortable || activeSortable;\r\n hideGhostForTarget();\r\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\r\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\r\n unhideGhostForTarget();\r\n \r\n if (toSortable && !toSortable.el.contains(target)) {\r\n dispatchSortableEvent('spill');\r\n this.onSpill({\r\n dragEl: dragEl,\r\n putSortable: putSortable\r\n });\r\n }\r\n };\r\n \r\n function Revert() {}\r\n \r\n Revert.prototype = {\r\n startIndex: null,\r\n dragStart: function dragStart(_ref2) {\r\n var oldDraggableIndex = _ref2.oldDraggableIndex;\r\n this.startIndex = oldDraggableIndex;\r\n },\r\n onSpill: function onSpill(_ref3) {\r\n var dragEl = _ref3.dragEl,\r\n putSortable = _ref3.putSortable;\r\n this.sortable.captureAnimationState();\r\n \r\n if (putSortable) {\r\n putSortable.captureAnimationState();\r\n }\r\n \r\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\r\n \r\n if (nextSibling) {\r\n this.sortable.el.insertBefore(dragEl, nextSibling);\r\n } else {\r\n this.sortable.el.appendChild(dragEl);\r\n }\r\n \r\n this.sortable.animateAll();\r\n \r\n if (putSortable) {\r\n putSortable.animateAll();\r\n }\r\n },\r\n drop: drop\r\n };\r\n \r\n _extends(Revert, {\r\n pluginName: 'revertOnSpill'\r\n });\r\n \r\n function Remove() {}\r\n \r\n Remove.prototype = {\r\n onSpill: function onSpill(_ref4) {\r\n var dragEl = _ref4.dragEl,\r\n putSortable = _ref4.putSortable;\r\n var parentSortable = putSortable || this.sortable;\r\n parentSortable.captureAnimationState();\r\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\r\n parentSortable.animateAll();\r\n },\r\n drop: drop\r\n };\r\n \r\n _extends(Remove, {\r\n pluginName: 'removeOnSpill'\r\n });\r\n \r\n var OnSpill = [Remove, Revert];\r\n \r\n var lastSwapEl;\r\n \r\n function SwapPlugin() {\r\n function Swap() {\r\n this.defaults = {\r\n swapClass: 'sortable-swap-highlight'\r\n };\r\n }\r\n \r\n Swap.prototype = {\r\n dragStart: function dragStart(_ref) {\r\n var dragEl = _ref.dragEl;\r\n lastSwapEl = dragEl;\r\n },\r\n dragOverValid: function dragOverValid(_ref2) {\r\n var completed = _ref2.completed,\r\n target = _ref2.target,\r\n onMove = _ref2.onMove,\r\n activeSortable = _ref2.activeSortable,\r\n changed = _ref2.changed,\r\n cancel = _ref2.cancel;\r\n if (!activeSortable.options.swap) return;\r\n var el = this.sortable.el,\r\n options = this.options;\r\n \r\n if (target && target !== el) {\r\n var prevSwapEl = lastSwapEl;\r\n \r\n if (onMove(target) !== false) {\r\n toggleClass(target, options.swapClass, true);\r\n lastSwapEl = target;\r\n } else {\r\n lastSwapEl = null;\r\n }\r\n \r\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\r\n toggleClass(prevSwapEl, options.swapClass, false);\r\n }\r\n }\r\n \r\n changed();\r\n completed(true);\r\n cancel();\r\n },\r\n drop: function drop(_ref3) {\r\n var activeSortable = _ref3.activeSortable,\r\n putSortable = _ref3.putSortable,\r\n dragEl = _ref3.dragEl;\r\n var toSortable = putSortable || this.sortable;\r\n var options = this.options;\r\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\r\n \r\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\r\n if (dragEl !== lastSwapEl) {\r\n toSortable.captureAnimationState();\r\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\r\n swapNodes(dragEl, lastSwapEl);\r\n toSortable.animateAll();\r\n if (toSortable !== activeSortable) activeSortable.animateAll();\r\n }\r\n }\r\n },\r\n nulling: function nulling() {\r\n lastSwapEl = null;\r\n }\r\n };\r\n return _extends(Swap, {\r\n pluginName: 'swap',\r\n eventProperties: function eventProperties() {\r\n return {\r\n swapItem: lastSwapEl\r\n };\r\n }\r\n });\r\n }\r\n \r\n function swapNodes(n1, n2) {\r\n var p1 = n1.parentNode,\r\n p2 = n2.parentNode,\r\n i1,\r\n i2;\r\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\r\n i1 = index(n1);\r\n i2 = index(n2);\r\n \r\n if (p1.isEqualNode(p2) && i1 < i2) {\r\n i2++;\r\n }\r\n \r\n p1.insertBefore(n2, p1.children[i1]);\r\n p2.insertBefore(n1, p2.children[i2]);\r\n }\r\n \r\n var multiDragElements = [],\r\n multiDragClones = [],\r\n lastMultiDragSelect,\r\n // for selection with modifier key down (SHIFT)\r\n multiDragSortable,\r\n initialFolding = false,\r\n // Initial multi-drag fold when drag started\r\n folding = false,\r\n // Folding any other time\r\n dragStarted = false,\r\n dragEl$1,\r\n clonesFromRect,\r\n clonesHidden;\r\n \r\n function MultiDragPlugin() {\r\n function MultiDrag(sortable) {\r\n // Bind all private methods\r\n for (var fn in this) {\r\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\r\n this[fn] = this[fn].bind(this);\r\n }\r\n }\r\n \r\n if (!sortable.options.avoidImplicitDeselect) {\r\n if (sortable.options.supportPointer) {\r\n on(document, 'pointerup', this._deselectMultiDrag);\r\n } else {\r\n on(document, 'mouseup', this._deselectMultiDrag);\r\n on(document, 'touchend', this._deselectMultiDrag);\r\n }\r\n }\r\n \r\n on(document, 'keydown', this._checkKeyDown);\r\n on(document, 'keyup', this._checkKeyUp);\r\n this.defaults = {\r\n selectedClass: 'sortable-selected',\r\n multiDragKey: null,\r\n avoidImplicitDeselect: false,\r\n setData: function setData(dataTransfer, dragEl) {\r\n var data = '';\r\n \r\n if (multiDragElements.length && multiDragSortable === sortable) {\r\n multiDragElements.forEach(function (multiDragElement, i) {\r\n data += (!i ? '' : ', ') + multiDragElement.textContent;\r\n });\r\n } else {\r\n data = dragEl.textContent;\r\n }\r\n \r\n dataTransfer.setData('Text', data);\r\n }\r\n };\r\n }\r\n \r\n MultiDrag.prototype = {\r\n multiDragKeyDown: false,\r\n isMultiDrag: false,\r\n delayStartGlobal: function delayStartGlobal(_ref) {\r\n var dragged = _ref.dragEl;\r\n dragEl$1 = dragged;\r\n },\r\n delayEnded: function delayEnded() {\r\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\r\n },\r\n setupClone: function setupClone(_ref2) {\r\n var sortable = _ref2.sortable,\r\n cancel = _ref2.cancel;\r\n if (!this.isMultiDrag) return;\r\n \r\n for (var i = 0; i < multiDragElements.length; i++) {\r\n multiDragClones.push(clone(multiDragElements[i]));\r\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\r\n multiDragClones[i].draggable = false;\r\n multiDragClones[i].style['will-change'] = '';\r\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\r\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\r\n }\r\n \r\n sortable._hideClone();\r\n \r\n cancel();\r\n },\r\n clone: function clone(_ref3) {\r\n var sortable = _ref3.sortable,\r\n rootEl = _ref3.rootEl,\r\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\r\n cancel = _ref3.cancel;\r\n if (!this.isMultiDrag) return;\r\n \r\n if (!this.options.removeCloneOnHide) {\r\n if (multiDragElements.length && multiDragSortable === sortable) {\r\n insertMultiDragClones(true, rootEl);\r\n dispatchSortableEvent('clone');\r\n cancel();\r\n }\r\n }\r\n },\r\n showClone: function showClone(_ref4) {\r\n var cloneNowShown = _ref4.cloneNowShown,\r\n rootEl = _ref4.rootEl,\r\n cancel = _ref4.cancel;\r\n if (!this.isMultiDrag) return;\r\n insertMultiDragClones(false, rootEl);\r\n multiDragClones.forEach(function (clone) {\r\n css(clone, 'display', '');\r\n });\r\n cloneNowShown();\r\n clonesHidden = false;\r\n cancel();\r\n },\r\n hideClone: function hideClone(_ref5) {\r\n var _this = this;\r\n \r\n var sortable = _ref5.sortable,\r\n cloneNowHidden = _ref5.cloneNowHidden,\r\n cancel = _ref5.cancel;\r\n if (!this.isMultiDrag) return;\r\n multiDragClones.forEach(function (clone) {\r\n css(clone, 'display', 'none');\r\n \r\n if (_this.options.removeCloneOnHide && clone.parentNode) {\r\n clone.parentNode.removeChild(clone);\r\n }\r\n });\r\n cloneNowHidden();\r\n clonesHidden = true;\r\n cancel();\r\n },\r\n dragStartGlobal: function dragStartGlobal(_ref6) {\r\n var sortable = _ref6.sortable;\r\n \r\n if (!this.isMultiDrag && multiDragSortable) {\r\n multiDragSortable.multiDrag._deselectMultiDrag();\r\n }\r\n \r\n multiDragElements.forEach(function (multiDragElement) {\r\n multiDragElement.sortableIndex = index(multiDragElement);\r\n }); // Sort multi-drag elements\r\n \r\n multiDragElements = multiDragElements.sort(function (a, b) {\r\n return a.sortableIndex - b.sortableIndex;\r\n });\r\n dragStarted = true;\r\n },\r\n dragStarted: function dragStarted(_ref7) {\r\n var _this2 = this;\r\n \r\n var sortable = _ref7.sortable;\r\n if (!this.isMultiDrag) return;\r\n \r\n if (this.options.sort) {\r\n // Capture rects,\r\n // hide multi drag elements (by positioning them absolute),\r\n // set multi drag elements rects to dragRect,\r\n // show multi drag elements,\r\n // animate to rects,\r\n // unset rects & remove from DOM\r\n sortable.captureAnimationState();\r\n \r\n if (this.options.animation) {\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (multiDragElement === dragEl$1) return;\r\n css(multiDragElement, 'position', 'absolute');\r\n });\r\n var dragRect = getRect(dragEl$1, false, true, true);\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (multiDragElement === dragEl$1) return;\r\n setRect(multiDragElement, dragRect);\r\n });\r\n folding = true;\r\n initialFolding = true;\r\n }\r\n }\r\n \r\n sortable.animateAll(function () {\r\n folding = false;\r\n initialFolding = false;\r\n \r\n if (_this2.options.animation) {\r\n multiDragElements.forEach(function (multiDragElement) {\r\n unsetRect(multiDragElement);\r\n });\r\n } // Remove all auxiliary multidrag items from el, if sorting enabled\r\n \r\n \r\n if (_this2.options.sort) {\r\n removeMultiDragElements();\r\n }\r\n });\r\n },\r\n dragOver: function dragOver(_ref8) {\r\n var target = _ref8.target,\r\n completed = _ref8.completed,\r\n cancel = _ref8.cancel;\r\n \r\n if (folding && ~multiDragElements.indexOf(target)) {\r\n completed(false);\r\n cancel();\r\n }\r\n },\r\n revert: function revert(_ref9) {\r\n var fromSortable = _ref9.fromSortable,\r\n rootEl = _ref9.rootEl,\r\n sortable = _ref9.sortable,\r\n dragRect = _ref9.dragRect;\r\n \r\n if (multiDragElements.length > 1) {\r\n // Setup unfold animation\r\n multiDragElements.forEach(function (multiDragElement) {\r\n sortable.addAnimationState({\r\n target: multiDragElement,\r\n rect: folding ? getRect(multiDragElement) : dragRect\r\n });\r\n unsetRect(multiDragElement);\r\n multiDragElement.fromRect = dragRect;\r\n fromSortable.removeAnimationState(multiDragElement);\r\n });\r\n folding = false;\r\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\r\n }\r\n },\r\n dragOverCompleted: function dragOverCompleted(_ref10) {\r\n var sortable = _ref10.sortable,\r\n isOwner = _ref10.isOwner,\r\n insertion = _ref10.insertion,\r\n activeSortable = _ref10.activeSortable,\r\n parentEl = _ref10.parentEl,\r\n putSortable = _ref10.putSortable;\r\n var options = this.options;\r\n \r\n if (insertion) {\r\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\r\n if (isOwner) {\r\n activeSortable._hideClone();\r\n }\r\n \r\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\r\n \r\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\r\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\r\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (multiDragElement === dragEl$1) return;\r\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\r\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\r\n \r\n parentEl.appendChild(multiDragElement);\r\n });\r\n folding = true;\r\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\r\n \r\n \r\n if (!isOwner) {\r\n // Only remove if not folding (folding will remove them anyways)\r\n if (!folding) {\r\n removeMultiDragElements();\r\n }\r\n \r\n if (multiDragElements.length > 1) {\r\n var clonesHiddenBefore = clonesHidden;\r\n \r\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\r\n \r\n \r\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\r\n multiDragClones.forEach(function (clone) {\r\n activeSortable.addAnimationState({\r\n target: clone,\r\n rect: clonesFromRect\r\n });\r\n clone.fromRect = clonesFromRect;\r\n clone.thisAnimationDuration = null;\r\n });\r\n }\r\n } else {\r\n activeSortable._showClone(sortable);\r\n }\r\n }\r\n }\r\n },\r\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\r\n var dragRect = _ref11.dragRect,\r\n isOwner = _ref11.isOwner,\r\n activeSortable = _ref11.activeSortable;\r\n multiDragElements.forEach(function (multiDragElement) {\r\n multiDragElement.thisAnimationDuration = null;\r\n });\r\n \r\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\r\n clonesFromRect = _extends({}, dragRect);\r\n var dragMatrix = matrix(dragEl$1, true);\r\n clonesFromRect.top -= dragMatrix.f;\r\n clonesFromRect.left -= dragMatrix.e;\r\n }\r\n },\r\n dragOverAnimationComplete: function dragOverAnimationComplete() {\r\n if (folding) {\r\n folding = false;\r\n removeMultiDragElements();\r\n }\r\n },\r\n drop: function drop(_ref12) {\r\n var evt = _ref12.originalEvent,\r\n rootEl = _ref12.rootEl,\r\n parentEl = _ref12.parentEl,\r\n sortable = _ref12.sortable,\r\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\r\n oldIndex = _ref12.oldIndex,\r\n putSortable = _ref12.putSortable;\r\n var toSortable = putSortable || this.sortable;\r\n if (!evt) return;\r\n var options = this.options,\r\n children = parentEl.children; // Multi-drag selection\r\n \r\n if (!dragStarted) {\r\n if (options.multiDragKey && !this.multiDragKeyDown) {\r\n this._deselectMultiDrag();\r\n }\r\n \r\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\r\n \r\n if (!~multiDragElements.indexOf(dragEl$1)) {\r\n multiDragElements.push(dragEl$1);\r\n dispatchEvent({\r\n sortable: sortable,\r\n rootEl: rootEl,\r\n name: 'select',\r\n targetEl: dragEl$1,\r\n originalEvent: evt\r\n }); // Modifier activated, select from last to dragEl\r\n \r\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\r\n var lastIndex = index(lastMultiDragSelect),\r\n currentIndex = index(dragEl$1);\r\n \r\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\r\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\r\n // (but previous selection existed)\r\n var n, i;\r\n \r\n if (currentIndex > lastIndex) {\r\n i = lastIndex;\r\n n = currentIndex;\r\n } else {\r\n i = currentIndex;\r\n n = lastIndex + 1;\r\n }\r\n \r\n for (; i < n; i++) {\r\n if (~multiDragElements.indexOf(children[i])) continue;\r\n toggleClass(children[i], options.selectedClass, true);\r\n multiDragElements.push(children[i]);\r\n dispatchEvent({\r\n sortable: sortable,\r\n rootEl: rootEl,\r\n name: 'select',\r\n targetEl: children[i],\r\n originalEvent: evt\r\n });\r\n }\r\n }\r\n } else {\r\n lastMultiDragSelect = dragEl$1;\r\n }\r\n \r\n multiDragSortable = toSortable;\r\n } else {\r\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\r\n lastMultiDragSelect = null;\r\n dispatchEvent({\r\n sortable: sortable,\r\n rootEl: rootEl,\r\n name: 'deselect',\r\n targetEl: dragEl$1,\r\n originalEvent: evt\r\n });\r\n }\r\n } // Multi-drag drop\r\n \r\n \r\n if (dragStarted && this.isMultiDrag) {\r\n folding = false; // Do not \"unfold\" after around dragEl if reverted\r\n \r\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\r\n var dragRect = getRect(dragEl$1),\r\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\r\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\r\n toSortable.captureAnimationState();\r\n \r\n if (!initialFolding) {\r\n if (options.animation) {\r\n dragEl$1.fromRect = dragRect;\r\n multiDragElements.forEach(function (multiDragElement) {\r\n multiDragElement.thisAnimationDuration = null;\r\n \r\n if (multiDragElement !== dragEl$1) {\r\n var rect = folding ? getRect(multiDragElement) : dragRect;\r\n multiDragElement.fromRect = rect; // Prepare unfold animation\r\n \r\n toSortable.addAnimationState({\r\n target: multiDragElement,\r\n rect: rect\r\n });\r\n }\r\n });\r\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\r\n // properly they must all be removed\r\n \r\n \r\n removeMultiDragElements();\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (children[multiDragIndex]) {\r\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\r\n } else {\r\n parentEl.appendChild(multiDragElement);\r\n }\r\n \r\n multiDragIndex++;\r\n }); // If initial folding is done, the elements may have changed position because they are now\r\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\r\n // must be fired here as Sortable will not.\r\n \r\n if (oldIndex === index(dragEl$1)) {\r\n var update = false;\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\r\n update = true;\r\n return;\r\n }\r\n });\r\n \r\n if (update) {\r\n dispatchSortableEvent('update');\r\n }\r\n }\r\n } // Must be done after capturing individual rects (scroll bar)\r\n \r\n \r\n multiDragElements.forEach(function (multiDragElement) {\r\n unsetRect(multiDragElement);\r\n });\r\n toSortable.animateAll();\r\n }\r\n \r\n multiDragSortable = toSortable;\r\n } // Remove clones if necessary\r\n \r\n \r\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\r\n multiDragClones.forEach(function (clone) {\r\n clone.parentNode && clone.parentNode.removeChild(clone);\r\n });\r\n }\r\n },\r\n nullingGlobal: function nullingGlobal() {\r\n this.isMultiDrag = dragStarted = false;\r\n multiDragClones.length = 0;\r\n },\r\n destroyGlobal: function destroyGlobal() {\r\n this._deselectMultiDrag();\r\n \r\n off(document, 'pointerup', this._deselectMultiDrag);\r\n off(document, 'mouseup', this._deselectMultiDrag);\r\n off(document, 'touchend', this._deselectMultiDrag);\r\n off(document, 'keydown', this._checkKeyDown);\r\n off(document, 'keyup', this._checkKeyUp);\r\n },\r\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\r\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\r\n \r\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\r\n \r\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\r\n \r\n if (evt && evt.button !== 0) return;\r\n \r\n while (multiDragElements.length) {\r\n var el = multiDragElements[0];\r\n toggleClass(el, this.options.selectedClass, false);\r\n multiDragElements.shift();\r\n dispatchEvent({\r\n sortable: this.sortable,\r\n rootEl: this.sortable.el,\r\n name: 'deselect',\r\n targetEl: el,\r\n originalEvent: evt\r\n });\r\n }\r\n },\r\n _checkKeyDown: function _checkKeyDown(evt) {\r\n if (evt.key === this.options.multiDragKey) {\r\n this.multiDragKeyDown = true;\r\n }\r\n },\r\n _checkKeyUp: function _checkKeyUp(evt) {\r\n if (evt.key === this.options.multiDragKey) {\r\n this.multiDragKeyDown = false;\r\n }\r\n }\r\n };\r\n return _extends(MultiDrag, {\r\n // Static methods & properties\r\n pluginName: 'multiDrag',\r\n utils: {\r\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\r\n select: function select(el) {\r\n var sortable = el.parentNode[expando];\r\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\r\n \r\n if (multiDragSortable && multiDragSortable !== sortable) {\r\n multiDragSortable.multiDrag._deselectMultiDrag();\r\n \r\n multiDragSortable = sortable;\r\n }\r\n \r\n toggleClass(el, sortable.options.selectedClass, true);\r\n multiDragElements.push(el);\r\n },\r\n \r\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\r\n deselect: function deselect(el) {\r\n var sortable = el.parentNode[expando],\r\n index = multiDragElements.indexOf(el);\r\n if (!sortable || !sortable.options.multiDrag || !~index) return;\r\n toggleClass(el, sortable.options.selectedClass, false);\r\n multiDragElements.splice(index, 1);\r\n }\r\n },\r\n eventProperties: function eventProperties() {\r\n var _this3 = this;\r\n \r\n var oldIndicies = [],\r\n newIndicies = [];\r\n multiDragElements.forEach(function (multiDragElement) {\r\n oldIndicies.push({\r\n multiDragElement: multiDragElement,\r\n index: multiDragElement.sortableIndex\r\n }); // multiDragElements will already be sorted if folding\r\n \r\n var newIndex;\r\n \r\n if (folding && multiDragElement !== dragEl$1) {\r\n newIndex = -1;\r\n } else if (folding) {\r\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\r\n } else {\r\n newIndex = index(multiDragElement);\r\n }\r\n \r\n newIndicies.push({\r\n multiDragElement: multiDragElement,\r\n index: newIndex\r\n });\r\n });\r\n return {\r\n items: _toConsumableArray(multiDragElements),\r\n clones: [].concat(multiDragClones),\r\n oldIndicies: oldIndicies,\r\n newIndicies: newIndicies\r\n };\r\n },\r\n optionListeners: {\r\n multiDragKey: function multiDragKey(key) {\r\n key = key.toLowerCase();\r\n \r\n if (key === 'ctrl') {\r\n key = 'Control';\r\n } else if (key.length > 1) {\r\n key = key.charAt(0).toUpperCase() + key.substr(1);\r\n }\r\n \r\n return key;\r\n }\r\n }\r\n });\r\n }\r\n \r\n function insertMultiDragElements(clonesInserted, rootEl) {\r\n multiDragElements.forEach(function (multiDragElement, i) {\r\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\r\n \r\n if (target) {\r\n rootEl.insertBefore(multiDragElement, target);\r\n } else {\r\n rootEl.appendChild(multiDragElement);\r\n }\r\n });\r\n }\r\n /**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\r\n \r\n \r\n function insertMultiDragClones(elementsInserted, rootEl) {\r\n multiDragClones.forEach(function (clone, i) {\r\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\r\n \r\n if (target) {\r\n rootEl.insertBefore(clone, target);\r\n } else {\r\n rootEl.appendChild(clone);\r\n }\r\n });\r\n }\r\n \r\n function removeMultiDragElements() {\r\n multiDragElements.forEach(function (multiDragElement) {\r\n if (multiDragElement === dragEl$1) return;\r\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\r\n });\r\n }\r\n \r\n export default Sortable;\r\n export { AutoScrollPlugin as AutoScroll, MultiDragPlugin as MultiDrag, OnSpill, Sortable, SwapPlugin as Swap };","import { MODULE_ID } from \"../main.js\";\n\nexport class HandlebarsApplication extends foundry.applications.api.HandlebarsApplicationMixin(\n foundry.applications.api.ApplicationV2,\n) {\n constructor() {\n super();\n this.constructor.registerPositionSetting();\n this.savePosition = foundry.utils.debounce(\n this.savePosition.bind(this),\n 100,\n );\n }\n\n static registerPositionSetting() {\n if (\n this.POSITION_SETTING_REGISTERED ||\n !this.DEFAULT_OPTIONS.window?.savePosition\n )\n return;\n this.POSITION_SETTING_REGISTERED = true;\n game.settings.register(MODULE_ID, this.APP_ID + \"-position\", {\n scope: \"client\",\n config: false,\n type: Object,\n default: {},\n });\n }\n\n static resetSavedPosition() {\n game.settings.set(MODULE_ID, this.APP_ID + \"-position\", {});\n }\n\n savePosition(position) {\n const positionToSave = {\n left: position.left,\n top: position.top,\n width: position.width,\n height: position.height,\n };\n // if (positionToSave.width === \"auto\") delete positionToSave.width;\n // if (positionToSave.height === \"auto\") delete positionToSave.height\n if (this.constructor.DEFAULT_OPTIONS.position.width === \"auto\") delete positionToSave.width;\n if (this.constructor.DEFAULT_OPTIONS.position.height === \"auto\") delete positionToSave.height;\n game.settings.set(MODULE_ID, this.APP_ID + \"-position\", positionToSave);\n }\n\n setPosition(...args) {\n if (this.constructor.DEFAULT_OPTIONS.position.width === \"auto\") delete args.width;\n if (this.constructor.DEFAULT_OPTIONS.position.height === \"auto\") delete args.height;\n const r = super.setPosition(...args);\n if (this.constructor.POSITION_SETTING_REGISTERED)\n this.savePosition(this.position);\n return r;\n }\n\n static get APP_ID() {\n return this.name\n .split(/(?=[A-Z])/)\n .join(\"-\")\n .toLowerCase();\n }\n\n get APP_ID() {\n return this.constructor.APP_ID;\n }\n\n static get PARTS() {\n return {\n content: {\n template: `modules/${MODULE_ID}/templates/${this.APP_ID}.hbs`,\n classes: [],\n scrollable: [],\n },\n };\n }\n\n static get DEFAULT_OPTIONS() {\n return {\n tag: \"div\",\n id: this.APP_ID,\n window: {\n title: `${MODULE_ID}.${this.APP_ID}.title`,\n frame: true,\n positioned: true,\n icon: \"\",\n controls: [],\n minimizable: true,\n resizable: false,\n contentTag: \"section\",\n contentClasses: [],\n savePosition: false,\n preventEscapeClose: false\n },\n actions: {},\n form: {\n handler: undefined,\n submitOnChange: false,\n closeOnSubmit: false,\n },\n position: {\n width: 560,\n height: \"auto\",\n },\n };\n }\n\n async _prepareContext(options) {\n if (this.getData) return this.getData();\n const data = {};\n return { data };\n }\n\n activateListeners() {}\n\n _onRender(context, options) {\n super._onRender(context, options);\n if (this.constructor.DEFAULT_OPTIONS.window.preventEscapeClose) {\n foundry.applications.instances.delete(this.id, this);\n this.window.close.style.display = \"none\"\n }\n const html = this.element;\n if (this.activateListeners) this.activateListeners(html);\n }\n\n async render(options1 = {}, options2 = {}) {\n const activeOptions =\n typeof options1 === \"boolean\" ? options2 : options1;\n if (\n !activeOptions.position &&\n this.constructor.POSITION_SETTING_REGISTERED\n )\n activeOptions.position = game.settings.get(\n MODULE_ID,\n this.APP_ID + \"-position\",\n );\n return super.render(options1, options2);\n }\n}\n\nexport function dynamicImport(url) {\n const dynamicImport = new Function(\"url\", \"return import(url)\");\n return dynamicImport(url);\n}\n\nexport function confirm(title, content, options = {}) {\n title = l(title);\n content = l(content);\n return foundry.applications.api.DialogV2.confirm({\n window: { title },\n content,\n });\n}\n\nexport function prompt(title, content, options = {}) {\n title = l(title);\n content = l(content);\n return foundry.applications.api.DialogV2.prompt({\n window: { title },\n content,\n ...options,\n });\n}\n\nexport function deepClone(obj) {\n return foundry.utils.deepClone(obj);\n}\n\nexport function expandObject(obj) {\n return foundry.utils.expandObject(obj);\n}\n\nexport function flattenObject(obj) {\n return foundry.utils.flattenObject(obj);\n}\n\nexport function mergeObject(obj, other) {\n return foundry.utils.mergeObject(obj, other);\n}\n\nexport function mergeClone(obj, other) {\n obj = foundry.utils.deepClone(obj);\n other = foundry.utils.deepClone(other);\n return foundry.utils.mergeObject(obj, other);\n}\n\nexport function randomID(length = 20) {\n return foundry.utils.randomID(length);\n}\n\nexport function setProperty(obj, key, value) {\n return foundry.utils.setProperty(obj, key, value);\n}\n\nexport function getProperty(obj, key) {\n return foundry.utils.getProperty(obj, key);\n}\n\nexport function l(x) {\n return game.i18n.localize(x);\n}\n\nexport function easeInSine(x) {\n return 1 - Math.cos((x * Math.PI) / 2);\n}\n\nexport function easeOutSine(x) {\n return Math.sin((x * Math.PI) / 2);\n}\n\nexport function easeInOutSine(x) {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n}\n\nexport function easeInQuad(x) {\n return x * x;\n}\n\nexport function easeOutQuad(x) {\n return 1 - (1 - x) * (1 - x);\n}\n\nexport function easeInOutQuad(x) {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n}\n\nexport function easeInCubic(x) {\n return x * x * x;\n}\n\nexport function easeOutCubic(x) {\n return 1 - Math.pow(1 - x, 3);\n}\n\nexport function easeInOutCubic(x) {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n}\n\nexport function easeInQuart(x) {\n return x * x * x * x;\n}\n\nexport function easeOutQuart(x) {\n return 1 - Math.pow(1 - x, 4);\n}\n\nexport function easeInOutQuart(x) {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n}\n\nexport function easeInQuint(x) {\n return x * x * x * x * x;\n}\n\nexport function easeOutQuint(x) {\n return 1 - Math.pow(1 - x, 5);\n}\n\nexport function easeInOutQuint(x) {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n}\n\nexport function easeInExpo(x) {\n return x == 0 ? x : Math.pow(2, 10 * (x - 1));\n}\n\nexport function easeOutExpo(x) {\n return x == 1 ? x : 1 - Math.pow(2, -10 * x);\n}\n\nexport function easeInOutExpo(x) {\n return x == 0\n ? 0\n : x == 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n}\n\nexport function easeInCirc(x) {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n}\n\nexport function easeOutCirc(x) {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n}\n\nexport function easeInOutCirc(x) {\n return x < 0.5\n ? 1 - Math.sqrt(1 - Math.pow(2 * x, 2)) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n}\n\nexport function easeInElastic(x) {\n let s = 1.70158;\n let p = 0;\n let a = 1;\n if (x == 0) return 0;\n if ((x /= 1) == 1) return 1;\n if (!p) p = 0.3;\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = (p / (2 * Math.PI)) * Math.asin(1 / a);\n }\n return -(\n a *\n Math.pow(2, 10 * (x -= 1)) *\n Math.sin(((x * 1 - s) * (2 * Math.PI)) / p)\n );\n}\n\nexport function easeOutElastic(x) {\n let s = 1.70158;\n let p = 0;\n let a = 1;\n if (x == 0) return 0;\n if ((x /= 1) == 1) return 1;\n if (!p) p = 0.3;\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = (p / (2 * Math.PI)) * Math.asin(1 / a);\n }\n return (\n a * Math.pow(2, -10 * x) * Math.sin(((x * 1 - s) * (2 * Math.PI)) / p) +\n 1\n );\n}\n\nexport function easeInOutElastic(x) {\n let s = 1.70158;\n let p = 0;\n let a = 1;\n if (x == 0) return 0;\n if ((x /= 1 / 2) == 2) return 1;\n if (!p) p = 0.3 * (0.3 + 1);\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = (p / (2 * Math.PI)) * Math.asin(1 / a);\n }\n if (x < 1)\n return (\n -0.5 *\n (a *\n Math.pow(2, 10 * (x -= 1)) *\n Math.sin(((x * 1 - s) * (2 * Math.PI)) / p))\n );\n return (\n a *\n Math.pow(2, -10 * (x -= 1)) *\n Math.sin(((x * 1 - s) * (2 * Math.PI)) / p) *\n 0.5 +\n 1\n );\n}\n\nexport function easeInBack(x) {\n let s = 1.70158;\n return x * x * ((s + 1) * x - s);\n}\n\nexport function easeOutBack(x) {\n let s = 1.70158;\n return 1 - (1 - x) * (1 - x) * ((s + 1) * x - s);\n}\n\nexport function easeInOutBack(x) {\n let s = 1.70158;\n if ((x /= 1 / 2) < 1)\n return (1 / 2) * (x * x * (((s *= 1.525) + 1) * x - s));\n return (1 / 2) * ((x -= 2) * x * (((s *= 1.525) + 1) * x + s) + 2);\n}\n\nexport function addColorPicker(input, { value, opacity = false } = {}) {\n const hexToComponents = (hex) => {\n const hexColor =\n hex.length < 9 ? hex + \"f\".repeat(9 - hex.length) : hex;\n\n const colorValue = hexColor.slice(0, 7);\n const alphaValue = parseInt(hexColor.slice(7, 9), 16) / 255;\n return { color: colorValue, alpha: alphaValue };\n };\n\n const componentsToHex = (color, alpha) => {\n const colorValue = color.replace(\"#\", \"\");\n const alphaValue = Math.round(alpha * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${colorValue}${alphaValue}`;\n };\n\n const textInput =\n input.type === \"text\"\n ? input\n : input.querySelector(\"input[type='text']\");\n if (textInput.classList.contains(\"color-picker-added\")) return;\n\n textInput.classList.add(\"color-picker-added\");\n textInput.classList.add(\"color\");\n const parent = textInput.parentElement;\n\n value ??= textInput.value || \"#000000ff\";\n\n const { color, alpha } = hexToComponents(value);\n\n const colorPickerElement = document.createElement(\"input\");\n colorPickerElement.setAttribute(\"type\", \"color\");\n if (opacity) colorPickerElement.style.maxWidth = \"2rem\";\n\n const alphaPickerHtml = ``;\n const alphaPickerElement = new DOMParser()\n .parseFromString(alphaPickerHtml, \"text/html\")\n .querySelector(\"range-picker\");\n\n const updateTextInput = (color, alpha) => {\n const hex = componentsToHex(color, alpha);\n if (!opacity) textInput.value = hex.slice(0, 7);\n else textInput.value = hex;\n textInput.dispatchEvent(new Event(\"change\"));\n };\n\n colorPickerElement.value = color;\n alphaPickerElement.value = alpha;\n\n colorPickerElement.addEventListener(\"input\", (event) => {\n const color = event.target.value;\n const alpha = alphaPickerElement.value;\n updateTextInput(color, alpha);\n });\n\n alphaPickerElement.addEventListener(\"input\", (event) => {\n const alpha = event.target.value;\n const color = colorPickerElement.value;\n updateTextInput(color, alpha);\n });\n\n textInput.after(colorPickerElement);\n opacity && colorPickerElement.after(alphaPickerElement);\n}\n","import { MODULE_ID} from \"../main.js\";\r\nimport Sortable from \"../sortable.js\";\r\nimport { HandlebarsApplication, mergeClone } from \"../lib/utils.js\";\r\n\r\nexport class AttributesConfig extends HandlebarsApplication {\r\n constructor () {\r\n super();\r\n }\r\n\r\n static get DEFAULT_OPTIONS() {\r\n return mergeClone(super.DEFAULT_OPTIONS, {\r\n tag: \"form\",\r\n id: \"combat-dock-attributes-config\",\r\n window: {\r\n title: `${MODULE_ID}.settings.attributesMenu.name`,\r\n contentClasses: [\"standard-form\"],\r\n },\r\n actions: {\r\n onAdd: this.onAdd,\r\n onReset: this.onReset,\r\n },\r\n form: {\r\n handler: this.#onSubmit,\r\n closeOnSubmit: true,\r\n },\r\n });\r\n }\r\n\r\n static get PARTS() {\r\n return {\r\n content: {\r\n template: `modules/combat-tracker-dock/templates/attributes-config.hbs`,\r\n classes: [\"standard-form\", \"scrollable\"],\r\n },\r\n footer: {\r\n template: \"templates/generic/form-footer.hbs\",\r\n },\r\n };\r\n }\r\n\r\n _prepareContext(options) {\r\n const attributes = TokenDocument.implementation.getTrackedAttributes();\r\n attributes.bar.forEach(a => a.push(\"value\"));\r\n const attributeChoices = (TokenDocument.implementation.getTrackedAttributeChoices(attributes));\r\n\r\n const saveButton = {\r\n type: \"submit\",\r\n action: \"submit\",\r\n icon: \"fas fa-save\",\r\n label: \"combat-tracker-dock.settings.attributesMenu.form.save\",\r\n };\r\n const resetButton = {\r\n type: \"button\",\r\n action: \"onReset\",\r\n icon: \"fas fa-undo\",\r\n label: \"combat-tracker-dock.settings.attributesMenu.form.reset\",\r\n };\r\n const addButton = {\r\n type: \"button\",\r\n action: \"onAdd\",\r\n icon: \"fas fa-plus\",\r\n label: \"combat-tracker-dock.settings.attributesMenu.form.add\",\r\n };\r\n\r\n return {attributes: game.settings.get(MODULE_ID, \"attributes\"), attributeChoices, buttons: [saveButton, resetButton, addButton]};\r\n }\r\n \r\n _onRender(context, options) {\r\n super._onRender(context, options);\r\n const html = this.element;\r\n html.querySelectorAll(\".attributePicker\").forEach((picker) => {\r\n picker.addEventListener(\"change\", (event) => {\r\n const value = event.target.value;\r\n const attributeInput = event.target.closest(\".form-group\").querySelector(\".attr\");\r\n attributeInput.value = value;\r\n });\r\n });\r\n Sortable.create(html.querySelector(\"ul\"), {\r\n animation: 200,\r\n filter: \"input\",\r\n preventOnFilter: false,\r\n });\r\n }\r\n\r\n static async onAdd(event) {\r\n event.preventDefault();\r\n await this._saveData();\r\n const attributes = game.settings.get(MODULE_ID, \"attributes\");\r\n attributes.push({\r\n attr: \"\",\r\n icon: \"\",\r\n units: \"\",\r\n });\r\n await game.settings.set(MODULE_ID, \"attributes\", attributes);\r\n this.render({ force: true });\r\n }\r\n\r\n static async onReset(event) {\r\n event.preventDefault();\r\n const response = await foundry.applications.api.DialogV2.confirm({\r\n window: { title: `${MODULE_ID}.settings.attributesMenu.reset` },\r\n content: game.i18n.localize(`${MODULE_ID}.settings.attributesMenu.resetWarning`),\r\n });\r\n if(response) {\r\n const defaultSett = game.settings.settings.get(\"combat-tracker-dock.attributes\").default;\r\n await game.settings.set(MODULE_ID, \"attributes\", defaultSett);\r\n this.render({ force: true });\r\n }\r\n }\r\n\r\n async _saveData() {\r\n let attributes = this._getSubmitData();\r\n attributes = attributes.filter((attr) => attr.attr !== \"\");\r\n await game.settings.set(MODULE_ID, \"attributes\", attributes);\r\n }\r\n\r\n static async #onSubmit(event) {\r\n event.preventDefault();\r\n await this._saveData();\r\n this.close();\r\n }\r\n\r\n _getSubmitData() {\r\n let data = [];\r\n const li = this.element.querySelectorAll(\"li\");\r\n for (let i = 0; i < li.length; i++) {\r\n const attr = li[i].querySelector(\".attr\").value;\r\n const icon = li[i].querySelector(\".icon\").value;\r\n const units = li[i].querySelector(\".units\").value;\r\n data.push({attr, icon, units});\r\n }\r\n return data;\r\n }\r\n}","/*\r\n * -------------------------------------------------------------\r\n * Community Maintained\r\n * -------------------------------------------------------------\r\n *\r\n * This file is maintained by the community and is subject to the\r\n * terms of the MIT License.\r\n *\r\n * For more information, please visit:\r\n * https://opensource.org/licenses/MIT\r\n *\r\n * -------------------------------------------------------------\r\n */\r\n\r\nimport { MODULE_ID } from \"./main.js\";\r\nimport { registerSystemSetting, getSystemSetting } from \"./settings.js\";\r\n\r\n/**\r\n * Returns the default attributes configuration for different game systems.\r\n *\r\n * @returns {Object} The default attributes configuration.\r\n */\r\n\r\nexport function defaultAttributesConfig() {\r\n return {\r\n dnd5e: [\r\n {\r\n attr: \"attributes.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"attributes.ac.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"AC\",\r\n },\r\n {\r\n attr: \"attributes.movement.walk\",\r\n icon: \"fas fa-person-running-fast\",\r\n units: \"ft.\",\r\n },\r\n {\r\n attr: \"attributes.spell.dc\",\r\n icon: \"fas fa-hand-holding-magic\",\r\n units: \"Spell DC\",\r\n },\r\n {\r\n attr: \"resources.legact.value\",\r\n icon: \"far fa-bolt-lightning\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.legres.value\",\r\n icon: \"fas fa-shield-cross\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.lair.value\",\r\n icon: \"fa-solid fa-dungeon\",\r\n units: \"\",\r\n },\r\n ],\r\n \"dnd4e\": [\r\n {\r\n attr: \"defences.ac.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"DND4E.DefAC\"),\r\n },\r\n {\r\n attr: \"defences.fort.value\",\r\n icon: \"fas fa-heart-pulse\",\r\n units: game.i18n.localize(\"DND4E.DefFort\"),\r\n },\r\n {\r\n attr: \"defences.ref.value\",\r\n icon: \"fas fa-rabbit-running\",\r\n units: game.i18n.localize(\"DND4E.DefRef\"),\r\n },\r\n {\r\n attr: \"defences.wil.value\",\r\n icon: \"fas fa-brain\",\r\n units: game.i18n.localize(\"DND4E.DefWil\"),\r\n },\r\n {\r\n attr: \"attributes.init.value\",\r\n icon: \"fas fa-traffic-light-go\",\r\n units: game.i18n.localize(\"DND4E.Init\"),\r\n },\r\n {\r\n attr: \"movement.walk.value\",\r\n icon: \"fas fa-person-running\",\r\n units: game.i18n.localize(\"DND4E.Speed\"),\r\n },\r\n {\r\n attr: \"attributes.hp.max\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"DND4E.HPShort\"),\r\n },\r\n {\r\n attr: \"details.bloodied\",\r\n icon: \"fas fa-heart-half-stroke\",\r\n units: null,\r\n },\r\n\t\t],\r\n \"cyberpunk-red-core\": [\r\n {\r\n attr: \"derivedStats.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"derivedStats.walk.value\",\r\n icon: \"fas fa-person-running\",\r\n units: \"m/ft\",\r\n },\r\n {\r\n attr: \"derivedStats.run.value\",\r\n icon: \"fas fa-person-running-fast\",\r\n units: \"m/ft\",\r\n },\r\n {\r\n attr: \"externalData.currentArmorHead.value\",\r\n icon: \"fas fa-helmet-safety\",\r\n units: \"SP\",\r\n },\r\n {\r\n attr: \"externalData.currentArmorBody.value\",\r\n icon: \"fas fa-shirt-tank-top\",\r\n units: \"SP\",\r\n },\r\n ],\r\n swade: [\r\n {\r\n attr: \"wounds.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"SWADE.Wounds\"),\r\n },\r\n {\r\n attr: \"fatigue.value\",\r\n icon: \"fas fa-face-hand-yawn\",\r\n units: game.i18n.localize(\"SWADE.Fatigue\"),\r\n },\r\n {\r\n attr: \"bennies.value\",\r\n icon: \"fas fa-bullseye\",\r\n units: game.i18n.localize(\"SWADE.Bennies\"),\r\n },\r\n {\r\n attr: \"stats.speed.value\",\r\n icon: \"fas fa-person-running\",\r\n units: game.i18n.localize(\"SWADE.Pace\"),\r\n },\r\n {\r\n attr: \"stats.parry.value\",\r\n icon: \"fas fa-swords\",\r\n units: game.i18n.localize(\"SWADE.Parry\"),\r\n },\r\n {\r\n attr: \"stats.toughness.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"SWADE.Tough\"),\r\n },\r\n {\r\n attr: \"stats.toughness.armor\",\r\n icon: \"fas fa-helmet-battle\",\r\n units: game.i18n.localize(\"SWADE.Armor\"),\r\n },\r\n ],\r\n pirateborg: [\r\n {\r\n attr: \"attributes.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"attributes.luck.value\",\r\n icon: \"fas fa-clover\",\r\n units: \"Devil's Luck\",\r\n },\r\n {\r\n attr: \"attributes.rituals.value\",\r\n icon: \"fas fa-ankh\",\r\n units: \"Rituals\",\r\n },\r\n ],\r\n cyphersystem: [\r\n {\r\n attr: \"pools.might.value\",\r\n icon: \"fas fa-hand-fist\",\r\n units: \"Might\",\r\n },\r\n {\r\n attr: \"pools.speed.value\",\r\n icon: \"fas fa-person-running\",\r\n units: \"Speed\",\r\n },\r\n {\r\n attr: \"pools.intellect.value\",\r\n icon: \"fas fa-brain\",\r\n units: \"Intellect\",\r\n },\r\n {\r\n attr: \"combat.damageTrack.state\",\r\n icon: \"fas fa-heart\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"pools.health.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"Health\",\r\n },\r\n {\r\n attr: \"combat.armor\",\r\n icon: \"fas fa-shield\",\r\n units: \"Armor\",\r\n },\r\n {\r\n attr: \"combat.damage\",\r\n icon: \"fas fa-axe-battle\",\r\n units: \"Damage\",\r\n },\r\n ],\r\n pf2e: [\r\n {\r\n attr: \"attributes.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"attributes.ac.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"AC\",\r\n },\r\n {\r\n attr: \"attributes.speed.value\",\r\n icon: \"systems/pf2e/icons/default-icons/action.svg\",\r\n units: \"ft.\",\r\n },\r\n {\r\n attr: \"attributes.spellDC.value\",\r\n icon: \"fas fa-hand-holding-magic\",\r\n units: \"Spell DC\",\r\n },\r\n {\r\n attr: \"attributes.shield.hp.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"Shield HP\",\r\n },\r\n ],\r\n pf1: [\r\n {\r\n attr: \"attributes.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"attributes.ac.normal.total\",\r\n icon: \"fas fa-shield\",\r\n units: \"AC\",\r\n },\r\n {\r\n attr: \"attributes.ac.touch.total\",\r\n icon: \"fas fa-shield-slash\",\r\n units: \"Touch AC\",\r\n },\r\n {\r\n attr: \"attributes.ac.flatFooted.total\",\r\n icon: \"fas fa-circle-exclamation\",\r\n units: \"Flat Footed AC\",\r\n },\r\n {\r\n attr: \"attributes.cmd.total\",\r\n icon: \"fas fa-hand-fist\",\r\n units: \"CMD\",\r\n },\r\n {\r\n attr: \"attributes.cmd.flatFootedTotal\",\r\n icon: \"fas fa-person-circle-exclamation\",\r\n units: \"Flat Footed CMD\",\r\n },\r\n {\r\n attr: \"attributes.sr.total\",\r\n icon: \"fas fa-hand-holding-magic\",\r\n units: \"Spell Resistance\",\r\n },\r\n {\r\n attr: \"attributes.speed.land.total\",\r\n icon: \"fas fa-person-running\",\r\n units: \"ft.\",\r\n },\r\n ],\r\n crucible: [\r\n {\r\n attr: \"resources.health.value\",\r\n icon: \"fa-solid fa-heart\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.morale.value\",\r\n icon: \"fa-solid fa-brain\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.action.value\",\r\n icon: \"fa-solid fa-hand-fist\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.focus.value\",\r\n icon: \"fa-solid fa-hand-holding-magic\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.wounds.value\",\r\n icon: \"fa-solid fa-droplet\",\r\n units: \"\",\r\n },\r\n {\r\n attr: \"resources.madness.value\",\r\n icon: \"fa-solid fa-head-side-brain\",\r\n units: \"\",\r\n },\r\n ],\r\n wfrp4e: [\r\n {\r\n attr: \"status.wounds.value\",\r\n icon: \"fa-thin fa-heart\",\r\n units: game.i18n.localize(\"Wounds\"),\r\n },\r\n {\r\n attr: \"status.advantage.value\",\r\n icon: \"fa-thin fa-swords\",\r\n units: game.i18n.localize(\"Advantage\"),\r\n },\r\n {\r\n attr: \"status.fortune.value\",\r\n icon: \"fa-thin fa-clover\",\r\n units: game.i18n.localize(\"Fortune\"),\r\n },\r\n {\r\n attr: \"status.resolve.value\",\r\n icon: \"fa-thin fa-face-pouting\",\r\n units: game.i18n.localize(\"Resolve\"),\r\n },\r\n {\r\n attr: \"details.move.run\",\r\n icon: \"fa-thin fa-person-running\",\r\n units: game.i18n.localize(\"yds\"),\r\n },\r\n ],\r\n alienrpg: [\r\n {\r\n attr: \"header.health.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"ALIENRPG.Health\"),\r\n },\r\n {\r\n attr: \"header.stress.value\",\r\n icon: \"fas fa-face-scream\",\r\n units: game.i18n.localize(\"ALIENRPG.Stress\"),\r\n },\r\n {\r\n attr: \"general.armor.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"ALIENRPG.Armor\"),\r\n },\r\n {\r\n attr: \"attributes.speed.value\",\r\n icon: \"fas fa-person-running\",\r\n units: game.i18n.localize(\"ALIENRPG.Speed\"),\r\n },\r\n {\r\n attr: \"general.mobility.value\",\r\n icon: \"fas fa-user-ninja\",\r\n units: game.i18n.localize(\"ALIENRPG.Skillmobility\"),\r\n },\r\n {\r\n attr: \"general.observation.value\",\r\n icon: \"fas fa-eye\",\r\n units: game.i18n.localize(\"ALIENRPG.Skillobservation\"),\r\n },\r\n {\r\n attr: \"attributes.armorrating.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"ALIENRPG.ArmorRating\"),\r\n },\r\n {\r\n attr: \"attributes.hull.value\",\r\n icon: \"fas fa-shuttle-space\",\r\n units: game.i18n.localize(\"ALIENRPG.HULL\"),\r\n },\r\n {\r\n attr: \"attributes.armor.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"ALIENRPG.SHIP-ARMOR\"),\r\n },\r\n {\r\n attr: \"attributes.thrusters.value\",\r\n icon: \"fas fa-rocket-launch\",\r\n units: game.i18n.localize(\"ALIENRPG.THRUSTERS\"),\r\n },\r\n {\r\n attr: \"attributes.signature.value\",\r\n icon: \"fas fa-satellite-dish\",\r\n units: game.i18n.localize(\"ALIENRPG.SIGNATURE\"),\r\n },\r\n ],\r\n exaltedthird: [\r\n {\r\n attr: \"health.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"Ex3.Health\"),\r\n },\r\n {\r\n attr: \"evasion.value\",\r\n icon: \"fas fa-rabbit-running\",\r\n units: game.i18n.localize(\"Ex3.Evasion\"),\r\n },\r\n {\r\n attr: \"parry.value\",\r\n icon: \"fas fa-swords\",\r\n units: game.i18n.localize(\"Ex3.Parry\"),\r\n },\r\n {\r\n attr: \"soak.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"Ex3.Soak\"),\r\n },\r\n {\r\n attr: \"hardness.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"Ex3.Hardness\"),\r\n },\r\n {\r\n attr: \"willpower.value\",\r\n icon: \"fas fa-hand-fist\",\r\n units: game.i18n.localize(\"Ex3.Willpower\"),\r\n },\r\n {\r\n attr: \"anima.value\",\r\n icon: \"fas fa-sun\",\r\n units: game.i18n.localize(\"Ex3.Anima\"),\r\n },\r\n ],\r\n exaltedessence: [\r\n {\r\n attr: \"health.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"ExEss.Health\"),\r\n },\r\n {\r\n attr: \"evasion.value\",\r\n icon: \"fas fa-rabbit-running\",\r\n units: game.i18n.localize(\"ExEss.Evasion\"),\r\n },\r\n {\r\n attr: \"parry.value\",\r\n icon: \"fas fa-swords\",\r\n units: game.i18n.localize(\"ExEss.Parry\"),\r\n },\r\n {\r\n attr: \"soak.value\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"ExEss.Soak\"),\r\n },\r\n {\r\n attr: \"hardness.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"ExEss.Hardness\"),\r\n },\r\n {\r\n attr: \"power.value\",\r\n icon: \"fas fa-hand-fist\",\r\n units: game.i18n.localize(\"ExEss.Power\"),\r\n },\r\n {\r\n attr: \"will.value\",\r\n icon: \"fas fa-hand-sparkles\",\r\n units: game.i18n.localize(\"ExEss.Will\"),\r\n },\r\n {\r\n attr: \"anima.value\",\r\n icon: \"fas fa-sun\",\r\n units: game.i18n.localize(\"ExEss.Anima\"),\r\n },\r\n ],\r\n swnr: [\r\n {\r\n attr: \"health.value\",\r\n icon: \"fas fa-heart\",\r\n units: game.i18n.localize(\"swnr.sheet.hp\"),\r\n },\r\n {\r\n attr: \"ac\",\r\n icon: \"fas fa-shield\",\r\n units: game.i18n.localize(\"swnr.sheet.ac\"),\r\n },\r\n {\r\n attr: \"speed\",\r\n icon: \"fas fa-person-running-fast\",\r\n units: \"m\",\r\n },\r\n {\r\n attr: \"save.physical\",\r\n icon: \"fas fa-hand-fist\",\r\n units: game.i18n.localize(\"swnr.sheet.vs\"),\r\n },\r\n {\r\n attr: \"save.evasion\",\r\n icon: \"fas fa-feather-pointed\",\r\n units: game.i18n.localize(\"swnr.sheet.vs\"),\r\n },\r\n {\r\n attr: \"save.mental\",\r\n icon: \"fas fa-brain\",\r\n units: game.i18n.localize(\"swnr.sheet.vs\"),\r\n },\r\n ],\r\n wwn: [\r\n {\r\n attr: \"hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"Hit Points\",\r\n },\r\n {\r\n attr: \"details.strain.value\",\r\n icon: \"fas fa-ankh\",\r\n units: \"System Strain\",\r\n }, \r\n {\r\n attr: \"aac.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"Armor Class\",\r\n },\r\n {\r\n attr: \"movement.base\",\r\n icon: \"fas fa-person-running\",\r\n units: \"ft. Movement\",\r\n },\r\n {\r\n attr: \"saves.evasion.value\",\r\n icon: \"fas fa-bullseye\",\r\n units: \"Evasion Save\",\r\n },\r\n {\r\n attr: \"saves.mental.value\",\r\n icon: \"fas fa-brain\",\r\n units: \"Mental Save\", \r\n },\r\n {\r\n attr: \"saves.physical.value\",\r\n icon: \"fas fa-hand-fist\",\r\n units: \"Physical Save\",\r\n },\r\n {\r\n attr: \"saves.luck.value\",\r\n icon: \"fas fa-star\",\r\n units: \"Luck Save\",\r\n },\r\n ], \r\n ars: [\r\n {\r\n attr: \"attributes.hp.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"Hit Points\",\r\n }, \r\n {\r\n attr: \"attributes.ac.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"Armor Class\",\r\n },\r\n {\r\n attr: \"attributes.movement.value\",\r\n icon: \"fas fa-person-running\",\r\n units: \"Movement\",\r\n },\r\n {\r\n attr: \"attributes.thaco.value\",\r\n icon: \"fas fa-swords\",\r\n units: \"THAC0\",\r\n }, \r\n ], \r\n lancer: [\r\n { attr: \"hp.value\", icon: \"mdi mdi-heart-outline\", units: \"\" },\r\n { attr: \"structure.value\", icon: \"cci cci-structure\", units: \"\" },\r\n { attr: \"heat.value\", icon: \"cci cci-heat\", units: \"\" },\r\n { attr: \"stress.value\", icon: \"cci cci-reactor\", units: \"\" },\r\n ],\r\n dc20rpg: [\r\n {\r\n attr: \"resources.health.value\",\r\n icon: \"fas fa-heart\",\r\n units: \"HP\",\r\n },\r\n {\r\n attr: \"resources.mana.value\",\r\n icon: \"fas fa-star\",\r\n units: \"MP\",\r\n },\r\n {\r\n attr: \"resources.stamina.value\",\r\n icon: \"fas fa-hand-fist\",\r\n units: \"SP\",\r\n },\r\n {\r\n attr: \"defences.physical.value\",\r\n icon: \"fas fa-shield\",\r\n units: \"PD\",\r\n },\r\n {\r\n attr: \"defences.mystical.value\",\r\n icon: \"fas fa-wand-magic-sparkles\",\r\n units: \"MD\",\r\n },\r\n {\r\n attr: \"movement.ground.value\",\r\n icon: \"fas fa-person-walking\",\r\n units: \"Spaces\",\r\n },\r\n ],\r\n shadowdark: [\r\n { attr: \"attributes.ac.value\", icon: \"fas fa-shield\", units: \"AC\" },\r\n { attr: \"attributes.hp.value\", icon: \"fas fa-heart\", units: \"HP\" },\r\n ],\r\n };\r\n}\r\n\r\n/**\r\n * Generates a description for the given actor based on its data.\r\n * This description is shown in the Tooltip under the actor's name.\r\n *\r\n * @param {Object} actor - The actor object.\r\n * @returns {string|null} The generated description or null if no description is available.\r\n */\r\n\r\nexport function generateDescription(actor) {\r\n const { type, system } = actor;\r\n switch (game.system.id) {\r\n case \"dnd5e\":\r\n const isNPC = type === \"npc\";\r\n const isPC = type === \"character\";\r\n if (isNPC) {\r\n const creatureType = game.i18n.localize(CONFIG.DND5E.creatureTypes[actor.system.details.type.value]?.label ?? actor.system.details.type.custom);\r\n const cr = system.details.cr >= 1 || system.details.cr <= 0 ? system.details.cr : `1/${1 / system.details.cr}`;\r\n return `CR ${cr} ${creatureType}`;\r\n } else if (isPC) {\r\n const classes = Object.values(actor.classes)\r\n .map((c) => c.name)\r\n .join(\" / \");\r\n return `Level ${system.details.level} ${classes} (${system.details.race})`;\r\n } else {\r\n return null;\r\n }\r\n case \"dnd4e\":\r\n switch (type) {\r\n case \"Player Character\":\r\n\t\t\t\t\treturn `${game.i18n.localize(\"DND4E.Level\")} ${system.details.level} ${system.details.race} ${system.details.class} (${system.details.alignment})`;\r\n case \"NPC\":\r\n\t\t\t\t\treturn `${CONFIG.DND4E.actorSizes[actor.system.details.size]?.label} ${CONFIG.DND4E.creatureOrigin[actor.system.details.origin]?.label} ${CONFIG.DND4E.creatureType[actor.system.details.type]?.label}`;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn null;\r\n\t\t\t}\r\n case \"swade\":\r\n if (system?.wildcard) return `${game.i18n.localize(\"SWADE.WildCard\")}`;\r\n switch (type) {\r\n case \"character\":\r\n case \"npc\":\r\n return `${game.i18n.localize(\"SWADE.Extra\")}`;\r\n case \"vehicle\":\r\n return game.i18n.localize(\"TYPES.Actor.vehicle\");\r\n default:\r\n return null;\r\n }\r\n case \"pirateborg\":\r\n switch (type) {\r\n case \"character\":\r\n const classes = [actor.characterClass?.name || \"Character\"];\r\n if (actor.characterBaseClass?.name) {\r\n classes.push(actor.characterBaseClass.name);\r\n }\r\n return classes.join(\" - \");\r\n case \"creature\":\r\n return \"Creature\";\r\n case \"vehicle\":\r\n case \"vehicle_npc\":\r\n return \"Ship\";\r\n default:\r\n return null;\r\n }\r\n case \"cyphersystem\":\r\n switch (type) {\r\n case \"pc\":\r\n return \"Character\";\r\n case \"npc\":\r\n return \"Creature\";\r\n case \"companion\":\r\n return \"Companion\";\r\n case \"community\":\r\n return \"Community\";\r\n case \"vehicle\":\r\n return \"Vehicle\";\r\n case \"marker\":\r\n return \"Marker\";\r\n default:\r\n return null;\r\n }\r\n case \"pf2e\":\r\n switch (type) {\r\n case \"character\":\r\n return `Level ${system.details.level.value} ${system.details.class.name} (${system.details.ancestry.name})`;\r\n default:\r\n return null;\r\n }\r\n case \"crucible\":\r\n if (actor.type === \"hero\") return `${system.details.ancestry.name} ${system.details.background.name} ${system.details.signatureName ? `(${system.details.signatureName})` : \"\"}`;\r\n if (actor.type === \"adversary\") return `${system.details.taxonomy.name} ${system.details.archetype.name} (${game.i18n.localize(\"ADVANCEMENT.Level\")} ${system.details.level} ${game.i18n.localize(\"ADVERSARY.Threat\" + system.details.threat.charAt(0).toUpperCase() + system.details.threat.slice(1))})`;\r\n case \"wfrp4e\":\r\n switch (type) {\r\n case \"character\":\r\n return `${actor.Species} ${actor.currentCareer.name}`;\r\n case \"npc\":\r\n const length = actor.itemTypes.career.length - 1;\r\n if (length < 0) {\r\n return `${actor.Species}`;\r\n } else {\r\n const careers = Object.values(actor.itemTypes.career).map((c) => c.name);\r\n const career = careers[length];\r\n return `${actor.Species} ${career}`;\r\n }\r\n case \"creature\":\r\n return `${actor.Species}`;\r\n default:\r\n return null;\r\n }\r\n case \"alienrpg\":\r\n switch (type) {\r\n case \"character\":\r\n let career;\r\n if (system.general.career.value == 1) career = game.i18n.localize(\"ALIENRPG.ColonialMarine\");\r\n else if (system.general.career.value == 2) career = game.i18n.localize(\"ALIENRPG.ColonialMarshal\");\r\n else if (system.general.career.value == 3) career = game.i18n.localize(\"ALIENRPG.CompanyAgent\");\r\n else if (system.general.career.value == 4) career = game.i18n.localize(\"ALIENRPG.Kid\");\r\n else if (system.general.career.value == 5) career = game.i18n.localize(\"ALIENRPG.Medic\");\r\n else if (system.general.career.value == 6) career = game.i18n.localize(\"ALIENRPG.Mercenary\");\r\n else if (system.general.career.value == 7) career = game.i18n.localize(\"ALIENRPG.Officer\");\r\n else if (system.general.career.value == 8) career = game.i18n.localize(\"ALIENRPG.Pilot\");\r\n else if (system.general.career.value == 9) career = game.i18n.localize(\"ALIENRPG.Roughneck\");\r\n else if (system.general.career.value == 10) career = game.i18n.localize(\"ALIENRPG.Scientist\");\r\n else if (system.general.career.value == 11) career = game.i18n.localize(\"ALIENRPG.Synthetic\");\r\n else if (system.general.career.value == 12) career = game.i18n.localize(\"ALIENRPG.Homebrew\");\r\n if (actor.itemTypes.specialty.length == 0) return `${career}`;\r\n else if (actor.itemTypes.specialty.length == 1) {\r\n const specialties = Object.values(actor.itemTypes.specialty).map((c) => c.name);\r\n const specialty = specialties[0];\r\n return `${career}: ${specialty}`;\r\n }\r\n case \"synthetic\":\r\n let careersynth;\r\n if (system.general.career.value == 1) careersynth = game.i18n.localize(\"ALIENRPG.ColonialMarine\");\r\n else if (system.general.career.value == 2) careersynth = game.i18n.localize(\"ALIENRPG.ColonialMarshal\");\r\n else if (system.general.career.value == 3) careersynth = game.i18n.localize(\"ALIENRPG.CompanyAgent\");\r\n else if (system.general.career.value == 4) careersynth = game.i18n.localize(\"ALIENRPG.Kid\");\r\n else if (system.general.career.value == 5) careersynth = game.i18n.localize(\"ALIENRPG.Medic\");\r\n else if (system.general.career.value == 6) careersynth = game.i18n.localize(\"ALIENRPG.Mercenary\");\r\n else if (system.general.career.value == 7) careersynth = game.i18n.localize(\"ALIENRPG.Officer\");\r\n else if (system.general.career.value == 8) careersynth = game.i18n.localize(\"ALIENRPG.Pilot\");\r\n else if (system.general.career.value == 9) careersynth = game.i18n.localize(\"ALIENRPG.Roughneck\");\r\n else if (system.general.career.value == 10) careersynth = game.i18n.localize(\"ALIENRPG.Scientist\");\r\n else if (system.general.career.value == 11) careersynth = game.i18n.localize(\"ALIENRPG.Synthetic\");\r\n else if (system.general.career.value == 12) careersynth = game.i18n.localize(\"ALIENRPG.Homebrew\");\r\n if (actor.itemTypes.specialty.length == 0) return `${careersynth}`;\r\n else if (actor.itemTypes.specialty.length == 1) {\r\n const specialties = Object.values(actor.itemTypes.specialty).map((c) => c.name);\r\n const specialty = specialties[0];\r\n return `${careersynth}: ${specialty}`;\r\n }\r\n case \"spacecraft\":\r\n return `${game.i18n.localize(\"ALIENRPG.MODEL\")}: ${system.attributes.model}`;\r\n default:\r\n return null;\r\n }\r\n case \"exaltedthird\":\r\n switch (type) {\r\n case \"character\":\r\n case \"npc\":\r\n return `${game.i18n.localize(\"Ex3.Essence\")} ${system.essence.value}`;\r\n default:\r\n return null;\r\n }\r\n case \"exaltedessence\":\r\n switch (type) {\r\n case \"character\":\r\n case \"npc\":\r\n return `${game.i18n.localize(\"ExEss.Essence\")} ${system.essence.value}`;\r\n default:\r\n return null;\r\n }\r\n case \"swnr\":\r\n switch (type) {\r\n case \"character\":\r\n return `${game.i18n.localize(\"swnr.sheet.level\")} ${system.level.value} ${system.background} ${system.class}`;\r\n case \"npc\":\r\n return \"NPC\";\r\n case \"vehicle\":\r\n return \"Vehicle\";\r\n case \"ship\":\r\n return \"Ship\";\r\n case \"drone\":\r\n return \"Drone\";\r\n case \"mech\":\r\n return \"Mech\";\r\n default:\r\n return null;\r\n }\r\n case \"wwn\":\r\n switch (type) {\r\n case \"Character\":\r\n return `Level ${system.details.level} ${system.details.background} ${system.details.class}`;\r\n case \"Faction\":\r\n return \"Faction\";\r\n case \"Monster\":\r\n return `${system.hp.hd} hit dice Monster`;\r\n default:\r\n return null;\r\n }\r\n case \"ars\":\r\n switch (type) {\r\n case \"character\":\r\n return \"Player Character\";\r\n case \"lootable\":\r\n return \"Loot\";\r\n case \"merchant\":\r\n return \"Merchant\"; \r\n case \"npc\":\r\n return \"Non-Player-Character\";\r\n default:\r\n return null;\r\n } \r\n case \"lancer\":\r\n return game.lancer.combatTrackerDock?.generateDescription(actor);\r\n case \"shadowdark\":\r\n switch (type) {\r\n case \"Player\":\r\n case \"NPC\":\r\n return `Level: ${system.level.value}`;\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the display information for the initiative of a combatant based on the game system.\r\n * The icon can be both a font-awesome icon or an image.\r\n *\r\n * @param {Object} combatant - The combatant object.\r\n * @returns {Object} The initiative display information, including value, icon, and roll icon.\r\n */\r\n\r\nexport function getInitiativeDisplay(combatant) {\r\n switch (game.system.id) {\r\n case \"swade\": {\r\n let suit = \"\";\r\n const getCardImage = (cardstr) => {\r\n return Array.from(game.cards.get(game.settings.get(\"swade\", \"actionDeck\")).cards).find((c) => c.description === cardstr)?.img;\r\n };\r\n let cardString = combatant?.cardString ?? \"\";\r\n if (cardString.includes(\"♥\")) suit = \"fas fa-heart\";\r\n else if (cardString.includes(\"♦\")) suit = \"fas fa-diamond\";\r\n else if (cardString.includes(\"♣\")) suit = \"fas fa-club\";\r\n else if (cardString.includes(\"♠\")) suit = \"fas fa-spade\";\r\n else if (cardString === \"Red J\" || cardString === \"Blk J\") cardString = \"JK\";\r\n\r\n return {\r\n value: cardString,\r\n icon: getCardImage(combatant?.cardString ?? \"\") ?? suit,\r\n rollIcon: \"far fa-cards-blank\",\r\n };\r\n }\r\n case \"wfrp4e\": {\r\n return {\r\n value: combatant?.initiative,\r\n icon: \"far fa-dice-d10\",\r\n rollIcon: \"far fa-dice-d10\",\r\n };\r\n }\r\n case \"alienrpg\": {\r\n return {\r\n value: combatant?.initiative,\r\n icon: \"far fa-cards-blank\",\r\n rollIcon: \"fa-solid fa-cards-blank\",\r\n };\r\n }\r\n case \"exaltedthird\": {\r\n return {\r\n value: combatant?.initiative,\r\n icon: \"far fa-dice-d10\",\r\n rollIcon: \"far fa-dice-d10\",\r\n };\r\n }\r\n case \"exaltedessence\": {\r\n return {\r\n value: combatant?.initiative,\r\n icon: \"far fa-dice-d10\",\r\n rollIcon: \"far fa-dice-d10\",\r\n };\r\n }\r\n case \"lancer\":\r\n return (\r\n game.lancer.combatTrackerDock?.getInitiativeDisplay(combatant) ?? {\r\n value: combatant?.initiative,\r\n icon: \"fas fa-dice-d20\",\r\n rollIcon: \"fas fa-dice-d20\",\r\n }\r\n );\r\n case \"dnd4e\":\r\n return {\r\n\t\t\t\tvalue: combatant?.initiative ? parseInt(combatant.initiative).toString() : null,\r\n\t\t\t\ticon: \"fas fa-dice-d20\",\r\n\t\t\t\trollIcon: \"fas fa-dice-d20\",\r\n\t\t\t};\t\r\n default:\r\n return {\r\n value: combatant?.initiative,\r\n icon: \"far fa-dice-d20\",\r\n rollIcon: \"far fa-dice-d20\",\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves system icons for the given actor based on the game system.\r\n * These icons can be shown both at the bottom of the tooltip and\r\n * in the portrait under the tracked resource. If a callback is provided, it will be called on click.\r\n *\r\n * Example Icon Object:\r\n *\r\n * {\r\n * icon: \"fas fa-times\",\r\n * color: \"#e16de1\",\r\n * enabled: true,\r\n * visible: true, // If not provided, defaults to combattant permissions.\r\n * callback: (event, combatant, iconIndex, iconId) => { },\r\n * id: \"my-button\",\r\n * fontSize: \"1rem\",\r\n * }\r\n *\r\n * @param {Object} actor - The actor object.\r\n * @returns {Array} An array of system icons with their respective properties.\r\n */\r\n\r\nexport function getSystemIcons(combatant) {\r\n switch (game.system.id) {\r\n case \"dnd5e\": {\r\n if (game.modules.get(\"midi-qol\")?.active && combatant.actor) {\r\n const getMidiFlag = (actionType) => {\r\n const flag = combatant.actor.getFlag(\"midi-qol\", \"actions\") ?? {};\r\n return flag[actionType] ?? false;\r\n };\r\n const toggleMidiFlag = (actionType) => {\r\n const flag = combatant.actor.getFlag(\"midi-qol\", \"actions\") ?? {};\r\n flag[actionType] = !(flag[actionType] ?? false);\r\n combatant.actor.setFlag(\"midi-qol\", \"actions\", flag);\r\n };\r\n return [\r\n {\r\n icon: \"fas fa-circle\",\r\n color: getMidiFlag(\"action\") ? \"#888888\" : \"green\",\r\n enabled: true,\r\n callback: combatant.isOwner ? () => toggleMidiFlag(\"action\") : null,\r\n },\r\n {\r\n icon: \"fas fa-triangle\",\r\n color: getMidiFlag(\"bonus\") ? \"#888888\" : \"#ff9f4c\",\r\n enabled: true,\r\n callback: combatant.isOwner ? () => toggleMidiFlag(\"bonus\") : null,\r\n },\r\n {\r\n icon: \"fas fa-sparkle\",\r\n color: getMidiFlag(\"reaction\") ? \"#888888\" : \"#e16de1\",\r\n enabled: true,\r\n callback: combatant.isOwner ? () => toggleMidiFlag(\"reaction\") : null,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n icon: \"fas fa-circle\",\r\n color: combatant.getFlag(MODULE_ID, \"action\") ?? true ? \"green\" : \"#888888\",\r\n enabled: true,\r\n callback: combatant.isOwner\r\n ? (event, combatant, iconIndex, iconId) => {\r\n combatant.setFlag(MODULE_ID, \"action\", !(combatant.getFlag(MODULE_ID, \"action\") ?? true));\r\n }\r\n : null,\r\n },\r\n {\r\n icon: \"fas fa-triangle\",\r\n color: combatant.getFlag(MODULE_ID, \"bonus\") ?? true ? \"#ff9f4c\" : \"#888888\",\r\n enabled: true,\r\n callback: combatant.isOwner\r\n ? (event, combatant, iconIndex, iconId) => {\r\n combatant.setFlag(MODULE_ID, \"bonus\", !(combatant.getFlag(MODULE_ID, \"bonus\") ?? true));\r\n }\r\n : null,\r\n },\r\n {\r\n icon: \"fas fa-sparkle\",\r\n color: combatant.getFlag(MODULE_ID, \"reaction\") ?? true ? \"#e16de1\" : \"#888888\",\r\n enabled: true,\r\n callback: combatant.isOwner\r\n ? (event, combatant, iconIndex, iconId) => {\r\n combatant.setFlag(MODULE_ID, \"reaction\", !(combatant.getFlag(MODULE_ID, \"reaction\") ?? true));\r\n }\r\n : null,\r\n },\r\n ];\r\n }\r\n case \"crucible\": {\r\n const systemData = combatant.actor?.system;\r\n const alwaysShowActions = getSystemSetting(\"alwaysShowActions\") || undefined;\r\n const actions = {\r\n value: systemData.resources.action.value,\r\n max: systemData.resources.action.max,\r\n };\r\n const focus = {\r\n value: systemData.resources.focus.value,\r\n max: systemData.resources.focus.max,\r\n };\r\n const systemIcons = [];\r\n for (let i = 0; i < actions.max; i++) {\r\n systemIcons.push({\r\n icon: \"fas fa-square\",\r\n color: \"#ff6400\",\r\n enabled: actions.value > 0,\r\n visible: alwaysShowActions,\r\n });\r\n actions.value--;\r\n }\r\n for (let i = 0; i < focus.max; i++) {\r\n systemIcons.push({\r\n icon: \"fas fa-sparkle\",\r\n color: \"#00bbff\",\r\n enabled: focus.value > 0,\r\n });\r\n focus.value--;\r\n }\r\n return systemIcons;\r\n }\r\n case \"alienrpg\": {\r\n if (game.modules.get(\"alien-actions\")?.active && combatant.actor && combatant.actor.type !== \"spacecraft\") {\r\n return [\r\n {\r\n icon: \"fas fa-play\",\r\n fontSize: \"1rem\",\r\n enabled: true,\r\n callback: combatant.isOwner\r\n ? (event, combatant) => {\r\n const token = combatant.actor.getActiveTokens();\r\n token.forEach((t) => t.toggleEffect(CONFIG.statusEffects.find((eff) => eff.id === \"slowAction\")));\r\n }\r\n : null,\r\n },\r\n {\r\n icon: \"fas fa-forward\",\r\n fontSize: \"1rem\",\r\n enabled: true,\r\n callback: combatant.isOwner\r\n ? (event, combatant) => {\r\n const token = combatant.actor.getActiveTokens();\r\n token.forEach((t) => t.toggleEffect(CONFIG.statusEffects.find((eff) => eff.id === \"fastAction\")));\r\n }\r\n : null,\r\n },\r\n ];\r\n }\r\n }\r\n case \"lancer\":\r\n return game.lancer.combatTrackerDock?.getSystemIcons(combatant) ?? [];\r\n default: {\r\n return [];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Register settings for specific game systems.\r\n * This function is called once on startup.\r\n * When you need to get the setting value, use `getSystemSetting(key) helper`.\r\n */\r\n\r\nexport function registerSystemSettings() {\r\n switch (game.system.id) {\r\n case \"crucible\":\r\n registerSystemSetting(\"alwaysShowActions\", {\r\n scope: \"world\",\r\n config: true,\r\n type: Boolean,\r\n default: true,\r\n onChange: () => ui.combatDock?.refresh(),\r\n });\r\n break;\r\n default:\r\n break;\r\n }\r\n}\r\n","import { AttributesConfig } from \"./app/AttributesConfig.js\";\nimport {registerSystemSettings} from \"./systems.js\";\nimport { MODULE_ID } from \"./main.js\";\n\nexport function registerSettings() {\n game.settings.register(MODULE_ID, \"attributes\", {\n scope: \"world\",\n config: false,\n type: Array,\n default: CONFIG.combatTrackerDock.defaultAttributesConfig()[game.system.id] ?? [],\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"events\", {\n scope: \"world\",\n config: false,\n type: Array,\n default: [],\n });\n\n game.settings.registerMenu(MODULE_ID, \"attributesMenu\", {\n name: game.i18n.localize(`${MODULE_ID}.settings.attributesMenu.name`),\n label: game.i18n.localize(`${MODULE_ID}.settings.attributesMenu.label`),\n hint: game.i18n.localize(`${MODULE_ID}.settings.attributesMenu.hint`),\n icon: \"fas fa-cogs\",\n scope: \"world\",\n restricted: true,\n type: AttributesConfig,\n });\n\n game.settings.register(MODULE_ID, \"direction\", {\n name: \"combat-tracker-dock.settings.direction.name\",\n hint: \"combat-tracker-dock.settings.direction.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n rowDocked: \"combat-tracker-dock.settings.direction.choices.rowDocked\",\n rowFloat: \"combat-tracker-dock.settings.direction.choices.rowFloat\",\n columnFloat: \"combat-tracker-dock.settings.direction.choices.columnFloat\",\n },\n default: \"rowDocked\",\n onChange: async () => {\n await ui.combatDock?.restart();\n setDirection();\n setOverflowStyle();\n setFlex();\n ui.combatDock?.autosize();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"portraitSize\", {\n name: \"combat-tracker-dock.settings.portraitSize.name\",\n hint: \"combat-tracker-dock.settings.portraitSize.hint\",\n scope: \"client\",\n config: true,\n type: String,\n choices: {\n \"30px\": \"combat-tracker-dock.settings.portraitSize.choices.30px\",\n \"50px\": \"combat-tracker-dock.settings.portraitSize.choices.50px\",\n \"70px\": \"combat-tracker-dock.settings.portraitSize.choices.70px\",\n \"90px\": \"combat-tracker-dock.settings.portraitSize.choices.90px\",\n \"110px\": \"combat-tracker-dock.settings.portraitSize.choices.110px\",\n \"150px\": \"combat-tracker-dock.settings.portraitSize.choices.150px\",\n \"180px\": \"combat-tracker-dock.settings.portraitSize.choices.180px\",\n },\n default: \"70px\",\n onChange: () => {\n setPortraitSize();\n ui.combatDock?.autosize();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"lessButtons\", {\n name: \"combat-tracker-dock.settings.lessButtons.name\",\n hint: \"combat-tracker-dock.settings.lessButtons.hint\",\n scope: \"client\",\n config: true,\n type: Boolean,\n default: false,\n onChange: () => ui.combatDock?.render(),\n });\n\n game.settings.register(MODULE_ID, \"overflowStyle\", {\n name: \"combat-tracker-dock.settings.overflowStyle.name\",\n hint: \"combat-tracker-dock.settings.overflowStyle.hint\",\n scope: \"client\",\n config: true,\n type: String,\n choices: {\n autofit: \"combat-tracker-dock.settings.overflowStyle.choices.autofit\",\n hidden: \"combat-tracker-dock.settings.overflowStyle.choices.hidden\",\n scroll: \"combat-tracker-dock.settings.overflowStyle.choices.scroll\",\n },\n default: \"autofit\",\n onChange: () => {\n setOverflowStyle();\n ui.combatDock?.autosize();\n ui.combatDock?.refresh();\n ui.combatDock?.render();\n },\n });\n\n game.settings.register(MODULE_ID, \"carouselStyle\", {\n name: \"combat-tracker-dock.settings.carouselStyle.name\",\n hint: \"combat-tracker-dock.settings.carouselStyle.hint\",\n scope: \"world\",\n config: true,\n type: Number,\n choices: {\n 0: \"combat-tracker-dock.settings.carouselStyle.choices.centerCarousel\",\n 1: \"combat-tracker-dock.settings.carouselStyle.choices.leftCarousel\",\n 2: \"combat-tracker-dock.settings.carouselStyle.choices.basic\",\n },\n default: 0,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"alignment\", {\n name: \"combat-tracker-dock.settings.alignment.name\",\n hint: \"combat-tracker-dock.settings.alignment.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n left: \"combat-tracker-dock.settings.alignment.choices.left\",\n center: \"combat-tracker-dock.settings.alignment.choices.center\",\n right: \"combat-tracker-dock.settings.alignment.choices.right\",\n },\n default: \"center\",\n onChange: () => {\n setAlignment();\n setFlex();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"floatingSize\", {\n name: \"combat-tracker-dock.settings.floatingSize.name\",\n hint: \"combat-tracker-dock.settings.floatingSize.hint\",\n scope: \"world\",\n config: true,\n type: Number,\n default: 60,\n range: {\n min: 30,\n max: 100,\n step: 1,\n },\n onChange: () => {\n setFloatingSize();\n ui.combatDock?.refresh();\n }\n });\n\n game.settings.register(MODULE_ID, \"portraitAspect\", {\n name: \"combat-tracker-dock.settings.portraitAspect.name\",\n hint: \"combat-tracker-dock.settings.portraitAspect.hint\",\n scope: \"world\",\n config: true,\n type: Number,\n choices: {\n 1: \"combat-tracker-dock.settings.portraitAspect.choices.square\",\n 1.5: \"combat-tracker-dock.settings.portraitAspect.choices.portrait\",\n 2: \"combat-tracker-dock.settings.portraitAspect.choices.long\",\n },\n default: 1.5,\n onChange: () => {\n setPortraitAspect();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"roundness\", {\n name: \"combat-tracker-dock.settings.roundness.name\",\n hint: \"combat-tracker-dock.settings.roundness.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n \"0%\": \"combat-tracker-dock.settings.roundness.choices.sharp\",\n \"10%\": \"combat-tracker-dock.settings.roundness.choices.soft\",\n \"20%\": \"combat-tracker-dock.settings.roundness.choices.round\",\n },\n default: \"0%\",\n onChange: () => {\n setRoundness();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"attributeColor\", {\n name: \"combat-tracker-dock.settings.attributeColor.name\",\n hint: \"combat-tracker-dock.settings.attributeColor.hint\",\n scope: \"world\",\n config: true,\n type: new foundry.data.fields.ColorField(),\n default: \"#41AA7D\",\n onChange: () => {\n setAttributeColor();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"attributeColor2\", {\n name: \"combat-tracker-dock.settings.attributeColor2.name\",\n hint: \"combat-tracker-dock.settings.attributeColor2.hint\",\n scope: \"world\",\n config: true,\n type: new foundry.data.fields.ColorField(),\n default: \"#ffcd00\",\n onChange: () => {\n setAttributeColor();\n ui.combatDock?.refresh();\n },\n });\n //\n game.settings.register(MODULE_ID, \"attributeColorPortrait\", {\n name: \"combat-tracker-dock.settings.attributeColorPortrait.name\",\n hint: \"combat-tracker-dock.settings.attributeColorPortrait.hint\",\n scope: \"world\",\n config: true,\n type: new foundry.data.fields.ColorField(),\n default: \"#e62121\",\n onChange: () => {\n setAttributeColor();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"barsPlacement\", {\n name: \"combat-tracker-dock.settings.barsPlacement.name\",\n hint: \"combat-tracker-dock.settings.barsPlacement.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n left: \"combat-tracker-dock.settings.barsPlacement.choices.left\",\n right: \"combat-tracker-dock.settings.barsPlacement.choices.right\",\n twinned: \"combat-tracker-dock.settings.barsPlacement.choices.twinned\",\n },\n default: \"left\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"attributeVisibility\", {\n name: \"combat-tracker-dock.settings.attributeVisibility.name\",\n hint: \"combat-tracker-dock.settings.attributeVisibility.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n text: \"combat-tracker-dock.settings.attributeVisibility.choices.text\",\n bars: \"combat-tracker-dock.settings.attributeVisibility.choices.bars\",\n both: \"combat-tracker-dock.settings.attributeVisibility.choices.both\",\n },\n default: \"both\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"displayDescriptions\", {\n name: \"combat-tracker-dock.settings.displayDescriptions.name\",\n hint: \"combat-tracker-dock.settings.displayDescriptions.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n \"none\": \"combat-tracker-dock.settings.displayDescriptions.choices.none\",\n \"owner\": \"combat-tracker-dock.settings.displayDescriptions.choices.owner\",\n \"all\": \"combat-tracker-dock.settings.displayDescriptions.choices.all\",\n },\n default: \"owner\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"hideDefeated\", {\n name: \"combat-tracker-dock.settings.hideDefeated.name\",\n hint: \"combat-tracker-dock.settings.hideDefeated.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: false,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"showDispositionColor\", {\n name: \"combat-tracker-dock.settings.showDispositionColor.name\",\n hint: \"combat-tracker-dock.settings.showDispositionColor.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: true,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"showInitiativeOnPortrait\", {\n name: \"combat-tracker-dock.settings.showInitiativeOnPortrait.name\",\n hint: \"combat-tracker-dock.settings.showInitiativeOnPortrait.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: true,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"portraitImage\", {\n name: \"combat-tracker-dock.settings.portraitImage.name\",\n hint: \"combat-tracker-dock.settings.portraitImage.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n actor: \"combat-tracker-dock.settings.portraitImage.choices.actor\",\n token: \"combat-tracker-dock.settings.portraitImage.choices.token\",\n },\n default: \"actor\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"displayName\", {\n name: \"combat-tracker-dock.settings.displayName.name\",\n hint: \"combat-tracker-dock.settings.displayName.hint\",\n scope: \"world\",\n config: true,\n type: String,\n choices: {\n default: \"combat-tracker-dock.settings.displayName.choices.default\",\n token: \"combat-tracker-dock.settings.displayName.choices.token\",\n owner: \"combat-tracker-dock.settings.displayName.choices.owner\",\n },\n default: \"default\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"playerPlayerPermission\", {\n name: \"combat-tracker-dock.settings.playerPlayerPermission.name\",\n hint: \"combat-tracker-dock.settings.playerPlayerPermission.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: false,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"hideFirstRound\", {\n name: \"combat-tracker-dock.settings.hideFirstRound.name\",\n hint: \"combat-tracker-dock.settings.hideFirstRound.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: false,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"hideEnemyInitiative\", {\n name: \"combat-tracker-dock.settings.hideEnemyInitiative.name\",\n hint: \"combat-tracker-dock.settings.hideEnemyInitiative.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: false,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"portraitImageBorder\", {\n name: \"combat-tracker-dock.settings.portraitImageBorder.name\",\n hint: \"combat-tracker-dock.settings.portraitImageBorder.hint\",\n scope: \"world\",\n config: true,\n type: new foundry.data.fields.FilePathField({categories: [\"IMAGE\"]}),\n default: \"modules/combat-tracker-dock/assets/border.png\",\n onChange: function () {\n setPortraitImageBorder();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"portraitImageBackground\", {\n name: \"combat-tracker-dock.settings.portraitImageBackground.name\",\n hint: \"combat-tracker-dock.settings.portraitImageBackground.hint\",\n scope: \"world\",\n config: true,\n type: new foundry.data.fields.FilePathField({categories: [\"IMAGE\"]}),\n default: \"ui/denim075.png\",\n onChange: function () {\n setPortraitImageBackground();\n ui.combatDock?.refresh();\n },\n });\n\n game.settings.register(MODULE_ID, \"showSystemIcons\", {\n name: \"combat-tracker-dock.settings.showSystemIcons.name\",\n hint: \"combat-tracker-dock.settings.showSystemIcons.hint\",\n scope: \"world\",\n config: true,\n type: Number,\n choices: {\n 0: \"combat-tracker-dock.settings.showSystemIcons.choices.none\",\n 1: \"combat-tracker-dock.settings.showSystemIcons.choices.tooltip\",\n 2: \"combat-tracker-dock.settings.showSystemIcons.choices.resource\",\n 3: \"combat-tracker-dock.settings.showSystemIcons.choices.both\",\n },\n default: 1,\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"hideConflictingUIs\", {\n name: \"combat-tracker-dock.settings.hideConflictingUIs.name\",\n hint: \"combat-tracker-dock.settings.hideConflictingUIs.hint\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: true,\n onChange: () => setHideConflictingUIs(),\n });\n\n registerSystemSettings();\n\n setAllSettings();\n\n game.settings.register(MODULE_ID, \"resource\", {\n name: \"combat-tracker-dock.settings.resource.name\",\n hint: \"combat-tracker-dock.settings.resource.hint\",\n scope: \"world\",\n config: true,\n type: String,\n default: \"\",\n onChange: () => ui.combatDock?.refresh(),\n });\n\n game.settings.register(MODULE_ID, \"portraitResource\", {\n name: \"combat-tracker-dock.settings.portraitResource.name\",\n hint: \"combat-tracker-dock.settings.portraitResource.hint\",\n scope: \"world\",\n config: true,\n type: String,\n default: \"\",\n onChange: () => ui.combatDock?.refresh(),\n });\n}\n\nfunction setAllSettings() {\n setDirection();\n setOverflowStyle();\n setAlignment();\n setFlex();\n setPortraitAspect();\n setRoundness();\n setAttributeColor();\n setPortraitImageBorder();\n setPortraitImageBackground();\n setHideConflictingUIs();\n setFloatingSize();\n}\n\nfunction setFloatingSize() {\n const floatingSize = game.settings.get(MODULE_ID, \"floatingSize\");\n document.documentElement.style.setProperty(\"--carousel-floating-size\", floatingSize + \"%\");\n}\n\nfunction setPortraitSize() {\n const portraitSize = game.settings.get(MODULE_ID, \"portraitSize\");\n document.documentElement.style.setProperty(\"--combatant-portrait-size\", portraitSize);\n}\n\nfunction setPortraitAspect() {\n const portraitAspect = game.settings.get(MODULE_ID, \"portraitAspect\");\n document.documentElement.style.setProperty(\"--combatant-portrait-aspect\", portraitAspect);\n}\n\nfunction setAlignment() {\n const alignment = game.settings.get(MODULE_ID, \"alignment\");\n document.documentElement.style.setProperty(\"--carousel-alignment\", alignment);\n ui.combatDock?.setControlsOrder();\n}\n\nfunction setPortraitImageBorder() {\n let portraitImageBorder = game.settings.get(MODULE_ID, \"portraitImageBorder\");\n document.documentElement.style.setProperty(\"--combatant-portrait-image-border\", `url('${portraitImageBorder}')`);\n}\n\nfunction setPortraitImageBackground() {\n let portraitImageBackground = game.settings.get(MODULE_ID, \"portraitImageBackground\");\n document.documentElement.style.setProperty(\"--combatant-portrait-image-background\", `url('${portraitImageBackground}')`);\n}\n\nfunction setHideConflictingUIs() {\n const hideConflictingUIs = game.settings.get(MODULE_ID, \"hideConflictingUIs\");\n document.querySelector(\"#ui-top\")?.classList.toggle(\"ctd-hide-conflicting-uis\", hideConflictingUIs);\n}\n\nfunction setRoundness() {\n const roundness = game.settings.get(MODULE_ID, \"roundness\");\n document.documentElement.style.setProperty(\"--combatant-portrait-border-radius\", roundness);\n}\n\nfunction setAttributeColor() {\n const attributeColor = game.settings.get(MODULE_ID, \"attributeColor\") || \"#41AA7D\";\n document.documentElement.style.setProperty(\"--attribute-bar-primary-color\", attributeColor);\n\n const color = Color.from(attributeColor);\n const darkened = color.mix(Color.from(\"#000\"), 0.5);\n\n document.documentElement.style.setProperty(\"--attribute-bar-secondary-color\", darkened.toString());\n\n const attributeColor2 = game.settings.get(MODULE_ID, \"attributeColor2\") || \"#ffcd00\";\n document.documentElement.style.setProperty(\"--attribute-bar-primary-color2\", attributeColor2);\n\n const color2 = Color.from(attributeColor2);\n const darkened2 = color2.mix(Color.from(\"#000\"), 0.5);\n\n document.documentElement.style.setProperty(\"--attribute-bar-secondary-color2\", darkened2.toString());\n\n const attributeColorPortrait = game.settings.get(MODULE_ID, \"attributeColorPortrait\") || \"#e62121\";\n document.documentElement.style.setProperty(\"--attribute-bar-portrait-color\", attributeColorPortrait);\n\n}\n\nfunction setOverflowStyle() {\n let overflowStyle = game.settings.get(MODULE_ID, \"overflowStyle\");\n if (overflowStyle === \"autofit\") overflowStyle = \"hidden\";\n if (overflowStyle === \"scroll\") {\n const direction = game.settings.get(MODULE_ID, \"direction\");\n if (direction !== \"columnFloat\") overflowStyle = \"scroll hidden\";\n else overflowStyle = \"hidden scroll\";\n }\n document.documentElement.style.setProperty(\"--carousel-overflow\", overflowStyle);\n}\n\nfunction setDirection() {\n let direction = game.settings.get(MODULE_ID, \"direction\");\n if(!(direction in game.settings.settings.get(`${MODULE_ID}.direction`).choices)) {\n direction = direction.includes(\"column\") ? \"columnFloat\" : \"rowDocked\"; \n game.settings.set(MODULE_ID, \"direction\", direction);\n }\n document.documentElement.style.setProperty(\"--carousel-direction\", direction === \"columnFloat\" ? \"column\" : \"row\");\n document.documentElement.style.setProperty(\"--combatant-portrait-margin\", direction !== \"columnFloat\" ? \"0 calc(var(--combatant-portrait-size) * 0.1)\" : \"0\");\n ui.combatDock?.setControlsOrder();\n}\n\nfunction setFlex() {\n const alignment = game.settings.get(MODULE_ID, \"alignment\");\n const direction = game.settings.get(MODULE_ID, \"direction\");\n let flexD = \"flex-start\";\n if (direction == \"columnFloat\" && alignment == \"right\") flexD = \"flex-end\";\n if (direction == \"columnFloat\" && alignment == \"center\") flexD = \"center\";\n\n document.documentElement.style.setProperty(\"--carousel-align-items\", flexD);\n}\n\nfunction l(key) {\n return game.i18n.localize(key);\n}\n\nexport function registerSystemSetting(key, data) {\n const rootKey = MODULE_ID + \".settings.systems.\" + game.system.id;\n game.settings.register(MODULE_ID, game.system.id + \".\" + key, {\n ...data,\n name: game.system.title + \" \" + l(MODULE_ID + \".settings.integration\") + \": \" + l(rootKey+\".\"+key+\".name\"),\n hint: l(rootKey+\".\"+key+\".hint\"),\n });\n}\n\nexport function getSystemSetting(key) {\n return game.settings.get(MODULE_ID, game.system.id + \".\" + key);\n}\n","import { MODULE_ID } from \"../main.js\";\r\nimport { HandlebarsApplication, mergeClone } from \"../lib/utils.js\";\r\n\r\nexport class AddEvent extends HandlebarsApplication {\r\n constructor(combat) {\r\n super();\r\n this.combat = combat;\r\n }\r\n\r\n static get defaultOptions() {\r\n return foundry.utils.mergeObject(super.defaultOptions, {\r\n id: \"combat-dock-add-event\",\r\n title: `combat-tracker-dock.add-event.title`,\r\n template: `modules/combat-tracker-dock/templates/add-event.hbs`,\r\n width: 400,\r\n height: \"auto\",\r\n closeOnSubmit: true,\r\n });\r\n }\r\n\r\n static get DEFAULT_OPTIONS() {\r\n return {\r\n tag: \"form\",\r\n id: \"combat-dock-add-event\",\r\n window: {\r\n title: `combat-tracker-dock.add-event.title`,\r\n },\r\n actions: {},\r\n form: {\r\n handler: this.#onSubmit,\r\n closeOnSubmit: true,\r\n },\r\n position: {\r\n width: 400,\r\n },\r\n };\r\n }\r\n\r\n static get PARTS() {\r\n return mergeClone(super.PARTS, {\r\n content: {\r\n classes: [\"standard-form\"],\r\n },\r\n footer: {\r\n template: \"templates/generic/form-footer.hbs\",\r\n },\r\n });\r\n }\r\n\r\n _prepareContext(options) {\r\n const submitButton = {\r\n type: \"submit\",\r\n action: \"submit\",\r\n icon: \"fas fa-plus\",\r\n label: \"combat-tracker-dock.add-event.title\",\r\n };\r\n const recentEvents = game.settings.get(MODULE_ID, \"events\");\r\n return { recentEvents, buttons: [submitButton] };\r\n }\r\n\r\n _onRender(context, options) {\r\n super._onRender(context, options);\r\n const html = this.element;\r\n html.querySelectorAll(\".cct-event\").forEach((eventButton) => {\r\n eventButton.addEventListener(\"click\", (e) => {\r\n const eventIndex = e.currentTarget.dataset.index;\r\n const recentEvents = game.settings.get(MODULE_ID, \"events\");\r\n const event = recentEvents[eventIndex];\r\n html.querySelector(\"[name='name']\").value = event.name;\r\n html.querySelector(\"[name='img']\").value = event.img;\r\n html.querySelector(\"[name='initiative']\").value = event.initiative;\r\n html.querySelector(\"[name='duration']\").value = event.duration;\r\n html.querySelector(\"[name='hidden']\").checked = event.hidden;\r\n });\r\n });\r\n }\r\n\r\n static async #onSubmit(event) {\r\n const form = this.element;\r\n const formData = new foundry.applications.ux.FormDataExtended(form).object;\r\n if (!formData.name || !formData.img || (!Number.isNumeric(formData.initiative) && !formData.initiative)) return ui.notifications.error(game.i18n.localize(\"combat-tracker-dock.add-event.error\"));\r\n this.combat.createEmbeddedDocuments(\"Combatant\", [\r\n {\r\n name: formData.name,\r\n img: formData.img,\r\n initiative: formData.initiative,\r\n hidden: formData.hidden || false,\r\n \"flags.combat-tracker-dock\": {\r\n event: true,\r\n duration: formData.duration || false,\r\n roundCreated: this.combat.round,\r\n },\r\n },\r\n ]);\r\n let recentEvents = game.settings.get(MODULE_ID, \"events\");\r\n const newRecentEvent = { name: formData.name, img: formData.img, initiative: formData.initiative, duration: formData.duration, hidden: formData.hidden };\r\n recentEvents = recentEvents.filter((event) => event.name !== newRecentEvent.name && event.img !== newRecentEvent.img);\r\n recentEvents.unshift(newRecentEvent);\r\n recentEvents = recentEvents.slice(0, 10);\r\n await game.settings.set(MODULE_ID, \"events\", recentEvents);\r\n }\r\n}\r\n","import { MODULE_ID } from \"../main.js\";\r\nimport { AddEvent } from \"./AddEvent.js\";\r\nimport { HandlebarsApplication, mergeClone, mergeObject } from \"../lib/utils.js\";\r\n\r\nexport class CombatDock extends HandlebarsApplication {\r\n constructor(combat) {\r\n super();\r\n ui.combatDock?.close();\r\n ui.combatDock = this;\r\n this.portraits = [];\r\n this.combat = combat ?? game.combat;\r\n this.hooks = [];\r\n this._playAnimation = true;\r\n this._currentPortraitSize = {\r\n max: parseInt(game.settings.get(MODULE_ID, \"portraitSize\")),\r\n aspect: game.settings.get(MODULE_ID, \"portraitAspect\"),\r\n };\r\n this.setHooks();\r\n window.addEventListener(\"resize\", this.autosize.bind(this));\r\n this._combatTrackerRefreshed = false;\r\n }\r\n\r\n static get DEFAULT_OPTIONS() {\r\n let options = mergeClone(super.DEFAULT_OPTIONS, {\r\n classes: [\"hidden\"],\r\n window: {\r\n title: \"\",\r\n icon: \"fas fa-arrows-up-down-left-right\",\r\n frame: false,\r\n positioned: false,\r\n minimizable: false,\r\n resizable: false,\r\n savePosition: true,\r\n },\r\n position: {\r\n width: \"auto\",\r\n height: \"auto\"\r\n }\r\n });\r\n if (game.settings.get(MODULE_ID, \"direction\") !== \"rowDocked\") {\r\n mergeObject(options, this.WINDOWED_DEFAULT_OPTIONS);\r\n }\r\n return options;\r\n }\r\n\r\n static get WINDOWED_DEFAULT_OPTIONS() {\r\n return {\r\n window: {\r\n frame: true,\r\n positioned: true,\r\n // savePosition: true,\r\n preventEscapeClose: true\r\n }\r\n }\r\n }\r\n\r\n get sortedCombatants() {\r\n const sorted = Array.from(this.combat.combatants.contents.sort(this.combat._sortCombatants));\r\n if (game.settings.get(MODULE_ID, \"hideDefeated\")) {\r\n return sorted.filter(c => !c.isDefeated);\r\n }\r\n return sorted;\r\n }\r\n\r\n get trueCarousel() {\r\n return game.settings.get(MODULE_ID, \"carouselStyle\") < 2;\r\n }\r\n\r\n get leftAligned() {\r\n return game.settings.get(MODULE_ID, \"carouselStyle\") == 1;\r\n }\r\n\r\n get autoFit() {\r\n return game.settings.get(MODULE_ID, \"overflowStyle\") == \"autofit\";\r\n }\r\n\r\n get isVertical() {\r\n return game.settings.get(MODULE_ID, \"direction\") == \"columnFloat\";\r\n }\r\n\r\n get isDocked() {\r\n return game.settings.get(MODULE_ID, \"direction\") == \"rowDocked\";\r\n }\r\n\r\n setHooks() {\r\n this.hooks = [\r\n {\r\n hook: \"renderCombatTracker\",\r\n fn: this._onRenderCombatTracker.bind(this),\r\n },\r\n {\r\n hook: \"createCombatant\",\r\n fn: this.setupCombatants.bind(this),\r\n },\r\n {\r\n hook: \"deleteCombatant\",\r\n fn: this.setupCombatants.bind(this),\r\n },\r\n {\r\n hook: \"updateCombatant\",\r\n fn: this.updateCombatant.bind(this),\r\n },\r\n {\r\n hook: \"updateCombat\",\r\n fn: this._onCombatTurn.bind(this),\r\n },\r\n {\r\n hook: \"deleteCombat\",\r\n fn: this._onDeleteCombat.bind(this),\r\n },\r\n {\r\n hook: \"combatStart\",\r\n fn: this._onCombatStart.bind(this),\r\n },\r\n {\r\n hook: \"hoverToken\",\r\n fn: this._onHoverToken.bind(this),\r\n },\r\n ];\r\n for (let hook of this.hooks) {\r\n hook.id = Hooks.on(hook.hook, hook.fn);\r\n }\r\n }\r\n\r\n removeHooks() {\r\n for (let hook of this.hooks) {\r\n Hooks.off(hook.hook, hook.id);\r\n }\r\n }\r\n\r\n _prepareContext(options) {\r\n const scroll = game.settings.get(MODULE_ID, \"overflowStyle\") === \"scroll\";\r\n const lessButtons = game.settings.get(MODULE_ID, \"lessButtons\");\r\n const reverseHeaderPosition = !this.isDocked && !this.isVertical;\r\n return {\r\n isGM: game.user.isGM,\r\n scroll,\r\n lessButtons,\r\n reverseHeaderPosition\r\n };\r\n }\r\n\r\n setupCombatants() {\r\n this.portraits = [];\r\n this.sortedCombatants.forEach((combatant) => this.portraits.push(new CONFIG.combatTrackerDock.CombatantPortrait(combatant)));\r\n const combatantsContainer = this.element.querySelector(\"#combatants\");\r\n combatantsContainer.innerHTML = \"\";\r\n this.portraits.forEach((p) => combatantsContainer.appendChild(p.element));\r\n const isEven = this.portraits.length % 2 === 0;\r\n this.element.classList.toggle(\"even\", isEven);\r\n this.setupSeparator();\r\n this.updateOrder();\r\n this.autosize();\r\n if (!this._combatTrackerRefreshed) {\r\n this._combatTrackerRefreshed = true;\r\n ui.combat.render(true);\r\n }\r\n if (this._playAnimation && this.sortedCombatants.length > 0) {\r\n this._playAnimation = false;\r\n const promises = this.portraits.map((p) => p.ready);\r\n this._promises = promises;\r\n Promise.all(promises).then(() => {\r\n this.playIntroAnimation();\r\n });\r\n }\r\n }\r\n\r\n setupSeparator(){\r\n const combatantsContainer = this.element.querySelector(\"#combatants\");\r\n combatantsContainer.querySelectorAll(\".separator\").forEach(s => s.remove());\r\n const turn = this.combat.turn + 1;\r\n const combatantsCount = this.sortedCombatants.length;\r\n const afterHalf = turn > Math.floor(combatantsCount / 2) || this.leftAligned ? 1 : 0;\r\n const separator = document.createElement(\"div\");\r\n separator.classList.add(\"separator\");\r\n const line = document.createElement(\"div\");\r\n line.classList.add(\"line\");\r\n separator.appendChild(line);\r\n const round = document.createElement(\"div\");\r\n round.classList.add(\"round\", this.isVertical ? \"flexrow\" : \"flexcol\");\r\n round.innerHTML = this.isVertical ? `${this.combat.round + afterHalf}` : `${this.combat.round + afterHalf}`;\r\n separator.appendChild(round);\r\n combatantsContainer.appendChild(separator);\r\n }\r\n\r\n playIntroAnimation(easing = \"cubic-bezier(0.22, 1, 0.36, 1)\") {\r\n Hooks.callAll(\"combatDock:playIntroAnimation\", this);\r\n\r\n const duration = CONFIG.combatTrackerDock.INTRO_ANIMATION_DURATION;\r\n const delayMultiplier = CONFIG.combatTrackerDock.INTRO_ANIMATION_DELAY;\r\n\r\n const isVertical = this.isVertical;\r\n const alignment = game.settings.get(MODULE_ID, \"alignment\");\r\n\r\n const transformAxis = isVertical ? \"X\" : \"Y\";\r\n const transformDirection = isVertical && alignment == \"right\" ? \"\" : \"-\";\r\n\r\n const playSlideInAnimation = (el, delay = 0) => {\r\n el.style.transform = `translate${transformAxis}(${transformDirection}150%)`;\r\n const anim = el.animate([{ transform: `translate${transformAxis}(${transformDirection}150%)` }, { transform: `translate${transformAxis}(0)` }], {\r\n duration: duration,\r\n easing: easing,\r\n //fill: \"forwards\",\r\n delay: delay,\r\n });\r\n\r\n anim.finished.then(() => {\r\n el.style.transform = \"\";\r\n Hooks.callAll(\"combatDock:playIntroAnimation:finished\", this, el);\r\n });\r\n };\r\n let totalAnimationTime = 0;\r\n Array.from(this.element.querySelector(\"#combatants\").children).forEach((el, index) => {\r\n const order = this.trueCarousel ? parseInt(el.style.order) / 100 : index;\r\n const delay = order * duration * delayMultiplier;\r\n totalAnimationTime = Math.max(totalAnimationTime, delay + duration);\r\n playSlideInAnimation(el, delay);\r\n });\r\n\r\n setTimeout(() => {\r\n if (isVertical) this.centerCurrentCombatant();\r\n }, totalAnimationTime + duration);\r\n\r\n setTimeout(() => {\r\n this.element.classList.remove(\"hidden\");\r\n if (!isVertical) this.centerCurrentCombatant();\r\n }, 10);\r\n }\r\n\r\n autosize(combatantRevived = false) {\r\n const max = parseInt(game.settings.get(MODULE_ID, \"portraitSize\"));\r\n const aspect = game.settings.get(MODULE_ID, \"portraitAspect\");\r\n this._currentPortraitSize = {\r\n max: max,\r\n aspect: aspect,\r\n };\r\n const verticalSize = max * aspect;\r\n if (!this.autoFit) return document.documentElement.style.setProperty(\"--combatant-portrait-size\", max + \"px\");\r\n\r\n const sizeModifier = game.settings.get(MODULE_ID, \"floatingSize\");\r\n const combatantCount = this.sortedCombatants.length + (combatantRevived ? 1 : 0);\r\n let maxSpace, portraitSize;\r\n if (this.isVertical) {\r\n maxSpace = window.innerHeight * sizeModifier / 100;\r\n } else if (this.isDocked) {\r\n maxSpace = document.getElementById(\"ui-top\").getBoundingClientRect().width * 0.9;\r\n } else {\r\n maxSpace = window.innerWidth * sizeModifier / 100;\r\n }\r\n portraitSize = this.isVertical ? Math.min(verticalSize, Math.floor(maxSpace / combatantCount)) / aspect : Math.min(max, Math.floor(maxSpace / combatantCount));\r\n\r\n document.documentElement.style.setProperty(\"--combatant-portrait-size\", portraitSize / (this.isVertical ? 1 : 1.2) + \"px\");\r\n }\r\n\r\n updateCombatant(combatant, updates = {}) {\r\n if (\"initiative\" in updates) {\r\n this.setupCombatants();\r\n return;\r\n }\r\n const portrait = this.portraits.find((p) => p.combatant === combatant);\r\n if (portrait) portrait.renderInner();\r\n const combatantRevived = updates.defeated === false;\r\n this.autosize(combatantRevived);\r\n }\r\n\r\n updateCombatants() {\r\n this.portraits.forEach((p) => p.renderInner());\r\n }\r\n\r\n updateOrder() {\r\n this.setupSeparator();\r\n const separator = this.element.querySelector(\".separator\");\r\n const isTrueCarousel = this.trueCarousel;\r\n separator.style.display = isTrueCarousel ? \"\" : \"none\";\r\n if (this.sortedCombatants.filter((c) => c?.visible)?.length === 0) {\r\n separator.style.display = \"none\";\r\n }\r\n separator.classList.remove(\"vertical\", \"horizontal\");\r\n separator.classList.add(this.isVertical ? \"vertical\" : \"horizontal\");\r\n\r\n const combatants = this.sortedCombatants;\r\n\r\n\r\n if (!this.trueCarousel) return this.portraits.forEach((p) => p.element.style.setProperty(\"order\", combatants.indexOf(p.combatant)));\r\n\r\n const isLeftAligned = this.leftAligned;\r\n\r\n //order combatants so that the current combatant is at the center\r\n const currentCombatant = this.combat.combatant;\r\n const currentCombatantIndex = combatants.findIndex((c) => c === currentCombatant) + combatants.length;\r\n const tempCombatantList = [...combatants, ...combatants, ...combatants];\r\n const halfLength = isLeftAligned ? combatants.length : Math.floor(combatants.length / 2);\r\n const orderedCombatants = tempCombatantList.slice(currentCombatantIndex - halfLength, currentCombatantIndex + halfLength + 1);\r\n\r\n const lastCombatant = this.sortedCombatants[this.sortedCombatants.length - 1];\r\n\r\n this.portraits.forEach((p) => {\r\n const combatant = orderedCombatants.find((c) => c === p.combatant);\r\n const index = orderedCombatants.findIndex((c) => c === combatant);\r\n p.element.style.setProperty(\"order\", index * 100);\r\n });\r\n\r\n //get last combatant's order\r\n const lastCombatantOrder = this.portraits.find((p) => p.combatant === lastCombatant)?.element?.style?.order ?? 999999;\r\n //set separator's order to last combatant's order + 1\r\n\r\n separator.style.setProperty(\"order\", parseInt(lastCombatantOrder) + 1);\r\n }\r\n\r\n updateStartEndButtons() {\r\n if(!this.element) return;\r\n const startButton = this.element.querySelector(`[data-action=\"start-combat\"]`);\r\n const endButton = this.element.querySelector(`[data-action=\"end-combat\"]`);\r\n startButton.style.display = this.combat.started ? \"none\" : \"\";\r\n endButton.style.display = this.combat.started ? \"\" : \"none\";\r\n }\r\n\r\n appendHtml(){\r\n if (this.isDocked) {\r\n return document.querySelector(\"#ui-top\").prepend(this.element);\r\n }\r\n }\r\n\r\n _onRender(context, options) {\r\n if (this._closed) return this.close();\r\n super._onRender(context, options);\r\n this.setupCombatants();\r\n this.appendHtml();\r\n this.element.querySelectorAll(\".buttons-container button\").forEach((i) => {\r\n i.addEventListener(\"click\", (e) => {\r\n const action = e.currentTarget.dataset.action;\r\n switch (action) {\r\n case \"previous-turn\":\r\n this.combat.previousTurn();\r\n break;\r\n case \"next-turn\":\r\n this.combat.nextTurn();\r\n break;\r\n case \"previous-round\":\r\n this.combat.previousRound();\r\n break;\r\n case \"next-round\":\r\n this.combat.nextRound();\r\n break;\r\n case \"end-combat\":\r\n this.combat.endCombat();\r\n break;\r\n case \"roll-all\":\r\n this.combat.rollAll({ event: e });\r\n break;\r\n case \"roll-npc\":\r\n this.combat.rollNPC({ event: e });\r\n break;\r\n case \"reset\":\r\n this.combat.resetAll();\r\n break;\r\n case \"configure\":\r\n new foundry.applications.apps.CombatTrackerConfig().render(true);\r\n break;\r\n case \"start-combat\":\r\n this.combat.startCombat();\r\n break;\r\n case \"add-event\":\r\n new AddEvent(this.combat).render(true);\r\n break;\r\n }\r\n });\r\n });\r\n this.autosize();\r\n this.setControlsOrder();\r\n new foundry.applications.ux.ContextMenu(\r\n this.element.querySelector(\"#combatants\"),\r\n \".combatant-portrait\",\r\n [\r\n {\r\n condition: game?.user?.isGM,\r\n name: `${MODULE_ID}.contextMenu.setAsCurrent`,\r\n icon: ``,\r\n callback: (el) => {\r\n this.combat.update({ turn: this.sortedCombatants.indexOf(this.combat.combatants.get(el.dataset.combatantId)) });\r\n },\r\n },\r\n ...game.combats.directory._getEntryContextOptions(),\r\n ],\r\n { jQuery: false, fixed: true }\r\n );\r\n }\r\n\r\n _onRenderCombatTracker() {\r\n this.portraits.forEach((p) => p.renderInner());\r\n this.updateStartEndButtons();\r\n }\r\n\r\n _onCombatTurn(combat, updates, update) {\r\n if (!(\"turn\" in updates) && !(\"round\" in updates)) return;\r\n if (\"round\" in updates) this._onRoundChange();\r\n const combatantsContainer = this.element.querySelector(\"#combatants\");\r\n const filteredChildren = Array.from(combatantsContainer.children).filter((c) => !c.classList.contains(\"separator\"));\r\n const currentSize = combatantsContainer.getBoundingClientRect();\r\n combatantsContainer.style.minWidth = currentSize.width + \"px\";\r\n combatantsContainer.style.minHeight = currentSize.height + \"px\";\r\n //find combatant with lowest order\r\n\r\n const childrenByHighestOrder = [...filteredChildren].sort((a, b) => b.style.order - a.style.order);\r\n const childrenByLowestOrder = [...filteredChildren].sort((a, b) => a.style.order - b.style.order);\r\n\r\n const currentCombatant = this.combat.combatant;\r\n const currentIndex = this.sortedCombatants.findIndex((c) => c === currentCombatant);\r\n let nextDefeatedCount = 0;\r\n let previousDefeatedCount = 0;\r\n const sortedCombatants = this.sortedCombatants;\r\n for (let i = 0 + 1; i < sortedCombatants.length; i++) {\r\n const index = (currentIndex + i) % sortedCombatants.length;\r\n const combatant = sortedCombatants[index];\r\n if (combatant.defeated) previousDefeatedCount++;\r\n else break;\r\n }\r\n\r\n for (let i = 0 + 1; i < sortedCombatants.length; i++) {\r\n const index = (currentIndex - i + sortedCombatants.length) % sortedCombatants.length;\r\n const combatant = sortedCombatants[index];\r\n if (combatant.defeated) nextDefeatedCount++;\r\n else break;\r\n }\r\n\r\n const nextDefeatedCombatants = childrenByLowestOrder.slice(0, nextDefeatedCount + 1);\r\n const previousDefeatedCombatants = childrenByHighestOrder.slice(0, previousDefeatedCount + 1);\r\n\r\n const first = nextDefeatedCount != 0 ? nextDefeatedCombatants : [[...filteredChildren].reduce((a, b) => (a.style.order < b.style.order ? a : b), combatantsContainer.children[0])];\r\n const last = previousDefeatedCount != 0 ? previousDefeatedCombatants : [[...filteredChildren].reduce((a, b) => (a.style.order > b.style.order ? a : b), combatantsContainer.children[0])];\r\n\r\n const els = update.direction === 1 ? first : last;\r\n\r\n if (this._playAnimation && this.sortedCombatants.length > 0) {\r\n this._playAnimation = false;\r\n this.updateOrder();\r\n this.playIntroAnimation();\r\n return;\r\n }\r\n\r\n setTimeout(() => this.updateOrder(), 200);\r\n\r\n if (!this.trueCarousel) {\r\n combatantsContainer.style.minWidth = \"\";\r\n combatantsContainer.style.minHeight = \"\";\r\n return this.centerCurrentCombatant();\r\n }\r\n\r\n for (const el of els) {\r\n el.classList.add(`collapsed-${this.isVertical ? \"vertical\" : \"horizontal\"}`);\r\n setTimeout(() => {\r\n el.classList.remove(`collapsed-${this.isVertical ? \"vertical\" : \"horizontal\"}`);\r\n setTimeout(() => {\r\n combatantsContainer.style.minWidth = \"\";\r\n combatantsContainer.style.minHeight = \"\";\r\n }, 200);\r\n this.centerCurrentCombatant();\r\n }, 200);\r\n }\r\n }\r\n\r\n async _onRoundChange() {\r\n const toDelete = [];\r\n for (const combatant of this.combat.combatants) {\r\n const duration = combatant.getFlag(MODULE_ID, \"duration\");\r\n if (!duration) continue;\r\n const roundCreated = combatant.getFlag(MODULE_ID, \"roundCreated\");\r\n if (!roundCreated) continue;\r\n const currentRound = this.combat.round;\r\n const roundsElapsed = currentRound - roundCreated;\r\n if (roundsElapsed >= duration) {\r\n toDelete.push(combatant.id);\r\n ChatMessage.create({\r\n speaker: { alias: \"Combat Tracker Dock\" },\r\n content: game.i18n.localize(\"combat-tracker-dock.add-event.expired\").replace(\"%n\", `${combatant.name}`),\r\n type: CONST.CHAT_MESSAGE_TYPES.OTHER,\r\n whisper: [game.user.id],\r\n });\r\n }\r\n }\r\n if (toDelete.length > 0) {\r\n await this.combat.deleteEmbeddedDocuments(\"Combatant\", toDelete);\r\n }\r\n }\r\n\r\n centerCurrentCombatant() {\r\n if(!this.element) return;\r\n const carouselStyle = game.settings.get(MODULE_ID, \"carouselStyle\");\r\n const combatantsEl = this.element.querySelector(\"#combatants\");\r\n if (this.trueCarousel) {\r\n if (carouselStyle == 1) {\r\n return combatantsEl.scrollTo({\r\n top: 0,\r\n left: 0,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n\r\n combatantsEl.scrollTo({\r\n top: combatantsEl.scrollHeight / 2 - combatantsEl.offsetHeight / 2 + this._currentPortraitSize.max * this._currentPortraitSize.aspect,\r\n left: combatantsEl.scrollWidth / 2 - combatantsEl.offsetWidth / 2 + this._currentPortraitSize.max,\r\n behavior: \"smooth\",\r\n });\r\n } else {\r\n const current = this.portraits.find((p) => p.combatant === this.combat.combatants.get(this.combat?.current?.combatantId));\r\n if (!current) return;\r\n const el = current.element;\r\n el.scrollIntoView({\r\n behavior: \"smooth\",\r\n block: \"center\",\r\n inline: \"center\",\r\n });\r\n }\r\n }\r\n\r\n setControlsOrder() {\r\n const uiLeft = this.element.querySelector(\".buttons-container.left\");\r\n const uiRight = this.element.querySelector(\".buttons-container.right\");\r\n uiLeft.style.marginRight = \"\";\r\n uiRight.style.marginLeft = \"\";\r\n const combatants = this.element.querySelector(\"#combatants\");\r\n const alignment = game.settings.get(MODULE_ID, \"alignment\");\r\n if (this.isVertical && alignment !== \"center\") {\r\n if (alignment == \"right\") {\r\n uiLeft.style.order = 0;\r\n uiLeft.style.marginRight = \"1rem\";\r\n uiRight.style.order = 1;\r\n combatants.style.order = 2;\r\n } else {\r\n uiLeft.style.order = 1;\r\n uiRight.style.order = 2;\r\n uiRight.style.marginLeft = \"1rem\";\r\n combatants.style.order = 0;\r\n }\r\n } else {\r\n uiLeft.style.order = \"\";\r\n uiRight.style.order = \"\";\r\n combatants.style.order = \"\";\r\n }\r\n }\r\n\r\n _onDeleteCombat(combat) {\r\n if (combat === this.combat) {\r\n this.close();\r\n }\r\n }\r\n\r\n _onCombatStart(combat) {\r\n if (combat === this.combat) this._playAnimation = true;\r\n }\r\n\r\n _onHoverToken(token, hover) {\r\n const portrait = this.portraits.find((p) => p.token === token);\r\n if (!portrait) return;\r\n portrait.element.classList.toggle(\"hovered\", hover);\r\n }\r\n\r\n refresh() {\r\n this.autosize();\r\n this.updateCombatants();\r\n this.appendHtml();\r\n }\r\n\r\n async restart() {\r\n await this.close();\r\n await new CombatDock().render({ force: true });\r\n }\r\n\r\n async close(...args) {\r\n this.removeHooks();\r\n window.removeEventListener(\"resize\", this.autosize.bind(this));\r\n if (this.element) this.element.remove();\r\n this._closed = true;\r\n return super.close(...args);\r\n }\r\n}\r\n","import { MODULE_ID } from \"../main.js\";\r\nimport { generateDescription, getInitiativeDisplay, getSystemIcons } from \"../systems.js\";\r\n\r\nexport class CombatantPortrait {\r\n constructor(combatant) {\r\n this.combatant = combatant;\r\n this.combat = combatant.combat;\r\n this.element = document.createElement(\"div\");\r\n this.element.classList.add(\"combatant-portrait\");\r\n this.element.setAttribute(\"data-combatant-id\", combatant.id);\r\n this.element.setAttribute(\"data-tooltip-class\", \"combat-dock-tooltip\");\r\n this.element.style.backgroundImage = `url(\"${game.settings.get(MODULE_ID, \"portraitImageBackground\")}\")`;\r\n this.resolve = null;\r\n this.ready = new Promise((res) => (this.resolve = res));\r\n this._hasTakenTurn = this.combat.round ?? 0 <= 1;\r\n if (!game.settings.get(MODULE_ID, \"hideFirstRound\")) this._hasTakenTurn = true;\r\n this.activateCoreListeners();\r\n this.renderInner();\r\n }\r\n\r\n get actor() {\r\n return this.combatant?.actor;\r\n }\r\n\r\n get token() {\r\n return this.combatant?.token?.object;\r\n }\r\n\r\n get img() {\r\n const useActor = game.settings.get(MODULE_ID, \"portraitImage\") === \"actor\";\r\n return (useActor ? this.combatant.actor?.img : this.combatant.img) ?? this.combatant.img;\r\n }\r\n\r\n get name() {\r\n if (this.combatant.isOwner) return this.combatant.name;\r\n const displayName = game.settings.get(MODULE_ID, \"displayName\");\r\n if (displayName === \"owner\") return this.combatant.isOwner ? this.combatant.name : \"???\";\r\n if (displayName === \"default\") return this.combatant.name;\r\n return [CONST.TOKEN_DISPLAY_MODES.HOVER, CONST.TOKEN_DISPLAY_MODES.ALWAYS].includes(this.token?.document?.displayName) ? this.combatant.name : \"???\";\r\n }\r\n\r\n get firstTurnHidden() {\r\n const combatant = this.combatant;\r\n const hasPermission = (combatant.actor?.permission ?? -10) >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER || combatant.isOwner;\r\n const isFriendly = combatant.token?.disposition === CONST.TOKEN_DISPOSITIONS.FRIENDLY;\r\n if (!hasPermission && !this._hasTakenTurn && !isFriendly) return true;\r\n return false;\r\n }\r\n\r\n get isEvent() {\r\n return this.combatant.flags[MODULE_ID]?.event ?? false;\r\n }\r\n\r\n get eventResource() {\r\n if (!this.isEvent) return null;\r\n const flags = this.combatant.flags[MODULE_ID];\r\n const {duration, roundCreated} = flags;\r\n const currentRound = this.combat.round;\r\n return {\r\n max: duration,\r\n value: duration - (currentRound - roundCreated),\r\n percentage: Math.round((duration - (currentRound - roundCreated)) / duration * 100),\r\n };\r\n }\r\n\r\n get eventRoundsLeft() {\r\n return this.combatant.getFlag(MODULE_ID, \"roundsLeft\") ?? 0;\r\n }\r\n\r\n activateCoreListeners() {\r\n this.element.addEventListener(\"mouseenter\", this._onHoverIn.bind(this));\r\n this.element.addEventListener(\"mouseleave\", this._onHoverOut.bind(this));\r\n }\r\n activateListeners() {\r\n this.element.querySelector(\".combatant-wrapper\").addEventListener(\"click\", this._onCombatantMouseDown.bind(this));\r\n\r\n (this.element.querySelectorAll(\".system-icon\") ?? []).forEach((iconEl, index) => {\r\n const systemIcons = this._systemIcons;\r\n const icon = systemIcons[index];\r\n if (icon.callback && icon.enabled) {\r\n iconEl.addEventListener(\"click\", async (event) => {\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n icon.callback(event, this.combatant, index, icon.id);\r\n });\r\n }\r\n });\r\n\r\n if(!this.actor?.isOwner) return;\r\n\r\n (this.element.querySelectorAll(\".portrait-effect\") ?? []).forEach((effectEl) => {\r\n //delete on right click\r\n effectEl.addEventListener(\"contextmenu\", async (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const uuid = effectEl.dataset.uuid;\r\n const effect = await fromUuid(uuid);\r\n const statusEffect = CONFIG.statusEffects.find((s) => s.img === effect.img);\r\n\r\n const response = await foundry.applications.api.DialogV2.confirm({\r\n window: { title: `${MODULE_ID}.deleteEffectTitle` },\r\n content: game.i18n.localize(`${MODULE_ID}.deleteEffectContent`) + game.i18n.localize(effect?.label ?? statusEffect?.name ?? \"\") + \"?\",\r\n defaultYes: false,\r\n });\r\n if(!response) return;\r\n if (!effect) {\r\n this.token?.toggleEffect(uuid);\r\n return;\r\n }\r\n await effect.delete();\r\n });\r\n });\r\n }\r\n\r\n async _onCombatantMouseDown(event) {\r\n event.preventDefault();\r\n\r\n if (event.target.dataset.action === \"player-pass\") return this.combat.nextTurn();\r\n\r\n if (!event.target.classList.contains(\"combatant-wrapper\")) return;\r\n\r\n if (event.button === 2) return game.user.isGM && this.combatant.sheet.render(true);\r\n\r\n const combatant = this.combatant;\r\n const token = combatant.token;\r\n if (!combatant.actor?.testUserPermission(game.user, \"OBSERVER\")) return;\r\n const now = Date.now();\r\n\r\n // Handle double-left click to open sheet\r\n const dt = now - this._clickTime;\r\n this._clickTime = now;\r\n if (dt <= 250) {\r\n return combatant.actor?.sheet.render(true);\r\n }\r\n\r\n // Control and pan to Token object\r\n if (token?.object) {\r\n token.object?.control({ releaseOthers: true });\r\n return canvas.animatePan(token.object.center);\r\n }\r\n }\r\n\r\n _onHoverIn(event) {\r\n if (!this.token) return;\r\n if ( this.token?.isVisible && !this.token.controlled ) this.token._onHoverIn(event);\r\n }\r\n\r\n _onHoverOut(event) {\r\n if (!this.token) return;\r\n if (this.token.hover) this.token._onHoverOut(event);\r\n }\r\n\r\n async renderInner() {\r\n const data = await this.getData();\r\n this.element.classList.toggle(\"hidden\", !data);\r\n if (!data) {\r\n this.resolve(true);\r\n this.element.innerHTML = \"\";\r\n return;\r\n }\r\n const template = await foundry.applications.handlebars.renderTemplate(\"modules/combat-tracker-dock/templates/combatant-portrait.hbs\", { ...data });\r\n const tooltip = await foundry.applications.handlebars.renderTemplate(\"modules/combat-tracker-dock/templates/combatant-tooltip.hbs\", { ...data });\r\n this.element.innerHTML = template;\r\n this.element.setAttribute(\"data-tooltip\", tooltip);\r\n const direction = game.settings.get(MODULE_ID, \"direction\");\r\n let tooltipDirection = \"\";\r\n if (direction == \"columnFloat\") {\r\n const alignment = game.settings.get(MODULE_ID, \"alignment\");\r\n if(alignment == \"left\") tooltipDirection = foundry.helpers.interaction.TooltipManager.implementation.TOOLTIP_DIRECTIONS.RIGHT;\r\n else if(alignment == \"right\") tooltipDirection = foundry.helpers.interaction.TooltipManager.implementation.TOOLTIP_DIRECTIONS.LEFT;\r\n }\r\n this.element.setAttribute(\"data-tooltip-direction\", tooltipDirection);\r\n\r\n this.element.classList.toggle(\"active\", data.css.includes(\"active\"));\r\n this.element.classList.toggle(\"visible\", data.css.includes(\"hidden\"));\r\n this.element.classList.toggle(\"defeated\", data.css.includes(\"defeated\"));\r\n this.element.style.borderBottomColor = this.getBorderColor(this.token?.document);\r\n this.element.querySelector(\".roll-initiative\").addEventListener(\"click\", async (event) => {\r\n event.preventDefault();\r\n Hooks.once(\"renderCombatTracker\", () => {\r\n ui.combatDock.updateOrder();\r\n });\r\n await this.combatant.combat.rollInitiative([this.combatant.id],{event});\r\n });\r\n this.element.querySelectorAll(\".action\").forEach((action) => {\r\n action.addEventListener(\"click\", async (event) => {\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n const dataAction = action.dataset.action;\r\n switch (dataAction) {\r\n case \"toggle-hidden\":\r\n await this.combatant.update({ hidden: !this.combatant.hidden });\r\n break;\r\n case \"toggle-defeated\":\r\n await ui.combat._onToggleDefeatedStatus(this.combatant);\r\n break;\r\n case \"ping\":\r\n await ui.combat._onPingCombatant(this.combatant);\r\n break;\r\n }\r\n });\r\n });\r\n const ib = this.element.querySelector(\".image-border\");\r\n if(ib) ib.style.backgroundImage = `url(\"${game.settings.get(MODULE_ID, \"portraitImageBorder\")}\")`;\r\n this.activateListeners();\r\n this.resolve(true);\r\n }\r\n\r\n getResource(resource = null, primary = false) {\r\n\r\n if (this.isEvent && primary) return this.eventResource;\r\n\r\n if (!this.actor || !this.combat) return null;\r\n\r\n resource = resource ?? this.combat.settings.resource;\r\n\r\n let max, value, percentage;\r\n\r\n if (!resource) return { max, value, percentage };\r\n\r\n max = foundry.utils.getProperty(this.actor.system, resource + \".max\") ?? foundry.utils.getProperty(this.actor.system, resource.replace(\"value\", \"\") + \"max\");\r\n\r\n value = foundry.utils.getProperty(this.actor.system, resource) ?? foundry.utils.getProperty(this.actor.system, resource + \".value\");\r\n\r\n if (max !== undefined && value !== undefined && Number.isNumeric(max) && Number.isNumeric(value)) percentage = Math.min(Math.max( Math.round((value / max) * 100) , 0) , 100);\r\n\r\n value = this.validateValue(value);\r\n max = this.validateValue(max);\r\n\r\n return { max, value, percentage };\r\n }\r\n\r\n validateValue(value) {\r\n if (typeof value === \"boolean\") value = value ? \"✓\" : \"✗\";\r\n\r\n if (Array.isArray(value)) value = value.join(\", \");\r\n\r\n if (value === \"\") value = null;\r\n\r\n if (!Number.isNumeric(value) && Object.prototype.toString.call(value) != \"[object String]\") value = null;\r\n\r\n return value;\r\n }\r\n\r\n getBarsOrder(hasEffects, r1, r2) {\r\n const sett = game.settings.get(MODULE_ID, \"barsPlacement\");\r\n r1 = !isNaN(r1?.percentage) ? 0 : 1;\r\n r2 = !isNaN(r2?.percentage) ? 0 : 1;\r\n\r\n switch (sett) {\r\n case \"left\":\r\n return {bar1: 0, bar2: 1, init: 2, effects: 3, bar1ML: 0, bar2ML: 0, initBars: 2.5 - r1 - r2};\r\n case \"right\":\r\n return {bar1: 2, bar2: 3, init: 0, effects: 1, bar1ML: hasEffects ? 0 : \"auto\", bar2ML: 0, initBars: 0.5};\r\n case \"twinned\":\r\n return {bar1: 0, bar2: 3, init: 1, effects: 2, bar1ML: 0, bar2ML: hasEffects ? 0 : \"auto\", initBars: 1.5 - r1};\r\n }\r\n }\r\n\r\n get hasPermission() {\r\n const combatant = this.combatant;\r\n const playerPlayerPermission = combatant.actor?.hasPlayerOwner && game.settings.get(MODULE_ID, \"playerPlayerPermission\");\r\n const hasPermission = (combatant.actor?.permission ?? -10) >= CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER || combatant.isOwner || playerPlayerPermission;\r\n return hasPermission;\r\n }\r\n\r\n async getData() {\r\n // Format information about each combatant in the encounter\r\n let hasDecimals = false;\r\n const combatant = this.combatant;\r\n const hideDefeated = game.settings.get(MODULE_ID, \"hideDefeated\");\r\n if (hideDefeated && combatant.isDefeated) return null;\r\n const isActive = this.combat.turns.indexOf(combatant) === this.combat.turn;\r\n if (isActive && this.combat.started) this._hasTakenTurn = true;\r\n const hasPermission = this.hasPermission;\r\n if (!hasPermission && !this._hasTakenTurn) return null;\r\n if (!combatant.visible && !game.user.isGM) return null;\r\n const trackedAttributes = game.settings\r\n .get(MODULE_ID, \"attributes\")\r\n .map((a) => {\r\n const resourceData = this.getResource(a.attr);\r\n const iconHasExtension = a.icon.includes(\".\");\r\n return {\r\n ...resourceData,\r\n icon: iconHasExtension ? `` : ``,\r\n units: a.units || \"\",\r\n };\r\n })\r\n .filter((a) => a.value !== null && a.value !== undefined);\r\n\r\n const systemIcons = this.getSystemIcons();\r\n const systemIconCount = systemIcons.resource?.length ?? 0;\r\n\r\n const attributesVisibility = game.settings.get(MODULE_ID, \"attributeVisibility\");\r\n\r\n const displayDescriptionsSetting = game.settings.get(MODULE_ID, \"displayDescriptions\");\r\n\r\n let displayDescriptions = false;\r\n\r\n if (displayDescriptionsSetting === \"all\") displayDescriptions = true;\r\n else if (displayDescriptionsSetting === \"owner\") displayDescriptions = hasPermission;\r\n\r\n // Prepare turn data\r\n const resource = hasPermission ? this.getResource(null, true) : null;\r\n const resource2 = hasPermission ? this.getResource(game.settings.get(MODULE_ID, \"resource\")) : null;\r\n const portraitResourceSetting = game.settings.get(MODULE_ID, \"portraitResource\");\r\n const portraitResource = hasPermission && portraitResourceSetting ? this.getResource(portraitResourceSetting) : null;\r\n const initiativeData = this.getInitiativeDisplay();\r\n initiativeData.isIconImg = initiativeData.icon.includes(\".\");\r\n initiativeData.isRollIconImg = initiativeData.rollIcon.includes(\".\");\r\n const turn = {\r\n id: combatant.id,\r\n name: this.name,\r\n img: this.img,\r\n active: this.combat.turns.indexOf(combatant) === this.combat.turn,\r\n owner: combatant.isOwner,\r\n isGM: game.user.isGM,\r\n showPass: combatant.isOwner && !game.user.isGM,\r\n defeated: combatant.isDefeated,\r\n hidden: combatant.hidden,\r\n initiative: combatant.initiative,\r\n hasRolled: combatant.initiative !== null && combatant.initiative !== undefined,\r\n hasResource: resource !== null,\r\n hasResource2: resource2 !== null,\r\n hasPortraitResource: portraitResource !== null,\r\n hasPlayerOwner: combatant.actor?.hasPlayerOwner,\r\n hasPermission: hasPermission,\r\n showInitiative: game.settings.get(MODULE_ID, \"showInitiativeOnPortrait\"),\r\n isInitiativeNaN: combatant.initiative === null || combatant.initiative === undefined,\r\n initiativeData: initiativeData,\r\n resource: resource,\r\n resource2: resource2,\r\n portraitResource: portraitResource,\r\n showBars: attributesVisibility == \"bars\" || attributesVisibility == \"both\",\r\n showText: attributesVisibility == \"text\" || attributesVisibility == \"both\",\r\n canPing: combatant.sceneId === canvas.scene?.id && game.user.hasPermission(\"PING_CANVAS\"),\r\n attributes: trackedAttributes,\r\n description: this.getDescription(),\r\n resSystemIcons: systemIcons.resource,\r\n tooltipSystemIcons: systemIcons.tooltip,\r\n systemIconsSizeMulti: clamp(0.03, 1/(systemIconCount * 2) ,0.1),\r\n barsOrder: null,\r\n displayDescriptions: displayDescriptions,\r\n };\r\n if (turn.initiative !== null && !Number.isInteger(turn.initiative)) hasDecimals = true;\r\n if (turn.initiativeData.value !== null && !Number.isInteger(turn.initiativeData.value)) hasDecimals = true;\r\n turn.css = [turn.active ? \"active\" : \"\", turn.hidden ? \"hidden\" : \"\", turn.defeated ? \"defeated\" : \"\"].join(\" \").trim();\r\n\r\n // Actor and Token status effects\r\n turn.effects = new Set();\r\n turn.hasAttributes = trackedAttributes.length > 0;\r\n if (combatant.actor) {\r\n for (const effect of combatant.actor.temporaryEffects) {\r\n if (effect.statuses.has(CONFIG.specialStatusEffects.DEFEATED)) turn.defeated = true;\r\n else if (effect.img) {\r\n const description = effect.description ? await foundry.applications.ux.TextEditor.implementation.enrichHTML(effect.description) : \"\";\r\n const duration = parseInt(effect.duration?.label ?? \"\");\r\n const percent = effect.duration?.remaining / effect.duration?.duration;\r\n const uuid = effect.uuid;\r\n turn.effects.add({ uuid, img: effect.img, name: effect.name, description: description, duration: duration, percent: isNaN(percent) ? null : percent*100, hasDuration: !isNaN(duration) });\r\n }\r\n }\r\n }\r\n\r\n turn.hasEffects = turn.effects.size > 0;\r\n turn.barsOrder = this.getBarsOrder(turn.hasEffects, resource, resource2);\r\n // Format initiative numeric precision\r\n const precision = CONFIG.Combat.initiative.decimals;\r\n if (turn.hasRolled && typeof turn.initiative == \"number\") turn.initiative = turn.initiative.toFixed(hasDecimals ? precision : 0);\r\n if (turn.hasRolled && typeof turn.initiativeData.value == \"number\") turn.initiativeData.value = turn.initiativeData.value.toFixed(hasDecimals ? precision : 0);\r\n if (!game.user.isGM && !combatant.actor?.isOwner && game.settings.get(MODULE_ID, \"hideEnemyInitiative\")) {\r\n turn.initiative = \"?\";\r\n turn.initiativeData.value = \"?\";\r\n }\r\n return turn;\r\n }\r\n\r\n getDescription() {\r\n const actor = this.actor;\r\n if (!actor) return null;\r\n let description = null;\r\n\r\n try {\r\n description = generateDescription(actor);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n\r\n return description;\r\n }\r\n\r\n getSystemIcons() {\r\n try {\r\n const sett = game.settings.get(MODULE_ID, \"showSystemIcons\");\r\n const icons = sett > 0 ? getSystemIcons(this.combatant) : [];\r\n const hasPermission = this.hasPermission;\r\n icons.forEach((icon) => {\r\n if (icon.callback) icon.hasCallback = true;\r\n icon.visible ??= hasPermission;\r\n });\r\n this._systemIcons = icons;\r\n if (!icons || !icons?.length) return { resource: null, tooltip: null };\r\n return {\r\n resource: sett >= 2 ? icons : null,\r\n tooltip: sett == 1 || sett == 3 ? icons : null,\r\n };\r\n } catch (e) {\r\n console.error(e);\r\n return { resource: null, tooltip: null };\r\n }\r\n }\r\n\r\n getInitiativeDisplay() {\r\n return getInitiativeDisplay(this.combatant);\r\n }\r\n\r\n getBorderColor(tokenDocument) {\r\n if (!game.settings.get(MODULE_ID, \"showDispositionColor\") || !tokenDocument) return \"#000\";\r\n\r\n function getColor() {\r\n const colors = CONFIG.Canvas.dispositionColors;\r\n if ( tokenDocument.isOwner && !game.user.isGM ) return colors.CONTROLLED;\r\n const D = CONST.TOKEN_DISPOSITIONS;\r\n switch ( tokenDocument.disposition ) {\r\n case D.SECRET: return colors.SECRET;\r\n case D.HOSTILE: return colors.HOSTILE;\r\n case D.NEUTRAL: return colors.NEUTRAL;\r\n case D.FRIENDLY: return tokenDocument.actor?.hasPlayerOwner ? colors.PARTY : colors.FRIENDLY;\r\n default: return colors.NEUTRAL;\r\n }\r\n }\r\n\r\n return new Color(getColor()).toString();\r\n }\r\n\r\n destroy() {\r\n this.element?.remove();\r\n }\r\n}\r\n\r\nconst clamp = (value, min, max) => Math.min(Math.max(value, min), max);\r\n","import {MODULE_ID} from \"../main.js\";\n\nconst SHOWN_KEY = \"chat-welcome-message-shown\";\n\nexport function showWelcome() {\n if (!game.user.isGM) return;\n const module = game.modules.get(MODULE_ID);\n const VIDEO_ID = \"2Iq_so_GsLA\";\n const EMBEDDED_VIDEO = ``;\n const WIKI_URL = module.protected ? `https://wiki.theripper93.com/premium/${MODULE_ID}` : `https://wiki.theripper93.com/free/${MODULE_ID}`;\n const MESSAGE = `

${module.title}

\n

by theripper93

\n

New to ${module.title}? Visit the Wiki for a quickstart guide and resources.

\n ${VIDEO_ID ? EMBEDDED_VIDEO : \"\"}\n

Special thanks to all my Patreons for making ongoing updates and development possible. Supporting gives you access to 30+ premium modules and priority support.

\n

Explore all resources and modules:

`;\n\n\n game.settings.register(MODULE_ID, SHOWN_KEY, {\n default: false,\n type: Boolean,\n scope: \"world\",\n config: false,\n });\n\n if (!game.settings.get(MODULE_ID, SHOWN_KEY)) {\n\n ChatMessage.create({\n user: game.user.id,\n whisper: game.users.filter(u => u.isGM).map(u => u.id),\n blind: true,\n content: MESSAGE,\n });\n\n game.settings.set(MODULE_ID, SHOWN_KEY, true);\n }\n}","import { initConfig } from './config.js';\r\nimport {registerSettings} from './settings.js';\r\nimport {CombatDock} from './app/CombatDock.js';\r\nimport {CombatantPortrait} from './app/CombatantPortrait.js';\r\nimport {defaultAttributesConfig, generateDescription} from './systems.js';\r\nimport { showWelcome } from './lib/welcome.js';\r\nimport \"../scss/module.scss\";\r\n\r\nexport const MODULE_ID = 'combat-tracker-dock';\r\n\r\nexport function getCurrentCombat(){\r\n return ui.combat.viewed;\r\n}\r\n\r\nHooks.once('init', function () {\r\n registerWrappers();\r\n registerHotkeys();\r\n CONFIG.combatTrackerDock = {\r\n CombatDock,\r\n CombatantPortrait,\r\n defaultAttributesConfig,\r\n generateDescription,\r\n INTRO_ANIMATION_DURATION: 1000,\r\n INTRO_ANIMATION_DELAY: 0.25,\r\n }\r\n\r\n Hooks.callAll(`${MODULE_ID}-init`, CONFIG.combatTrackerDock);\r\n});\r\n\r\nHooks.on('ready', () => {\r\n registerSettings();\r\n initConfig();\r\n const currentCombat = getCurrentCombat();\r\n if(currentCombat && !ui.combatDock && game.settings.get(\"core\", \"noCanvas\")) {\r\n new CONFIG.combatTrackerDock.CombatDock(currentCombat).render(true);\r\n }\r\n showWelcome();\r\n});\r\n\r\nHooks.on('createCombat', (combat) => {\r\n if (game.combat === combat) {\r\n new CONFIG.combatTrackerDock.CombatDock(combat).render(true);\r\n }\r\n});\r\n\r\nHooks.on('updateCombat', (combat, updates) => {\r\n if(updates.active || updates.scene === null) {\r\n new CONFIG.combatTrackerDock.CombatDock(combat).render(true);\r\n }\r\n if(updates.scene && combat.scene !== game.scenes.viewed && ui.combatDock?.combat === combat) {\r\n ui.combatDock.close();\r\n }\r\n});\r\n\r\nHooks.on('canvasReady', () => {\r\n Hooks.once(\"renderCombatTracker\", (tab) => {\r\n const currentCombat = getCurrentCombat();\r\n if(currentCombat) {\r\n new CONFIG.combatTrackerDock.CombatDock(currentCombat).render(true);\r\n } else {\r\n ui.combatDock?.close();\r\n }\r\n })\r\n});\r\n\r\n\r\nfunction registerWrappers() {\r\n if (!game.modules.get(\"lib-wrapper\")?.active) return;\r\n\r\n libWrapper.register(MODULE_ID, \"Combatant.prototype.visible\", function (wrapped, ...args) {\r\n const visible = wrapped(...args);\r\n if (!ui.combatDock?.rendered) return visible;\r\n const cDVisible = ui.combatDock.portraits.find((p) => p.combatant == this)?.firstTurnHidden;\r\n return visible && !cDVisible;\r\n });\r\n}\r\n\r\nfunction registerHotkeys() {\r\n game.keybindings.register(MODULE_ID, \"combatPrev\", {\r\n name: `${MODULE_ID}.hotkeys.combatPrev.name`,\r\n editable: [{ key: \"KeyN\", modifiers: [foundry.helpers.interaction.KeyboardManager.MODIFIER_KEYS.SHIFT] }],\r\n restricted: false,\r\n onDown: () => {},\r\n onUp: () => {\r\n if (!game.combat) return;\r\n const isOwner = game.combat.combatant?.isOwner;\r\n if (!isOwner) return;\r\n game.combat.previousTurn();\r\n },\r\n });\r\n\r\n game.keybindings.register(MODULE_ID, \"combatNext\", {\r\n name: `${MODULE_ID}.hotkeys.combatNext.name`,\r\n editable: [{ key: \"KeyM\", modifiers: [foundry.helpers.interaction.KeyboardManager.MODIFIER_KEYS.SHIFT] }],\r\n restricted: false,\r\n onDown: () => {},\r\n onUp: () => {\r\n if (!game.combat) return;\r\n const isOwner = game.combat.combatant?.isOwner;\r\n if (!isOwner) return;\r\n game.combat.nextTurn();\r\n },\r\n });\r\n}\r\n","import { MODULE_ID } from \"./main.js\";\n\nexport function initConfig() {\n\n Hooks.on(\"renderCombatTrackerConfig\", (app, html, data) => {\n if (!game.user.isGM) return;\n const attributes = TokenDocument.implementation.getTrackedAttributes();\n attributes.bar.forEach(a => a.push(\"value\"));\n const attributeChoices = TokenDocument.implementation.getTrackedAttributeChoices(attributes)\n attributeChoices.unshift({label: \"None\", value: \"\"})\n const attributeBarChoices = TokenDocument.implementation.getTrackedAttributeChoices({bar: attributes.bar, value: []})\n attributeBarChoices.unshift({label: \"None\", value: \"\"})\n const compiled = Handlebars.compile(``)\n const compiled2 = Handlebars.compile(``)\n const selectResourceHtml = compiled({options: attributeChoices, value: game.settings.get(MODULE_ID, \"resource\")})\n const portraitResource = game.settings.get(MODULE_ID, \"portraitResource\");\n const selectPortraitResourceHtml = compiled2({options: attributeBarChoices, value: portraitResource})\n\n const fg = document.createElement(\"div\");\n fg.classList.add(\"form-group\");\n fg.innerHTML = `\n \n ${selectResourceHtml}\n

${game.i18n.localize('COMBAT.CONFIG.FIELDS.core.combatTrackerConfig.resource.hint')}

\n `;\n\n html.querySelector(`select[name=\"core.combatTrackerConfig.resource\"]`).closest(\".form-group\").appendChild(fg);\n\n const portraitFg = document.createElement(\"div\");\n portraitFg.classList.add(\"form-group\");\n portraitFg.innerHTML = `\n \n ${selectPortraitResourceHtml}\n

${game.i18n.localize(`${MODULE_ID}.combatConfig.portraitResource.hint`)}

\n `;\n\n html.querySelector(`select[name=\"flags.${MODULE_ID}.resource\"]`).closest(\".form-group\").appendChild(portraitFg);\n\n const button = document.createElement(\"button\");\n button.innerHTML = ` ` + game.i18n.localize(`${MODULE_ID}.configureCarousel`);\n\n button.addEventListener(\"click\", (e) => {\n e.preventDefault();\n new foundry.applications.settings.SettingsConfig().render(true)\n Hooks.once(\"renderSettingsConfig\", (app, html, data) => {\n html.querySelector('button[data-tab=\"combat-tracker-dock\"]').click();\n });\n });\n\n //find last form group\n const lastFormGroup = Array.from(html.querySelectorAll(\".form-group\")).pop();\n lastFormGroup.after(button);\n\n html.querySelector(`select[name=\"flags.${MODULE_ID}.resource\"]`).addEventListener(\"change\", async (event) => {\n await game.settings.set(MODULE_ID, \"resource\", event.target.value);\n });\n\n html.querySelector(`select[name=\"flags.${MODULE_ID}.portraitResource\"]`).addEventListener(\"change\", async (event) => {\n await game.settings.set(MODULE_ID, \"portraitResource\", event.target.value);\n });\n\n app.setPosition({height: \"auto\"});\n });\n\n}"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","target","i","arguments","length","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_typeof","Symbol","iterator","constructor","value","configurable","writable","_extends","assign","this","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceKeys","indexOf","sourceSymbolKeys","propertyIsEnumerable","userAgent","pattern","window","navigator","match","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","capture","passive","on","el","event","fn","addEventListener","off","removeEventListener","matches","selector","substring","msMatchesSelector","webkitMatchesSelector","_","getParentOrHost","host","document","nodeType","parentNode","closest","ctx","includeCTX","_throttleTimeout","R_SPACE","toggleClass","name","state","classList","className","replace","css","val","style","defaultView","getComputedStyle","currentStyle","matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","find","tagName","list","getElementsByTagName","n","getWindowScrollingElement","scrollingElement","documentElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","getBoundingClientRect","elRect","top","left","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","a","scaleY","d","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","getChild","childNum","options","includeDragEl","currentChild","children","display","Sortable","ghost","dragged","draggable","lastChild","last","lastElementChild","previousElementSibling","index","nodeName","toUpperCase","clone","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollLeft","scrollTop","includeSelf","elem","gotSelf","clientWidth","scrollWidth","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","body","isRectEqual","rect1","rect2","Math","round","throttle","callback","ms","args","setTimeout","scrollBy","x","y","Polymer","$","jQuery","Zepto","dom","cloneNode","expando","Date","getTime","AnimationStateManager","animationCallbackId","animationStates","captureAnimationState","animation","slice","child","rect","fromRect","thisAnimationDuration","childMatrix","f","e","addAnimationState","removeAnimationState","splice","indexOfObject","arr","Number","animateAll","_this","clearTimeout","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","sqrt","pow","animate","max","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","repaint","offsetWidth","easing","animated","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","option","p","pluginName","concat","pluginEvent","eventName","sortable","evt","eventCanceled","cancel","eventNameGlobal","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","charAt","substr","CustomEvent","createEvent","initEvent","bubbles","cancelable","to","from","item","pullMode","lastPutMode","undefined","allEventProperties","_excluded","data","bind","dragEl","parentEl","ghostEl","nextEl","lastDownEl","cloneHidden","dragStarted","moved","activeSortable","active","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","activeGroup","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","targetMoveDistance","ghostRelativeParent","awaitingDragStarted","ignoreNextClick","sortables","pastFirstInvertThresh","isCircumstantialInvert","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","createElement","supportCssPointerEvents","cssText","pointerEvents","_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","split","touchingSideChild2","clear","_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","nearestEmptyInsertDetectEvent","nearest","_detectNearestEmptySortable","ret","some","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","touches","clientX","clientY","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","toString","sort","disabled","store","handle","test","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","_onMove","dragRect","targetRect","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","_disableDraggable","_unsilent","_generateId","str","src","href","sum","charCodeAt","_nextTick","_cancelNextTick","id","contains","_getDirection","type","touch","pointerType","originalTarget","shadowRoot","path","composedPath","_saveInputCheckedState","root","inputs","idx","checked","button","isContentEditable","criteria","trim","_prepareDragStart","dragStartFn","ownerDocument","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","ghostMatrix","relativeScrollOffset","dx","dy","b","c","cssMatrix","appendChild","removeAttribute","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","revert","vertical","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","_ghostIsLast","spacer","changed","_ghostIsFirst","firstChild","targetBeforeFirstSwap","sibling","differentLevel","differentRowCol","_dragElInRowColumn","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","side1","scrolledPastTop","scrollBefore","_getSwapDirection","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","dragIndex","nextElementSibling","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","removeChild","save","handleEvent","_globalDragOver","dropEffect","toArray","order","getAttribute","useAnimation","items","set","closest$1","destroy","Array","querySelectorAll","utils","is","extend","dst","nextTick","cancelNextTick","detectDirection","element","_len","_key","create","version","scrollEl","scrollRootEl","touchEvt$1","autoScrolls","clearAutoScrolls","autoScroll","pid","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","scrollThisInstance","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","scrolling","drop","toSortable","changedTouches","onSpill","Revert","Remove","startIndex","dragStart","_ref2","_ref3","_ref4","parentSortable","HandlebarsApplication","foundry","applications","api","HandlebarsApplicationMixin","ApplicationV2","super","registerPositionSetting","savePosition","debounce","POSITION_SETTING_REGISTERED","DEFAULT_OPTIONS","game","settings","register","MODULE_ID","APP_ID","scope","config","default","resetSavedPosition","position","positionToSave","setPosition","r","toLowerCase","PARTS","content","template","classes","scrollable","tag","title","frame","positioned","icon","controls","minimizable","resizable","contentTag","contentClasses","preventEscapeClose","actions","form","handler","submitOnChange","closeOnSubmit","_prepareContext","getData","activateListeners","_onRender","context","instances","delete","close","html","render","options1","options2","activeOptions","mergeClone","other","deepClone","mergeObject","AttributesConfig","onAdd","onReset","footer","attributes","TokenDocument","implementation","getTrackedAttributes","bar","attributeChoices","getTrackedAttributeChoices","buttons","action","label","picker","querySelector","_saveData","attr","units","force","DialogV2","confirm","i18n","localize","defaultSett","_getSubmitData","li","defaultAttributesConfig","dnd5e","swade","pirateborg","cyphersystem","pf2e","pf1","crucible","wfrp4e","alienrpg","exaltedthird","exaltedessence","swnr","wwn","ars","lancer","dc20rpg","shadowdark","generateDescription","actor","system","isPC","creatureType","CONFIG","DND5E","creatureTypes","details","custom","cr","values","map","level","race","class","alignment","DND4E","actorSizes","size","creatureOrigin","origin","wildcard","characterClass","characterBaseClass","ancestry","background","signatureName","taxonomy","archetype","threat","Species","currentCareer","itemTypes","career","general","specialty","careersynth","model","essence","hp","hd","combatTrackerDock","getSystemIcons","combatant","modules","getMidiFlag","actionType","getFlag","toggleMidiFlag","flag","setFlag","color","enabled","iconIndex","iconId","systemData","alwaysShowActions","getSystemSetting","resources","focus","systemIcons","visible","fontSize","getActiveTokens","t","toggleEffect","statusEffects","eff","registerSystemSettings","registerSystemSetting","rootKey","l","hint","Boolean","onChange","ui","combatDock","refresh","registerSettings","registerMenu","restricted","String","choices","rowDocked","rowFloat","columnFloat","async","restart","setDirection","setOverflowStyle","setFlex","autosize","setPortraitSize","portraitSize","setProperty","autofit","hidden","center","setAlignment","range","min","step","setFloatingSize","setPortraitAspect","setRoundness","fields","ColorField","setAttributeColor","twinned","text","bars","both","token","owner","FilePathField","categories","setPortraitImageBorder","setPortraitImageBackground","setHideConflictingUIs","setAllSettings","floatingSize","portraitAspect","setControlsOrder","portraitImageBorder","portraitImageBackground","hideConflictingUIs","toggle","roundness","attributeColor","darkened","Color","mix","attributeColor2","darkened2","attributeColorPortrait","overflowStyle","includes","flexD","AddEvent","combat","defaultOptions","recentEvents","eventButton","eventIndex","currentTarget","dataset","img","initiative","formData","ux","FormDataExtended","isNumeric","notifications","error","createEmbeddedDocuments","roundCreated","newRecentEvent","unshift","CombatDock","portraits","hooks","_playAnimation","_currentPortraitSize","aspect","setHooks","_combatTrackerRefreshed","WINDOWED_DEFAULT_OPTIONS","sortedCombatants","sorted","combatants","contents","_sortCombatants","isDefeated","trueCarousel","leftAligned","autoFit","isVertical","isDocked","hook","_onRenderCombatTracker","setupCombatants","updateCombatant","_onCombatTurn","_onDeleteCombat","_onCombatStart","_onHoverToken","Hooks","removeHooks","lessButtons","reverseHeaderPosition","isGM","user","CombatantPortrait","combatantsContainer","innerHTML","isEven","setupSeparator","updateOrder","promises","ready","_promises","Promise","all","then","playIntroAnimation","s","remove","turn","combatantsCount","afterHalf","separator","add","line","callAll","INTRO_ANIMATION_DURATION","delayMultiplier","INTRO_ANIMATION_DELAY","transformAxis","transformDirection","playSlideInAnimation","finished","totalAnimationTime","centerCurrentCombatant","combatantRevived","verticalSize","sizeModifier","combatantCount","maxSpace","getElementById","updates","portrait","renderInner","defeated","updateCombatants","isTrueCarousel","isLeftAligned","currentCombatant","currentCombatantIndex","findIndex","tempCombatantList","halfLength","orderedCombatants","lastCombatant","lastCombatantOrder","updateStartEndButtons","startButton","endButton","started","appendHtml","prepend","_closed","previousTurn","nextTurn","previousRound","nextRound","endCombat","rollAll","rollNPC","resetAll","apps","CombatTrackerConfig","startCombat","ContextMenu","condition","update","combatantId","combats","directory","_getEntryContextOptions","fixed","_onRoundChange","filteredChildren","currentSize","minWidth","minHeight","childrenByHighestOrder","childrenByLowestOrder","currentIndex","nextDefeatedCount","previousDefeatedCount","nextDefeatedCombatants","previousDefeatedCombatants","first","reduce","els","toDelete","ChatMessage","speaker","alias","CONST","CHAT_MESSAGE_TYPES","OTHER","whisper","deleteEmbeddedDocuments","carouselStyle","combatantsEl","scrollTo","behavior","offsetHeight","current","scrollIntoView","block","inline","uiLeft","uiRight","hover","setAttribute","backgroundImage","resolve","res","_hasTakenTurn","activateCoreListeners","displayName","TOKEN_DISPLAY_MODES","HOVER","ALWAYS","firstTurnHidden","hasPermission","permission","DOCUMENT_OWNERSHIP_LEVELS","OBSERVER","isFriendly","disposition","TOKEN_DISPOSITIONS","FRIENDLY","isEvent","flags","eventResource","currentRound","percentage","eventRoundsLeft","_onHoverIn","_onHoverOut","_onCombatantMouseDown","iconEl","_systemIcons","effectEl","uuid","effect","fromUuid","statusEffect","defaultYes","sheet","testUserPermission","now","dt","_clickTime","control","releaseOthers","canvas","animatePan","isVisible","controlled","handlebars","renderTemplate","tooltip","tooltipDirection","helpers","interaction","TooltipManager","TOOLTIP_DIRECTIONS","RIGHT","LEFT","borderBottomColor","getBorderColor","once","rollInitiative","_onToggleDefeatedStatus","_onPingCombatant","ib","getResource","resource","primary","getProperty","validateValue","isArray","getBarsOrder","hasEffects","r1","r2","sett","isNaN","bar1","bar2","init","effects","bar1ML","bar2ML","initBars","playerPlayerPermission","hasPlayerOwner","hasDecimals","turns","trackedAttributes","systemIconCount","attributesVisibility","displayDescriptionsSetting","displayDescriptions","resource2","portraitResourceSetting","portraitResource","initiativeData","getInitiativeDisplay","isIconImg","isRollIconImg","rollIcon","showPass","hasRolled","hasResource","hasResource2","hasPortraitResource","showInitiative","isInitiativeNaN","showBars","showText","canPing","sceneId","scene","description","getDescription","resSystemIcons","tooltipSystemIcons","systemIconsSizeMulti","clamp","barsOrder","isInteger","Set","hasAttributes","temporaryEffects","statuses","has","specialStatusEffects","DEFEATED","TextEditor","enrichHTML","percent","remaining","hasDuration","precision","Combat","decimals","toFixed","console","icons","hasCallback","suit","getCardImage","cardstr","cards","cardString","tokenDocument","getColor","colors","Canvas","dispositionColors","CONTROLLED","D","SECRET","HOSTILE","NEUTRAL","PARTY","SHOWN_KEY","getCurrentCombat","viewed","registerWrappers","libWrapper","wrapped","rendered","cDVisible","registerHotkeys","keybindings","editable","modifiers","KeyboardManager","MODIFIER_KEYS","SHIFT","onDown","onUp","initConfig","app","attributeBarChoices","compiled","Handlebars","compile","compiled2","selectResourceHtml","selectPortraitResourceHtml","fg","portraitFg","SettingsConfig","click","pop","currentCombat","showWelcome","module","VIDEO_ID","EMBEDDED_VIDEO","WIKI_URL","protected","MESSAGE","users","u","blind","scenes","tab"],"ignoreList":[],"sourceRoot":""}