diff --git a/.gitignore b/.gitignore index 259925fcb9..87498acf14 100644 --- a/.gitignore +++ b/.gitignore @@ -210,6 +210,6 @@ temp/ demo/release packages/*/dist/ demo/_data/version.yml -dist/ + outjs/ declaration/ diff --git a/dist/flicking.esm.js b/dist/flicking.esm.js new file mode 100644 index 0000000000..79e7217fb9 --- /dev/null +++ b/dist/flicking.esm.js @@ -0,0 +1,5059 @@ +/* +Copyright (c) 2015-present NAVER Corp. +name: @egjs/flicking +license: MIT +author: NAVER Corp. +repository: https://github.com/naver/egjs-flicking +version: 3.7.2 +*/ +import Component from '@egjs/component'; +import ImReady from '@egjs/imready'; +import Axes, { PanInput } from '@egjs/axes'; + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/* global Reflect, Promise */ +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; +} + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ +var MOVE_TYPE = { + SNAP: "snap", + FREE_SCROLL: "freeScroll" +}; +var DEFAULT_MOVE_TYPE_OPTIONS = { + snap: { + type: "snap", + count: 1 + }, + freeScroll: { + type: "freeScroll" + } +}; +var isBrowser = typeof document !== "undefined"; +/** + * Default options for creating Flicking. + * @ko 플리킹을 만들 때 사용하는 기본 옵션들 + * @private + * @memberof eg.Flicking + */ + +var DEFAULT_OPTIONS = { + classPrefix: "eg-flick", + deceleration: 0.0075, + horizontal: true, + circular: false, + infinite: false, + infiniteThreshold: 0, + lastIndex: Infinity, + threshold: 40, + duration: 100, + panelEffect: function (x) { + return 1 - Math.pow(1 - x, 3); + }, + defaultIndex: 0, + inputType: ["touch", "mouse"], + thresholdAngle: 45, + bounce: 10, + autoResize: false, + adaptive: false, + zIndex: 2000, + bound: false, + overflow: false, + hanger: "50%", + anchor: "50%", + gap: 0, + moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap, + useOffset: false, + isEqualSize: false, + isConstantSize: false, + renderOnlyVisible: false, + renderExternal: false, + resizeOnContentsReady: false, + iOSEdgeSwipeThreshold: 30, + collectStatistics: true +}; +var DEFAULT_VIEWPORT_CSS = { + position: "relative", + zIndex: DEFAULT_OPTIONS.zIndex, + overflow: "hidden" +}; +var DEFAULT_CAMERA_CSS = { + width: "100%", + height: "100%", + willChange: "transform" +}; +var DEFAULT_PANEL_CSS = { + position: "absolute" +}; +var EVENTS = { + HOLD_START: "holdStart", + HOLD_END: "holdEnd", + MOVE_START: "moveStart", + MOVE: "move", + MOVE_END: "moveEnd", + CHANGE: "change", + RESTORE: "restore", + SELECT: "select", + NEED_PANEL: "needPanel", + VISIBLE_CHANGE: "visibleChange", + CONTENT_ERROR: "contentError" +}; +var AXES_EVENTS = { + HOLD: "hold", + CHANGE: "change", + RELEASE: "release", + ANIMATION_END: "animationEnd", + FINISH: "finish" +}; +var STATE_TYPE = { + IDLE: 0, + HOLDING: 1, + DRAGGING: 2, + ANIMATING: 3, + DISABLED: 4 +}; +var DIRECTION = { + PREV: "PREV", + NEXT: "NEXT" +}; +var FLICKING_METHODS = { + prev: true, + next: true, + moveTo: true, + getIndex: true, + getAllPanels: true, + getCurrentPanel: true, + getElement: true, + getSize: true, + getPanel: true, + getPanelCount: true, + getStatus: true, + getVisiblePanels: true, + enableInput: true, + disableInput: true, + destroy: true, + resize: true, + setStatus: true, + isPlaying: true +}; // Check whether browser supports transform: translate3d +// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + +var checkTranslateSupport = function () { + var transforms = { + webkitTransform: "-webkit-transform", + msTransform: "-ms-transform", + MozTransform: "-moz-transform", + OTransform: "-o-transform", + transform: "transform" + }; + + if (!isBrowser) { + return { + name: transforms.transform, + has3d: true + }; + } + + var supportedStyle = document.documentElement.style; + var transformName = ""; + + for (var prefixedTransform in transforms) { + if (prefixedTransform in supportedStyle) { + transformName = prefixedTransform; + } + } + + if (!transformName) { + throw new Error("Browser doesn't support CSS3 2D Transforms."); + } + + var el = document.createElement("div"); + document.documentElement.insertBefore(el, null); + el.style[transformName] = "translate3d(1px, 1px, 1px)"; + var styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]); + el.parentElement.removeChild(el); + var transformInfo = { + name: transformName, + has3d: styleVal.length > 0 && styleVal !== "none" + }; + + checkTranslateSupport = function () { + return transformInfo; + }; + + return transformInfo; +}; +var TRANSFORM = checkTranslateSupport(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ +function merge(target) { + var srcs = []; + + for (var _i = 1; _i < arguments.length; _i++) { + srcs[_i - 1] = arguments[_i]; + } + + srcs.forEach(function (source) { + Object.keys(source).forEach(function (key) { + var value = source[key]; + target[key] = value; + }); + }); + return target; +} +function parseElement(element) { + if (!Array.isArray(element)) { + element = [element]; + } + + var elements = []; + element.forEach(function (el) { + if (isString(el)) { + var tempDiv = document.createElement("div"); + tempDiv.innerHTML = el; + elements.push.apply(elements, toArray(tempDiv.children)); + + while (tempDiv.firstChild) { + tempDiv.removeChild(tempDiv.firstChild); + } + } else { + elements.push(el); + } + }); + return elements; +} +function isString(value) { + return typeof value === "string"; +} // Get class list of element as string array + +function addClass(element, className) { + if (element.classList) { + element.classList.add(className); + } else { + if (!hasClass(element, className)) { + element.className = (element.className + " " + className).replace(/\s{2,}/g, " "); + } + } +} +function hasClass(element, className) { + if (element.classList) { + return element.classList.contains(className); + } else { + return element.className.split(" ").indexOf(className) >= 0; + } +} +function applyCSS(element, cssObj) { + Object.keys(cssObj).forEach(function (property) { + element.style[property] = cssObj[property]; + }); +} +function clamp(val, min, max) { + return Math.max(Math.min(val, max), min); +} // Min: inclusive, Max: exclusive + +function isBetween(val, min, max) { + return val >= min && val <= max; +} +function toArray(iterable) { + return [].slice.call(iterable); +} +function isArray(arr) { + return arr && arr.constructor === Array; +} +function parseArithmeticExpression(cssValue, base, defaultVal) { + // Set base / 2 to default value, if it's undefined + var defaultValue = defaultVal != null ? defaultVal : base / 2; + var cssRegex = /(?:(\+|\-)\s*)?(\d+(?:\.\d+)?(%|px)?)/g; + + if (typeof cssValue === "number") { + return clamp(cssValue, 0, base); + } + + var idx = 0; + var calculatedValue = 0; + var matchResult = cssRegex.exec(cssValue); + + while (matchResult != null) { + var sign = matchResult[1]; + var value = matchResult[2]; + var unit = matchResult[3]; + var parsedValue = parseFloat(value); + + if (idx <= 0) { + sign = sign || "+"; + } // Return default value for values not in good form + + + if (!sign) { + return defaultValue; + } + + if (unit === "%") { + parsedValue = parsedValue / 100 * base; + } + + calculatedValue += sign === "+" ? parsedValue : -parsedValue; // Match next occurrence + + ++idx; + matchResult = cssRegex.exec(cssValue); + } // None-matched + + + if (idx === 0) { + return defaultValue; + } // Clamp between 0 ~ base + + + return clamp(calculatedValue, 0, base); +} +function getProgress(pos, range) { + // start, anchor, end + // -1 , 0 , 1 + var min = range[0], + center = range[1], + max = range[2]; + + if (pos > center && max - center) { + // 0 ~ 1 + return (pos - center) / (max - center); + } else if (pos < center && center - min) { + // -1 ~ 0 + return (pos - center) / (center - min); + } else if (pos !== center && max - min) { + return (pos - min) / (max - min); + } + + return 0; +} +function findIndex(iterable, callback) { + for (var i = 0; i < iterable.length; i += 1) { + var element = iterable[i]; + + if (element && callback(element)) { + return i; + } + } + + return -1; +} // return [0, 1, ...., max - 1] + +function counter(max) { + var counterArray = []; + + for (var i = 0; i < max; i += 1) { + counterArray[i] = i; + } + + return counterArray; +} // Circulate number between range [min, max] + +/* + * "indexed" means min and max is not same, so if it's true "min - 1" should be max + * While if it's false, "min - 1" should be "max - 1" + * use `indexed: true` when it should be used for circulating integers like index + * or `indexed: false` when it should be used for something like positions. + */ + +function circulate(value, min, max, indexed) { + var size = indexed ? max - min + 1 : max - min; + + if (value < min) { + var offset = indexed ? (min - value - 1) % size : (min - value) % size; + value = max - offset; + } else if (value > max) { + var offset = indexed ? (value - max - 1) % size : (value - max) % size; + value = min + offset; + } + + return value; +} +function restoreStyle(element, originalStyle) { + originalStyle.className ? element.setAttribute("class", originalStyle.className) : element.removeAttribute("class"); + originalStyle.style ? element.setAttribute("style", originalStyle.style) : element.removeAttribute("style"); +} +/** + * Decorator that makes the method of flicking available in the framework. + * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터. + * @memberof eg.Flicking + * @private + * @example + * ```js + * import Flicking, { withFlickingMethods } from "@egjs/flicking"; + * + * class Flicking extends React.Component> { + * @withFlickingMethods + * private flicking: Flicking; + * } + * ``` + */ + +function withFlickingMethods(prototype, flickingName) { + Object.keys(FLICKING_METHODS).forEach(function (name) { + if (prototype[name]) { + return; + } + + prototype[name] = function () { + var _a; + + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var result = (_a = this[flickingName])[name].apply(_a, args); // fix `this` type to return your own `flicking` instance to the instance using the decorator. + + + if (result === this[flickingName]) { + return this; + } else { + return result; + } + }; + }); +} +function getBbox(element, useOffset) { + var bbox; + + if (useOffset) { + bbox = { + x: 0, + y: 0, + width: element.offsetWidth, + height: element.offsetHeight + }; + } else { + var clientRect = element.getBoundingClientRect(); + bbox = { + x: clientRect.left, + y: clientRect.top, + width: clientRect.width, + height: clientRect.height + }; + } + + return bbox; +} + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var Panel = +/*#__PURE__*/ +function () { + function Panel(element, index, viewport) { + this.viewport = viewport; + this.prevSibling = null; + this.nextSibling = null; + this.clonedPanels = []; + this.state = { + index: index, + position: 0, + relativeAnchorPosition: 0, + size: 0, + isClone: false, + isVirtual: false, + cloneIndex: -1, + originalStyle: { + className: "", + style: "" + }, + cachedBbox: null + }; + this.setElement(element); + } + + var __proto = Panel.prototype; + + __proto.resize = function (givenBbox) { + var state = this.state; + var options = this.viewport.options; + var bbox = givenBbox ? givenBbox : this.getBbox(); + this.state.cachedBbox = bbox; + var prevSize = state.size; + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size); + } + + if (!state.isClone) { + this.clonedPanels.forEach(function (panel) { + var cloneState = panel.state; + cloneState.size = state.size; + cloneState.cachedBbox = state.cachedBbox; + cloneState.relativeAnchorPosition = state.relativeAnchorPosition; + }); + } + }; + + __proto.unCacheBbox = function () { + this.state.cachedBbox = null; + }; + + __proto.getProgress = function () { + var viewport = this.viewport; + var options = viewport.options; + var panelCount = viewport.panelManager.getPanelCount(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex(); + var progress = relativeIndex - viewport.getCurrentProgress(); + return progress; + }; + + __proto.getOutsetProgress = function () { + var viewport = this.viewport; + var outsetRange = [-this.getSize(), viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(), viewport.getSize()]; + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var outsetProgress = getProgress(relativePanelPosition, outsetRange); + return outsetProgress; + }; + + __proto.getVisibleRatio = function () { + var viewport = this.viewport; + var panelSize = this.getSize(); + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var rightRelativePanelPosition = relativePanelPosition + panelSize; + var visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0); + var visibleRatio = visibleSize >= 0 ? visibleSize / panelSize : 0; + return visibleRatio; + }; + + __proto.focus = function (duration) { + var viewport = this.viewport; + var currentPanel = viewport.getCurrentPanel(); + var hangerPosition = viewport.getHangerPosition(); + var anchorPosition = this.getAnchorPosition(); + + if (hangerPosition === anchorPosition || !currentPanel) { + return; + } + + var currentPosition = currentPanel.getPosition(); + var eventType = currentPosition === this.getPosition() ? "" : EVENTS.CHANGE; + viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration); + }; + + __proto.update = function (updateFunction, shouldResize) { + if (updateFunction === void 0) { + updateFunction = null; + } + + if (shouldResize === void 0) { + shouldResize = true; + } + + var identicalPanels = this.getIdenticalPanels(); + + if (updateFunction) { + identicalPanels.forEach(function (eachPanel) { + updateFunction(eachPanel.getElement()); + }); + } + + if (shouldResize) { + identicalPanels.forEach(function (eachPanel) { + eachPanel.unCacheBbox(); + }); + this.viewport.addVisiblePanel(this); + this.viewport.resize(); + } + }; + + __proto.prev = function () { + var viewport = this.viewport; + var options = viewport.options; + var prevSibling = this.prevSibling; + + if (!prevSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var prevPanelIndex = prevSibling.getIndex(); + var prevPanelPosition = prevSibling.getPosition(); + var prevPanelSize = prevSibling.getSize(); + var hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1; + var notYetMinPanel = options.infinite && currentIndex > 0 && prevPanelIndex > currentIndex; + + if (hasEmptyPanelBetween || notYetMinPanel) { + // Empty panel exists between + return null; + } + + var newPosition = currentPosition - prevPanelSize - options.gap; + var prevPanel = prevSibling; + + if (prevPanelPosition !== newPosition) { + prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true); + prevPanel.setPosition(newPosition); + } + + return prevPanel; + }; + + __proto.next = function () { + var viewport = this.viewport; + var options = viewport.options; + var nextSibling = this.nextSibling; + var lastIndex = viewport.panelManager.getLastIndex(); + + if (!nextSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var nextPanelIndex = nextSibling.getIndex(); + var nextPanelPosition = nextSibling.getPosition(); + var hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1; + var notYetMaxPanel = options.infinite && currentIndex < lastIndex && nextPanelIndex < currentIndex; + + if (hasEmptyPanelBetween || notYetMaxPanel) { + return null; + } + + var newPosition = currentPosition + this.getSize() + options.gap; + var nextPanel = nextSibling; + + if (nextPanelPosition !== newPosition) { + nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true); + nextPanel.setPosition(newPosition); + } + + return nextPanel; + }; + + __proto.insertBefore = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var firstPanel = viewport.panelManager.firstPanel(); + var prevSibling = this.prevSibling; // Finding correct inserting index + // While it should insert removing empty spaces, + // It also should have to be bigger than prevSibling' s index + + var targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex() ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length) : Math.max(this.getIndex() - parsedElements.length, 0); + return viewport.insert(targetIndex, parsedElements); + }; + + __proto.insertAfter = function (element) { + return this.viewport.insert(this.getIndex() + 1, element); + }; + + __proto.remove = function () { + this.viewport.remove(this.getIndex()); + return this; + }; + + __proto.destroy = function (option) { + if (!option.preserveUI) { + var originalStyle = this.state.originalStyle; + restoreStyle(this.element, originalStyle); + } // release resources + + + for (var x in this) { + this[x] = null; + } + }; + + __proto.getElement = function () { + return this.element; + }; + + __proto.getAnchorPosition = function () { + return this.state.position + this.state.relativeAnchorPosition; + }; + + __proto.getRelativeAnchorPosition = function () { + return this.state.relativeAnchorPosition; + }; + + __proto.getIndex = function () { + return this.state.index; + }; + + __proto.getPosition = function () { + return this.state.position; + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getBbox = function () { + var state = this.state; + var viewport = this.viewport; + var element = this.element; + var options = viewport.options; + + if (!element) { + state.cachedBbox = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } else if (!state.cachedBbox) { + var wasVisible = Boolean(element.parentNode); + var cameraElement = viewport.getCameraElement(); + + if (!wasVisible) { + cameraElement.appendChild(element); + viewport.addVisiblePanel(this); + } + + state.cachedBbox = getBbox(element, options.useOffset); + + if (!wasVisible && viewport.options.renderExternal) { + cameraElement.removeChild(element); + } + } + + return state.cachedBbox; + }; + + __proto.isClone = function () { + return this.state.isClone; + }; + + __proto.getOverlappedClass = function (classes) { + var element = this.element; + + for (var _i = 0, classes_1 = classes; _i < classes_1.length; _i++) { + var className = classes_1[_i]; + + if (hasClass(element, className)) { + return className; + } + } + }; + + __proto.getCloneIndex = function () { + return this.state.cloneIndex; + }; + + __proto.getClonedPanels = function () { + var state = this.state; + return state.isClone ? this.original.getClonedPanels() : this.clonedPanels; + }; + + __proto.getIdenticalPanels = function () { + var state = this.state; + return state.isClone ? this.original.getIdenticalPanels() : __spreadArrays([this], this.clonedPanels); + }; + + __proto.getOriginalPanel = function () { + return this.state.isClone ? this.original : this; + }; + + __proto.setIndex = function (index) { + var state = this.state; + state.index = index; + this.clonedPanels.forEach(function (panel) { + return panel.state.index = index; + }); + }; + + __proto.setPosition = function (pos) { + this.state.position = pos; + return this; + }; + + __proto.setPositionCSS = function (offset) { + if (offset === void 0) { + offset = 0; + } + + if (!this.element) { + return; + } + + var state = this.state; + var pos = state.position; + var options = this.viewport.options; + var elementStyle = this.element.style; + var currentElementStyle = options.horizontal ? elementStyle.left : elementStyle.top; + var styleToApply = pos - offset + "px"; + + if (!state.isVirtual && currentElementStyle !== styleToApply) { + options.horizontal ? elementStyle.left = styleToApply : elementStyle.top = styleToApply; + } + }; + + __proto.clone = function (cloneIndex, isVirtual, element) { + if (isVirtual === void 0) { + isVirtual = false; + } + + var state = this.state; + var viewport = this.viewport; + var cloneElement = element; + + if (!cloneElement && this.element) { + cloneElement = isVirtual ? this.element : this.element.cloneNode(true); + } + + var clonedPanel = new Panel(cloneElement, state.index, viewport); + var clonedState = clonedPanel.state; + clonedPanel.original = state.isClone ? this.original : this; + clonedState.isClone = true; + clonedState.isVirtual = isVirtual; + clonedState.cloneIndex = cloneIndex; // Inherit some state values + + clonedState.size = state.size; + clonedState.relativeAnchorPosition = state.relativeAnchorPosition; + clonedState.originalStyle = state.originalStyle; + clonedState.cachedBbox = state.cachedBbox; + + if (!isVirtual) { + this.clonedPanels.push(clonedPanel); + } else { + clonedPanel.prevSibling = this.prevSibling; + clonedPanel.nextSibling = this.nextSibling; + } + + return clonedPanel; + }; + + __proto.removeElement = function () { + if (!this.viewport.options.renderExternal) { + var element = this.element; + element.parentNode && element.parentNode.removeChild(element); + } // Do the same thing for clones + + + if (!this.state.isClone) { + this.removeClonedPanelsAfter(0); + } + }; + + __proto.removeClonedPanelsAfter = function (start) { + var options = this.viewport.options; + var removingPanels = this.clonedPanels.splice(start); + + if (!options.renderExternal) { + removingPanels.forEach(function (panel) { + panel.removeElement(); + }); + } + }; + + __proto.setElement = function (element) { + if (!element) { + return; + } + + var currentElement = this.element; + + if (element !== currentElement) { + var options = this.viewport.options; + + if (currentElement) { + if (options.horizontal) { + element.style.left = currentElement.style.left; + } else { + element.style.top = currentElement.style.top; + } + } else { + var originalStyle = this.state.originalStyle; + originalStyle.className = element.getAttribute("class"); + originalStyle.style = element.getAttribute("style"); + } + + this.element = element; + + if (options.classPrefix) { + addClass(element, options.classPrefix + "-panel"); + } // Update size info after applying panel css + + + applyCSS(this.element, DEFAULT_PANEL_CSS); + } + }; + + return Panel; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var PanelManager = +/*#__PURE__*/ +function () { + function PanelManager(cameraElement, options) { + this.cameraElement = cameraElement; + this.panels = []; + this.clones = []; + this.range = { + min: -1, + max: -1 + }; + this.length = 0; + this.cloneCount = 0; + this.options = options; + this.lastIndex = options.lastIndex; + } + + var __proto = PanelManager.prototype; + + __proto.firstPanel = function () { + return this.panels[this.range.min]; + }; + + __proto.lastPanel = function () { + return this.panels[this.range.max]; + }; + + __proto.allPanels = function () { + return __spreadArrays(this.panels, this.clones.reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, [])); + }; + + __proto.originalPanels = function () { + return this.panels; + }; + + __proto.clonedPanels = function () { + return this.clones; + }; + + __proto.replacePanels = function (newPanels, newClones) { + this.panels = newPanels; + this.clones = newClones; + this.range = { + min: findIndex(newPanels, function (panel) { + return Boolean(panel); + }), + max: newPanels.length - 1 + }; + this.length = newPanels.filter(function (panel) { + return Boolean(panel); + }).length; + }; + + __proto.has = function (index) { + return !!this.panels[index]; + }; + + __proto.get = function (index) { + return this.panels[index]; + }; + + __proto.getPanelCount = function () { + return this.length; + }; + + __proto.getLastIndex = function () { + return this.lastIndex; + }; + + __proto.getRange = function () { + return this.range; + }; + + __proto.getCloneCount = function () { + return this.cloneCount; + }; + + __proto.setLastIndex = function (lastIndex) { + this.lastIndex = lastIndex; + var firstPanel = this.firstPanel(); + var lastPanel = this.lastPanel(); + + if (!firstPanel || !lastPanel) { + return; // no meaning of updating range & length + } // Remove panels above new last index + + + var range = this.range; + + if (lastPanel.getIndex() > lastIndex) { + var removingPanels = this.panels.splice(lastIndex + 1); + this.length -= removingPanels.length; + var firstRemovedPanel = removingPanels.filter(function (panel) { + return !!panel; + })[0]; + var possibleLastPanel = firstRemovedPanel.prevSibling; + + if (possibleLastPanel) { + range.max = possibleLastPanel.getIndex(); + } else { + range.min = -1; + range.max = -1; + } + + if (this.shouldRender()) { + removingPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + }; + + __proto.setCloneCount = function (cloneCount) { + this.cloneCount = cloneCount; + }; // Insert at index + // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it + + + __proto.insert = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var isCircular = this.options.circular; + var lastIndex = this.lastIndex; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + var pushedIndex = newPanels.length; // Like when setting index 50 while visible panels are 0, 1, 2 + + if (index > range.max) { + newPanels.forEach(function (panel, offset) { + panels[index + offset] = panel; + }); + } else { + var panelsAfterIndex = panels.slice(index, index + newPanels.length); // Find empty from beginning + + var emptyPanelCount = findIndex(panelsAfterIndex, function (panel) { + return !!panel; + }); + + if (emptyPanelCount < 0) { + // All empty + emptyPanelCount = panelsAfterIndex.length; + } + + pushedIndex = newPanels.length - emptyPanelCount; // Insert removing empty panels + + panels.splice.apply(panels, __spreadArrays([index, emptyPanelCount], newPanels)); // Remove panels after last index + + if (panels.length > lastIndex + 1) { + var removedPanels = panels.splice(lastIndex + 1).filter(function (panel) { + return Boolean(panel); + }); + this.length -= removedPanels.length; // Find first + + var newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), function (panel) { + return !!panel; + }); // Can be filled with empty after newLastIndex + + this.panels.splice(newLastIndex + 1); + this.range.max = newLastIndex; + + if (this.shouldRender()) { + removedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + } // Update index of previous panels + + + if (pushedIndex > 0) { + panels.slice(index + newPanels.length).forEach(function (panel) { + panel.setIndex(panel.getIndex() + pushedIndex); + }); + } // Update state + + + this.length += newPanels.length; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling); + var clones = this.clones; + var panelCount_1 = this.panels.length; + + if (clones[0] && clones[0].length > lastIndex + 1) { + clones.forEach(function (cloneSet) { + cloneSet.splice(panelCount_1); + }); + } + } + + return pushedIndex; + }; + + __proto.replace = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var options = this.options; + var isCircular = options.circular; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index + newPanels.length); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + + if (index > range.max) { + // Temporarily insert null at index to use splice() + panels[index] = null; + } + + var replacedPanels = panels.splice.apply(panels, __spreadArrays([index, newPanels.length], newPanels)); + var wasNonEmptyCount = replacedPanels.filter(function (panel) { + return Boolean(panel); + }).length; // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1] + // So length should be increased by 3(inserting panels) - 1(non-empty panels) + + this.length += newPanels.length - wasNonEmptyCount; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length, nextSibling); + } + + if (this.shouldRender()) { + replacedPanels.forEach(function (panel) { + return panel && panel.removeElement(); + }); + } + + return replacedPanels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var isCircular = this.options.circular; + var panels = this.panels; + var clones = this.clones; // Delete count should be equal or larger than 0 + + deleteCount = Math.max(deleteCount, 0); + var deletedPanels = panels.splice(index, deleteCount).filter(function (panel) { + return !!panel; + }); + + if (this.shouldRender()) { + deletedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(index, deleteCount); + }); + } // Update indexes + + + panels.slice(index).forEach(function (panel) { + panel.setIndex(panel.getIndex() - deleteCount); + }); // Check last panel is empty + + var lastIndex = panels.length - 1; + + if (!panels[lastIndex]) { + var reversedPanels = panels.concat().reverse(); + var nonEmptyIndexFromLast = findIndex(reversedPanels, function (panel) { + return !!panel; + }); + lastIndex = nonEmptyIndexFromLast < 0 ? -1 // All empty + : lastIndex - nonEmptyIndexFromLast; // Remove all empty panels from last + + panels.splice(lastIndex + 1); + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(lastIndex + 1); + }); + } + } // Update range & length + + + this.range = { + min: findIndex(panels, function (panel) { + return !!panel; + }), + max: lastIndex + }; + this.length -= deletedPanels.length; + + if (this.length <= 0) { + // Reset clones + this.clones = []; + this.cloneCount = 0; + } + + return deletedPanels; + }; + + __proto.chainAllPanels = function () { + var allPanels = this.allPanels().filter(function (panel) { + return !!panel; + }); + var allPanelsCount = allPanels.length; + + if (allPanelsCount <= 1) { + return; + } + + allPanels.slice(1, allPanels.length - 1).forEach(function (panel, idx) { + var prevPanel = allPanels[idx]; + var nextPanel = allPanels[idx + 2]; + panel.prevSibling = prevPanel; + panel.nextSibling = nextPanel; + }); + var firstPanel = allPanels[0]; + var lastPanel = allPanels[allPanelsCount - 1]; + firstPanel.prevSibling = null; + firstPanel.nextSibling = allPanels[1]; + lastPanel.prevSibling = allPanels[allPanelsCount - 2]; + lastPanel.nextSibling = null; + + if (this.options.circular) { + firstPanel.prevSibling = lastPanel; + lastPanel.nextSibling = firstPanel; + } + }; + + __proto.insertClones = function (cloneIndex, index, clonedPanels, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 0; + } + + var clones = this.clones; + var lastIndex = this.lastIndex; + + if (!clones[cloneIndex]) { + var newClones_1 = []; + clonedPanels.forEach(function (panel, offset) { + newClones_1[index + offset] = panel; + }); + clones[cloneIndex] = newClones_1; + } else { + var insertTarget_1 = clones[cloneIndex]; + + if (index >= insertTarget_1.length) { + clonedPanels.forEach(function (panel, offset) { + insertTarget_1[index + offset] = panel; + }); + } else { + insertTarget_1.splice.apply(insertTarget_1, __spreadArrays([index, deleteCount], clonedPanels)); // Remove panels after last index + + if (clonedPanels.length > lastIndex + 1) { + clonedPanels.splice(lastIndex + 1); + } + } + } + }; // clones are operating in set + + + __proto.removeClonesAfter = function (cloneIndex) { + var panels = this.panels; + panels.forEach(function (panel) { + panel.removeClonedPanelsAfter(cloneIndex); + }); + this.clones.splice(cloneIndex); + }; + + __proto.findPanelOf = function (element) { + var allPanels = this.allPanels(); + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var panelElement = panel.getElement(); + + if (panelElement.contains(element)) { + return panel; + } + } + }; + + __proto.findFirstPanelFrom = function (index) { + for (var _i = 0, _a = this.panels.slice(index); _i < _a.length; _i++) { + var panel = _a[_i]; + + if (panel && panel.getIndex() >= index && panel.getElement().parentNode) { + return panel; + } + } + }; + + __proto.addNewClones = function (index, originalPanels, deleteCount, nextSibling) { + var _this = this; + + var cameraElement = this.cameraElement; + var cloneCount = this.getCloneCount(); + var lastPanel = this.lastPanel(); + var lastPanelClones = lastPanel ? lastPanel.getClonedPanels() : []; + var nextSiblingClones = nextSibling ? nextSibling.getClonedPanels() : []; + + var _loop_1 = function (cloneIndex) { + var cloneNextSibling = nextSiblingClones[cloneIndex]; + var lastPanelSibling = lastPanelClones[cloneIndex]; + var cloneSiblingElement = cloneNextSibling ? cloneNextSibling.getElement() : lastPanelSibling ? lastPanelSibling.getElement().nextElementSibling : null; + var newClones = originalPanels.map(function (panel) { + var clone = panel.clone(cloneIndex); + + if (_this.shouldRender()) { + cameraElement.insertBefore(clone.getElement(), cloneSiblingElement); + } + + return clone; + }); + this_1.insertClones(cloneIndex, index, newClones, deleteCount); + }; + + var this_1 = this; + + for (var _i = 0, _a = counter(cloneCount); _i < _a.length; _i++) { + var cloneIndex = _a[_i]; + + _loop_1(cloneIndex); + } + }; + + __proto.updateIndex = function (insertingIndex) { + var panels = this.panels; + var range = this.range; + var newLastIndex = panels.length - 1; + + if (newLastIndex > range.max) { + range.max = newLastIndex; + } + + if (insertingIndex < range.min || range.min < 0) { + range.min = insertingIndex; + } + }; + + __proto.insertNewPanels = function (newPanels, siblingElement) { + if (this.shouldRender()) { + var fragment_1 = document.createDocumentFragment(); + newPanels.forEach(function (panel) { + return fragment_1.appendChild(panel.getElement()); + }); + this.cameraElement.insertBefore(fragment_1, siblingElement); + } + }; + + __proto.shouldRender = function () { + var options = this.options; + return !options.renderExternal && !options.renderOnlyVisible; + }; + + return PanelManager; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ +var State = +/*#__PURE__*/ +function () { + function State() { + this.delta = 0; + this.direction = null; + this.targetPanel = null; + this.lastPosition = 0; + } + + var __proto = State.prototype; + + __proto.onEnter = function (prevState) { + this.delta = prevState.delta; + this.direction = prevState.direction; + this.targetPanel = prevState.targetPanel; + this.lastPosition = prevState.lastPosition; + }; + + __proto.onExit = function (nextState) {// DO NOTHING + }; + + __proto.onHold = function (e, context) {// DO NOTHING + }; + + __proto.onChange = function (e, context) {// DO NOTHING + }; + + __proto.onRelease = function (e, context) {// DO NOTHING + }; + + __proto.onAnimationEnd = function (e, context) {// DO NOTHING + }; + + __proto.onFinish = function (e, context) {// DO NOTHING + }; + + return State; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var IdleState = +/*#__PURE__*/ +function (_super) { + __extends(IdleState, _super); + + function IdleState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.IDLE; + _this.holding = false; + _this.playing = false; + return _this; + } + + var __proto = IdleState.prototype; + + __proto.onEnter = function () { + this.direction = null; + this.targetPanel = null; + this.delta = 0; + this.lastPosition = 0; + }; + + __proto.onHold = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Shouldn't do any action until any panels on flicking area + + if (flicking.getPanelCount() <= 0) { + if (viewport.options.infinite) { + viewport.moveCamera(viewport.getCameraPosition(), e); + } + + transitTo(STATE_TYPE.DISABLED); + return; + } + + this.lastPosition = viewport.getCameraPosition(); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.HOLDING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; // By methods call + + + __proto.onChange = function (e, context) { + var triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.MOVE_START, e, false).onSuccess(function () { + // Trigger AnimatingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.ANIMATING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + return IdleState; +}(State); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var HoldingState = +/*#__PURE__*/ +function (_super) { + __extends(HoldingState, _super); + + function HoldingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.HOLDING; + _this.holding = true; + _this.playing = true; + _this.releaseEvent = null; + return _this; + } + + var __proto = HoldingState.prototype; + + __proto.onChange = function (e, context) { + var flicking = context.flicking, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + var offset = flicking.options.horizontal ? e.inputEvent.offsetX : e.inputEvent.offsetY; + this.direction = offset < 0 ? DIRECTION.NEXT : DIRECTION.PREV; + triggerEvent(EVENTS.MOVE_START, e, true).onSuccess(function () { + // Trigger DraggingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.DRAGGING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.HOLD_END, e, true); + + if (e.delta.flick !== 0) { + // Sometimes "release" event on axes triggered before "change" event + // Especially if user flicked panel fast in really short amount of time + // if delta is not zero, that means above case happened. + // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END + // At least one move event should be included between holdStart and holdEnd + e.setTo({ + flick: viewport.getCameraPosition() + }, 0); + transitTo(STATE_TYPE.IDLE); + return; + } // Can't handle select event here, + // As "finish" axes event happens + + + this.releaseEvent = e; + }; + + __proto.onFinish = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Should transite to IDLE state before select event + // As user expects hold is already finished + + transitTo(STATE_TYPE.IDLE); + + if (!this.releaseEvent) { + return; + } // Handle release event here + // To prevent finish event called twice + + + var releaseEvent = this.releaseEvent; // Static click + + var srcEvent = releaseEvent.inputEvent.srcEvent; + var clickedElement; + + if (srcEvent.type === "touchend") { + var touchEvent = srcEvent; + var touch = touchEvent.changedTouches[0]; + clickedElement = document.elementFromPoint(touch.clientX, touch.clientY); + } else { + clickedElement = srcEvent.target; + } + + var clickedPanel = viewport.panelManager.findPanelOf(clickedElement); + var cameraPosition = viewport.getCameraPosition(); + + if (clickedPanel) { + var clickedPanelPosition = clickedPanel.getPosition(); + var direction = clickedPanelPosition > cameraPosition ? DIRECTION.NEXT : clickedPanelPosition < cameraPosition ? DIRECTION.PREV : null; // Don't provide axes event, to use axes instance instead + + triggerEvent(EVENTS.SELECT, null, true, { + direction: direction, + index: clickedPanel.getIndex(), + panel: clickedPanel + }); + } + }; + + return HoldingState; +}(State); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var DraggingState = +/*#__PURE__*/ +function (_super) { + __extends(DraggingState, _super); + + function DraggingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DRAGGING; + _this.holding = true; + _this.playing = true; + return _this; + } + + var __proto = DraggingState.prototype; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var flicking = context.flicking, + viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo, + stopCamera = context.stopCamera; + var delta = this.delta; + var absDelta = Math.abs(delta); + var options = flicking.options; + var horizontal = options.horizontal; + var moveType = viewport.moveType; + var inputEvent = e.inputEvent; + var velocity = horizontal ? inputEvent.velocityX : inputEvent.velocityY; + var inputDelta = horizontal ? inputEvent.deltaX : inputEvent.deltaY; + var isNextDirection = Math.abs(velocity) > 1 ? velocity < 0 : absDelta > 0 ? delta > 0 : inputDelta < 0; + var swipeDistance = viewport.options.bound ? Math.max(absDelta, Math.abs(inputDelta)) : absDelta; + var swipeAngle = inputEvent.deltaX ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI) : 90; + var belowAngleThreshold = horizontal ? swipeAngle <= options.thresholdAngle : swipeAngle > options.thresholdAngle; + var overThreshold = swipeDistance >= options.threshold && belowAngleThreshold; + var moveTypeContext = { + viewport: viewport, + axesEvent: e, + state: this, + swipeDistance: swipeDistance, + isNextDirection: isNextDirection + }; // Update last position to cope with Axes's animating behavior + // Axes uses start position when animation start + + triggerEvent(EVENTS.HOLD_END, e, true); + var targetPanel = this.targetPanel; + + if (!overThreshold && targetPanel) { + // Interrupted while animating + var interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext); + viewport.moveTo(interruptDestInfo.panel, interruptDestInfo.destPos, interruptDestInfo.eventType, e, interruptDestInfo.duration); + transitTo(STATE_TYPE.ANIMATING); + return; + } + + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + + if (!currentPanel || !nearestPanel) { + // There're no panels + e.stop(); + transitTo(STATE_TYPE.IDLE); + return; + } + + var destInfo = overThreshold ? moveType.findTargetPanel(moveTypeContext) : moveType.findRestorePanel(moveTypeContext); + viewport.moveTo(destInfo.panel, destInfo.destPos, destInfo.eventType, e, destInfo.duration).onSuccess(function () { + transitTo(STATE_TYPE.ANIMATING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + stopCamera(e); + }); + }; + + return DraggingState; +}(State); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var AnimatingState = +/*#__PURE__*/ +function (_super) { + __extends(AnimatingState, _super); + + function AnimatingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.ANIMATING; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = AnimatingState.prototype; + + __proto.onHold = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var options = viewport.options; + var scrollArea = viewport.getScrollArea(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize); + var targetPanel = this.targetPanel; + + if (options.circular && loopCount !== 0 && targetPanel) { + var cloneCount = viewport.panelManager.getCloneCount(); + var originalTargetPosition = targetPanel.getPosition(); // cloneIndex is from -1 to cloneCount - 1 + + var newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true); + var newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize; + var newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true); // Set new target panel considering looped count + + newTargetPanel.setPosition(newTargetPosition); + this.targetPanel = newTargetPanel; + } // Reset last position and delta + + + this.delta = 0; + this.lastPosition = viewport.getCameraPosition(); // Update current panel as current nearest panel + + viewport.setCurrentPanel(viewport.getNearestPanel()); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.DRAGGING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onFinish = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var isTrusted = e && e.isTrusted; + viewport.options.bound ? viewport.setCurrentPanel(this.targetPanel) : viewport.setCurrentPanel(viewport.getNearestPanel()); + + if (flicking.options.adaptive) { + viewport.updateAdaptiveSize(); + } + + transitTo(STATE_TYPE.IDLE); + viewport.updateCameraPosition(); + triggerEvent(EVENTS.MOVE_END, e, isTrusted, { + direction: this.direction + }); + }; + + return AnimatingState; +}(State); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var DisabledState = +/*#__PURE__*/ +function (_super) { + __extends(DisabledState, _super); + + function DisabledState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DISABLED; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = DisabledState.prototype; + + __proto.onAnimationEnd = function (e, _a) { + var transitTo = _a.transitTo; + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onChange = function (e, _a) { + var viewport = _a.viewport, + transitTo = _a.transitTo; // Can stop Axes's change event + + e.stop(); // Should update axes position as it's already changed at this moment + + viewport.updateAxesPosition(viewport.getCameraPosition()); + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onRelease = function (e, _a) { + var transitTo = _a.transitTo; // This is needed when stopped hold start event + + if (e.delta.flick === 0) { + transitTo(STATE_TYPE.IDLE); + } + }; + + return DisabledState; +}(State); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var StateMachine = +/*#__PURE__*/ +function () { + function StateMachine() { + var _this = this; + + this.state = new IdleState(); + + this.transitTo = function (nextStateType) { + var currentState = _this.state; + + if (currentState.type !== nextStateType) { + var nextState = void 0; + + switch (nextStateType) { + case STATE_TYPE.IDLE: + nextState = new IdleState(); + break; + + case STATE_TYPE.HOLDING: + nextState = new HoldingState(); + break; + + case STATE_TYPE.DRAGGING: + nextState = new DraggingState(); + break; + + case STATE_TYPE.ANIMATING: + nextState = new AnimatingState(); + break; + + case STATE_TYPE.DISABLED: + nextState = new DisabledState(); + break; + } + + currentState.onExit(nextState); + nextState.onEnter(currentState); + _this.state = nextState; + } + + return _this.state; + }; + } + + var __proto = StateMachine.prototype; + + __proto.fire = function (eventType, e, context) { + var currentState = this.state; + + switch (eventType) { + case AXES_EVENTS.HOLD: + currentState.onHold(e, context); + break; + + case AXES_EVENTS.CHANGE: + currentState.onChange(e, context); + break; + + case AXES_EVENTS.RELEASE: + currentState.onRelease(e, context); + break; + + case AXES_EVENTS.ANIMATION_END: + currentState.onAnimationEnd(e, context); + break; + + case AXES_EVENTS.FINISH: + currentState.onFinish(e, context); + break; + } + }; + + __proto.getState = function () { + return this.state; + }; + + return StateMachine; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var MoveType = +/*#__PURE__*/ +function () { + function MoveType() {} + + var __proto = MoveType.prototype; + + __proto.is = function (type) { + return type === this.type; + }; + + __proto.findRestorePanel = function (ctx) { + var viewport = ctx.viewport; + var options = viewport.options; + var panel = options.circular ? this.findRestorePanelInCircularMode(ctx) : viewport.getCurrentPanel(); + return { + panel: panel, + destPos: viewport.findEstimatedPosition(panel), + duration: options.duration, + eventType: EVENTS.RESTORE + }; + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var state = ctx.state, + viewport = ctx.viewport; + var targetPanel = state.targetPanel; + return { + panel: targetPanel, + destPos: viewport.findEstimatedPosition(targetPanel), + duration: viewport.options.duration, + eventType: "" + }; + }; // Calculate minimum distance to "change" panel + + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var relativeAnchorPosition = currentPanel.getRelativeAnchorPosition(); // Minimum distance needed to decide prev/next panel as nearest + + /* + * | Prev | Next | + * |--------|--------------| + * [][ |<-Anchor ][] <- Panel + Half-Gap + */ + + var minimumDistanceToChange = isNextDirection ? currentPanel.getSize() - relativeAnchorPosition + halfGap : relativeAnchorPosition + halfGap; + minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold); + return minimumDistanceToChange; + }; + + __proto.findRestorePanelInCircularMode = function (ctx) { + var viewport = ctx.viewport; + var originalPanel = viewport.getCurrentPanel().getOriginalPanel(); + var hangerPosition = viewport.getHangerPosition(); + var firstClonedPanel = originalPanel.getIdenticalPanels()[1]; + var lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); + return !ctx.isNextDirection && lapped ? firstClonedPanel : originalPanel; + }; + + return MoveType; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var Snap = +/*#__PURE__*/ +function (_super) { + __extends(Snap, _super); + + function Snap(count) { + var _this = _super.call(this) || this; + + _this.type = MOVE_TYPE.SNAP; + _this.count = count; + return _this; + } + + var __proto = Snap.prototype; + + __proto.findTargetPanel = function (ctx) { + var viewport = ctx.viewport, + axesEvent = ctx.axesEvent, + swipeDistance = ctx.swipeDistance; + var snapCount = this.count; + var eventDelta = Math.abs(axesEvent.delta.flick); + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex(); // This can happen when bounce is 0 + + var shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent; + var shouldMoveToAdjacent = !viewport.isOutOfBound() && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0); + + if (snapCount > 1 && eventDelta > minimumDistanceToChange) { + return this.findSnappedPanel(ctx); + } else if (shouldMoveToAdjacent) { + return this.findAdjacentPanel(ctx); + } else { + return { + panel: nearestPanel, + duration: viewport.options.duration, + destPos: viewport.findEstimatedPosition(nearestPanel), + // As swipeDistance holds mouse/touch position change regardless of bounce option value + // swipDistance > minimumDistanceToChange can happen in bounce area + // Second condition is for handling that. + eventType: swipeDistance <= minimumDistanceToChange || viewport.isOutOfBound() && nearestIsCurrent ? EVENTS.RESTORE : EVENTS.CHANGE + }; + } + }; + + __proto.findSnappedPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + viewport = ctx.viewport, + state = ctx.state, + isNextDirection = ctx.isNextDirection; + var eventDelta = Math.abs(axesEvent.delta.flick); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var snapCount = this.count; + var options = viewport.options; + var scrollAreaSize = viewport.getScrollAreaSize(); + var halfGap = options.gap / 2; + var estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition(); + var panelToMove = viewport.getNearestPanel(); + var cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone) + + var passedPanelCount = 0; + + while (passedPanelCount < snapCount) { + // Since panelToMove holds also cloned panels, we should use original panel's position + var originalPanel = panelToMove.getOriginalPanel(); + var panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize; + var panelSize = originalPanel.getSize(); + var panelNextPosition = panelPosition + panelSize + halfGap; + var panelPrevPosition = panelPosition - halfGap; // Current panelToMove contains destPos + + if (isNextDirection && panelNextPosition > estimatedHangerPos || !isNextDirection && panelPrevPosition < estimatedHangerPos) { + break; + } + + var siblingPanel = isNextDirection ? panelToMove.nextSibling : panelToMove.prevSibling; + + if (!siblingPanel) { + break; + } + + var panelIndex = panelToMove.getIndex(); + var siblingIndex = siblingPanel.getIndex(); + + if (isNextDirection && siblingIndex <= panelIndex || !isNextDirection && siblingIndex >= panelIndex) { + cycleIndex = isNextDirection ? cycleIndex + 1 : cycleIndex - 1; + } + + panelToMove = siblingPanel; + passedPanelCount += 1; + } + + var originalPosition = panelToMove.getOriginalPanel().getPosition(); + + if (cycleIndex !== 0) { + panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true); + panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize); + } + + var defaultDuration = viewport.options.duration; + var duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount); + return { + panel: panelToMove, + destPos: viewport.findEstimatedPosition(panelToMove), + duration: duration, + eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange ? EVENTS.CHANGE : EVENTS.RESTORE + }; + }; + + __proto.findAdjacentPanel = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentIndex = viewport.getCurrentIndex(); + var currentPanel = viewport.panelManager.get(currentIndex); + var hangerPosition = viewport.getHangerPosition(); + var scrollArea = viewport.getScrollArea(); + var firstClonedPanel = currentPanel.getIdenticalPanels()[1]; + var lapped = options.circular && Math.abs(currentPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); // If lapped in circular mode, use first cloned panel as base panel + + var basePanel = lapped ? firstClonedPanel : currentPanel; + var basePosition = basePanel.getPosition(); + var adjacentPanel = isNextDirection ? basePanel.nextSibling : basePanel.prevSibling; + var eventType = adjacentPanel ? EVENTS.CHANGE : EVENTS.RESTORE; + var panelToMove = adjacentPanel ? adjacentPanel : basePanel; + var targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition(); + var estimatedPanelPosition = options.circular ? isNextDirection ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap : panelToMove.getAnchorPosition(); + var estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition(); + var destPos = viewport.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return { + panel: panelToMove, + destPos: destPos, + duration: options.duration, + eventType: eventType + }; + }; + + return Snap; +}(MoveType); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + +var FreeScroll = +/*#__PURE__*/ +function (_super) { + __extends(FreeScroll, _super); + + function FreeScroll() { + var _this = // Set snap count to Infinity + _super.call(this, Infinity) || this; + + _this.type = MOVE_TYPE.FREE_SCROLL; + return _this; + } + + var __proto = FreeScroll.prototype; + + __proto.findTargetPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + state = ctx.state, + viewport = ctx.viewport; + var destPos = axesEvent.destPos.flick; + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var scrollArea = viewport.getScrollArea(); + var currentPanel = viewport.getCurrentPanel(); + var options = viewport.options; + var delta = Math.abs(axesEvent.delta.flick + state.delta); + + if (delta > minimumDistanceToChange) { + var destInfo = _super.prototype.findSnappedPanel.call(this, ctx); + + destInfo.duration = axesEvent.duration; + destInfo.destPos = destPos; + destInfo.eventType = !options.circular && destInfo.panel === currentPanel ? "" : EVENTS.CHANGE; + return destInfo; + } else { + var estimatedPosition = options.circular ? circulate(destPos, scrollArea.prev, scrollArea.next, false) : destPos; + estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next); + estimatedPosition += viewport.getRelativeHangerPosition(); + var estimatedPanel = viewport.findNearestPanelAt(estimatedPosition); + return { + panel: estimatedPanel, + destPos: destPos, + duration: axesEvent.duration, + eventType: "" + }; + } + }; + + __proto.findRestorePanel = function (ctx) { + return this.findTargetPanel(ctx); + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var viewport = ctx.viewport; + return { + panel: viewport.getNearestPanel(), + destPos: viewport.getCameraPosition(), + duration: 0, + eventType: "" + }; + }; + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var lastPosition = viewport.stateMachine.getState().lastPosition; + var currentPanelPosition = currentPanel.getPosition(); // As camera can stop anywhere in free scroll mode, + // minimumDistanceToChange should be calculated differently. + // Ref #191(https://github.com/naver/egjs-flicking/issues/191) + + var lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var minimumDistanceToChange = isNextDirection ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap : lastHangerPosition - currentPanelPosition + halfGap; + minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize); + return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange); + }; + + return FreeScroll; +}(Snap); + +var Viewport = +/*#__PURE__*/ +function () { + function Viewport(flicking, options, triggerEvent) { + var _this = this; + + this.plugins = []; + + this.stopCamera = function (axesEvent) { + if (axesEvent && axesEvent.setTo) { + axesEvent.setTo({ + flick: _this.state.position + }, 0); + } + + _this.stateMachine.transitTo(STATE_TYPE.IDLE); + }; + + this.flicking = flicking; + this.triggerEvent = triggerEvent; + this.state = { + size: 0, + position: 0, + panelMaintainRatio: 0, + relativeHangerPosition: 0, + positionOffset: 0, + scrollArea: { + prev: 0, + next: 0 + }, + translate: TRANSFORM, + infiniteThreshold: 0, + checkedIndexes: [], + isAdaptiveCached: false, + isViewportGiven: false, + isCameraGiven: false, + originalViewportStyle: { + className: null, + style: null + }, + originalCameraStyle: { + className: null, + style: null + }, + cachedBbox: null + }; + this.options = options; + this.stateMachine = new StateMachine(); + this.visiblePanels = []; + this.panelBboxes = {}; + this.build(); + } + + var __proto = Viewport.prototype; + + __proto.moveTo = function (panel, destPos, eventType, axesEvent, duration) { + var _this = this; + + if (duration === void 0) { + duration = this.options.duration; + } + + var state = this.state; + var currentState = this.stateMachine.getState(); + var currentPosition = state.position; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + var direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + var eventResult; + + if (eventType === EVENTS.CHANGE) { + eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, { + index: panel.getIndex(), + panel: panel, + direction: direction + }); + } else if (eventType === EVENTS.RESTORE) { + eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted); + } else { + eventResult = { + onSuccess: function (callback) { + callback(); + return this; + }, + onStopped: function () { + return this; + } + }; + } + + eventResult.onSuccess(function () { + currentState.delta = 0; + currentState.lastPosition = _this.getCameraPosition(); + currentState.targetPanel = panel; + currentState.direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + + if (destPos === currentPosition) { + // no move + _this.nearestPanel = panel; + _this.currentPanel = panel; + } + + if (axesEvent && axesEvent.setTo) { + // freeScroll only occurs in release events + axesEvent.setTo({ + flick: destPos + }, duration); + } else { + _this.axes.setTo({ + flick: destPos + }, duration); + } + }); + return eventResult; + }; + + __proto.moveCamera = function (pos, axesEvent) { + var state = this.state; + var options = this.options; + var transform = state.translate.name; + var scrollArea = state.scrollArea; // Update position & nearestPanel + + if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) { + pos = circulate(pos, scrollArea.prev, scrollArea.next, false); + } + + state.position = pos; + this.nearestPanel = this.findNearestPanel(); + var nearestPanel = this.nearestPanel; + var originalNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; // From 0(panel position) to 1(panel position + panel size) + // When it's on gap area value will be (val > 1 || val < 0) + + if (nearestPanel) { + var hangerPosition = this.getHangerPosition(); + var panelPosition = nearestPanel.getPosition(); + var panelSize = nearestPanel.getSize(); + var halfGap = options.gap / 2; // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap + + state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap); + } else { + state.panelMaintainRatio = 0; + } + + this.checkNeedPanel(axesEvent); // Possibly modified after need panel, if it's looped + + var modifiedNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; + pos += modifiedNearestPosition - originalNearestPosition; + state.position = pos; + this.updateVisiblePanels(); // Offset is needed to fix camera layer size in visible-only rendering mode + + var posOffset = options.renderOnlyVisible ? state.positionOffset : 0; + var moveVector = options.horizontal ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)]; + var moveCoord = moveVector.map(function (coord) { + return Math.round(coord) + "px"; + }).join(", "); + this.cameraElement.style[transform] = state.translate.has3d ? "translate3d(" + moveCoord + ", 0px)" : "translate(" + moveCoord + ")"; + }; + + __proto.unCacheBbox = function () { + var state = this.state; + var options = this.options; + state.cachedBbox = null; + this.visiblePanels = []; + var viewportElement = this.viewportElement; + + if (!options.horizontal) { + // Don't preserve previous width for adaptive resizing + viewportElement.style.width = ""; + } else { + viewportElement.style.height = ""; + } + + state.isAdaptiveCached = false; + this.panelBboxes = {}; + }; + + __proto.resize = function () { + this.updateSize(); + this.updateOriginalPanelPositions(); + this.updateAdaptiveSize(); + this.updateScrollArea(); + this.updateClonePanels(); + this.updateVisiblePanelPositions(); + this.updateCameraPosition(); + this.updatePlugins(); + }; // Find nearest anchor from current hanger position + + + __proto.findNearestPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var hangerPosition = this.getHangerPosition(); + + if (this.isOutOfBound()) { + var position = state.position; + return position <= state.scrollArea.prev ? panelManager.firstPanel() : panelManager.lastPanel(); + } + + return this.findNearestPanelAt(hangerPosition); + }; + + __proto.findNearestPanelAt = function (position) { + var panelManager = this.panelManager; + var allPanels = panelManager.allPanels(); + var minimumDistance = Infinity; + var nearestPanel; + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var prevPosition = panel.getPosition(); + var nextPosition = prevPosition + panel.getSize(); // Use shortest distance from panel's range + + var distance = isBetween(position, prevPosition, nextPosition) ? 0 : Math.min(Math.abs(prevPosition - position), Math.abs(nextPosition - position)); + + if (distance > minimumDistance) { + break; + } else if (distance === minimumDistance) { + var minimumAnchorDistance = Math.abs(position - nearestPanel.getAnchorPosition()); + var anchorDistance = Math.abs(position - panel.getAnchorPosition()); + + if (anchorDistance > minimumAnchorDistance) { + break; + } + } + + minimumDistance = distance; + nearestPanel = panel; + } + + return nearestPanel; + }; + + __proto.findNearestIdenticalPanel = function (panel) { + var nearest = panel; + var shortestDistance = Infinity; + var hangerPosition = this.getHangerPosition(); + var identicals = panel.getIdenticalPanels(); + identicals.forEach(function (identical) { + var anchorPosition = identical.getAnchorPosition(); + var distance = Math.abs(anchorPosition - hangerPosition); + + if (distance < shortestDistance) { + nearest = identical; + shortestDistance = distance; + } + }); + return nearest; + }; // Find shortest camera position that distance is minimum + + + __proto.findShortestPositionToPanel = function (panel) { + var state = this.state; + var options = this.options; + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = this.getHangerPosition(); + var distance = Math.abs(hangerPosition - anchorPosition); + var scrollAreaSize = state.scrollArea.next - state.scrollArea.prev; + + if (!options.circular) { + var position = anchorPosition - state.relativeHangerPosition; + return this.canSetBoundMode() ? clamp(position, state.scrollArea.prev, state.scrollArea.next) : position; + } else { + // If going out of viewport border is more efficient way of moving, choose that position + return distance <= scrollAreaSize - distance ? anchorPosition - state.relativeHangerPosition : anchorPosition > hangerPosition // PREV TO NEXT + ? anchorPosition - state.relativeHangerPosition - scrollAreaSize // NEXT TO PREV + : anchorPosition - state.relativeHangerPosition + scrollAreaSize; + } + }; + + __proto.findEstimatedPosition = function (panel) { + var scrollArea = this.getScrollArea(); + var estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition(); + estimatedPosition = this.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return estimatedPosition; + }; + + __proto.addVisiblePanel = function (panel) { + if (this.getVisibleIndexOf(panel) < 0) { + this.visiblePanels.push(panel); + } + }; + + __proto.enable = function () { + if (!this.panInput) { + this.createPanInput(); + } + }; + + __proto.disable = function () { + if (this.panInput) { + this.panInput.destroy(); + this.panInput = null; + this.stateMachine.transitTo(STATE_TYPE.IDLE); + } + }; + + __proto.insert = function (index, element) { + var _this = this; + + var lastIndex = this.panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var state = this.state; + var options = this.options; + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var pushedIndex = this.panelManager.insert(index, panels); // ...then calc bbox for all panels + + this.resizePanels(panels); + + if (!this.currentPanel) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + }); + state.checkedIndexes.forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; + + if (index < min) { + // Push checked index + state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + } + }); + this.resize(); + return panels; + }; + + __proto.replace = function (index, element) { + var _this = this; + + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var lastIndex = panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var replacedPanels = panelManager.replace(index, panels); + replacedPanels.forEach(function (panel) { + var visibleIndex = _this.getVisibleIndexOf(panel); + + if (visibleIndex > -1) { + _this.visiblePanels.splice(visibleIndex, 1); + } + }); // ...then calc bbox for all panels + + this.resizePanels(panels); + var currentPanel = this.currentPanel; + var wasEmpty = !currentPanel; + + if (wasEmpty) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } else if (isBetween(currentPanel.getIndex(), index, index + panels.length - 1)) { + // Current panel is replaced + this.currentPanel = panelManager.get(currentPanel.getIndex()); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + panels.length - 1 + }); + this.resize(); + return panels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var state = this.state; // Index should not below 0 + + index = Math.max(index, 0); + var panelManager = this.panelManager; + var currentIndex = this.getCurrentIndex(); + var removedPanels = panelManager.remove(index, deleteCount); + + if (isBetween(currentIndex, index, index + deleteCount - 1)) { + // Current panel is removed + // Use panel at removing index - 1 as new current panel if it exists + var newCurrentIndex = Math.max(index - 1, panelManager.getRange().min); + this.currentPanel = panelManager.get(newCurrentIndex); + } // Update checked indexes in infinite mode + + + if (deleteCount > 0) { + // Check whether removing index will affect checked indexes + // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa. + this.updateCheckedIndexes({ + min: index - 1, + max: index + deleteCount + }); // Uncache visible panels to refresh panels + + this.visiblePanels = []; + } + + if (panelManager.getPanelCount() <= 0) { + this.currentPanel = undefined; + this.nearestPanel = undefined; + } + + this.resize(); + var scrollArea = state.scrollArea; + + if (state.position < scrollArea.prev || state.position > scrollArea.next) { + var newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false); + this.moveCamera(newPosition); + this.updateAxesPosition(newPosition); + } + + return removedPanels; + }; + + __proto.updateAdaptiveSize = function () { + var state = this.state; + var options = this.options; + var horizontal = options.horizontal; + var currentPanel = this.getCurrentPanel(); + + if (!currentPanel) { + return; + } + + var shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached; + var viewportStyle = this.viewportElement.style; + + if (shouldApplyAdaptive) { + var sizeToApply = void 0; + + if (options.adaptive) { + var panelBbox = currentPanel.getBbox(); + sizeToApply = horizontal ? panelBbox.height : panelBbox.width; + } else { + // Find minimum height of panels to maximum panel size + var maximumPanelSize = this.panelManager.originalPanels().reduce(function (maximum, panel) { + var panelBbox = panel.getBbox(); + return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width); + }, 0); + sizeToApply = maximumPanelSize; + } + + if (!state.isAdaptiveCached) { + var viewportBbox = this.updateBbox(); + sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width); + state.isAdaptiveCached = true; + } + + var viewportSize = sizeToApply + "px"; + + if (horizontal) { + viewportStyle.height = viewportSize; + state.cachedBbox.height = sizeToApply; + } else { + viewportStyle.width = viewportSize; + state.cachedBbox.width = sizeToApply; + } + } + }; // Update camera position after resizing + + + __proto.updateCameraPosition = function () { + var state = this.state; + var currentPanel = this.getCurrentPanel(); + var cameraPosition = this.getCameraPosition(); + var currentState = this.stateMachine.getState(); + var isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var halfGap = this.options.gap / 2; + + if (currentState.holding || currentState.playing) { + this.updateVisiblePanels(); + return; + } + + var newPosition; + + if (isFreeScroll) { + var positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next); + var nearestPanel = this.getNearestPanel(); // Preserve camera position if it is bound to scroll area limit + + newPosition = positionBounded || !nearestPanel ? cameraPosition : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition; + } else { + newPosition = currentPanel ? currentPanel.getAnchorPosition() - relativeHangerPosition : cameraPosition; + } + + if (this.canSetBoundMode()) { + newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next); + } // Pause & resume axes to prevent axes's "change" event triggered + // This should be done before moveCamera, as moveCamera can trigger needPanel + + + this.updateAxesPosition(newPosition); + this.moveCamera(newPosition); + }; + + __proto.updateBbox = function () { + var state = this.state; + var options = this.options; + var viewportElement = this.viewportElement; + + if (!state.cachedBbox) { + state.cachedBbox = getBbox(viewportElement, options.useOffset); + } + + return state.cachedBbox; + }; + + __proto.updatePlugins = function () { + var _this = this; // update for resize + + + this.plugins.forEach(function (plugin) { + plugin.update && plugin.update(_this.flicking); + }); + }; + + __proto.destroy = function (option) { + var _a; + + var state = this.state; + var wrapper = this.flicking.getElement(); + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var originalPanels = this.panelManager.originalPanels(); + this.removePlugins(this.plugins); + + if (!option.preserveUI) { + restoreStyle(viewportElement, state.originalViewportStyle); + restoreStyle(cameraElement, state.originalCameraStyle); + + if (!state.isCameraGiven && !this.options.renderExternal) { + var topmostElement_1 = state.isViewportGiven ? viewportElement : wrapper; + var deletingElement = state.isViewportGiven ? cameraElement : viewportElement; + originalPanels.forEach(function (panel) { + topmostElement_1.appendChild(panel.getElement()); + }); + topmostElement_1.removeChild(deletingElement); + } + } + + this.axes.destroy(); + (_a = this.panInput) === null || _a === void 0 ? void 0 : _a.destroy(); + originalPanels.forEach(function (panel) { + panel.destroy(option); + }); // release resources + + for (var x in this) { + this[x] = null; + } + }; + + __proto.restore = function (status) { + var panels = status.panels; + var defaultIndex = this.options.defaultIndex; + var cameraElement = this.cameraElement; + var panelManager = this.panelManager; // Restore index + + cameraElement.innerHTML = panels.map(function (panel) { + return panel.html; + }).join(""); // Create panels first + + this.refreshPanels(); + var createdPanels = panelManager.originalPanels(); // ...then order it by its index + + var orderedPanels = []; + panels.forEach(function (panel, idx) { + var createdPanel = createdPanels[idx]; + createdPanel.setIndex(panel.index); + orderedPanels[panel.index] = createdPanel; + }); + panelManager.replacePanels(orderedPanels, []); + panelManager.setCloneCount(0); // No clones at this point + + var panelCount = panelManager.getPanelCount(); + + if (panelCount > 0) { + this.currentPanel = panelManager.get(status.index) || panelManager.get(defaultIndex) || panelManager.firstPanel(); + } else { + this.currentPanel = undefined; + } + + this.visiblePanels = orderedPanels.filter(function (panel) { + return Boolean(panel); + }); + this.resize(); + this.axes.setTo({ + flick: status.position + }, 0); + this.moveCamera(status.position); + }; + + __proto.calcVisiblePanels = function () { + var allPanels = this.panelManager.allPanels(); + + if (this.options.renderOnlyVisible) { + var cameraPos_1 = this.getCameraPosition(); + var viewportSize_1 = this.getSize(); + var basePanel = this.nearestPanel; + + var getNextPanel = function (panel) { + var nextPanel = panel.nextSibling; + + if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) { + return nextPanel; + } else { + return null; + } + }; + + var getPrevPanel = function (panel) { + var prevPanel = panel.prevSibling; + + if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) { + return prevPanel; + } else { + return null; + } + }; + + var isOutOfBoundNext = function (panel) { + return panel.getPosition() >= cameraPos_1 + viewportSize_1; + }; + + var isOutOfBoundPrev = function (panel) { + return panel.getPosition() + panel.getSize() <= cameraPos_1; + }; + + var getVisiblePanels = function (panel, getNext, isOutOfViewport) { + var visiblePanels = []; + var lastPanel = panel; + + while (true) { + var nextPanel = getNext(lastPanel); + + if (!nextPanel || isOutOfViewport(nextPanel)) { + break; + } + + visiblePanels.push(nextPanel); + lastPanel = nextPanel; + } + + return visiblePanels; + }; + + var panelCount_1 = this.panelManager.getPanelCount(); + + var getAbsIndex_1 = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount_1; + }; + + var nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext); + var prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev); + return __spreadArrays([basePanel], nextPanels, prevPanels).sort(function (panel1, panel2) { + return getAbsIndex_1(panel1) - getAbsIndex_1(panel2); + }); + } else { + return allPanels.filter(function (panel) { + var outsetProgress = panel.getOutsetProgress(); + return outsetProgress > -1 && outsetProgress < 1; + }); + } + }; + + __proto.getCurrentPanel = function () { + return this.currentPanel; + }; + + __proto.getCurrentIndex = function () { + var currentPanel = this.currentPanel; + return currentPanel ? currentPanel.getIndex() : -1; + }; + + __proto.getNearestPanel = function () { + return this.nearestPanel; + }; // Get progress from nearest panel + + + __proto.getCurrentProgress = function () { + var currentState = this.stateMachine.getState(); + var nearestPanel = currentState.playing || currentState.holding ? this.nearestPanel : this.currentPanel; + var panelManager = this.panelManager; + + if (!nearestPanel) { + // There're no panels + return NaN; + } + + var _a = this.getScrollArea(), + prevRange = _a.prev, + nextRange = _a.next; + + var cameraPosition = this.getCameraPosition(); + var isOutOfBound = this.isOutOfBound(); + var prevPanel = nearestPanel.prevSibling; + var nextPanel = nearestPanel.nextSibling; + var hangerPosition = this.getHangerPosition(); + var nearestAnchorPos = nearestPanel.getAnchorPosition(); + + if (isOutOfBound && prevPanel && nextPanel && cameraPosition < nextRange // On the basis of anchor, prevPanel is nearestPanel. + && hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition) { + nearestPanel = prevPanel; + nextPanel = nearestPanel.nextSibling; + prevPanel = nearestPanel.prevSibling; + nearestAnchorPos = nearestPanel.getAnchorPosition(); + } + + var nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount(); + var nearestSize = nearestPanel.getSize(); + + if (isOutOfBound) { + var relativeHangerPosition = this.getRelativeHangerPosition(); + + if (nearestAnchorPos > nextRange + relativeHangerPosition) { + // next bounce area: hangerPosition - relativeHangerPosition - nextRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange; + } else if (nearestAnchorPos < prevRange + relativeHangerPosition) { + // prev bounce area: hangerPosition - relativeHangerPosition - prevRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange; + } + } + + var hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos; + var gap = this.options.gap; + var basePosition = nearestAnchorPos; + var targetPosition = nearestAnchorPos; + + if (hangerIsNextToNearestPanel) { + targetPosition = nextPanel ? nextPanel.getAnchorPosition() : nearestAnchorPos + nearestSize + gap; + } else { + basePosition = prevPanel ? prevPanel.getAnchorPosition() : nearestAnchorPos - nearestSize - gap; + } + + var progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition); + var startIndex = hangerIsNextToNearestPanel ? nearestIndex : prevPanel ? prevPanel.getIndex() : nearestIndex - 1; + return startIndex + progressBetween; + }; // Update axes flick position without triggering event + + + __proto.updateAxesPosition = function (position) { + var axes = this.axes; + axes.off(); + axes.setTo({ + flick: position + }, 0); + axes.on(this.axesHandlers); + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getScrollArea = function () { + return this.state.scrollArea; + }; + + __proto.isOutOfBound = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + return !options.circular && options.bound && (state.position <= scrollArea.prev || state.position >= scrollArea.next); + }; + + __proto.canSetBoundMode = function () { + var options = this.options; + return options.bound && !options.circular; + }; + + __proto.getViewportElement = function () { + return this.viewportElement; + }; + + __proto.getCameraElement = function () { + return this.cameraElement; + }; + + __proto.getScrollAreaSize = function () { + var scrollArea = this.state.scrollArea; + return scrollArea.next - scrollArea.prev; + }; + + __proto.getRelativeHangerPosition = function () { + return this.state.relativeHangerPosition; + }; + + __proto.getHangerPosition = function () { + return this.state.position + this.state.relativeHangerPosition; + }; + + __proto.getCameraPosition = function () { + return this.state.position; + }; + + __proto.getPositionOffset = function () { + return this.state.positionOffset; + }; + + __proto.getCheckedIndexes = function () { + return this.state.checkedIndexes; + }; + + __proto.getVisiblePanels = function () { + return this.visiblePanels; + }; + + __proto.setCurrentPanel = function (panel) { + this.currentPanel = panel; + }; + + __proto.setLastIndex = function (index) { + var currentPanel = this.currentPanel; + var panelManager = this.panelManager; + panelManager.setLastIndex(index); + + if (currentPanel && currentPanel.getIndex() > index) { + this.currentPanel = panelManager.lastPanel(); + } + + this.resize(); + }; + + __proto.setVisiblePanels = function (panels) { + this.visiblePanels = panels; + }; + + __proto.connectAxesHandler = function (handlers) { + var axes = this.axes; + this.axesHandlers = handlers; + axes.on(handlers); + }; + + __proto.addPlugins = function (plugins) { + var _this = this; + + var newPlugins = [].concat(plugins); + newPlugins.forEach(function (plugin) { + plugin.init(_this.flicking); + }); + this.plugins = this.plugins.concat(newPlugins); + return this; + }; + + __proto.removePlugins = function (plugins) { + var _this = this; + + var currentPlugins = this.plugins; + var removedPlugins = [].concat(plugins); + removedPlugins.forEach(function (plugin) { + var index = currentPlugins.indexOf(plugin); + + if (index > -1) { + currentPlugins.splice(index, 1); + } + + plugin.destroy(_this.flicking); + }); + return this; + }; + + __proto.updateCheckedIndexes = function (changedRange) { + var state = this.state; + var removed = 0; + state.checkedIndexes.concat().forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; // Can fill part of indexes in range + + if (changedRange.min <= max && changedRange.max >= min) { + // Remove checked index from list + state.checkedIndexes.splice(idx - removed, 1); + removed++; + } + }); + }; + + __proto.appendUncachedPanelElements = function (panels) { + var _this = this; + + var options = this.options; + var fragment = document.createDocumentFragment(); + + if (options.isEqualSize) { + var prevVisiblePanels = this.visiblePanels; + var equalSizeClasses_1 = options.isEqualSize; // for readability + + var cached_1 = {}; + this.visiblePanels = []; + Object.keys(this.panelBboxes).forEach(function (className) { + cached_1[className] = true; + }); + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_1); + + if (overlappedClass && !cached_1[overlappedClass]) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + + cached_1[overlappedClass] = true; + } else if (!overlappedClass) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + } + }); + prevVisiblePanels.forEach(function (panel) { + _this.addVisiblePanel(panel); + }); + } else { + if (!options.renderExternal) { + panels.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + } + + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + } + + if (!options.renderExternal) { + this.cameraElement.appendChild(fragment); + } + }; + + __proto.updateClonePanels = function () { + var panelManager = this.panelManager; // Clone panels in circular mode + + if (this.options.circular && panelManager.getPanelCount() > 0) { + this.clonePanels(); + this.updateClonedPanelPositions(); + } + + panelManager.chainAllPanels(); + }; + + __proto.getVisibleIndexOf = function (panel) { + return findIndex(this.visiblePanels, function (visiblePanel) { + return visiblePanel === panel; + }); + }; + + __proto.build = function () { + this.setElements(); + this.applyCSSValue(); + this.setMoveType(); + this.setAxesInstance(); + this.refreshPanels(); + this.setDefaultPanel(); + this.resize(); + this.moveToDefaultPanel(); + }; + + __proto.setElements = function () { + var state = this.state; + var options = this.options; + var wrapper = this.flicking.getElement(); + var classPrefix = options.classPrefix; + var viewportCandidate = wrapper.children[0]; + var hasViewportElement = viewportCandidate && hasClass(viewportCandidate, classPrefix + "-viewport"); + var viewportElement = hasViewportElement ? viewportCandidate : document.createElement("div"); + var cameraCandidate = hasViewportElement ? viewportElement.children[0] : wrapper.children[0]; + var hasCameraElement = cameraCandidate && hasClass(cameraCandidate, classPrefix + "-camera"); + var cameraElement = hasCameraElement ? cameraCandidate : document.createElement("div"); + + if (!hasCameraElement) { + cameraElement.className = classPrefix + "-camera"; + var panelElements = hasViewportElement ? viewportElement.children : wrapper.children; // Make all panels to be a child of camera element + // wrapper <- viewport <- camera <- panels[1...n] + + toArray(panelElements).forEach(function (child) { + cameraElement.appendChild(child); + }); + } else { + state.originalCameraStyle = { + className: cameraElement.getAttribute("class"), + style: cameraElement.getAttribute("style") + }; + } + + if (!hasViewportElement) { + viewportElement.className = classPrefix + "-viewport"; // Add viewport element to wrapper + + wrapper.appendChild(viewportElement); + } else { + state.originalViewportStyle = { + className: viewportElement.getAttribute("class"), + style: viewportElement.getAttribute("style") + }; + } + + if (!hasCameraElement || !hasViewportElement) { + viewportElement.appendChild(cameraElement); + } + + this.viewportElement = viewportElement; + this.cameraElement = cameraElement; + state.isViewportGiven = hasViewportElement; + state.isCameraGiven = hasCameraElement; + }; + + __proto.applyCSSValue = function () { + var options = this.options; + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var viewportStyle = this.viewportElement.style; // Set default css values for each element + + applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS); + applyCSS(cameraElement, DEFAULT_CAMERA_CSS); + viewportElement.style.zIndex = "" + options.zIndex; + + if (options.horizontal) { + viewportStyle.minHeight = "100%"; + viewportStyle.width = "100%"; + } else { + viewportStyle.minWidth = "100%"; + viewportStyle.height = "100%"; + } + + if (options.overflow) { + viewportStyle.overflow = "visible"; + } + + this.panelManager = new PanelManager(this.cameraElement, options); + }; + + __proto.setMoveType = function () { + var moveType = this.options.moveType; + + switch (moveType.type) { + case MOVE_TYPE.SNAP: + this.moveType = new Snap(moveType.count); + break; + + case MOVE_TYPE.FREE_SCROLL: + this.moveType = new FreeScroll(); + break; + + default: + throw new Error("moveType is not correct!"); + } + }; + + __proto.setAxesInstance = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + this.axes = new Axes({ + flick: { + range: [scrollArea.prev, scrollArea.next], + circular: options.circular, + bounce: [0, 0] + } + }, { + easing: options.panelEffect, + deceleration: options.deceleration, + interruptable: true + }); + this.createPanInput(); + }; + + __proto.refreshPanels = function () { + var _this = this; + + var panelManager = this.panelManager; // Panel elements were attached to camera element by Flicking class + + var panelElements = this.cameraElement.children; // Initialize panels + + var panels = toArray(panelElements).map(function (el, idx) { + return new Panel(el, idx, _this); + }); + panelManager.replacePanels(panels, []); + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + }; + + __proto.setDefaultPanel = function () { + var options = this.options; + var panelManager = this.panelManager; + var indexRange = this.panelManager.getRange(); + var index = clamp(options.defaultIndex, indexRange.min, indexRange.max); + this.currentPanel = panelManager.get(index); + }; + + __proto.clonePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var gap = options.gap; + var viewportSize = state.size; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); // There're no panels exist + + if (!firstPanel) { + return; + } // For each panels, clone itself while last panel's position + size is below viewport size + + + var panels = panelManager.originalPanels(); + var reversedPanels = panels.concat().reverse(); + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap; + var relativeAnchorPosition = firstPanel.getRelativeAnchorPosition(); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize; + var sizeSum = 0; + var panelAtLeftBoundary; + + for (var _i = 0, reversedPanels_1 = reversedPanels; _i < reversedPanels_1.length; _i++) { + var panel = reversedPanels_1[_i]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaPrev) { + panelAtLeftBoundary = panel; + break; + } + } + + var areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize; + sizeSum = 0; + var panelAtRightBoundary; + + for (var _a = 0, panels_1 = panels; _a < panels_1.length; _a++) { + var panel = panels_1[_a]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaNext) { + panelAtRightBoundary = panel; + break; + } + } // Need one more set of clones on prev area of original panel 0 + + + var needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0 && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex(); // Visible count of panel 0 on first screen + + var panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize) + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize) - 1; // duplication + + var cloneCount = panel0OnFirstscreen + (needCloneOnPrev ? 1 : 0); + var prevCloneCount = panelManager.getCloneCount(); + panelManager.setCloneCount(cloneCount); + + if (options.renderExternal) { + return; + } + + if (cloneCount > prevCloneCount) { + var _loop_1 = function (cloneIndex) { + var _a; + + var clones = panels.map(function (origPanel) { + return origPanel.clone(cloneIndex); + }); + var fragment = document.createDocumentFragment(); + clones.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + this_1.cameraElement.appendChild(fragment); + + (_a = this_1.visiblePanels).push.apply(_a, clones.filter(function (clone) { + return Boolean(clone); + })); + + panelManager.insertClones(cloneIndex, 0, clones); + }; + + var this_1 = this; // should clone more + + for (var cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) { + _loop_1(cloneIndex); + } + } else if (cloneCount < prevCloneCount) { + // should remove some + panelManager.removeClonesAfter(cloneCount); + } + }; + + __proto.moveToDefaultPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var indexRange = this.panelManager.getRange(); + var defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max); + var defaultPanel = panelManager.get(defaultIndex); + var defaultPosition = 0; + + if (defaultPanel) { + defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition; + defaultPosition = this.canSetBoundMode() ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next) : defaultPosition; + } + + this.moveCamera(defaultPosition); + this.axes.setTo({ + flick: defaultPosition + }, 0); + }; + + __proto.updateSize = function () { + var state = this.state; + var options = this.options; + var panels = this.panelManager.originalPanels().filter(function (panel) { + return Boolean(panel); + }); + var bbox = this.updateBbox(); + var prevSize = state.size; // Update size & hanger position + + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size); + state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size); + } + + if (panels.length <= 0) { + return; + } + + this.resizePanels(panels); + }; + + __proto.updateOriginalPanelPositions = function () { + var gap = this.options.gap; + var panelManager = this.panelManager; + var firstPanel = panelManager.firstPanel(); + var panels = panelManager.originalPanels(); + + if (!firstPanel) { + return; + } + + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + var scrollArea = this.state.scrollArea; // Update panel position && fit to wrapper + + var nextPanelPos = firstPanel.getPosition(); + var maintainingPanel = firstPanel; + + if (nearestPanel) { + // We should maintain nearestPanel's position + var looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next); + maintainingPanel = looped ? currentPanel : nearestPanel; + } else if (firstPanel.getIndex() > 0) { + maintainingPanel = currentPanel; + } + + var panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length); + var accumulatedSize = panelsBeforeMaintainPanel.reduce(function (total, panel) { + return total + panel.getSize() + gap; + }, 0); + nextPanelPos = maintainingPanel.getPosition() - accumulatedSize; + panels.forEach(function (panel) { + var newPosition = nextPanelPos; + var panelSize = panel.getSize(); + panel.setPosition(newPosition); + nextPanelPos += panelSize + gap; + }); + + if (!this.options.renderOnlyVisible) { + panels.forEach(function (panel) { + return panel.setPositionCSS(); + }); + } + }; + + __proto.updateClonedPanelPositions = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var clonedPanels = panelManager.clonedPanels().reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, []).filter(function (panel) { + return Boolean(panel); + }); + var scrollArea = state.scrollArea; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + + if (!firstPanel) { + return; + } + + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Locate all cloned panels linearly first + + for (var _i = 0, clonedPanels_1 = clonedPanels; _i < clonedPanels_1.length; _i++) { + var panel = clonedPanels_1[_i]; + var origPanel = panel.getOriginalPanel(); + var cloneIndex = panel.getCloneIndex(); + var cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1); + var clonedPanelPos = cloneBasePos + origPanel.getPosition(); + panel.setPosition(clonedPanelPos); + } + + var lastReplacePosition = firstPanel.getPosition(); // reverse() pollutes original array, so copy it with concat() + + for (var _a = 0, _b = clonedPanels.concat().reverse(); _a < _b.length; _a++) { + var panel = _b[_a]; + var panelSize = panel.getSize(); + var replacePosition = lastReplacePosition - panelSize - options.gap; + + if (replacePosition + panelSize <= scrollArea.prev) { + // Replace is not meaningful, as it won't be seen in current scroll area + break; + } + + panel.setPosition(replacePosition); + lastReplacePosition = replacePosition; + } + + if (!this.options.renderOnlyVisible) { + clonedPanels.forEach(function (panel) { + panel.setPositionCSS(); + }); + } + }; + + __proto.updateVisiblePanelPositions = function () { + var _this = this; + + if (this.options.renderOnlyVisible) { + this.visiblePanels.forEach(function (panel) { + panel.setPositionCSS(_this.state.positionOffset); + }); + } + }; + + __proto.updateScrollArea = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var axes = this.axes; // Set viewport scrollable area + + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + var relativeHangerPosition = state.relativeHangerPosition; + + if (!firstPanel) { + state.scrollArea = { + prev: 0, + next: 0 + }; + } else if (this.canSetBoundMode()) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition(); + + if (sumOriginalPanelSize >= state.size) { + state.scrollArea = { + prev: firstPanel.getPosition(), + next: lastPanel.getPosition() + lastPanel.getSize() - state.size + }; + } else { + // Find anchor position of set of the combined panels + var relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize); + var anchorPos = firstPanel.getPosition() + clamp(relAnchorPosOfCombined, sumOriginalPanelSize - (state.size - relativeHangerPosition), relativeHangerPosition); + state.scrollArea = { + prev: anchorPos - relativeHangerPosition, + next: anchorPos - relativeHangerPosition + }; + } + } else if (options.circular) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Maximum scroll extends to first clone sequence's first panel + + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition + }; + } else { + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: lastPanel.getAnchorPosition() - relativeHangerPosition + }; + } + + var viewportSize = state.size; + var bounce = options.bounce; + var parsedBounce; + + if (isArray(bounce)) { + parsedBounce = bounce.map(function (val) { + return parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce); + }); + } else { + var parsedVal = parseArithmeticExpression(bounce, viewportSize, DEFAULT_OPTIONS.bounce); + parsedBounce = [parsedVal, parsedVal]; + } // Update axes range and bounce + + + var flick = axes.axis.flick; + flick.range = [state.scrollArea.prev, state.scrollArea.next]; + flick.bounce = parsedBounce; + }; + + __proto.checkNeedPanel = function (axesEvent) { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + + if (!options.infinite) { + return; + } + + var gap = options.gap; + var infiniteThreshold = state.infiniteThreshold; + var maxLastIndex = panelManager.getLastIndex(); + + if (maxLastIndex < 0) { + return; + } + + if (!currentPanel || !nearestPanel) { + // There're no panels + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: null, + direction: null, + indexRange: { + min: 0, + max: maxLastIndex, + length: maxLastIndex + 1 + } + }); + return; + } + + var originalNearestPosition = nearestPanel.getPosition(); // Check next direction + + var checkingPanel = !currentState.holding && !currentState.playing ? currentPanel : nearestPanel; + + while (checkingPanel) { + var currentIndex = checkingPanel.getIndex(); + var nextSibling = checkingPanel.nextSibling; + var lastPanel = panelManager.lastPanel(); + var atLastPanel = currentIndex === lastPanel.getIndex(); + var nextIndex = !atLastPanel && nextSibling ? nextSibling.getIndex() : maxLastIndex + 1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition); + var cameraNext = state.position + state.size; // There're empty panels between + + var emptyPanelExistsBetween = nextIndex - currentIndex > 1; // Expected prev panel's left position is smaller than camera position + + var overThreshold = panelRight + gap - infiniteThreshold <= cameraNext; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: currentIndex + 1, + max: nextIndex - 1, + length: nextIndex - currentIndex - 1 + } + }); + } // Trigger needPanel in circular & at max panel index + + + if (options.circular && currentIndex === maxLastIndex && overThreshold) { + var firstPanel = panelManager.firstPanel(); + var firstIndex = firstPanel ? firstPanel.getIndex() : -1; + + if (firstIndex > 0) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: 0, + max: firstIndex - 1, + length: firstIndex + } + }); + } + } // Check whether panels are changed + + + var lastPanelAfterNeed = panelManager.lastPanel(); + var atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex(); + + if (atLastPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.nextSibling; + } // Check prev direction + + + checkingPanel = nearestPanel; + + while (checkingPanel) { + var cameraPrev = state.position; + var checkingIndex = checkingPanel.getIndex(); + var prevSibling = checkingPanel.prevSibling; + var firstPanel = panelManager.firstPanel(); + var atFirstPanel = checkingIndex === firstPanel.getIndex(); + var prevIndex = !atFirstPanel && prevSibling ? prevSibling.getIndex() : -1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition); // There're empty panels between + + var emptyPanelExistsBetween = checkingIndex - prevIndex > 1; // Expected prev panel's right position is smaller than camera position + + var overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: prevIndex + 1, + max: checkingIndex - 1, + length: checkingIndex - prevIndex - 1 + } + }); + } // Trigger needPanel in circular & at panel 0 + + + if (options.circular && checkingIndex === 0 && overThreshold) { + var lastPanel = panelManager.lastPanel(); + + if (lastPanel && lastPanel.getIndex() < maxLastIndex) { + var lastIndex = lastPanel.getIndex(); + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: lastIndex + 1, + max: maxLastIndex, + length: maxLastIndex - lastIndex + } + }); + } + } // Check whether panels were changed + + + var firstPanelAfterNeed = panelManager.firstPanel(); + var atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex(); // Looped in circular mode + + if (atFirstPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.prevSibling; + } + }; + + __proto.triggerNeedPanel = function (params) { + var _this = this; + + var axesEvent = params.axesEvent, + siblingPanel = params.siblingPanel, + direction = params.direction, + indexRange = params.indexRange; + var options = this.options; + var checkedIndexes = this.state.checkedIndexes; + var alreadyTriggered = checkedIndexes.some(function (_a) { + var min = _a[0], + max = _a[1]; + return min === indexRange.min || max === indexRange.max; + }); + var hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL); + + if (alreadyTriggered || !hasHandler) { + return; + } // Should done before triggering event, as we can directly add panels by event callback + + + checkedIndexes.push([indexRange.min, indexRange.max]); + var index = siblingPanel ? siblingPanel.getIndex() : 0; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + this.triggerEvent(EVENTS.NEED_PANEL, axesEvent, isTrusted, { + index: index, + panel: siblingPanel, + direction: direction, + range: indexRange, + fill: function (element) { + var panelManager = _this.panelManager; + + if (!siblingPanel) { + return _this.insert(panelManager.getRange().max + 1, element); + } + + var parsedElements = parseElement(element); // Slice elements to fit size equal to empty spaces + + var elements = direction === DIRECTION.NEXT ? parsedElements.slice(0, indexRange.length) : parsedElements.slice(-indexRange.length); + + if (direction === DIRECTION.NEXT) { + if (options.circular && index === panelManager.getLastIndex()) { + // needPanel event is triggered on last index, insert at index 0 + return _this.insert(0, elements); + } else { + return siblingPanel.insertAfter(elements); + } + } else if (direction === DIRECTION.PREV) { + if (options.circular && index === 0) { + // needPanel event is triggered on first index(0), insert at the last index + return _this.insert(indexRange.max - elements.length + 1, elements); + } else { + return siblingPanel.insertBefore(elements); + } + } else { + // direction is null when there're no panels exist + return _this.insert(0, elements); + } + } + }); + }; + + __proto.updateVisiblePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentState = this.stateMachine.getState(); + var cameraElement = this.cameraElement; + var renderExternal = options.renderExternal, + renderOnlyVisible = options.renderOnlyVisible; + + if (!renderOnlyVisible) { + return; + } + + if (!this.nearestPanel) { + this.visiblePanels = []; + + while (cameraElement.firstChild) { + cameraElement.removeChild(cameraElement.firstChild); + } + + return; + } + + var prevVisiblePanels = this.visiblePanels; + var newVisiblePanels = this.calcVisiblePanels(); + + var _a = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels), + addedPanels = _a.addedPanels, + removedPanels = _a.removedPanels; + + if (addedPanels.length <= 0 && removedPanels.length <= 0) { + // Visible panels not changed + return; + } + + if (currentState.holding) { + newVisiblePanels.push.apply(newVisiblePanels, removedPanels); + } else { + var firstVisiblePanelPos = newVisiblePanels[0].getPosition(); + state.positionOffset = firstVisiblePanelPos; + } + + newVisiblePanels.forEach(function (panel) { + panel.setPositionCSS(state.positionOffset); + }); + + if (!renderExternal) { + if (!currentState.holding) { + removedPanels.forEach(function (panel) { + var panelElement = panel.getElement(); + panelElement.parentNode && cameraElement.removeChild(panelElement); + }); + } + + var fragment_1 = document.createDocumentFragment(); + addedPanels.forEach(function (panel) { + fragment_1.appendChild(panel.getElement()); + }); + cameraElement.appendChild(fragment_1); + } + + var firstVisiblePanel = newVisiblePanels[0]; + var lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1]; + + var getAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount(); + }; + + var newVisibleRange = { + min: getAbsIndex(firstVisiblePanel), + max: getAbsIndex(lastVisiblePanel) + }; + this.visiblePanels = newVisiblePanels; + this.flicking.trigger(EVENTS.VISIBLE_CHANGE, { + type: EVENTS.VISIBLE_CHANGE, + range: newVisibleRange + }); + }; + + __proto.checkVisiblePanelChange = function (prevVisiblePanels, newVisiblePanels) { + var prevRefCount = prevVisiblePanels.map(function () { + return 0; + }); + var newRefCount = newVisiblePanels.map(function () { + return 0; + }); + prevVisiblePanels.forEach(function (prevPanel, prevIndex) { + newVisiblePanels.forEach(function (newPanel, newIndex) { + if (prevPanel === newPanel) { + prevRefCount[prevIndex]++; + newRefCount[newIndex]++; + } + }); + }); + var removedPanels = prevRefCount.reduce(function (removed, count, index) { + return count === 0 ? __spreadArrays(removed, [prevVisiblePanels[index]]) : removed; + }, []); + var addedPanels = newRefCount.reduce(function (added, count, index) { + return count === 0 ? __spreadArrays(added, [newVisiblePanels[index]]) : added; + }, []); + return { + removedPanels: removedPanels, + addedPanels: addedPanels + }; + }; + + __proto.resizePanels = function (panels) { + var options = this.options; + var panelBboxes = this.panelBboxes; + + if (options.isEqualSize === true) { + if (!panelBboxes.default) { + var defaultPanel = panels[0]; + panelBboxes.default = defaultPanel.getBbox(); + } + + var defaultBbox_1 = panelBboxes.default; + panels.forEach(function (panel) { + panel.resize(defaultBbox_1); + }); + return; + } else if (options.isEqualSize) { + var equalSizeClasses_2 = options.isEqualSize; + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_2); + + if (overlappedClass) { + panel.resize(panelBboxes[overlappedClass]); + panelBboxes[overlappedClass] = panel.getBbox(); + } else { + panel.resize(); + } + }); + return; + } + + panels.forEach(function (panel) { + panel.resize(); + }); + }; + + __proto.createPanInput = function () { + var options = this.options; + this.panInput = new PanInput(this.viewportElement, { + inputType: options.inputType, + thresholdAngle: options.thresholdAngle, + iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold, + scale: options.horizontal ? [-1, 0] : [0, -1] + }); + this.axes.connect(options.horizontal ? ["flick", ""] : ["", "flick"], this.panInput); + }; + + return Viewport; +}(); + +/** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ +/** + * @memberof eg + * @extends eg.Component + * @support {"ie": "10+", "ch" : "latest", "ff" : "latest", "sf" : "latest" , "edge" : "latest", "ios" : "7+", "an" : "4.X+"} + * @requires {@link https://github.com/naver/egjs-component|eg.Component} + * @requires {@link https://github.com/naver/egjs-axes|eg.Axes} + * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/} + */ + +var Flicking = +/*#__PURE__*/ +function (_super) { + __extends(Flicking, _super); + /** + * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다. + * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체 + * @param {string} [options.classPrefix="eg-flick"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사. + * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다. + * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향) + * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다. + * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다. + * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리. + * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
+ * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다. + * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다. + * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수. + * @param {string[]} [options.inputType=["touch,"mouse"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고}) + * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
+ * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, "10px", "20%")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, "10px", "20%")
+ * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부. + * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부. + * @param {number|""} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값. + * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다. + * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다. + * @param {string} [options.hanger="50%"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {string} [options.anchor="50%"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px) + * @param {eg.Flicking.MoveTypeOption} [options.moveType="snap"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll) + * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
+ * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다. + * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
+ * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다. + * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다. + * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
+ * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다. + */ + + + function Flicking(element, options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.contentsReadyChecker = null; + _this.isPanelChangedAtBeforeSync = false; + /** + * Update panels to current state. + * @ko 패널들을 현재 상태에 맞춰 갱신한다. + * @method + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + _this.resize = function () { + var viewport = _this.viewport; + var options = _this.options; + + var wrapper = _this.getElement(); + + var allPanels = viewport.panelManager.allPanels(); + + if (!options.isConstantSize) { + allPanels.forEach(function (panel) { + return panel.unCacheBbox(); + }); + } + + var shouldResetElements = options.renderOnlyVisible && !options.isConstantSize && options.isEqualSize !== true; // Temporarily set parent's height to prevent scroll (#333) + + var parent = wrapper.parentElement; + var origStyle = parent.style.height; + parent.style.height = parent.offsetHeight + "px"; + viewport.unCacheBbox(); // This should be done before adding panels, to lower performance issue + + viewport.updateBbox(); + + if (shouldResetElements) { + viewport.appendUncachedPanelElements(allPanels); + } + + viewport.resize(); + parent.style.height = origStyle; + return _this; + }; + + _this.triggerEvent = function (eventName, // visibleChange event has no common event definition from other events + axesEvent, isTrusted, params) { + if (params === void 0) { + params = {}; + } + + var viewport = _this.viewport; + var canceled = true; // Ignore events before viewport is initialized + + if (viewport) { + var state = viewport.stateMachine.getState(); + + var _a = viewport.getScrollArea(), + prev = _a.prev, + next = _a.next; + + var pos = viewport.getCameraPosition(); + var progress = getProgress(pos, [prev, prev, next]); + + if (_this.options.circular) { + progress %= 1; + } + + canceled = !_super.prototype.trigger.call(_this, eventName, merge({ + type: eventName, + index: _this.getIndex(), + panel: _this.getCurrentPanel(), + direction: state.direction, + holding: state.holding, + progress: progress, + axesEvent: axesEvent, + isTrusted: isTrusted + }, params)); + } + + return { + onSuccess: function (callback) { + if (!canceled) { + callback(); + } + + return this; + }, + onStopped: function (callback) { + if (canceled) { + callback(); + } + + return this; + } + }; + }; // Return result of "move" event triggered + + + _this.moveCamera = function (axesEvent) { + var viewport = _this.viewport; + var state = viewport.stateMachine.getState(); + var options = _this.options; + var pos = axesEvent.pos.flick; + var previousPosition = viewport.getCameraPosition(); + + if (axesEvent.isTrusted && state.holding) { + var inputOffset = options.horizontal ? axesEvent.inputEvent.offsetX : axesEvent.inputEvent.offsetY; + var isNextDirection = inputOffset < 0; + var cameraChange = pos - previousPosition; + var looped = isNextDirection === pos < previousPosition; + + if (options.circular && looped) { + // Reached at max/min range of axes + var scrollAreaSize = viewport.getScrollAreaSize(); + cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange)); + } + + var currentDirection = cameraChange === 0 ? state.direction : cameraChange > 0 ? DIRECTION.NEXT : DIRECTION.PREV; + state.direction = currentDirection; + } + + state.delta += axesEvent.delta.flick; + viewport.moveCamera(pos, axesEvent); + return _this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted).onStopped(function () { + // Undo camera movement + viewport.moveCamera(previousPosition, axesEvent); + }); + }; // Set flicking wrapper user provided + + + var wrapper; + + if (isString(element)) { + wrapper = document.querySelector(element); + + if (!wrapper) { + throw new Error("Base element doesn't exist."); + } + } else if (element.nodeName && element.nodeType === 1) { + wrapper = element; + } else { + throw new Error("Element should be provided in string or HTMLElement."); + } + + _this.wrapper = wrapper; // Override default options + + _this.options = merge({}, DEFAULT_OPTIONS, options); // Override moveType option + + var currentOptions = _this.options; + var moveType = currentOptions.moveType; + + if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) { + currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType]; + } // Make viewport instance with panel container element + + + _this.viewport = new Viewport(_this, _this.options, _this.triggerEvent); + + _this.listenInput(); + + _this.listenResize(); + + return _this; // if (this.options.collectStatistics) { + // sendEvent( + // "usage", + // "options", + // options, + // ); + // } + } + /** + * Move to the previous panel if it exists. + * @ko 이전 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + var __proto = Flicking.prototype; + + __proto.prev = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var prevPanel = currentPanel.prev(); + + if (prevPanel) { + prevPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the next panel if it exists. + * @ko 다음 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.next = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var nextPanel = currentPanel.next(); + + if (nextPanel) { + nextPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the panel of given index. + * @ko 주어진 인덱스에 해당하는 패널로 이동한다. + * @param index The index number of the panel to move.이동할 패널의 인덱스 번호. + * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.moveTo = function (index, duration) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + var state = viewport.stateMachine.getState(); + + if (!panel || state.type !== STATE_TYPE.IDLE) { + return this; + } + + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = viewport.getHangerPosition(); + var targetPanel = panel; + + if (this.options.circular) { + var scrollAreaSize = viewport.getScrollAreaSize(); // Check all three possible locations, find the nearest position among them. + + var possiblePositions = [anchorPosition - scrollAreaSize, anchorPosition, anchorPosition + scrollAreaSize]; + var nearestPosition = possiblePositions.reduce(function (nearest, current) { + return Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition) ? current : nearest; + }, Infinity) - panel.getRelativeAnchorPosition(); + var identicals = panel.getIdenticalPanels(); + var offset = nearestPosition - anchorPosition; + + if (offset > 0) { + // First cloned panel is nearest + targetPanel = identicals[1]; + } else if (offset < 0) { + // Last cloned panel is nearest + targetPanel = identicals[identicals.length - 1]; + } + + targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true); + targetPanel.setPosition(nearestPosition); + } + + var currentIndex = this.getIndex(); + + if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) { + return this; + } + + var eventType = panel.getIndex() === viewport.getCurrentIndex() ? "" : EVENTS.CHANGE; + viewport.moveTo(targetPanel, viewport.findEstimatedPosition(targetPanel), eventType, null, duration); + return this; + }; + /** + * Return index of the current panel. `-1` if no panel exists. + * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다. + * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수. + */ + + + __proto.getIndex = function () { + return this.viewport.getCurrentIndex(); + }; + /** + * Return the wrapper element user provided in constructor. + * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다. + * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트. + */ + + + __proto.getElement = function () { + return this.wrapper; + }; + /** + * Return the viewport element's size. + * @ko 뷰포트 엘리먼트의 크기를 반환한다. + * @return Width if horizontal: true, height if horizontal: false + */ + + + __proto.getSize = function () { + return this.viewport.getSize(); + }; + /** + * Return current panel. `null` if no panel exists. + * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다. + * @return Current panel.현재 패널. + */ + + + __proto.getCurrentPanel = function () { + var viewport = this.viewport; + var panel = viewport.getCurrentPanel(); + return panel ? panel : null; + }; + /** + * Return the panel of given index. `null` if it doesn't exists. + * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다. + * @return Panel of given index.주어진 인덱스에 해당하는 패널. + */ + + + __proto.getPanel = function (index) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + return panel ? panel : null; + }; + /** + * Return all panels. + * @ko 모든 패널들을 반환한다. + * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부. + * @return All panels.모든 패널들. + */ + + + __proto.getAllPanels = function (includeClone) { + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var panels = includeClone ? panelManager.allPanels() : panelManager.originalPanels(); + return panels.filter(function (panel) { + return !!panel; + }); + }; + /** + * Return the panels currently shown in viewport area. + * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다. + * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들 + */ + + + __proto.getVisiblePanels = function () { + return this.viewport.calcVisiblePanels(); + }; + /** + * Return length of original panels. + * @ko 원본 패널의 개수를 반환한다. + * @return Length of original panels.원본 패널의 개수 + */ + + + __proto.getPanelCount = function () { + return this.viewport.panelManager.getPanelCount(); + }; + /** + * Return how many groups of clones are created. + * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다. + * @return Length of cloned panel groups.클론된 패널 그룹의 개수 + */ + + + __proto.getCloneCount = function () { + return this.viewport.panelManager.getCloneCount(); + }; + /** + * Get maximum panel index for `infinite` mode. + * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다. + * @see {@link eg.Flicking.FlickingOptions} + * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스. + */ + + + __proto.getLastIndex = function () { + return this.viewport.panelManager.getLastIndex(); + }; + /** + * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it. + * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다. + * @param - Maximum panel index. + * @see {@link eg.Flicking.FlickingOptions} + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.setLastIndex = function (index) { + this.viewport.setLastIndex(index); + return this; + }; + /** + * Return panel movement animation. + * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다. + * @return Is animating or not.애니메이션 진행 여부. + */ + + + __proto.isPlaying = function () { + return this.viewport.stateMachine.getState().playing; + }; + /** + * Unblock input devices. + * @ko 막았던 입력 장치로부터의 입력을 푼다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.enableInput = function () { + this.viewport.enable(); + return this; + }; + /** + * Block input devices. + * @ko 입력 장치로부터의 입력을 막는다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.disableInput = function () { + this.viewport.disable(); + return this; + }; + /** + * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}. + * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다. + * @return An object with current status value information.현재 상태값 정보를 가진 객체. + */ + + + __proto.getStatus = function () { + var viewport = this.viewport; + var panels = viewport.panelManager.originalPanels().filter(function (panel) { + return !!panel; + }).map(function (panel) { + return { + html: panel.getElement().outerHTML, + index: panel.getIndex() + }; + }); + return { + index: viewport.getCurrentIndex(), + panels: panels, + position: viewport.getCameraPosition() + }; + }; + /** + * Restore to the state of the `status`. + * @ko `status`의 상태로 복원한다. + * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다. + */ + + + __proto.setStatus = function (status) { + this.viewport.restore(status); + }; + /** + * Add plugins that can have different effects on Flicking. + * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다. + * @param - The plugin(s) to add.추가할 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.addPlugins = function (plugins) { + this.viewport.addPlugins(plugins); + return this; + }; + /** + * Remove plugins from Flicking. + * @ko 플리킹으로부터 플러그인들을 제거한다. + * @param - The plugin(s) to remove.제거 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.removePlugins = function (plugins) { + this.viewport.removePlugins(plugins); + return this; + }; + /** + * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes). + * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다. + * @example + * const flick = new eg.Flicking("#flick"); + * flick.destroy(); + * console.log(flick.moveTo); // null + */ + + + __proto.destroy = function (option) { + var _a; + + if (option === void 0) { + option = {}; + } + + this.off(); + + if (this.options.autoResize) { + window.removeEventListener("resize", this.resize); + } + + this.viewport.destroy(option); + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.destroy(); // release resources + + for (var x in this) { + this[x] = null; + } + }; + /** + * Add new panels at the beginning of panels. + * @ko 제일 앞에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.replace(3, document.createElement("div")); // Add new panel at index 3 + * flicking.prepend("\Panel\"); // Prepended at index 2 + * flicking.prepend(["\Panel\", document.createElement("div")]); // Prepended at index 0, 1 + * flicking.prepend("\Panel\"); // Prepended at index 0, pushing every panels behind it. + */ + + + __proto.prepend = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0); + var prependedPanels = viewport.insert(insertingIndex, parsedElements); + this.checkContentsReady(prependedPanels); + return prependedPanels; + }; + /** + * Add new panels at the end of panels. + * @ko 제일 끝에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.append(document.createElement("div")); // Appended at index 0 + * flicking.append("\Panel\"); // Appended at index 1 + * flicking.append(["\Panel\", document.createElement("div")]); // Appended at index 2, 3 + * // Even this is possible + * flicking.append("\Panel 1\\Panel 2\"); // Appended at index 4, 5 + */ + + + __proto.append = function (element) { + var viewport = this.viewport; + var appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element); + this.checkContentsReady(appendedPanels); + return appendedPanels; + }; + /** + * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index. + * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다. + * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스 + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * + * // This will add new panel at index 3, + * // Index 0, 1, 2 is empty at this moment. + * // [empty, empty, empty, PANEL] + * flicking.replace(3, document.createElement("div")); + * + * // As index 2 was empty, this will also add new panel at index 2. + * // [empty, empty, PANEL, PANEL] + * flicking.replace(2, "\Panel\"); + * + * // Index 3 was not empty, so it will replace previous one. + * // It will also add new panels at index 4 and 5. + * // before - [empty, empty, PANEL, PANEL] + * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL] + * flicking.replace(3, ["\Panel\", "\Panel\", "\Panel\"]) + */ + + + __proto.replace = function (index, element) { + var replacedPanels = this.viewport.replace(index, element); + this.checkContentsReady(replacedPanels); + return replacedPanels; + }; + /** + * Remove panel at target index. This will decrease index of panels behind it. + * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다. + * @param index - Index of panel to remove.제거할 패널의 인덱스 + * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수. + * @return Array of removed panels제거된 패널들의 배열 + */ + + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + return this.viewport.remove(index, deleteCount); + }; + /** + * Get indexes to render. Should be used with `renderOnlyVisible` option. + * `beforeSync` should be called before this method for a correct result. + * @private + * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다. + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @return Array of indexes to render.렌더링할 인덱스의 배열 + */ + + + __proto.getRenderingIndexes = function (diffResult) { + var viewport = this.viewport; + var visiblePanels = viewport.getVisiblePanels(); + var maintained = diffResult.maintained.reduce(function (values, _a) { + var before = _a[0], + after = _a[1]; + values[after] = before; + return values; + }, {}); + var panelCount = diffResult.list.length; + var added = diffResult.added; + + var getPanelAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount; + }; + + var visibleIndexes = visiblePanels.map(function (panel) { + return getPanelAbsIndex(panel); + }).filter(function (val) { + return maintained[val % panelCount] != null; + }); + + var renderingPanels = __spreadArrays(visibleIndexes, added); + + var allPanels = viewport.panelManager.allPanels(); + viewport.setVisiblePanels(renderingPanels.map(function (index) { + return allPanels[index]; + })); + return renderingPanels; + }; + /** + * Synchronize info of panels instance with info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다. + * @private + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 + */ + + + __proto.beforeSync = function (diffInfo) { + var _this = this; + + var maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var isCircular = this.options.circular; + var cloneCount = panelManager.getCloneCount(); + var prevClonedPanels = panelManager.clonedPanels(); // Update visible panels + + var newVisiblePanels = viewport.getVisiblePanels().filter(function (panel) { + return findIndex(removed, function (index) { + return index === panel.getIndex(); + }) < 0; + }); + viewport.setVisiblePanels(newVisiblePanels); // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0 && cloneCount === prevClonedPanels.length) { + return this; + } + + var prevOriginalPanels = panelManager.originalPanels(); + var newPanels = []; + var newClones = counter(cloneCount).map(function () { + return []; + }); + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newPanels[afterIdx] = prevOriginalPanels[beforeIdx]; + newPanels[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + newPanels[addIndex] = new Panel(null, addIndex, _this.viewport); + }); + + if (isCircular) { + counter(cloneCount).forEach(function (groupIndex) { + var prevCloneGroup = prevClonedPanels[groupIndex]; + var newCloneGroup = newClones[groupIndex]; + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newCloneGroup[afterIdx] = prevCloneGroup ? prevCloneGroup[beforeIdx] : newPanels[afterIdx].clone(groupIndex, false); + newCloneGroup[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + var newPanel = newPanels[addIndex]; + newCloneGroup[addIndex] = newPanel.clone(groupIndex, false); + }); + }); + } + + added.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index, + max: index + }); + }); + removed.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index - 1, + max: index + 1 + }); + }); + var checkedIndexes = viewport.getCheckedIndexes(); + checkedIndexes.forEach(function (_a, idx) { + var min = _a[0], + max = _a[1]; // Push checked indexes backward + + var pushedIndex = added.filter(function (index) { + return index < min && panelManager.has(index); + }).length - removed.filter(function (index) { + return index < min; + }).length; + checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + }); // Only effective only when there are least one panel which have changed its index + + if (changed.length > 0) { + // Removed checked index by changed ones after pushing + maintained.forEach(function (_a) { + var next = _a[1]; + viewport.updateCheckedIndexes({ + min: next, + max: next + }); + }); + } + + panelManager.replacePanels(newPanels, newClones); + this.isPanelChangedAtBeforeSync = true; + }; + /** + * Synchronize info of panels with DOM info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다. + * @private + * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트. + */ + + + __proto.sync = function (diffInfo) { + var list = diffInfo.list, + maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) { + return this; + } + + var viewport = this.viewport; + var _a = this.options, + renderOnlyVisible = _a.renderOnlyVisible, + circular = _a.circular; + var panelManager = viewport.panelManager; + + if (!renderOnlyVisible) { + var indexRange = panelManager.getRange(); + var beforeDiffInfo = diffInfo; + + if (circular) { + var prevOriginalPanelCount_1 = indexRange.max; + var originalPanelCount_1 = list.length / (panelManager.getCloneCount() + 1) >> 0; + var originalAdded = added.filter(function (index) { + return index < originalPanelCount_1; + }); + var originalRemoved = removed.filter(function (index) { + return index <= prevOriginalPanelCount_1; + }); + var originalMaintained = maintained.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + var originalChanged = changed.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + beforeDiffInfo = { + added: originalAdded, + maintained: originalMaintained, + removed: originalRemoved, + changed: originalChanged + }; + } + + this.beforeSync(beforeDiffInfo); + } + + var visiblePanels = renderOnlyVisible ? viewport.getVisiblePanels() : this.getAllPanels(true); + added.forEach(function (addedIndex) { + var addedElement = list[addedIndex]; + var beforePanel = visiblePanels[addedIndex]; + beforePanel.setElement(addedElement); // As it can be 0 + + beforePanel.unCacheBbox(); + }); + + if (this.isPanelChangedAtBeforeSync) { + // Reset visible panels + viewport.setVisiblePanels([]); + this.isPanelChangedAtBeforeSync = false; + } + + viewport.resize(); + return this; + }; + + __proto.listenInput = function () { + var flicking = this; + var viewport = flicking.viewport; + var stateMachine = viewport.stateMachine; // Set event context + + flicking.eventContext = { + flicking: flicking, + viewport: flicking.viewport, + transitTo: stateMachine.transitTo, + triggerEvent: flicking.triggerEvent, + moveCamera: flicking.moveCamera, + stopCamera: viewport.stopCamera + }; + var handlers = {}; + + var _loop_1 = function (key) { + var eventType = AXES_EVENTS[key]; + + handlers[eventType] = function (e) { + return stateMachine.fire(eventType, e, flicking.eventContext); + }; + }; + + for (var key in AXES_EVENTS) { + _loop_1(key); + } // Connect Axes instance with PanInput + + + flicking.viewport.connectAxesHandler(handlers); + }; + + __proto.listenResize = function () { + var _this = this; + + var options = this.options; + + if (options.autoResize) { + window.addEventListener("resize", this.resize); + } + + if (options.resizeOnContentsReady) { + var contentsReadyChecker = new ImReady(); + contentsReadyChecker.on("preReady", function () { + _this.resize(); + }); + contentsReadyChecker.on("readyElement", function (e) { + if (e.hasLoading && e.isPreReadyOver) { + _this.resize(); + } + }); + contentsReadyChecker.on("error", function (e) { + _this.trigger(EVENTS.CONTENT_ERROR, { + type: EVENTS.CONTENT_ERROR, + element: e.element + }); + }); + contentsReadyChecker.check([this.wrapper]); + this.contentsReadyChecker = contentsReadyChecker; + } + }; + + __proto.checkContentsReady = function (panels) { + var _a; + + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.check(panels.map(function (panel) { + return panel.getElement(); + })); + }; + /** + * Version info string + * @ko 버전정보 문자열 + * @example + * eg.Flicking.VERSION; // ex) 3.0.0 + * @memberof eg.Flicking + */ + + + Flicking.VERSION = "3.7.2"; + /** + * Direction constant - "PREV" or "NEXT" + * @ko 방향 상수 - "PREV" 또는 "NEXT" + * @type {object} + * @property {"PREV"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
+ * @property {"NEXT"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
+ * @example + * eg.Flicking.DIRECTION.PREV; // "PREV" + * eg.Flicking.DIRECTION.NEXT; // "NEXT" + */ + + Flicking.DIRECTION = DIRECTION; + /** + * Event type object with event name strings. + * @ko 이벤트 이름 문자열들을 담은 객체 + * @type {object} + * @property {"holdStart"} HOLD_START - holdStart eventholdStart 이벤트 + * @property {"holdEnd"} HOLD_END - holdEnd eventholdEnd 이벤트 + * @property {"moveStart"} MOVE_START - moveStart eventmoveStart 이벤트 + * @property {"move"} MOVE - move eventmove 이벤트 + * @property {"moveEnd"} MOVE_END - moveEnd eventmoveEnd 이벤트 + * @property {"change"} CHANGE - change eventchange 이벤트 + * @property {"restore"} RESTORE - restore eventrestore 이벤트 + * @property {"select"} SELECT - select eventselect 이벤트 + * @property {"needPanel"} NEED_PANEL - needPanel eventneedPanel 이벤트 + * @example + * eg.Flicking.EVENTS.MOVE_START; // "MOVE_START" + */ + + Flicking.EVENTS = EVENTS; + return Flicking; +}(Component); + +export default Flicking; +export { DEFAULT_OPTIONS, MOVE_TYPE, withFlickingMethods }; +//# sourceMappingURL=flicking.esm.js.map diff --git a/dist/flicking.esm.js.map b/dist/flicking.esm.js.map new file mode 100644 index 0000000000..426fd252ea --- /dev/null +++ b/dist/flicking.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"flicking.esm.js","sources":["../src/consts.ts","../src/utils.ts","../src/components/Panel.ts","../src/components/PanelManager.ts","../src/states/State.ts","../src/states/IdleState.ts","../src/states/HoldingState.ts","../src/states/DraggingState.ts","../src/states/AnimatingState.ts","../src/states/DisabledState.ts","../src/components/StateMachine.ts","../src/moves/MoveType.ts","../src/moves/Snap.ts","../src/moves/FreeScroll.ts","../src/components/Viewport.ts","../src/Flicking.ts"],"sourcesContent":["/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { FlickingOptions, EventType, Direction, AxesEventType, StateType, MoveTypeSnapOption, MoveTypeFreeScrollOption, FlickingMethodsKeys } from \"./types\";\n\nexport const MOVE_TYPE: {\n SNAP: \"snap\";\n FREE_SCROLL: \"freeScroll\";\n} = {\n SNAP: \"snap\",\n FREE_SCROLL: \"freeScroll\",\n};\n\nexport const DEFAULT_MOVE_TYPE_OPTIONS: {\n snap: MoveTypeSnapOption,\n freeScroll: MoveTypeFreeScrollOption,\n} = {\n snap: {\n type: \"snap\",\n count: 1,\n },\n freeScroll: {\n type: \"freeScroll\",\n },\n};\nexport const isBrowser = typeof document !== \"undefined\";\n\n/**\n * Default options for creating Flicking.\n * @ko 플리킹을 만들 때 사용하는 기본 옵션들\n * @private\n * @memberof eg.Flicking\n */\nexport const DEFAULT_OPTIONS: Readonly = {\n classPrefix: \"eg-flick\",\n deceleration: 0.0075,\n horizontal: true,\n circular: false,\n infinite: false,\n infiniteThreshold: 0,\n lastIndex: Infinity,\n threshold: 40,\n duration: 100,\n panelEffect: x => 1 - Math.pow(1 - x, 3),\n defaultIndex: 0,\n inputType: [\"touch\", \"mouse\"],\n thresholdAngle: 45,\n bounce: 10,\n autoResize: false,\n adaptive: false,\n zIndex: 2000,\n bound: false,\n overflow: false,\n hanger: \"50%\",\n anchor: \"50%\",\n gap: 0,\n moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap,\n useOffset: false,\n isEqualSize: false,\n isConstantSize: false,\n renderOnlyVisible: false,\n renderExternal: false,\n resizeOnContentsReady: false,\n iOSEdgeSwipeThreshold: 30,\n collectStatistics: true,\n};\n\nexport const DEFAULT_VIEWPORT_CSS = {\n position: \"relative\",\n zIndex: DEFAULT_OPTIONS.zIndex,\n overflow: \"hidden\",\n};\n\nexport const DEFAULT_CAMERA_CSS = {\n width: \"100%\",\n height: \"100%\",\n willChange: \"transform\",\n};\n\nexport const DEFAULT_PANEL_CSS = {\n position: \"absolute\",\n};\n\nexport const EVENTS: EventType = {\n HOLD_START: \"holdStart\",\n HOLD_END: \"holdEnd\",\n MOVE_START: \"moveStart\",\n MOVE: \"move\",\n MOVE_END: \"moveEnd\",\n CHANGE: \"change\",\n RESTORE: \"restore\",\n SELECT: \"select\",\n NEED_PANEL: \"needPanel\",\n VISIBLE_CHANGE: \"visibleChange\",\n CONTENT_ERROR: \"contentError\",\n};\n\nexport const AXES_EVENTS: AxesEventType = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\",\n};\n\nexport const STATE_TYPE: StateType = {\n IDLE: 0,\n HOLDING: 1,\n DRAGGING: 2,\n ANIMATING: 3,\n DISABLED: 4,\n};\n\nexport const DIRECTION: Direction = {\n PREV: \"PREV\",\n NEXT: \"NEXT\",\n};\nexport const FLICKING_METHODS: {[key in FlickingMethodsKeys]: true} = {\n prev: true,\n next: true,\n moveTo: true,\n getIndex: true,\n getAllPanels: true,\n getCurrentPanel: true,\n getElement: true,\n getSize: true,\n getPanel: true,\n getPanelCount: true,\n getStatus: true,\n getVisiblePanels: true,\n enableInput: true,\n disableInput: true,\n destroy: true,\n resize: true,\n setStatus: true,\n isPlaying: true,\n};\n\n// Check whether browser supports transform: translate3d\n// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\nexport let checkTranslateSupport = () => {\n const transforms = {\n webkitTransform: \"-webkit-transform\",\n msTransform: \"-ms-transform\",\n MozTransform: \"-moz-transform\",\n OTransform: \"-o-transform\",\n transform: \"transform\",\n };\n\n if (!isBrowser) {\n return {\n name: transforms.transform,\n has3d: true,\n };\n }\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform in transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new Error(\"Browser doesn't support CSS3 2D Transforms.\");\n }\n\n const el = document.createElement(\"div\");\n\n document.documentElement.insertBefore(el, null);\n\n el.style[transformName] = \"translate3d(1px, 1px, 1px)\";\n const styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]);\n\n el.parentElement!.removeChild(el);\n\n const transformInfo = {\n name: transformName,\n has3d: styleVal.length > 0 && styleVal !== \"none\",\n };\n\n checkTranslateSupport = () => transformInfo;\n\n return transformInfo;\n};\n\nexport const TRANSFORM = checkTranslateSupport();\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ElementLike, OriginalStyle, BoundingBox } from \"./types\";\nimport Flicking from \"./Flicking\";\nimport { FLICKING_METHODS } from \"./consts\";\n\nexport function merge(target: object, ...srcs: object[]): object {\n srcs.forEach(source => {\n Object.keys(source).forEach(key => {\n const value = source[key];\n target[key] = value;\n });\n });\n\n return target;\n}\n\nexport function parseElement(element: ElementLike | ElementLike[]): HTMLElement[] {\n if (!Array.isArray(element)) {\n element = [element];\n }\n\n const elements: HTMLElement[] = [];\n element.forEach(el => {\n if (isString(el)) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = el;\n\n elements.push(...toArray(tempDiv.children) as HTMLElement[]);\n while (tempDiv.firstChild) {\n tempDiv.removeChild(tempDiv.firstChild);\n }\n } else {\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n// Get class list of element as string array\nexport function classList(element: HTMLElement): string[] {\n return element.classList\n ? toArray(element.classList)\n : element.className.split(\" \");\n}\n\n// Add class to specified element\nexport function addClass(element: HTMLElement, className: string): void {\n if (element.classList) {\n element.classList.add(className);\n } else {\n if (!hasClass(element, className)) {\n element.className = (`${element.className} ${className}`).replace(/\\s{2,}/g, \" \");\n }\n }\n}\n\nexport function hasClass(element: HTMLElement, className: string): boolean {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return (element.className.split(\" \").indexOf(className) >= 0);\n }\n}\n\nexport function applyCSS(element: HTMLElement, cssObj: object): void {\n Object.keys(cssObj).forEach(property => {\n element.style[property] = cssObj[property];\n });\n}\n\nexport function clamp(val: number, min: number, max: number) {\n return Math.max(Math.min(val, max), min);\n}\n\n// Min: inclusive, Max: exclusive\nexport function isBetween(val: number, min: number, max: number) {\n return val >= min && val <= max;\n}\n\nexport interface ArrayLike {\n length: number;\n [index: number]: T;\n}\n\nexport function toArray(iterable: ArrayLike): T[] {\n return [].slice.call(iterable);\n}\n\nexport function isArray(arr: any): boolean {\n return arr && arr.constructor === Array;\n}\n\nexport function parseArithmeticExpression(cssValue: number | string, base: number, defaultVal?: number): number {\n // Set base / 2 to default value, if it's undefined\n const defaultValue = defaultVal != null ? defaultVal : base / 2;\n const cssRegex = /(?:(\\+|\\-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return clamp(cssValue, 0, base);\n }\n\n let idx = 0;\n let calculatedValue = 0;\n let matchResult = cssRegex.exec(cssValue);\n while (matchResult != null) {\n let sign = matchResult[1];\n const value = matchResult[2];\n const unit = matchResult[3];\n\n let parsedValue = parseFloat(value);\n\n if (idx <= 0) {\n sign = sign || \"+\";\n }\n\n // Return default value for values not in good form\n if (!sign) {\n return defaultValue;\n }\n\n if (unit === \"%\") {\n parsedValue = (parsedValue / 100) * base;\n }\n\n calculatedValue += sign === \"+\"\n ? parsedValue\n : -parsedValue;\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return defaultValue;\n }\n\n // Clamp between 0 ~ base\n return clamp(calculatedValue, 0, base);\n}\n\nexport function getProgress(pos: number, range: number[]) {\n // start, anchor, end\n // -1 , 0 , 1\n const [min, center, max] = range;\n\n if (pos > center && (max - center)) {\n // 0 ~ 1\n return (pos - center) / (max - center);\n } else if (pos < center && (center - min)) {\n // -1 ~ 0\n return (pos - center) / (center - min);\n } else if (pos !== center && max - min) {\n return (pos - min) / (max - min);\n }\n return 0;\n}\n\nexport function findIndex(iterable: T[], callback: (el: T) => boolean): number {\n for (let i = 0; i < iterable.length; i += 1) {\n const element = iterable[i];\n if (element && callback(element)) {\n return i;\n }\n }\n\n return -1;\n}\n\n// return [0, 1, ...., max - 1]\nexport function counter(max: number): number[] {\n const counterArray: number[] = [];\n for (let i = 0; i < max; i += 1) {\n counterArray[i] = i;\n }\n return counterArray;\n}\n\n// Circulate number between range [min, max]\n/*\n * \"indexed\" means min and max is not same, so if it's true \"min - 1\" should be max\n * While if it's false, \"min - 1\" should be \"max - 1\"\n * use `indexed: true` when it should be used for circulating integers like index\n * or `indexed: false` when it should be used for something like positions.\n */\nexport function circulate(value: number, min: number, max: number, indexed: boolean): number {\n const size = indexed\n ? max - min + 1\n : max - min;\n if (value < min) {\n const offset = indexed\n ? (min - value - 1) % size\n : (min - value) % size;\n value = max - offset;\n } else if (value > max) {\n const offset = indexed\n ? (value - max - 1) % size\n : (value - max) % size;\n value = min + offset;\n }\n\n return value;\n}\n\nexport function restoreStyle(element: HTMLElement, originalStyle: OriginalStyle): void {\n originalStyle.className\n ? element.setAttribute(\"class\", originalStyle.className)\n : element.removeAttribute(\"class\");\n originalStyle.style\n ? element.setAttribute(\"style\", originalStyle.style)\n : element.removeAttribute(\"style\");\n}\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터.\n * @memberof eg.Flicking\n * @private\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nexport function withFlickingMethods(prototype: any, flickingName: string) {\n Object.keys(FLICKING_METHODS).forEach((name: keyof Flicking) => {\n if (prototype[name]) {\n return;\n }\n prototype[name] = function(...args) {\n const result = this[flickingName][name](...args);\n\n // fix `this` type to return your own `flicking` instance to the instance using the decorator.\n if (result === this[flickingName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n}\n\nexport function getBbox(element: HTMLElement, useOffset: boolean) {\n let bbox: BoundingBox;\n if (useOffset) {\n bbox = {\n x: 0,\n y: 0,\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n } else {\n const clientRect = element.getBoundingClientRect();\n bbox = {\n x: clientRect.left,\n y: clientRect.top,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n return bbox;\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Viewport from \"./Viewport\";\nimport { OriginalStyle, FlickingPanel, ElementLike, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_PANEL_CSS, EVENTS } from \"../consts\";\nimport { addClass, applyCSS, parseArithmeticExpression, parseElement, getProgress, restoreStyle, hasClass, getBbox } from \"../utils\";\n\nclass Panel implements FlickingPanel {\n public viewport: Viewport;\n public prevSibling: Panel | null;\n public nextSibling: Panel | null;\n\n protected state: {\n index: number;\n position: number;\n relativeAnchorPosition: number;\n size: number;\n isClone: boolean;\n isVirtual: boolean;\n // Index of cloned panel, zero-based integer(original: -1, cloned: [0, 1, 2, ...])\n // if cloneIndex is 0, that means it's first cloned panel of original panel\n cloneIndex: number;\n originalStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n private element: HTMLElement;\n private original?: Panel;\n private clonedPanels: Panel[];\n\n public constructor(\n element?: HTMLElement | null,\n index?: number,\n viewport?: Viewport,\n ) {\n this.viewport = viewport!;\n this.prevSibling = null;\n this.nextSibling = null;\n this.clonedPanels = [];\n\n this.state = {\n index: index!,\n position: 0,\n relativeAnchorPosition: 0,\n size: 0,\n isClone: false,\n isVirtual: false,\n cloneIndex: -1,\n originalStyle: {\n className: \"\",\n style: \"\",\n },\n cachedBbox: null,\n };\n this.setElement(element);\n }\n\n public resize(givenBbox?: BoundingBox): void {\n const state = this.state;\n const options = this.viewport.options;\n const bbox = givenBbox\n ? givenBbox\n : this.getBbox();\n this.state.cachedBbox = bbox;\n const prevSize = state.size;\n\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size);\n }\n\n if (!state.isClone) {\n this.clonedPanels.forEach(panel => {\n const cloneState = panel.state;\n\n cloneState.size = state.size;\n cloneState.cachedBbox = state.cachedBbox;\n cloneState.relativeAnchorPosition = state.relativeAnchorPosition;\n });\n }\n }\n\n public unCacheBbox(): void {\n this.state.cachedBbox = null;\n }\n\n public getProgress() {\n const viewport = this.viewport;\n const options = viewport.options;\n const panelCount = viewport.panelManager.getPanelCount();\n const scrollAreaSize = viewport.getScrollAreaSize();\n\n const relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex();\n const progress = relativeIndex - viewport.getCurrentProgress();\n\n return progress;\n }\n\n public getOutsetProgress() {\n const viewport = this.viewport;\n const outsetRange = [\n -this.getSize(),\n viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(),\n viewport.getSize(),\n ];\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const outsetProgress = getProgress(relativePanelPosition, outsetRange);\n\n return outsetProgress;\n }\n\n public getVisibleRatio() {\n const viewport = this.viewport;\n const panelSize = this.getSize();\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const rightRelativePanelPosition = relativePanelPosition + panelSize;\n\n const visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0);\n const visibleRatio = visibleSize >= 0\n ? visibleSize / panelSize\n : 0;\n\n return visibleRatio;\n }\n\n public focus(duration?: number): void {\n const viewport = this.viewport;\n const currentPanel = viewport.getCurrentPanel();\n const hangerPosition = viewport.getHangerPosition();\n const anchorPosition = this.getAnchorPosition();\n if (hangerPosition === anchorPosition || !currentPanel) {\n return;\n }\n\n const currentPosition = currentPanel.getPosition();\n const eventType = currentPosition === this.getPosition()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration);\n }\n\n public update(updateFunction: ((element: HTMLElement) => any) | null = null, shouldResize: boolean = true): void {\n const identicalPanels = this.getIdenticalPanels();\n\n if (updateFunction) {\n identicalPanels.forEach(eachPanel => {\n updateFunction(eachPanel.getElement());\n });\n }\n\n if (shouldResize) {\n identicalPanels.forEach(eachPanel => {\n eachPanel.unCacheBbox();\n });\n this.viewport.addVisiblePanel(this);\n this.viewport.resize();\n }\n }\n\n public prev(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const prevSibling = this.prevSibling;\n\n if (!prevSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const prevPanelIndex = prevSibling.getIndex();\n const prevPanelPosition = prevSibling.getPosition();\n const prevPanelSize = prevSibling.getSize();\n\n const hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1;\n const notYetMinPanel = options.infinite\n && currentIndex > 0\n && prevPanelIndex > currentIndex;\n\n if (hasEmptyPanelBetween || notYetMinPanel) {\n // Empty panel exists between\n return null;\n }\n\n const newPosition = currentPosition - prevPanelSize - options.gap;\n\n let prevPanel = prevSibling;\n if (prevPanelPosition !== newPosition) {\n prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true);\n prevPanel.setPosition(newPosition);\n }\n\n return prevPanel;\n }\n\n public next(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const nextSibling = this.nextSibling;\n const lastIndex = viewport.panelManager.getLastIndex();\n\n if (!nextSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const nextPanelIndex = nextSibling.getIndex();\n const nextPanelPosition = nextSibling.getPosition();\n\n const hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1;\n const notYetMaxPanel = options.infinite\n && currentIndex < lastIndex\n && nextPanelIndex < currentIndex;\n\n if (hasEmptyPanelBetween || notYetMaxPanel) {\n return null;\n }\n\n const newPosition = currentPosition + this.getSize() + options.gap;\n\n let nextPanel = nextSibling;\n if (nextPanelPosition !== newPosition) {\n nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true);\n nextPanel.setPosition(newPosition);\n }\n\n return nextPanel;\n }\n\n public insertBefore(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n const firstPanel = viewport.panelManager.firstPanel()!;\n const prevSibling = this.prevSibling;\n // Finding correct inserting index\n // While it should insert removing empty spaces,\n // It also should have to be bigger than prevSibling' s index\n const targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex()\n ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length)\n : Math.max(this.getIndex() - parsedElements.length, 0);\n\n return viewport.insert(targetIndex, parsedElements);\n }\n\n public insertAfter(element: ElementLike | ElementLike[]): FlickingPanel[] {\n return this.viewport.insert(this.getIndex() + 1, element);\n }\n\n public remove(): FlickingPanel {\n this.viewport.remove(this.getIndex());\n\n return this;\n }\n\n public destroy(option: Partial): void {\n if (!option.preserveUI) {\n const originalStyle = this.state.originalStyle;\n\n restoreStyle(this.element, originalStyle);\n }\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getAnchorPosition(): number {\n return this.state.position + this.state.relativeAnchorPosition;\n }\n\n public getRelativeAnchorPosition(): number {\n return this.state.relativeAnchorPosition;\n }\n\n public getIndex(): number {\n return this.state.index;\n }\n\n public getPosition(): number {\n return this.state.position;\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getBbox(): BoundingBox {\n const state = this.state;\n const viewport = this.viewport;\n const element = this.element;\n const options = viewport.options;\n\n if (!element) {\n state.cachedBbox = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n } else if (!state.cachedBbox) {\n const wasVisible = Boolean(element.parentNode);\n const cameraElement = viewport.getCameraElement();\n if (!wasVisible) {\n cameraElement.appendChild(element);\n viewport.addVisiblePanel(this);\n }\n state.cachedBbox = getBbox(element, options.useOffset);\n\n if (!wasVisible && viewport.options.renderExternal) {\n cameraElement.removeChild(element);\n }\n }\n return state.cachedBbox!;\n }\n\n public isClone(): boolean {\n return this.state.isClone;\n }\n\n public getOverlappedClass(classes: string[]): string | undefined {\n const element = this.element;\n\n for (const className of classes) {\n if (hasClass(element, className)) {\n return className;\n }\n }\n }\n\n public getCloneIndex(): number {\n return this.state.cloneIndex;\n }\n\n public getClonedPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getClonedPanels()\n : this.clonedPanels;\n }\n\n public getIdenticalPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getIdenticalPanels()\n : [this, ...this.clonedPanels];\n }\n\n public getOriginalPanel(): Panel {\n return this.state.isClone\n ? this.original!\n : this;\n }\n\n public setIndex(index: number): void {\n const state = this.state;\n\n state.index = index;\n this.clonedPanels.forEach(panel => panel.state.index = index);\n }\n\n public setPosition(pos: number): this {\n this.state.position = pos;\n\n return this;\n }\n\n public setPositionCSS(offset: number = 0): void {\n if (!this.element) {\n return;\n }\n const state = this.state;\n const pos = state.position;\n const options = this.viewport.options;\n const elementStyle = this.element.style;\n const currentElementStyle = options.horizontal\n ? elementStyle.left\n : elementStyle.top;\n const styleToApply = `${pos - offset}px`;\n\n if (!state.isVirtual && currentElementStyle !== styleToApply) {\n options.horizontal\n ? elementStyle.left = styleToApply\n : elementStyle.top = styleToApply;\n }\n }\n\n public clone(cloneIndex: number, isVirtual: boolean = false, element?: HTMLElement | null): Panel {\n const state = this.state;\n const viewport = this.viewport;\n let cloneElement = element;\n\n if (!cloneElement && this.element) {\n cloneElement = isVirtual ? this.element : this.element.cloneNode(true) as HTMLElement;\n }\n const clonedPanel = new Panel(cloneElement, state.index, viewport);\n const clonedState = clonedPanel.state;\n\n clonedPanel.original = state.isClone\n ? this.original\n : this;\n clonedState.isClone = true;\n clonedState.isVirtual = isVirtual;\n clonedState.cloneIndex = cloneIndex;\n // Inherit some state values\n clonedState.size = state.size;\n clonedState.relativeAnchorPosition = state.relativeAnchorPosition;\n clonedState.originalStyle = state.originalStyle;\n clonedState.cachedBbox = state.cachedBbox;\n\n if (!isVirtual) {\n this.clonedPanels.push(clonedPanel);\n } else {\n clonedPanel.prevSibling = this.prevSibling;\n clonedPanel.nextSibling = this.nextSibling;\n }\n\n return clonedPanel;\n }\n\n public removeElement(): void {\n if (!this.viewport.options.renderExternal) {\n const element = this.element;\n element.parentNode && element.parentNode.removeChild(element);\n }\n\n // Do the same thing for clones\n if (!this.state.isClone) {\n this.removeClonedPanelsAfter(0);\n }\n }\n\n public removeClonedPanelsAfter(start: number): void {\n const options = this.viewport.options;\n const removingPanels = this.clonedPanels.splice(start);\n\n if (!options.renderExternal) {\n removingPanels.forEach(panel => {\n panel.removeElement();\n });\n }\n }\n\n public setElement(element?: HTMLElement | null): void {\n if (!element) {\n return;\n }\n const currentElement = this.element;\n if (element !== currentElement) {\n const options = this.viewport.options;\n\n if (currentElement) {\n if (options.horizontal) {\n element.style.left = currentElement.style.left;\n } else {\n element.style.top = currentElement.style.top;\n }\n } else {\n const originalStyle = this.state.originalStyle;\n\n originalStyle.className = element.getAttribute(\"class\");\n originalStyle.style = element.getAttribute(\"style\");\n }\n\n this.element = element;\n\n if (options.classPrefix) {\n addClass(element, `${options.classPrefix}-panel`);\n }\n\n // Update size info after applying panel css\n applyCSS(this.element, DEFAULT_PANEL_CSS);\n }\n }\n}\n\nexport default Panel;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"./Panel\";\nimport { FlickingOptions } from \"../types\";\nimport { findIndex, counter } from \"../utils\";\n\nclass PanelManager {\n private cameraElement: HTMLElement;\n private options: FlickingOptions;\n private panels: Panel[];\n private clones: Panel[][];\n // index range of existing panels\n private range: {\n min: number;\n max: number;\n };\n private length: number;\n private lastIndex: number;\n private cloneCount: number;\n\n constructor(\n cameraElement: HTMLElement,\n options: FlickingOptions,\n ) {\n this.cameraElement = cameraElement;\n this.panels = [];\n this.clones = [];\n this.range = {\n min: -1,\n max: -1,\n };\n this.length = 0;\n this.cloneCount = 0;\n this.options = options;\n this.lastIndex = options.lastIndex;\n }\n\n public firstPanel(): Panel | undefined {\n return this.panels[this.range.min];\n }\n\n public lastPanel(): Panel | undefined {\n return this.panels[this.range.max];\n }\n\n public allPanels(): ReadonlyArray {\n return [\n ...this.panels,\n ...this.clones.reduce((allClones, clones) => [...allClones, ...clones], []),\n ];\n }\n\n public originalPanels(): ReadonlyArray {\n return this.panels;\n }\n\n public clonedPanels(): ReadonlyArray {\n return this.clones;\n }\n\n public replacePanels(newPanels: Panel[], newClones: Panel[][]): void {\n this.panels = newPanels;\n this.clones = newClones;\n\n this.range = {\n min: findIndex(newPanels, panel => Boolean(panel)),\n max: newPanels.length - 1,\n };\n this.length = newPanels.filter(panel => Boolean(panel)).length;\n }\n\n public has(index: number): boolean {\n return !!this.panels[index];\n }\n\n public get(index: number): Panel | undefined {\n return this.panels[index];\n }\n\n public getPanelCount(): number {\n return this.length;\n }\n\n public getLastIndex(): number {\n return this.lastIndex;\n }\n\n public getRange(): Readonly<{ min: number, max: number }> {\n return this.range;\n }\n\n public getCloneCount(): number {\n return this.cloneCount;\n }\n\n public setLastIndex(lastIndex: number): void {\n this.lastIndex = lastIndex;\n\n const firstPanel = this.firstPanel();\n const lastPanel = this.lastPanel();\n\n if (!firstPanel || !lastPanel) {\n return; // no meaning of updating range & length\n }\n\n // Remove panels above new last index\n const range = this.range;\n if (lastPanel.getIndex() > lastIndex) {\n const removingPanels = this.panels.splice(lastIndex + 1);\n this.length -= removingPanels.length;\n\n const firstRemovedPanel = removingPanels.filter(panel => !!panel)[0];\n const possibleLastPanel = firstRemovedPanel.prevSibling;\n if (possibleLastPanel) {\n range.max = possibleLastPanel.getIndex();\n } else {\n range.min = -1;\n range.max = -1;\n }\n\n if (this.shouldRender()) {\n removingPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n public setCloneCount(cloneCount: number): void {\n this.cloneCount = cloneCount;\n }\n\n // Insert at index\n // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it\n public insert(index: number, newPanels: Panel[]): number {\n const panels = this.panels;\n const range = this.range;\n const isCircular = this.options.circular;\n const lastIndex = this.lastIndex;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n let pushedIndex = newPanels.length;\n // Like when setting index 50 while visible panels are 0, 1, 2\n if (index > range.max) {\n newPanels.forEach((panel, offset) => {\n panels[index + offset] = panel;\n });\n } else {\n const panelsAfterIndex = panels.slice(index, index + newPanels.length);\n // Find empty from beginning\n let emptyPanelCount = findIndex(panelsAfterIndex, panel => !!panel);\n if (emptyPanelCount < 0) {\n // All empty\n emptyPanelCount = panelsAfterIndex.length;\n }\n pushedIndex = newPanels.length - emptyPanelCount;\n\n // Insert removing empty panels\n panels.splice(index, emptyPanelCount, ...newPanels);\n\n // Remove panels after last index\n if (panels.length > lastIndex + 1) {\n const removedPanels = panels.splice(lastIndex + 1)\n .filter(panel => Boolean(panel));\n this.length -= removedPanels.length;\n\n // Find first\n const newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), panel => !!panel);\n\n // Can be filled with empty after newLastIndex\n this.panels.splice(newLastIndex + 1);\n this.range.max = newLastIndex;\n\n if (this.shouldRender()) {\n removedPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n // Update index of previous panels\n if (pushedIndex > 0) {\n panels.slice(index + newPanels.length).forEach(panel => {\n panel.setIndex(panel.getIndex() + pushedIndex);\n });\n }\n\n // Update state\n this.length += newPanels.length;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling);\n const clones = this.clones;\n const panelCount = this.panels.length;\n if (clones[0] && clones[0].length > lastIndex + 1) {\n clones.forEach(cloneSet => {\n cloneSet.splice(panelCount);\n });\n }\n }\n\n return pushedIndex;\n }\n\n public replace(index: number, newPanels: Panel[]): Panel[] {\n const panels = this.panels;\n const range = this.range;\n const options = this.options;\n const isCircular = options.circular;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index + newPanels.length);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n if (index > range.max) {\n // Temporarily insert null at index to use splice()\n (panels[index] as any) = null;\n }\n\n const replacedPanels = panels.splice(index, newPanels.length, ...newPanels);\n const wasNonEmptyCount = replacedPanels.filter(panel => Boolean(panel)).length;\n\n // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1]\n // So length should be increased by 3(inserting panels) - 1(non-empty panels)\n this.length += newPanels.length - wasNonEmptyCount;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length, nextSibling);\n }\n\n if (this.shouldRender()) {\n replacedPanels.forEach(panel => panel && panel.removeElement());\n }\n\n return replacedPanels;\n }\n\n public remove(index: number, deleteCount: number = 1): Panel[] {\n const isCircular = this.options.circular;\n const panels = this.panels;\n const clones = this.clones;\n // Delete count should be equal or larger than 0\n deleteCount = Math.max(deleteCount, 0);\n\n const deletedPanels = panels\n .splice(index, deleteCount)\n .filter(panel => !!panel);\n\n if (this.shouldRender()) {\n deletedPanels.forEach(panel => panel.removeElement());\n }\n\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(index, deleteCount);\n });\n }\n\n // Update indexes\n panels\n .slice(index)\n .forEach(panel => {\n panel.setIndex(panel.getIndex() - deleteCount);\n });\n\n // Check last panel is empty\n let lastIndex = panels.length - 1;\n if (!panels[lastIndex]) {\n const reversedPanels = panels.concat().reverse();\n const nonEmptyIndexFromLast = findIndex(reversedPanels, panel => !!panel);\n lastIndex = nonEmptyIndexFromLast < 0\n ? -1 // All empty\n : lastIndex - nonEmptyIndexFromLast;\n\n // Remove all empty panels from last\n panels.splice(lastIndex + 1);\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(lastIndex + 1);\n });\n }\n }\n\n // Update range & length\n this.range = {\n min: findIndex(panels, panel => !!panel),\n max: lastIndex,\n };\n this.length -= deletedPanels.length;\n\n if (this.length <= 0) {\n // Reset clones\n this.clones = [];\n this.cloneCount = 0;\n }\n\n return deletedPanels;\n }\n\n public chainAllPanels() {\n const allPanels = this.allPanels().filter(panel => !!panel);\n const allPanelsCount = allPanels.length;\n\n if (allPanelsCount <= 1) {\n return;\n }\n\n allPanels.slice(1, allPanels.length - 1).forEach((panel, idx) => {\n const prevPanel = allPanels[idx];\n const nextPanel = allPanels[idx + 2];\n\n panel.prevSibling = prevPanel;\n panel.nextSibling = nextPanel;\n });\n\n const firstPanel = allPanels[0];\n const lastPanel = allPanels[allPanelsCount - 1];\n\n firstPanel.prevSibling = null;\n firstPanel.nextSibling = allPanels[1];\n lastPanel.prevSibling = allPanels[allPanelsCount - 2];\n lastPanel.nextSibling = null;\n\n if (this.options.circular) {\n firstPanel.prevSibling = lastPanel;\n lastPanel.nextSibling = firstPanel;\n }\n }\n\n public insertClones(cloneIndex: number, index: number, clonedPanels: Panel[], deleteCount: number = 0): void {\n const clones = this.clones;\n const lastIndex = this.lastIndex;\n\n if (!clones[cloneIndex]) {\n const newClones: Panel[] = [];\n clonedPanels.forEach((panel, offset) => {\n newClones[index + offset] = panel;\n });\n\n clones[cloneIndex] = newClones;\n } else {\n const insertTarget = clones[cloneIndex];\n\n if (index >= insertTarget.length) {\n clonedPanels.forEach((panel, offset) => {\n insertTarget[index + offset] = panel;\n });\n } else {\n insertTarget.splice(index, deleteCount, ...clonedPanels);\n // Remove panels after last index\n if (clonedPanels.length > lastIndex + 1) {\n clonedPanels.splice(lastIndex + 1);\n }\n }\n }\n }\n\n // clones are operating in set\n public removeClonesAfter(cloneIndex: number): void {\n const panels = this.panels;\n\n panels.forEach(panel => {\n panel.removeClonedPanelsAfter(cloneIndex);\n });\n this.clones.splice(cloneIndex);\n }\n\n public findPanelOf(element: HTMLElement): Panel | undefined {\n const allPanels = this.allPanels();\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const panelElement = panel.getElement();\n if (panelElement.contains(element)) {\n return panel;\n }\n }\n }\n\n public findFirstPanelFrom(index: number): Panel | undefined {\n for (const panel of this.panels.slice(index)) {\n if (panel && panel.getIndex() >= index && panel.getElement().parentNode) {\n return panel;\n }\n }\n }\n\n private addNewClones(index: number, originalPanels: Panel[], deleteCount: number, nextSibling: Panel | undefined) {\n const cameraElement = this.cameraElement;\n const cloneCount = this.getCloneCount();\n const lastPanel = this.lastPanel();\n const lastPanelClones: Panel[] = lastPanel\n ? lastPanel.getClonedPanels()\n : [];\n const nextSiblingClones: Panel[] = nextSibling\n ? nextSibling.getClonedPanels()\n : [];\n\n for (const cloneIndex of counter(cloneCount)) {\n const cloneNextSibling = nextSiblingClones[cloneIndex];\n const lastPanelSibling = lastPanelClones[cloneIndex];\n\n const cloneSiblingElement = cloneNextSibling\n ? cloneNextSibling.getElement()\n : lastPanelSibling\n ? lastPanelSibling.getElement().nextElementSibling\n : null;\n\n const newClones = originalPanels.map(panel => {\n const clone = panel.clone(cloneIndex);\n\n if (this.shouldRender()) {\n cameraElement.insertBefore(clone.getElement(), cloneSiblingElement);\n }\n\n return clone;\n });\n\n this.insertClones(cloneIndex, index, newClones, deleteCount);\n }\n }\n\n private updateIndex(insertingIndex: number) {\n const panels = this.panels;\n const range = this.range;\n\n const newLastIndex = panels.length - 1;\n if (newLastIndex > range.max) {\n range.max = newLastIndex;\n }\n if (insertingIndex < range.min || range.min < 0) {\n range.min = insertingIndex;\n }\n }\n\n private insertNewPanels(newPanels: Panel[], siblingElement: HTMLElement | null) {\n if (this.shouldRender()) {\n const fragment = document.createDocumentFragment();\n newPanels.forEach(panel => fragment.appendChild(panel.getElement()));\n this.cameraElement.insertBefore(fragment, siblingElement);\n }\n }\n\n private shouldRender(): boolean {\n const options = this.options;\n\n return !options.renderExternal && !options.renderOnlyVisible;\n }\n}\n\nexport default PanelManager;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"../components/Panel\";\nimport { ValueOf, Direction, StateType, FlickingContext } from \"../types\";\n\nabstract class State {\n public delta: number = 0;\n public direction: ValueOf | null = null;\n public targetPanel: Panel | null = null;\n public lastPosition: number = 0;\n public abstract readonly type: ValueOf;\n public abstract readonly holding: boolean;\n public abstract readonly playing: boolean;\n\n public onEnter(prevState: State): void {\n this.delta = prevState.delta;\n this.direction = prevState.direction;\n this.targetPanel = prevState.targetPanel;\n this.lastPosition = prevState.lastPosition;\n }\n\n public onExit(nextState: State): void {\n // DO NOTHING\n }\n\n public onHold(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onChange(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onAnimationEnd(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onFinish(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n}\n\nexport default State;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { EVENTS, STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass IdleState extends State {\n public readonly type = STATE_TYPE.IDLE;\n public readonly holding = false;\n public readonly playing = false;\n\n public onEnter() {\n this.direction = null;\n this.targetPanel = null;\n this.delta = 0;\n this.lastPosition = 0;\n }\n\n public onHold(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Shouldn't do any action until any panels on flicking area\n if (flicking.getPanelCount() <= 0) {\n if (viewport.options.infinite) {\n viewport.moveCamera(viewport.getCameraPosition(), e);\n }\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n this.lastPosition = viewport.getCameraPosition();\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.HOLDING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n // By methods call\n public onChange(e: any, context: FlickingContext): void {\n const { triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.MOVE_START, e, false)\n .onSuccess(() => {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n}\n\nexport default IdleState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS, DIRECTION } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass HoldingState extends State {\n public readonly type = STATE_TYPE.HOLDING;\n public readonly holding = true;\n public readonly playing = true;\n\n private releaseEvent: any = null;\n\n public onChange(e: any, context: FlickingContext): void {\n const { flicking, triggerEvent, transitTo } = context;\n\n const offset = flicking.options.horizontal\n ? e.inputEvent.offsetX\n : e.inputEvent.offsetY;\n this.direction = offset < 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n triggerEvent(EVENTS.MOVE_START, e, true)\n .onSuccess(() => {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { viewport, triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n if (e.delta.flick !== 0) {\n // Sometimes \"release\" event on axes triggered before \"change\" event\n // Especially if user flicked panel fast in really short amount of time\n // if delta is not zero, that means above case happened.\n\n // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END\n // At least one move event should be included between holdStart and holdEnd\n e.setTo({ flick: viewport.getCameraPosition() }, 0);\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n // Can't handle select event here,\n // As \"finish\" axes event happens\n this.releaseEvent = e;\n }\n\n public onFinish(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Should transite to IDLE state before select event\n // As user expects hold is already finished\n transitTo(STATE_TYPE.IDLE);\n\n if (!this.releaseEvent) {\n return;\n }\n\n // Handle release event here\n // To prevent finish event called twice\n const releaseEvent = this.releaseEvent;\n\n // Static click\n const srcEvent = releaseEvent.inputEvent.srcEvent;\n\n let clickedElement: HTMLElement;\n if (srcEvent.type === \"touchend\") {\n const touchEvent = srcEvent as TouchEvent;\n const touch = touchEvent.changedTouches[0];\n clickedElement = document.elementFromPoint(touch.clientX, touch.clientY) as HTMLElement;\n } else {\n clickedElement = srcEvent.target;\n }\n const clickedPanel = viewport.panelManager.findPanelOf(clickedElement);\n const cameraPosition = viewport.getCameraPosition();\n\n if (clickedPanel) {\n const clickedPanelPosition = clickedPanel.getPosition();\n const direction = clickedPanelPosition > cameraPosition\n ? DIRECTION.NEXT\n : clickedPanelPosition < cameraPosition\n ? DIRECTION.PREV\n : null;\n\n // Don't provide axes event, to use axes instance instead\n triggerEvent(EVENTS.SELECT, null, true, {\n direction, // Direction to the clicked panel\n index: clickedPanel.getIndex(),\n panel: clickedPanel,\n });\n }\n }\n}\n\nexport default HoldingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DraggingState extends State {\n public readonly type = STATE_TYPE.DRAGGING;\n public readonly holding = true;\n public readonly playing = true;\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { flicking, viewport, triggerEvent, transitTo, stopCamera } = context;\n\n const delta = this.delta;\n const absDelta = Math.abs(delta);\n const options = flicking.options;\n const horizontal = options.horizontal;\n const moveType = viewport.moveType;\n const inputEvent = e.inputEvent;\n\n const velocity = horizontal\n ? inputEvent.velocityX\n : inputEvent.velocityY;\n const inputDelta = horizontal\n ? inputEvent.deltaX\n : inputEvent.deltaY;\n const isNextDirection = Math.abs(velocity) > 1\n ? velocity < 0\n : absDelta > 0\n ? delta > 0\n : inputDelta < 0;\n\n const swipeDistance = viewport.options.bound\n ? Math.max(absDelta, Math.abs(inputDelta))\n : absDelta;\n const swipeAngle = inputEvent.deltaX\n ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI)\n : 90;\n const belowAngleThreshold = horizontal\n ? swipeAngle <= options.thresholdAngle\n : swipeAngle > options.thresholdAngle;\n const overThreshold = swipeDistance >= options.threshold\n && belowAngleThreshold;\n\n const moveTypeContext = {\n viewport,\n axesEvent: e,\n state: this,\n swipeDistance,\n isNextDirection,\n };\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n const targetPanel = this.targetPanel;\n if (!overThreshold && targetPanel) {\n // Interrupted while animating\n const interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext);\n\n viewport.moveTo(\n interruptDestInfo.panel,\n interruptDestInfo.destPos,\n interruptDestInfo.eventType,\n e,\n interruptDestInfo.duration,\n );\n transitTo(STATE_TYPE.ANIMATING);\n return;\n }\n\n const currentPanel = viewport.getCurrentPanel();\n const nearestPanel = viewport.getNearestPanel();\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n e.stop();\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n const destInfo = overThreshold\n ? moveType.findTargetPanel(moveTypeContext)\n : moveType.findRestorePanel(moveTypeContext);\n\n viewport.moveTo(\n destInfo.panel,\n destInfo.destPos,\n destInfo.eventType,\n e,\n destInfo.duration,\n ).onSuccess(() => {\n transitTo(STATE_TYPE.ANIMATING);\n }).onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n stopCamera(e);\n });\n }\n}\n\nexport default DraggingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\nimport { circulate } from \"../utils\";\n\nclass AnimatingState extends State {\n public readonly type = STATE_TYPE.ANIMATING;\n public readonly holding = false;\n public readonly playing = true;\n\n public onHold(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n const options = viewport.options;\n const scrollArea = viewport.getScrollArea();\n const scrollAreaSize = viewport.getScrollAreaSize();\n const loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize);\n\n const targetPanel = this.targetPanel;\n if (options.circular && loopCount !== 0 && targetPanel) {\n const cloneCount = viewport.panelManager.getCloneCount();\n const originalTargetPosition = targetPanel.getPosition();\n\n // cloneIndex is from -1 to cloneCount - 1\n const newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true);\n const newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize;\n const newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true);\n\n // Set new target panel considering looped count\n newTargetPanel.setPosition(newTargetPosition);\n this.targetPanel = newTargetPanel;\n }\n\n // Reset last position and delta\n this.delta = 0;\n this.lastPosition = viewport.getCameraPosition();\n\n // Update current panel as current nearest panel\n viewport.setCurrentPanel(viewport.getNearestPanel()!);\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.DRAGGING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onFinish(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext) {\n const isTrusted = e && e.isTrusted;\n\n viewport.options.bound\n ? viewport.setCurrentPanel(this.targetPanel!)\n : viewport.setCurrentPanel(viewport.getNearestPanel()!);\n\n if (flicking.options.adaptive) {\n viewport.updateAdaptiveSize();\n }\n\n transitTo(STATE_TYPE.IDLE);\n viewport.updateCameraPosition();\n triggerEvent(EVENTS.MOVE_END, e, isTrusted, {\n direction: this.direction,\n });\n }\n}\n\nexport default AnimatingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DisabledState extends State {\n public readonly type = STATE_TYPE.DISABLED;\n public readonly holding = false;\n public readonly playing = true;\n\n public onAnimationEnd(e: any, { transitTo }: FlickingContext): void {\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(e: any, { viewport, transitTo }: FlickingContext): void {\n // Can stop Axes's change event\n e.stop();\n\n // Should update axes position as it's already changed at this moment\n viewport.updateAxesPosition(viewport.getCameraPosition());\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(e: any, { transitTo }: FlickingContext): void {\n // This is needed when stopped hold start event\n if (e.delta.flick === 0) {\n transitTo(STATE_TYPE.IDLE);\n }\n }\n}\n\nexport default DisabledState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"../states/State\";\nimport { AxesEventType, ValueOf, FlickingContext, StateType } from \"../types\";\nimport { AXES_EVENTS, STATE_TYPE } from \"../consts\";\nimport IdleState from \"../states/IdleState\";\nimport HoldingState from \"../states/HoldingState\";\nimport DraggingState from \"../states/DraggingState\";\nimport AnimatingState from \"../states/AnimatingState\";\nimport DisabledState from \"../states/DisabledState\";\n\nclass StateMachine {\n private state: State = new IdleState();\n\n public fire(eventType: ValueOf, e: any, context: FlickingContext) {\n const currentState = this.state;\n switch (eventType) {\n case AXES_EVENTS.HOLD:\n currentState.onHold(e, context);\n break;\n case AXES_EVENTS.CHANGE:\n currentState.onChange(e, context);\n break;\n case AXES_EVENTS.RELEASE:\n currentState.onRelease(e, context);\n break;\n case AXES_EVENTS.ANIMATION_END:\n currentState.onAnimationEnd(e, context);\n break;\n case AXES_EVENTS.FINISH:\n currentState.onFinish(e, context);\n break;\n }\n }\n\n public getState(): State {\n return this.state;\n }\n\n public transitTo = (nextStateType: ValueOf): State => {\n const currentState = this.state;\n\n if (currentState.type !== nextStateType) {\n let nextState: State;\n\n switch (nextStateType) {\n case STATE_TYPE.IDLE:\n nextState = new IdleState();\n break;\n case STATE_TYPE.HOLDING:\n nextState = new HoldingState();\n break;\n case STATE_TYPE.DRAGGING:\n nextState = new DraggingState();\n break;\n case STATE_TYPE.ANIMATING:\n nextState = new AnimatingState();\n break;\n case STATE_TYPE.DISABLED:\n nextState = new DisabledState();\n break;\n }\n\n currentState.onExit(nextState!);\n nextState!.onEnter(currentState);\n\n this.state = nextState!;\n }\n return this.state;\n }\n}\n\nexport default StateMachine;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { MoveTypeStringOption, MoveTypeContext, DestinationInfo } from \"../types\";\nimport Panel from \"../components/Panel\";\nimport { EVENTS } from \"../consts\";\n\nabstract class MoveType {\n protected readonly abstract type: string;\n\n public abstract findTargetPanel(ctx: MoveTypeContext): DestinationInfo;\n\n public is(type: MoveTypeStringOption): boolean {\n return type === this.type;\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n const viewport = ctx.viewport;\n const options = viewport.options;\n\n const panel = options.circular\n ? this.findRestorePanelInCircularMode(ctx)\n : viewport.getCurrentPanel()!;\n\n return {\n panel,\n destPos: viewport.findEstimatedPosition(panel),\n duration: options.duration,\n eventType: EVENTS.RESTORE,\n };\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { state, viewport } = ctx;\n const targetPanel = state.targetPanel!;\n\n return {\n panel: targetPanel,\n destPos: viewport.findEstimatedPosition(targetPanel),\n duration: viewport.options.duration,\n eventType: \"\",\n };\n }\n\n // Calculate minimum distance to \"change\" panel\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const relativeAnchorPosition = currentPanel.getRelativeAnchorPosition();\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |--------|--------------|\n * [][ |<-Anchor ][] <- Panel + Half-Gap\n */\n let minimumDistanceToChange = isNextDirection\n ? currentPanel.getSize() - relativeAnchorPosition + halfGap\n : relativeAnchorPosition + halfGap;\n\n minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold);\n\n return minimumDistanceToChange;\n }\n\n private findRestorePanelInCircularMode(ctx: MoveTypeContext): Panel {\n const viewport = ctx.viewport;\n const originalPanel = viewport.getCurrentPanel()!.getOriginalPanel();\n const hangerPosition = viewport.getHangerPosition();\n\n const firstClonedPanel = originalPanel.getIdenticalPanels()[1];\n const lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition);\n\n return (!ctx.isNextDirection && lapped)\n ? firstClonedPanel\n : originalPanel;\n }\n}\n\nexport default MoveType;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport MoveType from \"./MoveType\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { clamp } from \"../utils\";\n\nclass Snap extends MoveType {\n protected readonly type: string = MOVE_TYPE.SNAP;\n protected count: number;\n\n constructor(count: number) {\n super();\n this.count = count;\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, axesEvent, swipeDistance } = ctx;\n const snapCount = this.count;\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const currentPanel = viewport.getCurrentPanel()!;\n const nearestPanel = viewport.getNearestPanel()!;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex();\n\n // This can happen when bounce is 0\n const shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent;\n const shouldMoveToAdjacent = !viewport.isOutOfBound()\n && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0);\n\n if (snapCount > 1 && eventDelta > minimumDistanceToChange) {\n return this.findSnappedPanel(ctx);\n } else if (shouldMoveToAdjacent) {\n return this.findAdjacentPanel(ctx);\n } else {\n return {\n panel: nearestPanel,\n duration: viewport.options.duration,\n destPos: viewport.findEstimatedPosition(nearestPanel),\n // As swipeDistance holds mouse/touch position change regardless of bounce option value\n // swipDistance > minimumDistanceToChange can happen in bounce area\n // Second condition is for handling that.\n eventType: (swipeDistance <= minimumDistanceToChange)\n || (viewport.isOutOfBound() && nearestIsCurrent)\n ? EVENTS.RESTORE\n : EVENTS.CHANGE,\n };\n }\n }\n\n protected findSnappedPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, viewport, state, isNextDirection } = ctx;\n\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const snapCount = this.count;\n const options = viewport.options;\n const scrollAreaSize = viewport.getScrollAreaSize();\n const halfGap = options.gap / 2;\n const estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition();\n\n let panelToMove = viewport.getNearestPanel()!;\n let cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone)\n let passedPanelCount = 0;\n\n while (passedPanelCount < snapCount) {\n // Since panelToMove holds also cloned panels, we should use original panel's position\n const originalPanel = panelToMove.getOriginalPanel();\n const panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize;\n const panelSize = originalPanel.getSize();\n\n const panelNextPosition = panelPosition + panelSize + halfGap;\n const panelPrevPosition = panelPosition - halfGap;\n\n // Current panelToMove contains destPos\n if (\n (isNextDirection && panelNextPosition > estimatedHangerPos)\n || (!isNextDirection && panelPrevPosition < estimatedHangerPos)\n ) {\n break;\n }\n\n const siblingPanel = isNextDirection\n ? panelToMove.nextSibling\n : panelToMove.prevSibling;\n if (!siblingPanel) {\n break;\n }\n\n const panelIndex = panelToMove.getIndex();\n const siblingIndex = siblingPanel.getIndex();\n if ((isNextDirection && siblingIndex <= panelIndex)\n || (!isNextDirection && siblingIndex >= panelIndex)\n ) {\n cycleIndex = isNextDirection\n ? cycleIndex + 1\n : cycleIndex - 1;\n }\n panelToMove = siblingPanel;\n passedPanelCount += 1;\n }\n\n const originalPosition = panelToMove.getOriginalPanel().getPosition();\n\n if (cycleIndex !== 0) {\n panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true);\n panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize);\n }\n\n const defaultDuration = viewport.options.duration;\n const duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount);\n\n return {\n panel: panelToMove,\n destPos: viewport.findEstimatedPosition(panelToMove),\n duration,\n eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange\n ? EVENTS.CHANGE\n : EVENTS.RESTORE,\n };\n }\n\n private findAdjacentPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentIndex = viewport.getCurrentIndex();\n const currentPanel = viewport.panelManager.get(currentIndex)!;\n const hangerPosition = viewport.getHangerPosition();\n const scrollArea = viewport.getScrollArea();\n\n const firstClonedPanel = currentPanel.getIdenticalPanels()[1];\n const lapped = options.circular\n && (Math.abs(currentPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition));\n\n // If lapped in circular mode, use first cloned panel as base panel\n const basePanel = lapped\n ? firstClonedPanel\n : currentPanel;\n const basePosition = basePanel.getPosition();\n\n const adjacentPanel = isNextDirection\n ? basePanel.nextSibling\n : basePanel.prevSibling;\n\n const eventType = adjacentPanel\n ? EVENTS.CHANGE\n : EVENTS.RESTORE;\n const panelToMove = adjacentPanel\n ? adjacentPanel\n : basePanel;\n const targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition();\n\n const estimatedPanelPosition = options.circular\n ? isNextDirection\n ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap\n : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap\n : panelToMove.getAnchorPosition();\n const estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition();\n const destPos = viewport.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return {\n panel: panelToMove,\n destPos,\n duration: options.duration,\n eventType,\n };\n }\n}\n\nexport default Snap;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Snap from \"./Snap\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { circulate, clamp } from \"../utils\";\n\nclass FreeScroll extends Snap {\n protected readonly type: string = MOVE_TYPE.FREE_SCROLL;\n\n constructor() {\n // Set snap count to Infinity\n super(Infinity);\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, state, viewport } = ctx;\n const destPos = axesEvent.destPos.flick;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const scrollArea = viewport.getScrollArea();\n const currentPanel = viewport.getCurrentPanel()!;\n const options = viewport.options;\n\n const delta = Math.abs(axesEvent.delta.flick + state.delta);\n if (delta > minimumDistanceToChange) {\n const destInfo = super.findSnappedPanel(ctx);\n\n destInfo.duration = axesEvent.duration;\n destInfo.destPos = destPos;\n destInfo.eventType = !options.circular && destInfo.panel === currentPanel\n ? \"\"\n : EVENTS.CHANGE;\n\n return destInfo;\n } else {\n let estimatedPosition = options.circular\n ? circulate(destPos, scrollArea.prev, scrollArea.next, false)\n : destPos;\n estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next);\n estimatedPosition += viewport.getRelativeHangerPosition();\n\n const estimatedPanel = viewport.findNearestPanelAt(estimatedPosition)!;\n\n return {\n panel: estimatedPanel,\n destPos,\n duration: axesEvent.duration,\n eventType: \"\",\n };\n }\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n return this.findTargetPanel(ctx);\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { viewport } = ctx;\n\n return {\n panel: viewport.getNearestPanel()!,\n destPos: viewport.getCameraPosition(),\n duration: 0,\n eventType: \"\",\n };\n }\n\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const lastPosition = viewport.stateMachine.getState().lastPosition;\n const currentPanelPosition = currentPanel.getPosition();\n\n // As camera can stop anywhere in free scroll mode,\n // minimumDistanceToChange should be calculated differently.\n // Ref #191(https://github.com/naver/egjs-flicking/issues/191)\n const lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition();\n\n const scrollAreaSize = viewport.getScrollAreaSize();\n let minimumDistanceToChange = isNextDirection\n ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap\n : lastHangerPosition - currentPanelPosition + halfGap;\n minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize);\n\n return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange);\n }\n}\n\nexport default FreeScroll;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Axes, { PanInput } from \"@egjs/axes\";\n\nimport Flicking from \"../Flicking\";\nimport Panel from \"./Panel\";\nimport PanelManager from \"./PanelManager\";\nimport StateMachine from \"./StateMachine\";\nimport MoveType from \"../moves/MoveType\";\nimport { FlickingOptions, FlickingPanel, FlickingStatus, ElementLike, EventType, TriggerCallback, NeedPanelEvent, FlickingEvent, MoveTypeObjectOption, OriginalStyle, Plugin, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_VIEWPORT_CSS, DEFAULT_CAMERA_CSS, TRANSFORM, DEFAULT_OPTIONS, EVENTS, DIRECTION, STATE_TYPE, MOVE_TYPE } from \"../consts\";\nimport { clamp, applyCSS, toArray, parseArithmeticExpression, isBetween, isArray, parseElement, hasClass, restoreStyle, circulate, findIndex, getBbox } from \"../utils\";\nimport Snap from \"../moves/Snap\";\nimport FreeScroll from \"../moves/FreeScroll\";\n\nexport default class Viewport {\n public options: FlickingOptions;\n public stateMachine: StateMachine;\n public panelManager: PanelManager;\n public moveType: MoveType;\n\n private flicking: Flicking;\n private axes: Axes;\n private panInput: PanInput | null;\n\n private viewportElement: HTMLElement;\n private cameraElement: HTMLElement;\n\n private triggerEvent: Flicking[\"triggerEvent\"];\n private axesHandlers: { [key: string]: any };\n\n private currentPanel: Panel | undefined;\n private nearestPanel: Panel | undefined;\n private visiblePanels: Panel[];\n\n private plugins: Plugin[] = [];\n private panelBboxes: { [className: string]: BoundingBox };\n private state: {\n size: number;\n position: number;\n panelMaintainRatio: number;\n relativeHangerPosition: number;\n positionOffset: number;\n scrollArea: {\n prev: number;\n next: number;\n };\n translate: {\n name: string,\n has3d: boolean,\n };\n infiniteThreshold: number;\n checkedIndexes: Array<[number, number]>;\n isAdaptiveCached: boolean;\n isViewportGiven: boolean;\n isCameraGiven: boolean;\n originalViewportStyle: OriginalStyle;\n originalCameraStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n\n constructor(\n flicking: Flicking,\n options: FlickingOptions,\n triggerEvent: Flicking[\"triggerEvent\"],\n ) {\n this.flicking = flicking;\n this.triggerEvent = triggerEvent;\n\n this.state = {\n size: 0,\n position: 0,\n panelMaintainRatio: 0,\n relativeHangerPosition: 0,\n positionOffset: 0,\n scrollArea: {\n prev: 0,\n next: 0,\n },\n translate: TRANSFORM,\n infiniteThreshold: 0,\n checkedIndexes: [],\n isAdaptiveCached: false,\n isViewportGiven: false,\n isCameraGiven: false,\n originalViewportStyle: {\n className: null,\n style: null,\n },\n originalCameraStyle: {\n className: null,\n style: null,\n },\n cachedBbox: null,\n };\n this.options = options;\n this.stateMachine = new StateMachine();\n this.visiblePanels = [];\n this.panelBboxes = {};\n\n this.build();\n }\n\n public moveTo(\n panel: Panel,\n destPos: number,\n eventType: EventType[\"CHANGE\"] | EventType[\"RESTORE\"] | \"\",\n axesEvent: any,\n duration: number = this.options.duration,\n ): TriggerCallback {\n const state = this.state;\n const currentState = this.stateMachine.getState();\n const currentPosition = state.position;\n\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n const direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n let eventResult: TriggerCallback;\n if (eventType === EVENTS.CHANGE) {\n eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, {\n index: panel.getIndex(),\n panel,\n direction,\n });\n } else if (eventType === EVENTS.RESTORE) {\n eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted);\n } else {\n eventResult = {\n onSuccess(callback: () => void): TriggerCallback {\n callback();\n return this;\n },\n onStopped(): TriggerCallback {\n return this;\n },\n };\n }\n\n eventResult.onSuccess(() => {\n currentState.delta = 0;\n currentState.lastPosition = this.getCameraPosition();\n currentState.targetPanel = panel;\n currentState.direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n if (destPos === currentPosition) {\n // no move\n this.nearestPanel = panel;\n this.currentPanel = panel;\n }\n\n if (axesEvent && axesEvent.setTo) {\n // freeScroll only occurs in release events\n axesEvent.setTo({ flick: destPos }, duration);\n } else {\n this.axes.setTo({ flick: destPos }, duration);\n }\n });\n\n return eventResult;\n }\n\n public moveCamera(pos: number, axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const transform = state.translate.name;\n const scrollArea = state.scrollArea;\n\n // Update position & nearestPanel\n if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) {\n pos = circulate(pos, scrollArea.prev, scrollArea.next, false);\n }\n state.position = pos;\n this.nearestPanel = this.findNearestPanel();\n const nearestPanel = this.nearestPanel;\n const originalNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n // From 0(panel position) to 1(panel position + panel size)\n // When it's on gap area value will be (val > 1 || val < 0)\n if (nearestPanel) {\n const hangerPosition = this.getHangerPosition();\n const panelPosition = nearestPanel.getPosition();\n const panelSize = nearestPanel.getSize();\n const halfGap = options.gap / 2;\n\n // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap\n state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap);\n } else {\n state.panelMaintainRatio = 0;\n }\n\n this.checkNeedPanel(axesEvent);\n\n // Possibly modified after need panel, if it's looped\n const modifiedNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n pos += (modifiedNearestPosition - originalNearestPosition);\n state.position = pos;\n\n this.updateVisiblePanels();\n\n // Offset is needed to fix camera layer size in visible-only rendering mode\n const posOffset = options.renderOnlyVisible\n ? state.positionOffset\n : 0;\n const moveVector = options.horizontal\n ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)];\n const moveCoord = moveVector.map(coord => `${Math.round(coord)}px`).join(\", \");\n\n this.cameraElement.style[transform] = state.translate.has3d\n ? `translate3d(${moveCoord}, 0px)`\n : `translate(${moveCoord})`;\n }\n\n public stopCamera = (axesEvent: any): void => {\n if (axesEvent && axesEvent.setTo) {\n axesEvent.setTo({ flick: this.state.position }, 0);\n }\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n\n public unCacheBbox(): void {\n const state = this.state;\n const options = this.options;\n\n state.cachedBbox = null;\n this.visiblePanels = [];\n\n const viewportElement = this.viewportElement;\n if (!options.horizontal) {\n // Don't preserve previous width for adaptive resizing\n viewportElement.style.width = \"\";\n } else {\n viewportElement.style.height = \"\";\n }\n state.isAdaptiveCached = false;\n this.panelBboxes = {};\n }\n\n public resize(): void {\n this.updateSize();\n this.updateOriginalPanelPositions();\n this.updateAdaptiveSize();\n this.updateScrollArea();\n this.updateClonePanels();\n this.updateVisiblePanelPositions();\n this.updateCameraPosition();\n this.updatePlugins();\n }\n\n // Find nearest anchor from current hanger position\n public findNearestPanel(): Panel | undefined {\n const state = this.state;\n const panelManager = this.panelManager;\n const hangerPosition = this.getHangerPosition();\n\n if (this.isOutOfBound()) {\n const position = state.position;\n\n return position <= state.scrollArea.prev\n ? panelManager.firstPanel()\n : panelManager.lastPanel();\n }\n\n return this.findNearestPanelAt(hangerPosition);\n }\n\n public findNearestPanelAt(position: number): Panel | undefined {\n const panelManager = this.panelManager;\n\n const allPanels = panelManager.allPanels();\n let minimumDistance = Infinity;\n let nearestPanel: Panel | undefined;\n\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const prevPosition = panel.getPosition();\n const nextPosition = prevPosition + panel.getSize();\n\n // Use shortest distance from panel's range\n const distance = isBetween(position, prevPosition, nextPosition)\n ? 0\n : Math.min(\n Math.abs(prevPosition - position),\n Math.abs(nextPosition - position),\n );\n\n if (distance > minimumDistance) {\n break;\n } else if (distance === minimumDistance) {\n const minimumAnchorDistance = Math.abs(position - nearestPanel!.getAnchorPosition());\n const anchorDistance = Math.abs(position - panel.getAnchorPosition());\n\n if (anchorDistance > minimumAnchorDistance) {\n break;\n }\n }\n\n minimumDistance = distance;\n nearestPanel = panel;\n }\n\n return nearestPanel;\n }\n\n public findNearestIdenticalPanel(panel: Panel): Panel {\n let nearest = panel;\n let shortestDistance = Infinity;\n const hangerPosition = this.getHangerPosition();\n\n const identicals = panel.getIdenticalPanels();\n identicals.forEach(identical => {\n const anchorPosition = identical.getAnchorPosition();\n const distance = Math.abs(anchorPosition - hangerPosition);\n\n if (distance < shortestDistance) {\n nearest = identical;\n shortestDistance = distance;\n }\n });\n\n return nearest;\n }\n\n // Find shortest camera position that distance is minimum\n public findShortestPositionToPanel(panel: Panel): number {\n const state = this.state;\n const options = this.options;\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = this.getHangerPosition();\n const distance = Math.abs(hangerPosition - anchorPosition);\n const scrollAreaSize = state.scrollArea.next - state.scrollArea.prev;\n\n if (!options.circular) {\n const position = anchorPosition - state.relativeHangerPosition;\n return this.canSetBoundMode()\n ? clamp(position, state.scrollArea.prev, state.scrollArea.next)\n : position;\n } else {\n // If going out of viewport border is more efficient way of moving, choose that position\n return distance <= scrollAreaSize - distance\n ? anchorPosition - state.relativeHangerPosition\n : anchorPosition > hangerPosition\n // PREV TO NEXT\n ? anchorPosition - state.relativeHangerPosition - scrollAreaSize\n // NEXT TO PREV\n : anchorPosition - state.relativeHangerPosition + scrollAreaSize;\n }\n }\n\n public findEstimatedPosition(panel: Panel): number {\n const scrollArea = this.getScrollArea();\n\n let estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition();\n estimatedPosition = this.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return estimatedPosition;\n }\n\n public addVisiblePanel(panel: Panel): void {\n if (this.getVisibleIndexOf(panel) < 0) {\n this.visiblePanels.push(panel);\n }\n }\n\n public enable(): void {\n if (!this.panInput) {\n this.createPanInput();\n }\n }\n\n public disable(): void {\n if (this.panInput) {\n this.panInput.destroy();\n this.panInput = null;\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n }\n\n public insert(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const lastIndex = this.panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const state = this.state;\n const options = this.options;\n const parsedElements = parseElement(element);\n\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const pushedIndex = this.panelManager.insert(index, panels);\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n if (!this.currentPanel) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index });\n state.checkedIndexes.forEach((indexes, idx) => {\n const [min, max] = indexes;\n if (index < min) {\n // Push checked index\n state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n }\n });\n\n this.resize();\n\n return panels;\n }\n\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const lastIndex = panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const parsedElements = parseElement(element);\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const replacedPanels = panelManager.replace(index, panels);\n\n replacedPanels.forEach(panel => {\n const visibleIndex = this.getVisibleIndexOf(panel);\n if (visibleIndex > -1) {\n this.visiblePanels.splice(visibleIndex, 1);\n }\n });\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n const currentPanel = this.currentPanel;\n const wasEmpty = !currentPanel;\n if (wasEmpty) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n } else if (isBetween(currentPanel!.getIndex(), index, index + panels.length - 1)) {\n // Current panel is replaced\n this.currentPanel = panelManager.get(currentPanel!.getIndex());\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index + panels.length - 1 });\n\n this.resize();\n\n return panels;\n }\n\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n const state = this.state;\n // Index should not below 0\n index = Math.max(index, 0);\n\n const panelManager = this.panelManager;\n const currentIndex = this.getCurrentIndex();\n\n const removedPanels = panelManager.remove(index, deleteCount);\n if (isBetween(currentIndex, index, index + deleteCount - 1)) {\n // Current panel is removed\n // Use panel at removing index - 1 as new current panel if it exists\n const newCurrentIndex = Math.max(index - 1, panelManager.getRange().min);\n this.currentPanel = panelManager.get(newCurrentIndex);\n }\n\n // Update checked indexes in infinite mode\n if (deleteCount > 0) {\n // Check whether removing index will affect checked indexes\n // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa.\n this.updateCheckedIndexes({ min: index - 1, max: index + deleteCount });\n // Uncache visible panels to refresh panels\n this.visiblePanels = [];\n }\n\n if (panelManager.getPanelCount() <= 0) {\n this.currentPanel = undefined;\n this.nearestPanel = undefined;\n }\n\n this.resize();\n\n const scrollArea = state.scrollArea;\n if (state.position < scrollArea.prev || state.position > scrollArea.next) {\n const newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false);\n this.moveCamera(newPosition);\n this.updateAxesPosition(newPosition);\n }\n\n return removedPanels;\n }\n\n public updateAdaptiveSize(): void {\n const state = this.state;\n const options = this.options;\n const horizontal = options.horizontal;\n const currentPanel = this.getCurrentPanel();\n\n if (!currentPanel) {\n return;\n }\n\n const shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached;\n const viewportStyle = this.viewportElement.style;\n if (shouldApplyAdaptive) {\n let sizeToApply: number;\n if (options.adaptive) {\n const panelBbox = currentPanel.getBbox();\n\n sizeToApply = horizontal ? panelBbox.height : panelBbox.width;\n } else {\n // Find minimum height of panels to maximum panel size\n const maximumPanelSize = this.panelManager.originalPanels().reduce((maximum, panel) => {\n const panelBbox = panel.getBbox();\n return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width);\n }, 0);\n\n sizeToApply = maximumPanelSize;\n }\n\n if (!state.isAdaptiveCached) {\n const viewportBbox = this.updateBbox();\n sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width);\n state.isAdaptiveCached = true;\n }\n\n const viewportSize = `${sizeToApply}px`;\n if (horizontal) {\n viewportStyle.height = viewportSize;\n state.cachedBbox!.height = sizeToApply;\n } else {\n viewportStyle.width = viewportSize;\n state.cachedBbox!.width = sizeToApply;\n }\n }\n }\n\n // Update camera position after resizing\n public updateCameraPosition(): void {\n const state = this.state;\n const currentPanel = this.getCurrentPanel();\n const cameraPosition = this.getCameraPosition();\n const currentState = this.stateMachine.getState();\n const isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL);\n const relativeHangerPosition = this.getRelativeHangerPosition();\n const halfGap = this.options.gap / 2;\n\n if (currentState.holding || currentState.playing) {\n this.updateVisiblePanels();\n return;\n }\n\n let newPosition: number;\n if (isFreeScroll) {\n const positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next);\n const nearestPanel = this.getNearestPanel();\n\n // Preserve camera position if it is bound to scroll area limit\n newPosition = positionBounded || !nearestPanel\n ? cameraPosition\n : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition;\n } else {\n newPosition = currentPanel\n ? currentPanel.getAnchorPosition() - relativeHangerPosition\n : cameraPosition;\n }\n\n if (this.canSetBoundMode()) {\n newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next);\n }\n\n // Pause & resume axes to prevent axes's \"change\" event triggered\n // This should be done before moveCamera, as moveCamera can trigger needPanel\n this.updateAxesPosition(newPosition);\n\n this.moveCamera(newPosition);\n }\n\n public updateBbox(): BoundingBox {\n const state = this.state;\n const options = this.options;\n const viewportElement = this.viewportElement;\n\n if (!state.cachedBbox) {\n state.cachedBbox = getBbox(viewportElement, options.useOffset);\n }\n\n return state.cachedBbox!;\n }\n\n public updatePlugins(): void {\n // update for resize\n this.plugins.forEach(plugin => {\n plugin.update && plugin.update(this.flicking);\n });\n }\n\n public destroy(option: Partial): void {\n const state = this.state;\n const wrapper = this.flicking.getElement();\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const originalPanels = this.panelManager.originalPanels();\n\n this.removePlugins(this.plugins);\n if (!option.preserveUI) {\n restoreStyle(viewportElement, state.originalViewportStyle);\n restoreStyle(cameraElement, state.originalCameraStyle);\n\n if (!state.isCameraGiven && !this.options.renderExternal) {\n const topmostElement = state.isViewportGiven\n ? viewportElement\n : wrapper;\n const deletingElement = state.isViewportGiven\n ? cameraElement\n : viewportElement;\n\n originalPanels.forEach(panel => {\n topmostElement.appendChild(panel.getElement());\n });\n\n topmostElement.removeChild(deletingElement);\n }\n }\n\n this.axes.destroy();\n this.panInput?.destroy();\n\n originalPanels.forEach(panel => { panel.destroy(option); });\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public restore(status: FlickingStatus): void {\n const panels = status.panels;\n const defaultIndex = this.options.defaultIndex;\n const cameraElement = this.cameraElement;\n const panelManager = this.panelManager;\n\n // Restore index\n cameraElement.innerHTML = panels.map(panel => panel.html).join(\"\");\n\n // Create panels first\n this.refreshPanels();\n const createdPanels = panelManager.originalPanels();\n\n // ...then order it by its index\n const orderedPanels: Panel[] = [];\n panels.forEach((panel, idx) => {\n const createdPanel = createdPanels[idx];\n createdPanel.setIndex(panel.index);\n orderedPanels[panel.index] = createdPanel;\n });\n panelManager.replacePanels(orderedPanels, []);\n panelManager.setCloneCount(0); // No clones at this point\n\n const panelCount = panelManager.getPanelCount();\n if (panelCount > 0) {\n this.currentPanel = panelManager.get(status.index)\n || panelManager.get(defaultIndex)\n || panelManager.firstPanel();\n } else {\n this.currentPanel = undefined;\n }\n this.visiblePanels = orderedPanels.filter(panel => Boolean(panel));\n\n this.resize();\n\n this.axes.setTo({ flick: status.position }, 0);\n this.moveCamera(status.position);\n }\n\n public calcVisiblePanels(): Panel[] {\n const allPanels = this.panelManager.allPanels();\n if (this.options.renderOnlyVisible) {\n const cameraPos = this.getCameraPosition();\n const viewportSize = this.getSize();\n const basePanel = this.nearestPanel!;\n\n const getNextPanel = (panel: Panel) => {\n const nextPanel = panel.nextSibling;\n\n if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) {\n return nextPanel;\n } else {\n return null;\n }\n };\n\n const getPrevPanel = (panel: Panel) => {\n const prevPanel = panel.prevSibling;\n\n if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) {\n return prevPanel;\n } else {\n return null;\n }\n };\n\n const isOutOfBoundNext = (panel: Panel) => panel.getPosition() >= cameraPos + viewportSize;\n const isOutOfBoundPrev = (panel: Panel) => panel.getPosition() + panel.getSize() <= cameraPos;\n\n const getVisiblePanels = (\n panel: Panel,\n getNext: (panel: Panel) => Panel | null,\n isOutOfViewport: (panel: Panel) => boolean,\n ): Panel[] => {\n const visiblePanels: Panel[] = [];\n\n let lastPanel = panel;\n while (true) {\n const nextPanel = getNext(lastPanel);\n if (!nextPanel || isOutOfViewport(nextPanel)) {\n break;\n }\n visiblePanels.push(nextPanel);\n lastPanel = nextPanel;\n }\n return visiblePanels;\n };\n\n const panelCount = this.panelManager.getPanelCount();\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n const nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext);\n const prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev);\n\n return [basePanel, ...nextPanels, ...prevPanels].sort((panel1, panel2) => getAbsIndex(panel1) - getAbsIndex(panel2));\n } else {\n return allPanels.filter(panel => {\n const outsetProgress = panel.getOutsetProgress();\n\n return outsetProgress > -1 && outsetProgress < 1;\n });\n }\n }\n\n public getCurrentPanel(): Panel | undefined {\n return this.currentPanel;\n }\n\n public getCurrentIndex(): number {\n const currentPanel = this.currentPanel;\n\n return currentPanel\n ? currentPanel.getIndex()\n : -1;\n }\n\n public getNearestPanel(): Panel | undefined {\n return this.nearestPanel;\n }\n\n // Get progress from nearest panel\n public getCurrentProgress(): number {\n const currentState = this.stateMachine.getState();\n let nearestPanel = currentState.playing || currentState.holding\n ? this.nearestPanel\n : this.currentPanel;\n\n const panelManager = this.panelManager;\n if (!nearestPanel) {\n // There're no panels\n return NaN;\n }\n const { prev: prevRange, next: nextRange } = this.getScrollArea();\n const cameraPosition = this.getCameraPosition();\n const isOutOfBound = this.isOutOfBound();\n let prevPanel = nearestPanel.prevSibling;\n let nextPanel = nearestPanel.nextSibling;\n let hangerPosition = this.getHangerPosition();\n let nearestAnchorPos = nearestPanel.getAnchorPosition();\n\n if (\n isOutOfBound\n && prevPanel\n && nextPanel\n && cameraPosition < nextRange\n // On the basis of anchor, prevPanel is nearestPanel.\n && (hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition)\n ) {\n nearestPanel = prevPanel;\n nextPanel = nearestPanel.nextSibling;\n prevPanel = nearestPanel.prevSibling;\n nearestAnchorPos = nearestPanel.getAnchorPosition();\n }\n const nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount();\n const nearestSize = nearestPanel.getSize();\n\n if (isOutOfBound) {\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n if (nearestAnchorPos > nextRange + relativeHangerPosition) {\n // next bounce area: hangerPosition - relativeHangerPosition - nextRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange;\n } else if (nearestAnchorPos < prevRange + relativeHangerPosition) {\n // prev bounce area: hangerPosition - relativeHangerPosition - prevRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange;\n }\n }\n const hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos;\n const gap = this.options.gap;\n\n let basePosition = nearestAnchorPos;\n let targetPosition = nearestAnchorPos;\n if (hangerIsNextToNearestPanel) {\n targetPosition = nextPanel\n ? nextPanel.getAnchorPosition()\n : nearestAnchorPos + nearestSize + gap;\n } else {\n basePosition = prevPanel\n ? prevPanel.getAnchorPosition()\n : nearestAnchorPos - nearestSize - gap;\n }\n\n const progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition);\n const startIndex = hangerIsNextToNearestPanel\n ? nearestIndex\n : prevPanel\n ? prevPanel.getIndex()\n : nearestIndex - 1;\n\n return startIndex + progressBetween;\n }\n\n // Update axes flick position without triggering event\n public updateAxesPosition(position: number) {\n const axes = this.axes;\n axes.off();\n axes.setTo({\n flick: position,\n }, 0);\n axes.on(this.axesHandlers);\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getScrollArea(): { prev: number, next: number } {\n return this.state.scrollArea;\n }\n\n public isOutOfBound(): boolean {\n const state = this.state;\n const options = this.options;\n const scrollArea = state.scrollArea;\n\n return !options.circular\n && options.bound\n && (state.position <= scrollArea.prev || state.position >= scrollArea.next);\n }\n\n public canSetBoundMode(): boolean {\n const options = this.options;\n\n return options.bound && !options.circular;\n }\n\n public getViewportElement(): HTMLElement {\n return this.viewportElement;\n }\n\n public getCameraElement(): HTMLElement {\n return this.cameraElement;\n }\n\n public getScrollAreaSize(): number {\n const scrollArea = this.state.scrollArea;\n\n return scrollArea.next - scrollArea.prev;\n }\n\n public getRelativeHangerPosition(): number {\n return this.state.relativeHangerPosition;\n }\n\n public getHangerPosition(): number {\n return this.state.position + this.state.relativeHangerPosition;\n }\n\n public getCameraPosition(): number {\n return this.state.position;\n }\n\n public getPositionOffset(): number {\n return this.state.positionOffset;\n }\n\n public getCheckedIndexes(): Array<[number, number]> {\n return this.state.checkedIndexes;\n }\n\n public getVisiblePanels(): Panel[] {\n return this.visiblePanels;\n }\n\n public setCurrentPanel(panel: Panel): void {\n this.currentPanel = panel;\n }\n\n public setLastIndex(index: number): void {\n const currentPanel = this.currentPanel;\n const panelManager = this.panelManager;\n\n panelManager.setLastIndex(index);\n if (currentPanel && currentPanel.getIndex() > index) {\n this.currentPanel = panelManager.lastPanel();\n }\n\n this.resize();\n }\n\n public setVisiblePanels(panels: Panel[]): void {\n this.visiblePanels = panels;\n }\n\n public connectAxesHandler(handlers: { [key: string]: (event: { [key: string]: any; }) => any }): void {\n const axes = this.axes;\n\n this.axesHandlers = handlers;\n axes.on(handlers);\n }\n\n public addPlugins(plugins: Plugin | Plugin[]) {\n const newPlugins = ([] as Plugin[]).concat(plugins);\n\n newPlugins.forEach(plugin => {\n plugin.init(this.flicking);\n });\n\n this.plugins = this.plugins.concat(newPlugins);\n return this;\n }\n\n public removePlugins(plugins: Plugin | Plugin[]) {\n const currentPlugins = this.plugins;\n const removedPlugins = ([] as Plugin[]).concat(plugins);\n\n removedPlugins.forEach(plugin => {\n const index = currentPlugins.indexOf(plugin);\n\n if (index > -1) {\n currentPlugins.splice(index, 1);\n }\n\n plugin.destroy(this.flicking);\n });\n return this;\n }\n\n public updateCheckedIndexes(changedRange: { min: number, max: number }): void {\n const state = this.state;\n\n let removed = 0;\n state.checkedIndexes.concat().forEach((indexes, idx) => {\n const [min, max] = indexes;\n // Can fill part of indexes in range\n if (changedRange.min <= max && changedRange.max >= min) {\n // Remove checked index from list\n state.checkedIndexes.splice(idx - removed, 1);\n removed++;\n }\n });\n }\n\n public appendUncachedPanelElements(panels: Panel[]): void {\n const options = this.options;\n const fragment = document.createDocumentFragment();\n\n if (options.isEqualSize) {\n const prevVisiblePanels = this.visiblePanels;\n const equalSizeClasses = options.isEqualSize as string[]; // for readability\n const cached: { [className: string]: boolean } = {};\n\n this.visiblePanels = [];\n\n Object.keys(this.panelBboxes).forEach(className => {\n cached[className] = true;\n });\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass && !cached[overlappedClass]) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n cached[overlappedClass] = true;\n } else if (!overlappedClass) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n }\n });\n prevVisiblePanels.forEach(panel => {\n this.addVisiblePanel(panel);\n });\n } else {\n if (!options.renderExternal) {\n panels.forEach(panel => fragment.appendChild(panel.getElement()));\n }\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n if (!options.renderExternal) {\n this.cameraElement.appendChild(fragment);\n }\n }\n\n private updateClonePanels() {\n const panelManager = this.panelManager;\n\n // Clone panels in circular mode\n if (this.options.circular && panelManager.getPanelCount() > 0) {\n this.clonePanels();\n this.updateClonedPanelPositions();\n }\n panelManager.chainAllPanels();\n }\n\n private getVisibleIndexOf(panel: Panel): number {\n return findIndex(this.visiblePanels, visiblePanel => visiblePanel === panel);\n }\n\n private build(): void {\n this.setElements();\n this.applyCSSValue();\n this.setMoveType();\n this.setAxesInstance();\n this.refreshPanels();\n this.setDefaultPanel();\n this.resize();\n this.moveToDefaultPanel();\n }\n\n private setElements(): void {\n const state = this.state;\n const options = this.options;\n const wrapper = this.flicking.getElement();\n const classPrefix = options.classPrefix;\n\n const viewportCandidate = wrapper.children[0] as HTMLElement;\n const hasViewportElement = viewportCandidate && hasClass(viewportCandidate, `${classPrefix}-viewport`);\n\n const viewportElement = hasViewportElement\n ? viewportCandidate\n : document.createElement(\"div\");\n\n const cameraCandidate = hasViewportElement\n ? viewportElement.children[0] as HTMLElement\n : wrapper.children[0] as HTMLElement;\n const hasCameraElement = cameraCandidate && hasClass(cameraCandidate, `${classPrefix}-camera`);\n\n const cameraElement = hasCameraElement\n ? cameraCandidate\n : document.createElement(\"div\");\n\n if (!hasCameraElement) {\n cameraElement.className = `${classPrefix}-camera`;\n\n const panelElements = hasViewportElement\n ? viewportElement.children\n : wrapper.children;\n\n // Make all panels to be a child of camera element\n // wrapper <- viewport <- camera <- panels[1...n]\n toArray(panelElements).forEach(child => {\n cameraElement.appendChild(child);\n });\n } else {\n state.originalCameraStyle = {\n className: cameraElement.getAttribute(\"class\"),\n style: cameraElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasViewportElement) {\n viewportElement.className = `${classPrefix}-viewport`;\n\n // Add viewport element to wrapper\n wrapper.appendChild(viewportElement);\n } else {\n state.originalViewportStyle = {\n className: viewportElement.getAttribute(\"class\"),\n style: viewportElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasCameraElement || !hasViewportElement) {\n viewportElement.appendChild(cameraElement);\n }\n\n this.viewportElement = viewportElement;\n this.cameraElement = cameraElement;\n state.isViewportGiven = hasViewportElement;\n state.isCameraGiven = hasCameraElement;\n }\n\n private applyCSSValue(): void {\n const options = this.options;\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const viewportStyle = this.viewportElement.style;\n\n // Set default css values for each element\n applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS);\n applyCSS(cameraElement, DEFAULT_CAMERA_CSS);\n\n viewportElement.style.zIndex = `${options.zIndex}`;\n if (options.horizontal) {\n viewportStyle.minHeight = \"100%\";\n viewportStyle.width = \"100%\";\n } else {\n viewportStyle.minWidth = \"100%\";\n viewportStyle.height = \"100%\";\n }\n if (options.overflow) {\n viewportStyle.overflow = \"visible\";\n }\n\n this.panelManager = new PanelManager(this.cameraElement, options);\n }\n\n private setMoveType(): void {\n const moveType = this.options.moveType as MoveTypeObjectOption;\n\n switch (moveType.type) {\n case MOVE_TYPE.SNAP:\n this.moveType = new Snap(moveType.count);\n break;\n case MOVE_TYPE.FREE_SCROLL:\n this.moveType = new FreeScroll();\n break;\n default:\n throw new Error(\"moveType is not correct!\");\n }\n }\n\n private setAxesInstance(): void {\n const state = this.state;\n const options = this.options;\n\n const scrollArea = state.scrollArea;\n\n this.axes = new Axes({\n flick: {\n range: [scrollArea.prev, scrollArea.next],\n circular: options.circular,\n bounce: [0, 0], // will be updated in resize()\n },\n }, {\n easing: options.panelEffect,\n deceleration: options.deceleration,\n interruptable: true,\n });\n\n this.createPanInput();\n }\n\n private refreshPanels(): void {\n const panelManager = this.panelManager;\n // Panel elements were attached to camera element by Flicking class\n const panelElements = this.cameraElement.children;\n\n // Initialize panels\n const panels = toArray(panelElements).map(\n (el: HTMLElement, idx: number) => new Panel(el, idx, this),\n );\n\n panelManager.replacePanels(panels, []);\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n private setDefaultPanel(): void {\n const options = this.options;\n const panelManager = this.panelManager;\n const indexRange = this.panelManager.getRange();\n const index = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n\n this.currentPanel = panelManager.get(index);\n }\n\n private clonePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n\n const gap = options.gap;\n const viewportSize = state.size;\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n // There're no panels exist\n if (!firstPanel) {\n return;\n }\n\n // For each panels, clone itself while last panel's position + size is below viewport size\n const panels = panelManager.originalPanels();\n const reversedPanels = panels.concat().reverse();\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap;\n const relativeAnchorPosition = firstPanel.getRelativeAnchorPosition();\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n const areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize;\n let sizeSum = 0;\n let panelAtLeftBoundary!: Panel;\n for (const panel of reversedPanels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaPrev) {\n panelAtLeftBoundary = panel;\n break;\n }\n }\n\n const areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize;\n sizeSum = 0;\n let panelAtRightBoundary!: Panel;\n for (const panel of panels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaNext) {\n panelAtRightBoundary = panel;\n break;\n }\n }\n\n // Need one more set of clones on prev area of original panel 0\n const needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0\n && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex();\n\n // Visible count of panel 0 on first screen\n const panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize)\n + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize)\n - 1; // duplication\n\n const cloneCount = panel0OnFirstscreen\n + (needCloneOnPrev ? 1 : 0);\n const prevCloneCount = panelManager.getCloneCount();\n\n panelManager.setCloneCount(cloneCount);\n if (options.renderExternal) {\n return;\n }\n\n if (cloneCount > prevCloneCount) {\n // should clone more\n for (let cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) {\n const clones = panels.map(origPanel => origPanel.clone(cloneIndex));\n const fragment = document.createDocumentFragment();\n clones.forEach(panel => fragment.appendChild(panel.getElement()));\n\n this.cameraElement.appendChild(fragment);\n this.visiblePanels.push(...clones.filter(clone => Boolean(clone)));\n panelManager.insertClones(cloneIndex, 0, clones);\n }\n } else if (cloneCount < prevCloneCount) {\n // should remove some\n panelManager.removeClonesAfter(cloneCount);\n }\n }\n\n private moveToDefaultPanel(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const indexRange = this.panelManager.getRange();\n\n const defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n const defaultPanel = panelManager.get(defaultIndex);\n\n let defaultPosition = 0;\n if (defaultPanel) {\n defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition;\n defaultPosition = this.canSetBoundMode()\n ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next)\n : defaultPosition;\n }\n\n this.moveCamera(defaultPosition);\n this.axes.setTo({ flick: defaultPosition }, 0);\n }\n\n private updateSize(): void {\n const state = this.state;\n const options = this.options;\n const panels = this.panelManager.originalPanels()\n .filter(panel => Boolean(panel));\n const bbox = this.updateBbox();\n\n const prevSize = state.size;\n // Update size & hanger position\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size);\n state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size);\n }\n\n if (panels.length <= 0) {\n return;\n }\n\n this.resizePanels(panels);\n }\n\n private updateOriginalPanelPositions(): void {\n const gap = this.options.gap;\n const panelManager = this.panelManager;\n\n const firstPanel = panelManager.firstPanel();\n const panels = panelManager.originalPanels();\n\n if (!firstPanel) {\n return;\n }\n\n const currentPanel = this.currentPanel!;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n const scrollArea = this.state.scrollArea;\n\n // Update panel position && fit to wrapper\n let nextPanelPos = firstPanel.getPosition();\n let maintainingPanel: Panel = firstPanel;\n if (nearestPanel) {\n // We should maintain nearestPanel's position\n const looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next);\n\n maintainingPanel = looped\n ? currentPanel\n : nearestPanel;\n } else if (firstPanel.getIndex() > 0) {\n maintainingPanel = currentPanel;\n }\n\n const panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length);\n const accumulatedSize = panelsBeforeMaintainPanel.reduce((total, panel) => {\n return total + panel.getSize() + gap;\n }, 0);\n\n nextPanelPos = maintainingPanel.getPosition() - accumulatedSize;\n\n panels.forEach(panel => {\n const newPosition = nextPanelPos;\n const panelSize = panel.getSize();\n\n panel.setPosition(newPosition);\n nextPanelPos += panelSize + gap;\n });\n\n if (!this.options.renderOnlyVisible) {\n panels.forEach(panel => panel.setPositionCSS());\n }\n }\n\n private updateClonedPanelPositions(): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const clonedPanels = panelManager.clonedPanels()\n .reduce((allClones, clones) => [...allClones, ...clones], [])\n .filter(panel => Boolean(panel));\n\n const scrollArea = state.scrollArea;\n\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n if (!firstPanel) {\n return;\n }\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Locate all cloned panels linearly first\n for (const panel of clonedPanels) {\n const origPanel = panel.getOriginalPanel();\n const cloneIndex = panel.getCloneIndex();\n const cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1);\n const clonedPanelPos = cloneBasePos + origPanel.getPosition();\n\n panel.setPosition(clonedPanelPos);\n }\n\n let lastReplacePosition = firstPanel.getPosition();\n // reverse() pollutes original array, so copy it with concat()\n for (const panel of clonedPanels.concat().reverse()) {\n const panelSize = panel.getSize();\n const replacePosition = lastReplacePosition - panelSize - options.gap;\n\n if (replacePosition + panelSize <= scrollArea.prev) {\n // Replace is not meaningful, as it won't be seen in current scroll area\n break;\n }\n\n panel.setPosition(replacePosition);\n lastReplacePosition = replacePosition;\n }\n\n if (!this.options.renderOnlyVisible) {\n clonedPanels.forEach(panel => {\n panel.setPositionCSS();\n });\n }\n }\n\n private updateVisiblePanelPositions(): void {\n if (this.options.renderOnlyVisible) {\n this.visiblePanels.forEach(panel => {\n panel.setPositionCSS(this.state.positionOffset);\n });\n }\n }\n\n private updateScrollArea(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const axes = this.axes;\n\n // Set viewport scrollable area\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel() as Panel;\n const relativeHangerPosition = state.relativeHangerPosition;\n\n if (!firstPanel) {\n state.scrollArea = {\n prev: 0,\n next: 0,\n };\n } else if (this.canSetBoundMode()) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition();\n\n if (sumOriginalPanelSize >= state.size) {\n state.scrollArea = {\n prev: firstPanel.getPosition(),\n next: lastPanel.getPosition() + lastPanel.getSize() - state.size,\n };\n } else {\n // Find anchor position of set of the combined panels\n const relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize);\n const anchorPos = firstPanel.getPosition() + clamp(\n relAnchorPosOfCombined,\n sumOriginalPanelSize - (state.size - relativeHangerPosition),\n relativeHangerPosition,\n );\n\n state.scrollArea = {\n prev: anchorPos - relativeHangerPosition,\n next: anchorPos - relativeHangerPosition,\n };\n }\n } else if (options.circular) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Maximum scroll extends to first clone sequence's first panel\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition,\n };\n } else {\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: lastPanel.getAnchorPosition() - relativeHangerPosition,\n };\n }\n\n const viewportSize = state.size;\n const bounce = options.bounce;\n\n let parsedBounce: number[];\n if (isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce as number));\n } else {\n const parsedVal = parseArithmeticExpression(bounce as number | string, viewportSize, DEFAULT_OPTIONS.bounce as number);\n parsedBounce = [parsedVal, parsedVal];\n }\n\n // Update axes range and bounce\n const flick = axes.axis.flick;\n flick.range = [state.scrollArea.prev, state.scrollArea.next];\n flick.bounce = parsedBounce;\n }\n\n private checkNeedPanel(axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentPanel = this.currentPanel;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n\n if (!options.infinite) {\n return;\n }\n\n const gap = options.gap;\n const infiniteThreshold = state.infiniteThreshold;\n const maxLastIndex = panelManager.getLastIndex();\n\n if (maxLastIndex < 0) {\n return;\n }\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: null,\n direction: null,\n indexRange: {\n min: 0,\n max: maxLastIndex,\n length: maxLastIndex + 1,\n },\n });\n return;\n }\n\n const originalNearestPosition = nearestPanel.getPosition();\n\n // Check next direction\n let checkingPanel: Panel | null = !currentState.holding && !currentState.playing\n ? currentPanel\n : nearestPanel;\n\n while (checkingPanel) {\n const currentIndex = checkingPanel.getIndex();\n const nextSibling = checkingPanel.nextSibling;\n const lastPanel = panelManager.lastPanel()!;\n const atLastPanel = currentIndex === lastPanel.getIndex();\n const nextIndex = !atLastPanel && nextSibling\n ? nextSibling.getIndex()\n : maxLastIndex + 1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition);\n const cameraNext = state.position + state.size;\n\n // There're empty panels between\n const emptyPanelExistsBetween = (nextIndex - currentIndex > 1);\n // Expected prev panel's left position is smaller than camera position\n const overThreshold = panelRight + gap - infiniteThreshold <= cameraNext;\n\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: currentIndex + 1,\n max: nextIndex - 1,\n length: nextIndex - currentIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at max panel index\n if (options.circular && currentIndex === maxLastIndex && overThreshold) {\n const firstPanel = panelManager.firstPanel();\n const firstIndex = firstPanel\n ? firstPanel.getIndex()\n : -1;\n\n if (firstIndex > 0) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: 0,\n max: firstIndex - 1,\n length: firstIndex,\n },\n });\n }\n }\n\n // Check whether panels are changed\n const lastPanelAfterNeed = panelManager.lastPanel()!;\n const atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex();\n\n if (atLastPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.nextSibling;\n }\n\n // Check prev direction\n checkingPanel = nearestPanel;\n while (checkingPanel) {\n const cameraPrev = state.position;\n const checkingIndex = checkingPanel.getIndex();\n const prevSibling = checkingPanel.prevSibling;\n const firstPanel = panelManager.firstPanel()!;\n const atFirstPanel = checkingIndex === firstPanel.getIndex();\n const prevIndex = !atFirstPanel && prevSibling\n ? prevSibling.getIndex()\n : -1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition);\n\n // There're empty panels between\n const emptyPanelExistsBetween = checkingIndex - prevIndex > 1;\n // Expected prev panel's right position is smaller than camera position\n const overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev;\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: prevIndex + 1,\n max: checkingIndex - 1,\n length: checkingIndex - prevIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at panel 0\n if (options.circular && checkingIndex === 0 && overThreshold) {\n const lastPanel = panelManager.lastPanel();\n\n if (lastPanel && lastPanel.getIndex() < maxLastIndex) {\n const lastIndex = lastPanel.getIndex();\n\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: lastIndex + 1,\n max: maxLastIndex,\n length: maxLastIndex - lastIndex,\n },\n });\n }\n }\n\n // Check whether panels were changed\n const firstPanelAfterNeed = panelManager.firstPanel();\n const atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex();\n\n // Looped in circular mode\n if (atFirstPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.prevSibling;\n }\n }\n\n private triggerNeedPanel(params: {\n axesEvent: any;\n siblingPanel: Panel | null,\n direction: FlickingEvent[\"direction\"];\n indexRange: NeedPanelEvent[\"range\"];\n }): void {\n const { axesEvent, siblingPanel, direction, indexRange } = params;\n const options = this.options;\n const checkedIndexes = this.state.checkedIndexes;\n const alreadyTriggered = checkedIndexes.some(([min, max]) => min === indexRange.min || max === indexRange.max);\n const hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL);\n\n if (alreadyTriggered || !hasHandler) {\n return;\n }\n\n // Should done before triggering event, as we can directly add panels by event callback\n checkedIndexes.push([indexRange.min, indexRange.max]);\n\n const index = siblingPanel\n ? siblingPanel.getIndex()\n : 0;\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n\n this.triggerEvent(\n EVENTS.NEED_PANEL,\n axesEvent,\n isTrusted,\n {\n index,\n panel: siblingPanel,\n direction,\n range: indexRange,\n fill: (element: ElementLike | ElementLike[]) => {\n const panelManager = this.panelManager;\n if (!siblingPanel) {\n return this.insert(panelManager.getRange().max + 1, element);\n }\n\n const parsedElements = parseElement(element);\n // Slice elements to fit size equal to empty spaces\n const elements = direction === DIRECTION.NEXT\n ? parsedElements.slice(0, indexRange.length)\n : parsedElements.slice(-indexRange.length);\n\n if (direction === DIRECTION.NEXT) {\n if (options.circular && index === panelManager.getLastIndex()) {\n // needPanel event is triggered on last index, insert at index 0\n return this.insert(0, elements);\n } else {\n return siblingPanel.insertAfter(elements);\n }\n } else if (direction === DIRECTION.PREV) {\n if (options.circular && index === 0) {\n // needPanel event is triggered on first index(0), insert at the last index\n return this.insert(indexRange.max - elements.length + 1, elements);\n } else {\n return siblingPanel.insertBefore(elements);\n }\n } else {\n // direction is null when there're no panels exist\n return this.insert(0, elements);\n }\n },\n } as Partial,\n );\n }\n\n private updateVisiblePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentState = this.stateMachine.getState();\n const cameraElement = this.cameraElement;\n const { renderExternal, renderOnlyVisible } = options;\n if (!renderOnlyVisible) {\n return;\n }\n\n if (!this.nearestPanel) {\n this.visiblePanels = [];\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n return;\n }\n\n const prevVisiblePanels = this.visiblePanels;\n const newVisiblePanels = this.calcVisiblePanels();\n\n const { addedPanels, removedPanels } = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels);\n\n if (addedPanels.length <= 0 && removedPanels.length <= 0) {\n // Visible panels not changed\n return;\n }\n\n if (currentState.holding) {\n newVisiblePanels.push(...removedPanels);\n } else {\n const firstVisiblePanelPos = newVisiblePanels[0].getPosition();\n state.positionOffset = firstVisiblePanelPos;\n }\n\n newVisiblePanels.forEach(panel => {\n panel.setPositionCSS(state.positionOffset);\n });\n\n if (!renderExternal) {\n if (!currentState.holding) {\n removedPanels.forEach(panel => {\n const panelElement = panel.getElement();\n panelElement.parentNode && cameraElement.removeChild(panelElement);\n });\n }\n\n const fragment = document.createDocumentFragment();\n addedPanels.forEach(panel => {\n fragment.appendChild(panel.getElement());\n });\n\n cameraElement.appendChild(fragment);\n }\n\n const firstVisiblePanel = newVisiblePanels[0];\n const lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1];\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount();\n\n const newVisibleRange = {\n min: getAbsIndex(firstVisiblePanel),\n max: getAbsIndex(lastVisiblePanel),\n };\n this.visiblePanels = newVisiblePanels;\n this.flicking.trigger(EVENTS.VISIBLE_CHANGE, {\n type: EVENTS.VISIBLE_CHANGE,\n range: newVisibleRange,\n });\n }\n\n private checkVisiblePanelChange(prevVisiblePanels: Panel[], newVisiblePanels: Panel[]) {\n const prevRefCount = prevVisiblePanels.map(() => 0);\n const newRefCount = newVisiblePanels.map(() => 0);\n\n prevVisiblePanels.forEach((prevPanel, prevIndex) => {\n newVisiblePanels.forEach((newPanel, newIndex) => {\n if (prevPanel === newPanel) {\n prevRefCount[prevIndex]++;\n newRefCount[newIndex]++;\n }\n });\n });\n\n const removedPanels = prevRefCount.reduce((removed: Panel[], count, index) => {\n return count === 0\n ? [...removed, prevVisiblePanels[index]]\n : removed;\n }, []);\n const addedPanels = newRefCount.reduce((added: Panel[], count, index) => {\n return count === 0\n ? [...added, newVisiblePanels[index]]\n : added;\n }, []);\n\n return { removedPanels, addedPanels };\n }\n\n private resizePanels(panels: Panel[]): void {\n const options = this.options;\n const panelBboxes = this.panelBboxes;\n\n if (options.isEqualSize === true) {\n if (!panelBboxes.default) {\n const defaultPanel = panels[0];\n panelBboxes.default = defaultPanel.getBbox();\n }\n\n const defaultBbox = panelBboxes.default;\n\n panels.forEach(panel => {\n panel.resize(defaultBbox);\n });\n return;\n } else if (options.isEqualSize) {\n const equalSizeClasses = options.isEqualSize;\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass) {\n panel.resize(panelBboxes[overlappedClass]);\n panelBboxes[overlappedClass] = panel.getBbox();\n } else {\n panel.resize();\n }\n });\n return;\n }\n panels.forEach(panel => {\n panel.resize();\n });\n }\n\n private createPanInput() {\n const options = this.options;\n\n this.panInput = new PanInput(this.viewportElement, {\n inputType: options.inputType,\n thresholdAngle: options.thresholdAngle,\n iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold,\n scale: options.horizontal ? [-1, 0] : [0, -1],\n });\n\n this.axes.connect(options.horizontal ? [\"flick\", \"\"] : [\"\", \"flick\"], this.panInput);\n }\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Component from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport Viewport from \"./components/Viewport\";\nimport Panel from \"./components/Panel\";\n\nimport { merge, getProgress, parseElement, isString, counter, findIndex } from \"./utils\";\nimport { DEFAULT_OPTIONS, EVENTS, DIRECTION, AXES_EVENTS, STATE_TYPE, DEFAULT_MOVE_TYPE_OPTIONS } from \"./consts\";\nimport {\n FlickingOptions,\n FlickingEvent,\n Direction,\n EventType,\n FlickingPanel,\n TriggerCallback,\n FlickingContext,\n FlickingStatus,\n Plugin,\n ElementLike,\n DestroyOption,\n BeforeSyncResult,\n SyncResult,\n ChangeEvent,\n SelectEvent,\n NeedPanelEvent,\n VisibleChangeEvent,\n ContentErrorEvent,\n MoveTypeStringOption,\n ValueOf,\n} from \"./types\";\n// import { sendEvent } from \"./ga/ga\";\nimport { DiffResult } from \"@egjs/list-differ\";\n\n/**\n * @memberof eg\n * @extends eg.Component\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"4.X+\"}\n * @requires {@link https://github.com/naver/egjs-component|eg.Component}\n * @requires {@link https://github.com/naver/egjs-axes|eg.Axes}\n * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/}\n */\nclass Flicking extends Component<{\n holdStart: FlickingEvent;\n holdEnd: FlickingEvent;\n moveStart: FlickingEvent;\n move: FlickingEvent;\n moveEnd: FlickingEvent;\n change: ChangeEvent;\n restore: FlickingEvent;\n select: SelectEvent;\n needPanel: NeedPanelEvent;\n visibleChange: VisibleChangeEvent;\n contentError: ContentErrorEvent;\n}> {\n /**\n * Version info string\n * @ko 버전정보 문자열\n * @example\n * eg.Flicking.VERSION; // ex) 3.0.0\n * @memberof eg.Flicking\n */\n public static VERSION: string = \"#__VERSION__#\";\n /**\n * Direction constant - \"PREV\" or \"NEXT\"\n * @ko 방향 상수 - \"PREV\" 또는 \"NEXT\"\n * @type {object}\n * @property {\"PREV\"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
\n * @property {\"NEXT\"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
\n * @example\n * eg.Flicking.DIRECTION.PREV; // \"PREV\"\n * eg.Flicking.DIRECTION.NEXT; // \"NEXT\"\n */\n public static DIRECTION: Direction = DIRECTION;\n\n /**\n * Event type object with event name strings.\n * @ko 이벤트 이름 문자열들을 담은 객체\n * @type {object}\n * @property {\"holdStart\"} HOLD_START - holdStart eventholdStart 이벤트\n * @property {\"holdEnd\"} HOLD_END - holdEnd eventholdEnd 이벤트\n * @property {\"moveStart\"} MOVE_START - moveStart eventmoveStart 이벤트\n * @property {\"move\"} MOVE - move eventmove 이벤트\n * @property {\"moveEnd\"} MOVE_END - moveEnd eventmoveEnd 이벤트\n * @property {\"change\"} CHANGE - change eventchange 이벤트\n * @property {\"restore\"} RESTORE - restore eventrestore 이벤트\n * @property {\"select\"} SELECT - select eventselect 이벤트\n * @property {\"needPanel\"} NEED_PANEL - needPanel eventneedPanel 이벤트\n * @example\n * eg.Flicking.EVENTS.MOVE_START; // \"MOVE_START\"\n */\n public static EVENTS: EventType = EVENTS;\n\n public options: FlickingOptions;\n\n private wrapper: HTMLElement;\n private viewport: Viewport;\n private contentsReadyChecker: ImReady | null = null;\n\n private eventContext: FlickingContext;\n private isPanelChangedAtBeforeSync: boolean = false;\n\n /**\n * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체\n * @param {string} [options.classPrefix=\"eg-flick\"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사.\n * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향)\n * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다.\n * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다.\n * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리.\n * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
\n * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다.\n * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다.\n * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수.\n * @param {string[]} [options.inputType=[\"touch,\"mouse\"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고})\n * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
\n * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, \"10px\", \"20%\")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, \"10px\", \"20%\")
\n * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부.\n * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부.\n * @param {number|\"\"} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값.\n * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다.\n * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다.\n * @param {string} [options.hanger=\"50%\"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {string} [options.anchor=\"50%\"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px)\n * @param {eg.Flicking.MoveTypeOption} [options.moveType=\"snap\"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll)\n * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
\n * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다.\n * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
\n * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.\n * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다.\n * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
\n * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다.\n */\n constructor(\n element: string | HTMLElement,\n options: Partial = {},\n ) {\n super();\n\n // Set flicking wrapper user provided\n let wrapper: HTMLElement | null;\n if (isString(element)) {\n wrapper = document.querySelector(element);\n if (!wrapper) {\n throw new Error(\"Base element doesn't exist.\");\n }\n } else if (element.nodeName && element.nodeType === 1) {\n wrapper = element;\n } else {\n throw new Error(\"Element should be provided in string or HTMLElement.\");\n }\n\n this.wrapper = wrapper;\n // Override default options\n this.options = merge({}, DEFAULT_OPTIONS, options) as FlickingOptions;\n // Override moveType option\n const currentOptions = this.options;\n const moveType = currentOptions.moveType as MoveTypeStringOption;\n\n if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) {\n currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType as keyof typeof DEFAULT_MOVE_TYPE_OPTIONS];\n }\n\n // Make viewport instance with panel container element\n this.viewport = new Viewport(this, this.options, this.triggerEvent);\n this.listenInput();\n this.listenResize();\n\n // if (this.options.collectStatistics) {\n // sendEvent(\n // \"usage\",\n // \"options\",\n // options,\n // );\n // }\n }\n\n /**\n * Move to the previous panel if it exists.\n * @ko 이전 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public prev(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const prevPanel = currentPanel.prev();\n if (prevPanel) {\n prevPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the next panel if it exists.\n * @ko 다음 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public next(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const nextPanel = currentPanel.next();\n if (nextPanel) {\n nextPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the panel of given index.\n * @ko 주어진 인덱스에 해당하는 패널로 이동한다.\n * @param index The index number of the panel to move.이동할 패널의 인덱스 번호.\n * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public moveTo(index: number, duration?: number): this {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n const state = viewport.stateMachine.getState();\n\n if (!panel || state.type !== STATE_TYPE.IDLE) {\n return this;\n }\n\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = viewport.getHangerPosition();\n\n let targetPanel = panel;\n if (this.options.circular) {\n const scrollAreaSize = viewport.getScrollAreaSize();\n // Check all three possible locations, find the nearest position among them.\n const possiblePositions = [\n anchorPosition - scrollAreaSize,\n anchorPosition,\n anchorPosition + scrollAreaSize,\n ];\n const nearestPosition = possiblePositions.reduce((nearest, current) => {\n return (Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition))\n ? current\n : nearest;\n }, Infinity) - panel.getRelativeAnchorPosition();\n\n const identicals = panel.getIdenticalPanels();\n const offset = nearestPosition - anchorPosition;\n if (offset > 0) {\n // First cloned panel is nearest\n targetPanel = identicals[1];\n } else if (offset < 0) {\n // Last cloned panel is nearest\n targetPanel = identicals[identicals.length - 1];\n }\n\n targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true);\n targetPanel.setPosition(nearestPosition);\n }\n const currentIndex = this.getIndex();\n\n if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) {\n return this;\n }\n\n const eventType = panel.getIndex() === viewport.getCurrentIndex()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(\n targetPanel,\n viewport.findEstimatedPosition(targetPanel),\n eventType,\n null,\n duration,\n );\n return this;\n }\n\n /**\n * Return index of the current panel. `-1` if no panel exists.\n * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다.\n * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n */\n public getIndex(): number {\n return this.viewport.getCurrentIndex();\n }\n\n /**\n * Return the wrapper element user provided in constructor.\n * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다.\n * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트.\n */\n public getElement(): HTMLElement {\n return this.wrapper;\n }\n\n /**\n * Return the viewport element's size.\n * @ko 뷰포트 엘리먼트의 크기를 반환한다.\n * @return Width if horizontal: true, height if horizontal: false\n */\n public getSize(): number {\n return this.viewport.getSize();\n }\n\n /**\n * Return current panel. `null` if no panel exists.\n * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다.\n * @return Current panel.현재 패널.\n */\n public getCurrentPanel(): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.getCurrentPanel();\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return the panel of given index. `null` if it doesn't exists.\n * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다.\n * @return Panel of given index.주어진 인덱스에 해당하는 패널.\n */\n public getPanel(index: number): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return all panels.\n * @ko 모든 패널들을 반환한다.\n * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부.\n * @return All panels.모든 패널들.\n */\n public getAllPanels(includeClone?: boolean): FlickingPanel[] {\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const panels = includeClone\n ? panelManager.allPanels()\n : panelManager.originalPanels();\n\n return panels\n .filter(panel => !!panel);\n }\n\n /**\n * Return the panels currently shown in viewport area.\n * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다.\n * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들\n */\n public getVisiblePanels(): FlickingPanel[] {\n return this.viewport.calcVisiblePanels();\n }\n\n /**\n * Return length of original panels.\n * @ko 원본 패널의 개수를 반환한다.\n * @return Length of original panels.원본 패널의 개수\n */\n public getPanelCount(): number {\n return this.viewport.panelManager.getPanelCount();\n }\n\n /**\n * Return how many groups of clones are created.\n * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다.\n * @return Length of cloned panel groups.클론된 패널 그룹의 개수\n */\n public getCloneCount(): number {\n return this.viewport.panelManager.getCloneCount();\n }\n\n /**\n * Get maximum panel index for `infinite` mode.\n * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스.\n */\n public getLastIndex(): number {\n return this.viewport.panelManager.getLastIndex();\n }\n\n /**\n * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it.\n * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다.\n * @param - Maximum panel index.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public setLastIndex(index: number): this {\n this.viewport.setLastIndex(index);\n\n return this;\n }\n\n /**\n * Return panel movement animation.\n * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다.\n * @return Is animating or not.애니메이션 진행 여부.\n */\n public isPlaying(): boolean {\n return this.viewport.stateMachine.getState().playing;\n }\n\n /**\n * Unblock input devices.\n * @ko 막았던 입력 장치로부터의 입력을 푼다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public enableInput(): this {\n this.viewport.enable();\n\n return this;\n }\n\n /**\n * Block input devices.\n * @ko 입력 장치로부터의 입력을 막는다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public disableInput(): this {\n this.viewport.disable();\n\n return this;\n }\n\n /**\n * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}.\n * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다.\n * @return An object with current status value information.현재 상태값 정보를 가진 객체.\n */\n public getStatus(): FlickingStatus {\n const viewport = this.viewport;\n\n const panels = viewport.panelManager.originalPanels()\n .filter(panel => !!panel)\n .map(panel => {\n return {\n html: panel.getElement().outerHTML,\n index: panel.getIndex(),\n };\n });\n\n return {\n index: viewport.getCurrentIndex(),\n panels,\n position: viewport.getCameraPosition(),\n };\n }\n\n /**\n * Restore to the state of the `status`.\n * @ko `status`의 상태로 복원한다.\n * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다.\n */\n public setStatus(status: FlickingStatus): void {\n this.viewport.restore(status);\n }\n\n /**\n * Add plugins that can have different effects on Flicking.\n * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다.\n * @param - The plugin(s) to add.추가할 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public addPlugins(plugins: Plugin | Plugin[]) {\n this.viewport.addPlugins(plugins);\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @ko 플리킹으로부터 플러그인들을 제거한다.\n * @param - The plugin(s) to remove.제거 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public removePlugins(plugins: Plugin | Plugin[]) {\n this.viewport.removePlugins(plugins);\n return this;\n }\n\n /**\n * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n * @example\n * const flick = new eg.Flicking(\"#flick\");\n * flick.destroy();\n * console.log(flick.moveTo); // null\n */\n public destroy(option: Partial = {}): void {\n this.off();\n\n if (this.options.autoResize) {\n window.removeEventListener(\"resize\", this.resize);\n }\n\n this.viewport.destroy(option);\n this.contentsReadyChecker?.destroy();\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n /**\n * Update panels to current state.\n * @ko 패널들을 현재 상태에 맞춰 갱신한다.\n * @method\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public resize = (): this => {\n const viewport = this.viewport;\n const options = this.options;\n const wrapper = this.getElement();\n\n const allPanels = viewport.panelManager.allPanels();\n if (!options.isConstantSize) {\n allPanels.forEach(panel => panel.unCacheBbox());\n }\n\n const shouldResetElements = options.renderOnlyVisible\n && !options.isConstantSize\n && options.isEqualSize !== true;\n\n // Temporarily set parent's height to prevent scroll (#333)\n const parent = wrapper.parentElement!;\n const origStyle = parent.style.height;\n parent.style.height = `${parent.offsetHeight}px`;\n\n viewport.unCacheBbox();\n // This should be done before adding panels, to lower performance issue\n viewport.updateBbox();\n\n if (shouldResetElements) {\n viewport.appendUncachedPanelElements(allPanels as Panel[]);\n }\n\n viewport.resize();\n parent.style.height = origStyle;\n\n return this;\n }\n\n /**\n * Add new panels at the beginning of panels.\n * @ko 제일 앞에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.replace(3, document.createElement(\"div\")); // Add new panel at index 3\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 2\n * flicking.prepend([\"\\Panel\\\", document.createElement(\"div\")]); // Prepended at index 0, 1\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 0, pushing every panels behind it.\n */\n public prepend(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n\n const insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0);\n const prependedPanels = viewport.insert(insertingIndex, parsedElements);\n\n this.checkContentsReady(prependedPanels);\n\n return prependedPanels;\n }\n\n /**\n * Add new panels at the end of panels.\n * @ko 제일 끝에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\")); // Appended at index 0\n * flicking.append(\"\\Panel\\\"); // Appended at index 1\n * flicking.append([\"\\Panel\\\", document.createElement(\"div\")]); // Appended at index 2, 3\n * // Even this is possible\n * flicking.append(\"\\Panel 1\\\\Panel 2\\\"); // Appended at index 4, 5\n */\n public append(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element);\n\n this.checkContentsReady(appendedPanels);\n\n return appendedPanels;\n }\n\n /**\n * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index.\n * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다.\n * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n *\n * // This will add new panel at index 3,\n * // Index 0, 1, 2 is empty at this moment.\n * // [empty, empty, empty, PANEL]\n * flicking.replace(3, document.createElement(\"div\"));\n *\n * // As index 2 was empty, this will also add new panel at index 2.\n * // [empty, empty, PANEL, PANEL]\n * flicking.replace(2, \"\\Panel\\\");\n *\n * // Index 3 was not empty, so it will replace previous one.\n * // It will also add new panels at index 4 and 5.\n * // before - [empty, empty, PANEL, PANEL]\n * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL]\n * flicking.replace(3, [\"\\Panel\\\", \"\\Panel\\\", \"\\Panel\\\"])\n */\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const replacedPanels = this.viewport.replace(index, element);\n\n this.checkContentsReady(replacedPanels);\n\n return replacedPanels;\n }\n\n /**\n * Remove panel at target index. This will decrease index of panels behind it.\n * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다.\n * @param index - Index of panel to remove.제거할 패널의 인덱스\n * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수.\n * @return Array of removed panels제거된 패널들의 배열\n */\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n return this.viewport.remove(index, deleteCount);\n }\n\n /**\n * Get indexes to render. Should be used with `renderOnlyVisible` option.\n * `beforeSync` should be called before this method for a correct result.\n * @private\n * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다.\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @return Array of indexes to render.렌더링할 인덱스의 배열\n */\n public getRenderingIndexes(diffResult: DiffResult): number[] {\n const viewport = this.viewport;\n const visiblePanels = viewport.getVisiblePanels();\n const maintained = diffResult.maintained.reduce((values: {[key: number]: number}, [before, after]) => {\n values[after] = before;\n return values;\n }, {});\n\n const panelCount = diffResult.list.length;\n const added = diffResult.added;\n const getPanelAbsIndex = (panel: Panel) => {\n return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n };\n\n const visibleIndexes = visiblePanels.map(panel => getPanelAbsIndex(panel))\n .filter(val => maintained[val % panelCount] != null);\n\n const renderingPanels = [...visibleIndexes, ...added];\n const allPanels = viewport.panelManager.allPanels();\n\n viewport.setVisiblePanels(renderingPanels.map(index => allPanels[index]));\n\n return renderingPanels;\n }\n\n /**\n * Synchronize info of panels instance with info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다.\n * @private\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 \n */\n public beforeSync(diffInfo: BeforeSyncResult) {\n const { maintained, added, changed, removed } = diffInfo;\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const isCircular = this.options.circular;\n const cloneCount = panelManager.getCloneCount();\n const prevClonedPanels = panelManager.clonedPanels();\n\n // Update visible panels\n const newVisiblePanels = viewport.getVisiblePanels()\n .filter(panel => findIndex(removed, index => {\n return index === panel.getIndex();\n }) < 0);\n viewport.setVisiblePanels(newVisiblePanels);\n\n // Did not changed at all\n if (\n added.length <= 0\n && removed.length <= 0\n && changed.length <= 0\n && cloneCount === prevClonedPanels.length\n ) {\n return this;\n }\n const prevOriginalPanels = panelManager.originalPanels();\n const newPanels: Panel[] = [];\n const newClones: Panel[][] = counter(cloneCount).map(() => []);\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newPanels[afterIdx] = prevOriginalPanels[beforeIdx];\n newPanels[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n newPanels[addIndex] = new Panel(null, addIndex, this.viewport);\n });\n\n if (isCircular) {\n counter(cloneCount).forEach(groupIndex => {\n const prevCloneGroup = prevClonedPanels[groupIndex];\n const newCloneGroup = newClones[groupIndex];\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newCloneGroup[afterIdx] = prevCloneGroup\n ? prevCloneGroup[beforeIdx]\n : newPanels[afterIdx].clone(groupIndex, false);\n\n newCloneGroup[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n const newPanel = newPanels[addIndex];\n\n newCloneGroup[addIndex] = newPanel.clone(groupIndex, false);\n });\n });\n }\n\n added.forEach(index => { viewport.updateCheckedIndexes({ min: index, max: index }); });\n removed.forEach(index => { viewport.updateCheckedIndexes({ min: index - 1, max: index + 1 }); });\n\n const checkedIndexes = viewport.getCheckedIndexes();\n checkedIndexes.forEach(([min, max], idx) => {\n // Push checked indexes backward\n const pushedIndex = added.filter(index => index < min && panelManager.has(index)).length\n - removed.filter(index => index < min).length;\n checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n });\n\n // Only effective only when there are least one panel which have changed its index\n if (changed.length > 0) {\n // Removed checked index by changed ones after pushing\n maintained.forEach(([, next]) => { viewport.updateCheckedIndexes({ min: next, max: next }); });\n }\n panelManager.replacePanels(newPanels, newClones);\n this.isPanelChangedAtBeforeSync = true;\n }\n\n /**\n * Synchronize info of panels with DOM info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다.\n * @private\n * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트.\n */\n public sync(diffInfo: SyncResult): this {\n const { list, maintained, added, changed, removed } = diffInfo;\n\n // Did not changed at all\n if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) {\n return this;\n }\n const viewport = this.viewport;\n const { renderOnlyVisible, circular } = this.options;\n const panelManager = viewport.panelManager;\n\n if (!renderOnlyVisible) {\n const indexRange = panelManager.getRange();\n let beforeDiffInfo: BeforeSyncResult = diffInfo;\n\n if (circular) {\n const prevOriginalPanelCount = indexRange.max;\n const originalPanelCount = (list.length / (panelManager.getCloneCount() + 1)) >> 0;\n const originalAdded = added.filter(index => index < originalPanelCount);\n const originalRemoved = removed.filter(index => index <= prevOriginalPanelCount);\n const originalMaintained = maintained.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n const originalChanged = changed.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n\n beforeDiffInfo = {\n added: originalAdded,\n maintained: originalMaintained,\n removed: originalRemoved,\n changed: originalChanged,\n };\n }\n this.beforeSync(beforeDiffInfo);\n }\n\n const visiblePanels = renderOnlyVisible\n ? viewport.getVisiblePanels()\n : this.getAllPanels(true);\n\n added.forEach(addedIndex => {\n const addedElement = list[addedIndex];\n const beforePanel = visiblePanels[addedIndex] as Panel;\n\n beforePanel.setElement(addedElement);\n // As it can be 0\n beforePanel.unCacheBbox();\n });\n if (this.isPanelChangedAtBeforeSync) {\n // Reset visible panels\n viewport.setVisiblePanels([]);\n this.isPanelChangedAtBeforeSync = false;\n }\n viewport.resize();\n\n return this;\n }\n\n private listenInput(): void {\n const flicking = this;\n const viewport = flicking.viewport;\n const stateMachine = viewport.stateMachine;\n\n // Set event context\n flicking.eventContext = {\n flicking,\n viewport: flicking.viewport,\n transitTo: stateMachine.transitTo,\n triggerEvent: flicking.triggerEvent,\n moveCamera: flicking.moveCamera,\n stopCamera: viewport.stopCamera,\n };\n\n const handlers = {};\n for (const key in AXES_EVENTS) {\n const eventType = AXES_EVENTS[key];\n\n handlers[eventType] = (e: any) => stateMachine.fire(eventType, e, flicking.eventContext);\n }\n\n // Connect Axes instance with PanInput\n flicking.viewport.connectAxesHandler(handlers);\n }\n\n private listenResize(): void {\n const options = this.options;\n\n if (options.autoResize) {\n window.addEventListener(\"resize\", this.resize);\n }\n\n if (options.resizeOnContentsReady) {\n const contentsReadyChecker = new ImReady();\n\n contentsReadyChecker.on(\"preReady\", () => {\n this.resize();\n });\n contentsReadyChecker.on(\"readyElement\", e => {\n if (e.hasLoading && e.isPreReadyOver) {\n this.resize();\n }\n });\n contentsReadyChecker.on(\"error\", e => {\n this.trigger(EVENTS.CONTENT_ERROR, {\n type: EVENTS.CONTENT_ERROR,\n element: e.element,\n });\n });\n contentsReadyChecker.check([this.wrapper]);\n\n this.contentsReadyChecker = contentsReadyChecker;\n }\n }\n\n private triggerEvent = (\n eventName: ValueOf>, // visibleChange event has no common event definition from other events\n axesEvent: any,\n isTrusted: boolean,\n params: Partial = {},\n ): TriggerCallback => {\n const viewport = this.viewport;\n\n let canceled: boolean = true;\n\n // Ignore events before viewport is initialized\n if (viewport) {\n const state = viewport.stateMachine.getState();\n const { prev, next } = viewport.getScrollArea();\n const pos = viewport.getCameraPosition();\n let progress = getProgress(pos, [prev, prev, next]);\n\n if (this.options.circular) {\n progress %= 1;\n }\n canceled = !super.trigger(eventName, merge({\n type: eventName,\n index: this.getIndex(),\n panel: this.getCurrentPanel(),\n direction: state.direction,\n holding: state.holding,\n progress,\n axesEvent,\n isTrusted,\n }, params) as FlickingEvent);\n }\n\n return {\n onSuccess(callback: () => void): TriggerCallback {\n if (!canceled) {\n callback();\n }\n return this;\n },\n onStopped(callback: () => void): TriggerCallback {\n if (canceled) {\n callback();\n }\n return this;\n },\n } as TriggerCallback;\n }\n\n // Return result of \"move\" event triggered\n private moveCamera = (axesEvent: any): TriggerCallback => {\n const viewport = this.viewport;\n const state = viewport.stateMachine.getState();\n const options = this.options;\n\n const pos = axesEvent.pos.flick;\n const previousPosition = viewport.getCameraPosition();\n\n if (axesEvent.isTrusted && state.holding) {\n const inputOffset = options.horizontal\n ? axesEvent.inputEvent.offsetX\n : axesEvent.inputEvent.offsetY;\n\n const isNextDirection = inputOffset < 0;\n\n let cameraChange = pos - previousPosition;\n const looped = isNextDirection === (pos < previousPosition);\n if (options.circular && looped) {\n // Reached at max/min range of axes\n const scrollAreaSize = viewport.getScrollAreaSize();\n cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange));\n }\n\n const currentDirection = cameraChange === 0\n ? state.direction\n : cameraChange > 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n state.direction = currentDirection;\n }\n state.delta += axesEvent.delta.flick;\n\n viewport.moveCamera(pos, axesEvent);\n return this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted)\n .onStopped(() => {\n // Undo camera movement\n viewport.moveCamera(previousPosition, axesEvent);\n });\n }\n\n private checkContentsReady(panels: FlickingPanel[]) {\n this.contentsReadyChecker?.check(panels.map(panel => panel.getElement()));\n }\n}\n\nexport default Flicking;\n"],"names":["MOVE_TYPE","SNAP","FREE_SCROLL","DEFAULT_MOVE_TYPE_OPTIONS","snap","type","count","freeScroll","isBrowser","document","DEFAULT_OPTIONS","classPrefix","deceleration","horizontal","circular","infinite","infiniteThreshold","lastIndex","Infinity","threshold","duration","panelEffect","x","Math","pow","defaultIndex","inputType","thresholdAngle","bounce","autoResize","adaptive","zIndex","bound","overflow","hanger","anchor","gap","moveType","useOffset","isEqualSize","isConstantSize","renderOnlyVisible","renderExternal","resizeOnContentsReady","iOSEdgeSwipeThreshold","collectStatistics","DEFAULT_VIEWPORT_CSS","position","DEFAULT_CAMERA_CSS","width","height","willChange","DEFAULT_PANEL_CSS","EVENTS","HOLD_START","HOLD_END","MOVE_START","MOVE","MOVE_END","CHANGE","RESTORE","SELECT","NEED_PANEL","VISIBLE_CHANGE","CONTENT_ERROR","AXES_EVENTS","HOLD","RELEASE","ANIMATION_END","FINISH","STATE_TYPE","IDLE","HOLDING","DRAGGING","ANIMATING","DISABLED","DIRECTION","PREV","NEXT","FLICKING_METHODS","prev","next","moveTo","getIndex","getAllPanels","getCurrentPanel","getElement","getSize","getPanel","getPanelCount","getStatus","getVisiblePanels","enableInput","disableInput","destroy","resize","setStatus","isPlaying","checkTranslateSupport","transforms","webkitTransform","msTransform","MozTransform","OTransform","transform","name","has3d","supportedStyle","documentElement","style","transformName","prefixedTransform","Error","el","createElement","insertBefore","styleVal","window","getComputedStyle","getPropertyValue","parentElement","removeChild","transformInfo","length","TRANSFORM","merge","target","_i","srcs","forEach","source","Object","keys","key","value","parseElement","element","Array","isArray","elements","isString","tempDiv","innerHTML","push","toArray","children","firstChild","addClass","className","classList","add","hasClass","replace","contains","split","indexOf","applyCSS","cssObj","property","clamp","val","min","max","isBetween","iterable","slice","call","arr","constructor","parseArithmeticExpression","cssValue","base","defaultVal","defaultValue","cssRegex","idx","calculatedValue","matchResult","exec","sign","unit","parsedValue","parseFloat","getProgress","pos","range","center","findIndex","callback","i","counter","counterArray","circulate","indexed","size","offset","restoreStyle","originalStyle","setAttribute","removeAttribute","withFlickingMethods","prototype","flickingName","args","result","_a","getBbox","bbox","y","offsetWidth","offsetHeight","clientRect","getBoundingClientRect","left","top","index","viewport","prevSibling","nextSibling","clonedPanels","state","relativeAnchorPosition","isClone","isVirtual","cloneIndex","cachedBbox","setElement","givenBbox","options","prevSize","panel","cloneState","panelCount","panelManager","scrollAreaSize","getScrollAreaSize","relativeIndex","floor","getPosition","progress","getCurrentProgress","outsetRange","getRelativeHangerPosition","getRelativeAnchorPosition","relativePanelPosition","getCameraPosition","outsetProgress","panelSize","rightRelativePanelPosition","visibleSize","visibleRatio","currentPanel","hangerPosition","getHangerPosition","anchorPosition","getAnchorPosition","currentPosition","eventType","findEstimatedPosition","updateFunction","shouldResize","identicalPanels","getIdenticalPanels","eachPanel","unCacheBbox","addVisiblePanel","currentIndex","prevPanelIndex","prevPanelPosition","prevPanelSize","hasEmptyPanelBetween","notYetMinPanel","newPosition","prevPanel","clone","getCloneIndex","setPosition","getLastIndex","nextPanelIndex","nextPanelPosition","notYetMaxPanel","nextPanel","parsedElements","firstPanel","targetIndex","insert","remove","option","preserveUI","wasVisible","Boolean","parentNode","cameraElement","getCameraElement","appendChild","classes","classes_1","original","getClonedPanels","elementStyle","currentElementStyle","styleToApply","cloneElement","cloneNode","clonedPanel","Panel","clonedState","removeClonedPanelsAfter","start","removingPanels","splice","removeElement","currentElement","getAttribute","panels","clones","cloneCount","reduce","allClones","newPanels","newClones","filter","lastPanel","firstRemovedPanel","possibleLastPanel","shouldRender","isCircular","findFirstPanelFrom","siblingElement","insertNewPanels","pushedIndex","panelsAfterIndex","emptyPanelCount","removedPanels","newLastIndex","concat","reverse","setIndex","updateIndex","addNewClones","panelCount_1","cloneSet","replacedPanels","wasNonEmptyCount","deleteCount","deletedPanels","reversedPanels","nonEmptyIndexFromLast","allPanels","allPanelsCount","newClones_1","insertTarget_1","allPanels_1","panelElement","originalPanels","getCloneCount","lastPanelClones","nextSiblingClones","cloneNextSibling","lastPanelSibling","cloneSiblingElement","nextElementSibling","map","_this","this_1","insertClones","insertingIndex","fragment_1","createDocumentFragment","prevState","delta","direction","targetPanel","lastPosition","nextState","e","context","__extends","flicking","triggerEvent","transitTo","moveCamera","onSuccess","onStopped","onChange","State","inputEvent","offsetX","offsetY","flick","setTo","releaseEvent","srcEvent","clickedElement","touchEvent","touch","changedTouches","elementFromPoint","clientX","clientY","clickedPanel","findPanelOf","cameraPosition","clickedPanelPosition","stopCamera","absDelta","abs","velocity","velocityX","velocityY","inputDelta","deltaX","deltaY","isNextDirection","swipeDistance","swipeAngle","atan","PI","belowAngleThreshold","overThreshold","moveTypeContext","axesEvent","interruptDestInfo","findPanelWhenInterrupted","destPos","nearestPanel","getNearestPanel","stop","destInfo","findTargetPanel","findRestorePanel","scrollArea","getScrollArea","loopCount","originalTargetPosition","newCloneIndex","newTargetPosition","newTargetPanel","setCurrentPanel","isTrusted","updateAdaptiveSize","updateCameraPosition","updateAxesPosition","IdleState","nextStateType","currentState","HoldingState","DraggingState","AnimatingState","DisabledState","onExit","onEnter","onHold","onRelease","onAnimationEnd","onFinish","ctx","findRestorePanelInCircularMode","halfGap","minimumDistanceToChange","originalPanel","getOriginalPanel","firstClonedPanel","lapped","_super","snapCount","eventDelta","calcBrinkOfChange","nearestIsCurrent","shouldMoveWhenBounceIs0","canSetBoundMode","shouldMoveToAdjacent","isOutOfBound","findSnappedPanel","findAdjacentPanel","estimatedHangerPos","panelToMove","cycleIndex","passedPanelCount","panelPosition","panelNextPosition","panelPrevPosition","siblingPanel","panelIndex","siblingIndex","originalPosition","defaultDuration","getCurrentIndex","get","basePanel","basePosition","adjacentPanel","targetRelativeAnchorPosition","estimatedPanelPosition","estimatedPosition","MoveType","estimatedPanel","findNearestPanelAt","stateMachine","getState","currentPanelPosition","lastHangerPosition","Snap","panelMaintainRatio","relativeHangerPosition","positionOffset","translate","checkedIndexes","isAdaptiveCached","isViewportGiven","isCameraGiven","originalViewportStyle","originalCameraStyle","StateMachine","visiblePanels","panelBboxes","build","eventResult","axes","findNearestPanel","originalNearestPosition","checkNeedPanel","modifiedNearestPosition","updateVisiblePanels","posOffset","moveVector","moveCoord","coord","round","join","viewportElement","updateSize","updateOriginalPanelPositions","updateScrollArea","updateClonePanels","updateVisiblePanelPositions","updatePlugins","minimumDistance","prevPosition","nextPosition","distance","minimumAnchorDistance","anchorDistance","nearest","shortestDistance","identicals","identical","getVisibleIndexOf","panInput","createPanInput","resizePanels","newCenterPanel","newPanelPosition","updateCheckedIndexes","indexes","visibleIndex","wasEmpty","newCurrentIndex","getRange","undefined","shouldApplyAdaptive","viewportStyle","sizeToApply","panelBbox","maximumPanelSize","maximum","viewportBbox","updateBbox","viewportSize","isFreeScroll","is","holding","playing","positionBounded","plugins","plugin","update","wrapper","removePlugins","topmostElement_1","deletingElement","status","html","refreshPanels","createdPanels","orderedPanels","createdPanel","replacePanels","setCloneCount","cameraPos_1","viewportSize_1","getNextPanel","getPrevPanel","isOutOfBoundNext","isOutOfBoundPrev","getNext","isOutOfViewport","getAbsIndex_1","nextPanels","prevPanels","__spreadArrays","sort","panel1","panel2","getOutsetProgress","NaN","prevRange","nextRange","nearestAnchorPos","nearestIndex","nearestSize","hangerIsNextToNearestPanel","targetPosition","progressBetween","startIndex","off","on","axesHandlers","setLastIndex","handlers","newPlugins","init","currentPlugins","removedPlugins","changedRange","removed","fragment","prevVisiblePanels","equalSizeClasses_1","cached_1","overlappedClass","getOverlappedClass","clonePanels","updateClonedPanelPositions","chainAllPanels","visiblePanel","setElements","applyCSSValue","setMoveType","setAxesInstance","setDefaultPanel","moveToDefaultPanel","viewportCandidate","hasViewportElement","cameraCandidate","hasCameraElement","panelElements","child","minHeight","minWidth","PanelManager","FreeScroll","Axes","easing","interruptable","indexRange","sumOriginalPanelSize","areaPrev","sizeSum","panelAtLeftBoundary","reversedPanels_1","areaNext","panelAtRightBoundary","panels_1","needCloneOnPrev","panel0OnFirstscreen","ceil","prevCloneCount","origPanel","removeClonesAfter","defaultPanel","defaultPosition","nextPanelPos","maintainingPanel","looped","panelsBeforeMaintainPanel","accumulatedSize","total","setPositionCSS","clonedPanels_1","cloneBasePos","clonedPanelPos","lastReplacePosition","_b","replacePosition","relAnchorPosOfCombined","anchorPos","parsedBounce","parsedVal","axis","maxLastIndex","triggerNeedPanel","checkingPanel","atLastPanel","nextIndex","currentNearestPosition","panelRight","cameraNext","emptyPanelExistsBetween","firstIndex","lastPanelAfterNeed","atLastPanelAfterNeed","cameraPrev","checkingIndex","atFirstPanel","prevIndex","panelLeft","firstPanelAfterNeed","atFirstPanelAfterNeed","params","alreadyTriggered","some","hasHandler","hasOn","fill","insertAfter","newVisiblePanels","calcVisiblePanels","checkVisiblePanelChange","addedPanels","firstVisiblePanelPos","firstVisiblePanel","lastVisiblePanel","getAbsIndex","newVisibleRange","trigger","prevRefCount","newRefCount","newPanel","newIndex","added","default","defaultBbox_1","equalSizeClasses_2","PanInput","scale","connect","shouldResetElements","parent","origStyle","appendUncachedPanelElements","eventName","canceled","previousPosition","inputOffset","cameraChange","currentDirection","querySelector","nodeName","nodeType","currentOptions","Viewport","listenInput","listenResize","focus","possiblePositions","nearestPosition","current","includeClone","enable","disable","outerHTML","restore","addPlugins","removeEventListener","contentsReadyChecker","prependedPanels","checkContentsReady","appendedPanels","diffResult","maintained","values","before","after","list","getPanelAbsIndex","visibleIndexes","renderingPanels","setVisiblePanels","diffInfo","changed","prevClonedPanels","prevOriginalPanels","beforeIdx","afterIdx","addIndex","groupIndex","prevCloneGroup","newCloneGroup","getCheckedIndexes","has","isPanelChangedAtBeforeSync","beforeDiffInfo","prevOriginalPanelCount_1","originalPanelCount_1","originalAdded","originalRemoved","originalMaintained","originalChanged","beforeSync","addedIndex","addedElement","beforePanel","eventContext","fire","connectAxesHandler","addEventListener","ImReady","hasLoading","isPreReadyOver","check","Flicking","Component"],"mappings":"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"} \ No newline at end of file diff --git a/dist/flicking.js b/dist/flicking.js new file mode 100644 index 0000000000..459435629f --- /dev/null +++ b/dist/flicking.js @@ -0,0 +1,5066 @@ +/* +Copyright (c) 2015-present NAVER Corp. +name: @egjs/flicking +license: MIT +author: NAVER Corp. +repository: https://github.com/naver/egjs-flicking +version: 3.7.2 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@egjs/component'), require('@egjs/imready'), require('@egjs/axes')) : + typeof define === 'function' && define.amd ? define(['@egjs/component', '@egjs/imready', '@egjs/axes'], factory) : + (global = global || self, (global.eg = global.eg || {}, global.eg.Flicking = factory(global.eg.Component, global.ImReady, global.eg.Axes))); +}(this, (function (Component, ImReady, Axes) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; + } + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + var MOVE_TYPE = { + SNAP: "snap", + FREE_SCROLL: "freeScroll" + }; + var DEFAULT_MOVE_TYPE_OPTIONS = { + snap: { + type: "snap", + count: 1 + }, + freeScroll: { + type: "freeScroll" + } + }; + var isBrowser = typeof document !== "undefined"; + /** + * Default options for creating Flicking. + * @ko 플리킹을 만들 때 사용하는 기본 옵션들 + * @private + * @memberof eg.Flicking + */ + + var DEFAULT_OPTIONS = { + classPrefix: "eg-flick", + deceleration: 0.0075, + horizontal: true, + circular: false, + infinite: false, + infiniteThreshold: 0, + lastIndex: Infinity, + threshold: 40, + duration: 100, + panelEffect: function (x) { + return 1 - Math.pow(1 - x, 3); + }, + defaultIndex: 0, + inputType: ["touch", "mouse"], + thresholdAngle: 45, + bounce: 10, + autoResize: false, + adaptive: false, + zIndex: 2000, + bound: false, + overflow: false, + hanger: "50%", + anchor: "50%", + gap: 0, + moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap, + useOffset: false, + isEqualSize: false, + isConstantSize: false, + renderOnlyVisible: false, + renderExternal: false, + resizeOnContentsReady: false, + iOSEdgeSwipeThreshold: 30, + collectStatistics: true + }; + var DEFAULT_VIEWPORT_CSS = { + position: "relative", + zIndex: DEFAULT_OPTIONS.zIndex, + overflow: "hidden" + }; + var DEFAULT_CAMERA_CSS = { + width: "100%", + height: "100%", + willChange: "transform" + }; + var DEFAULT_PANEL_CSS = { + position: "absolute" + }; + var EVENTS = { + HOLD_START: "holdStart", + HOLD_END: "holdEnd", + MOVE_START: "moveStart", + MOVE: "move", + MOVE_END: "moveEnd", + CHANGE: "change", + RESTORE: "restore", + SELECT: "select", + NEED_PANEL: "needPanel", + VISIBLE_CHANGE: "visibleChange", + CONTENT_ERROR: "contentError" + }; + var AXES_EVENTS = { + HOLD: "hold", + CHANGE: "change", + RELEASE: "release", + ANIMATION_END: "animationEnd", + FINISH: "finish" + }; + var STATE_TYPE = { + IDLE: 0, + HOLDING: 1, + DRAGGING: 2, + ANIMATING: 3, + DISABLED: 4 + }; + var DIRECTION = { + PREV: "PREV", + NEXT: "NEXT" + }; + var FLICKING_METHODS = { + prev: true, + next: true, + moveTo: true, + getIndex: true, + getAllPanels: true, + getCurrentPanel: true, + getElement: true, + getSize: true, + getPanel: true, + getPanelCount: true, + getStatus: true, + getVisiblePanels: true, + enableInput: true, + disableInput: true, + destroy: true, + resize: true, + setStatus: true, + isPlaying: true + }; // Check whether browser supports transform: translate3d + // https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + + var checkTranslateSupport = function () { + var transforms = { + webkitTransform: "-webkit-transform", + msTransform: "-ms-transform", + MozTransform: "-moz-transform", + OTransform: "-o-transform", + transform: "transform" + }; + + if (!isBrowser) { + return { + name: transforms.transform, + has3d: true + }; + } + + var supportedStyle = document.documentElement.style; + var transformName = ""; + + for (var prefixedTransform in transforms) { + if (prefixedTransform in supportedStyle) { + transformName = prefixedTransform; + } + } + + if (!transformName) { + throw new Error("Browser doesn't support CSS3 2D Transforms."); + } + + var el = document.createElement("div"); + document.documentElement.insertBefore(el, null); + el.style[transformName] = "translate3d(1px, 1px, 1px)"; + var styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]); + el.parentElement.removeChild(el); + var transformInfo = { + name: transformName, + has3d: styleVal.length > 0 && styleVal !== "none" + }; + + checkTranslateSupport = function () { + return transformInfo; + }; + + return transformInfo; + }; + var TRANSFORM = checkTranslateSupport(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + function merge(target) { + var srcs = []; + + for (var _i = 1; _i < arguments.length; _i++) { + srcs[_i - 1] = arguments[_i]; + } + + srcs.forEach(function (source) { + Object.keys(source).forEach(function (key) { + var value = source[key]; + target[key] = value; + }); + }); + return target; + } + function parseElement(element) { + if (!Array.isArray(element)) { + element = [element]; + } + + var elements = []; + element.forEach(function (el) { + if (isString(el)) { + var tempDiv = document.createElement("div"); + tempDiv.innerHTML = el; + elements.push.apply(elements, toArray(tempDiv.children)); + + while (tempDiv.firstChild) { + tempDiv.removeChild(tempDiv.firstChild); + } + } else { + elements.push(el); + } + }); + return elements; + } + function isString(value) { + return typeof value === "string"; + } // Get class list of element as string array + + function addClass(element, className) { + if (element.classList) { + element.classList.add(className); + } else { + if (!hasClass(element, className)) { + element.className = (element.className + " " + className).replace(/\s{2,}/g, " "); + } + } + } + function hasClass(element, className) { + if (element.classList) { + return element.classList.contains(className); + } else { + return element.className.split(" ").indexOf(className) >= 0; + } + } + function applyCSS(element, cssObj) { + Object.keys(cssObj).forEach(function (property) { + element.style[property] = cssObj[property]; + }); + } + function clamp(val, min, max) { + return Math.max(Math.min(val, max), min); + } // Min: inclusive, Max: exclusive + + function isBetween(val, min, max) { + return val >= min && val <= max; + } + function toArray(iterable) { + return [].slice.call(iterable); + } + function isArray(arr) { + return arr && arr.constructor === Array; + } + function parseArithmeticExpression(cssValue, base, defaultVal) { + // Set base / 2 to default value, if it's undefined + var defaultValue = defaultVal != null ? defaultVal : base / 2; + var cssRegex = /(?:(\+|\-)\s*)?(\d+(?:\.\d+)?(%|px)?)/g; + + if (typeof cssValue === "number") { + return clamp(cssValue, 0, base); + } + + var idx = 0; + var calculatedValue = 0; + var matchResult = cssRegex.exec(cssValue); + + while (matchResult != null) { + var sign = matchResult[1]; + var value = matchResult[2]; + var unit = matchResult[3]; + var parsedValue = parseFloat(value); + + if (idx <= 0) { + sign = sign || "+"; + } // Return default value for values not in good form + + + if (!sign) { + return defaultValue; + } + + if (unit === "%") { + parsedValue = parsedValue / 100 * base; + } + + calculatedValue += sign === "+" ? parsedValue : -parsedValue; // Match next occurrence + + ++idx; + matchResult = cssRegex.exec(cssValue); + } // None-matched + + + if (idx === 0) { + return defaultValue; + } // Clamp between 0 ~ base + + + return clamp(calculatedValue, 0, base); + } + function getProgress(pos, range) { + // start, anchor, end + // -1 , 0 , 1 + var min = range[0], + center = range[1], + max = range[2]; + + if (pos > center && max - center) { + // 0 ~ 1 + return (pos - center) / (max - center); + } else if (pos < center && center - min) { + // -1 ~ 0 + return (pos - center) / (center - min); + } else if (pos !== center && max - min) { + return (pos - min) / (max - min); + } + + return 0; + } + function findIndex(iterable, callback) { + for (var i = 0; i < iterable.length; i += 1) { + var element = iterable[i]; + + if (element && callback(element)) { + return i; + } + } + + return -1; + } // return [0, 1, ...., max - 1] + + function counter(max) { + var counterArray = []; + + for (var i = 0; i < max; i += 1) { + counterArray[i] = i; + } + + return counterArray; + } // Circulate number between range [min, max] + + /* + * "indexed" means min and max is not same, so if it's true "min - 1" should be max + * While if it's false, "min - 1" should be "max - 1" + * use `indexed: true` when it should be used for circulating integers like index + * or `indexed: false` when it should be used for something like positions. + */ + + function circulate(value, min, max, indexed) { + var size = indexed ? max - min + 1 : max - min; + + if (value < min) { + var offset = indexed ? (min - value - 1) % size : (min - value) % size; + value = max - offset; + } else if (value > max) { + var offset = indexed ? (value - max - 1) % size : (value - max) % size; + value = min + offset; + } + + return value; + } + function restoreStyle(element, originalStyle) { + originalStyle.className ? element.setAttribute("class", originalStyle.className) : element.removeAttribute("class"); + originalStyle.style ? element.setAttribute("style", originalStyle.style) : element.removeAttribute("style"); + } + /** + * Decorator that makes the method of flicking available in the framework. + * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터. + * @memberof eg.Flicking + * @private + * @example + * ```js + * import Flicking, { withFlickingMethods } from "@egjs/flicking"; + * + * class Flicking extends React.Component> { + * @withFlickingMethods + * private flicking: Flicking; + * } + * ``` + */ + + function withFlickingMethods(prototype, flickingName) { + Object.keys(FLICKING_METHODS).forEach(function (name) { + if (prototype[name]) { + return; + } + + prototype[name] = function () { + var _a; + + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var result = (_a = this[flickingName])[name].apply(_a, args); // fix `this` type to return your own `flicking` instance to the instance using the decorator. + + + if (result === this[flickingName]) { + return this; + } else { + return result; + } + }; + }); + } + function getBbox(element, useOffset) { + var bbox; + + if (useOffset) { + bbox = { + x: 0, + y: 0, + width: element.offsetWidth, + height: element.offsetHeight + }; + } else { + var clientRect = element.getBoundingClientRect(); + bbox = { + x: clientRect.left, + y: clientRect.top, + width: clientRect.width, + height: clientRect.height + }; + } + + return bbox; + } + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var Panel = + /*#__PURE__*/ + function () { + function Panel(element, index, viewport) { + this.viewport = viewport; + this.prevSibling = null; + this.nextSibling = null; + this.clonedPanels = []; + this.state = { + index: index, + position: 0, + relativeAnchorPosition: 0, + size: 0, + isClone: false, + isVirtual: false, + cloneIndex: -1, + originalStyle: { + className: "", + style: "" + }, + cachedBbox: null + }; + this.setElement(element); + } + + var __proto = Panel.prototype; + + __proto.resize = function (givenBbox) { + var state = this.state; + var options = this.viewport.options; + var bbox = givenBbox ? givenBbox : this.getBbox(); + this.state.cachedBbox = bbox; + var prevSize = state.size; + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size); + } + + if (!state.isClone) { + this.clonedPanels.forEach(function (panel) { + var cloneState = panel.state; + cloneState.size = state.size; + cloneState.cachedBbox = state.cachedBbox; + cloneState.relativeAnchorPosition = state.relativeAnchorPosition; + }); + } + }; + + __proto.unCacheBbox = function () { + this.state.cachedBbox = null; + }; + + __proto.getProgress = function () { + var viewport = this.viewport; + var options = viewport.options; + var panelCount = viewport.panelManager.getPanelCount(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex(); + var progress = relativeIndex - viewport.getCurrentProgress(); + return progress; + }; + + __proto.getOutsetProgress = function () { + var viewport = this.viewport; + var outsetRange = [-this.getSize(), viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(), viewport.getSize()]; + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var outsetProgress = getProgress(relativePanelPosition, outsetRange); + return outsetProgress; + }; + + __proto.getVisibleRatio = function () { + var viewport = this.viewport; + var panelSize = this.getSize(); + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var rightRelativePanelPosition = relativePanelPosition + panelSize; + var visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0); + var visibleRatio = visibleSize >= 0 ? visibleSize / panelSize : 0; + return visibleRatio; + }; + + __proto.focus = function (duration) { + var viewport = this.viewport; + var currentPanel = viewport.getCurrentPanel(); + var hangerPosition = viewport.getHangerPosition(); + var anchorPosition = this.getAnchorPosition(); + + if (hangerPosition === anchorPosition || !currentPanel) { + return; + } + + var currentPosition = currentPanel.getPosition(); + var eventType = currentPosition === this.getPosition() ? "" : EVENTS.CHANGE; + viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration); + }; + + __proto.update = function (updateFunction, shouldResize) { + if (updateFunction === void 0) { + updateFunction = null; + } + + if (shouldResize === void 0) { + shouldResize = true; + } + + var identicalPanels = this.getIdenticalPanels(); + + if (updateFunction) { + identicalPanels.forEach(function (eachPanel) { + updateFunction(eachPanel.getElement()); + }); + } + + if (shouldResize) { + identicalPanels.forEach(function (eachPanel) { + eachPanel.unCacheBbox(); + }); + this.viewport.addVisiblePanel(this); + this.viewport.resize(); + } + }; + + __proto.prev = function () { + var viewport = this.viewport; + var options = viewport.options; + var prevSibling = this.prevSibling; + + if (!prevSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var prevPanelIndex = prevSibling.getIndex(); + var prevPanelPosition = prevSibling.getPosition(); + var prevPanelSize = prevSibling.getSize(); + var hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1; + var notYetMinPanel = options.infinite && currentIndex > 0 && prevPanelIndex > currentIndex; + + if (hasEmptyPanelBetween || notYetMinPanel) { + // Empty panel exists between + return null; + } + + var newPosition = currentPosition - prevPanelSize - options.gap; + var prevPanel = prevSibling; + + if (prevPanelPosition !== newPosition) { + prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true); + prevPanel.setPosition(newPosition); + } + + return prevPanel; + }; + + __proto.next = function () { + var viewport = this.viewport; + var options = viewport.options; + var nextSibling = this.nextSibling; + var lastIndex = viewport.panelManager.getLastIndex(); + + if (!nextSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var nextPanelIndex = nextSibling.getIndex(); + var nextPanelPosition = nextSibling.getPosition(); + var hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1; + var notYetMaxPanel = options.infinite && currentIndex < lastIndex && nextPanelIndex < currentIndex; + + if (hasEmptyPanelBetween || notYetMaxPanel) { + return null; + } + + var newPosition = currentPosition + this.getSize() + options.gap; + var nextPanel = nextSibling; + + if (nextPanelPosition !== newPosition) { + nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true); + nextPanel.setPosition(newPosition); + } + + return nextPanel; + }; + + __proto.insertBefore = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var firstPanel = viewport.panelManager.firstPanel(); + var prevSibling = this.prevSibling; // Finding correct inserting index + // While it should insert removing empty spaces, + // It also should have to be bigger than prevSibling' s index + + var targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex() ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length) : Math.max(this.getIndex() - parsedElements.length, 0); + return viewport.insert(targetIndex, parsedElements); + }; + + __proto.insertAfter = function (element) { + return this.viewport.insert(this.getIndex() + 1, element); + }; + + __proto.remove = function () { + this.viewport.remove(this.getIndex()); + return this; + }; + + __proto.destroy = function (option) { + if (!option.preserveUI) { + var originalStyle = this.state.originalStyle; + restoreStyle(this.element, originalStyle); + } // release resources + + + for (var x in this) { + this[x] = null; + } + }; + + __proto.getElement = function () { + return this.element; + }; + + __proto.getAnchorPosition = function () { + return this.state.position + this.state.relativeAnchorPosition; + }; + + __proto.getRelativeAnchorPosition = function () { + return this.state.relativeAnchorPosition; + }; + + __proto.getIndex = function () { + return this.state.index; + }; + + __proto.getPosition = function () { + return this.state.position; + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getBbox = function () { + var state = this.state; + var viewport = this.viewport; + var element = this.element; + var options = viewport.options; + + if (!element) { + state.cachedBbox = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } else if (!state.cachedBbox) { + var wasVisible = Boolean(element.parentNode); + var cameraElement = viewport.getCameraElement(); + + if (!wasVisible) { + cameraElement.appendChild(element); + viewport.addVisiblePanel(this); + } + + state.cachedBbox = getBbox(element, options.useOffset); + + if (!wasVisible && viewport.options.renderExternal) { + cameraElement.removeChild(element); + } + } + + return state.cachedBbox; + }; + + __proto.isClone = function () { + return this.state.isClone; + }; + + __proto.getOverlappedClass = function (classes) { + var element = this.element; + + for (var _i = 0, classes_1 = classes; _i < classes_1.length; _i++) { + var className = classes_1[_i]; + + if (hasClass(element, className)) { + return className; + } + } + }; + + __proto.getCloneIndex = function () { + return this.state.cloneIndex; + }; + + __proto.getClonedPanels = function () { + var state = this.state; + return state.isClone ? this.original.getClonedPanels() : this.clonedPanels; + }; + + __proto.getIdenticalPanels = function () { + var state = this.state; + return state.isClone ? this.original.getIdenticalPanels() : __spreadArrays([this], this.clonedPanels); + }; + + __proto.getOriginalPanel = function () { + return this.state.isClone ? this.original : this; + }; + + __proto.setIndex = function (index) { + var state = this.state; + state.index = index; + this.clonedPanels.forEach(function (panel) { + return panel.state.index = index; + }); + }; + + __proto.setPosition = function (pos) { + this.state.position = pos; + return this; + }; + + __proto.setPositionCSS = function (offset) { + if (offset === void 0) { + offset = 0; + } + + if (!this.element) { + return; + } + + var state = this.state; + var pos = state.position; + var options = this.viewport.options; + var elementStyle = this.element.style; + var currentElementStyle = options.horizontal ? elementStyle.left : elementStyle.top; + var styleToApply = pos - offset + "px"; + + if (!state.isVirtual && currentElementStyle !== styleToApply) { + options.horizontal ? elementStyle.left = styleToApply : elementStyle.top = styleToApply; + } + }; + + __proto.clone = function (cloneIndex, isVirtual, element) { + if (isVirtual === void 0) { + isVirtual = false; + } + + var state = this.state; + var viewport = this.viewport; + var cloneElement = element; + + if (!cloneElement && this.element) { + cloneElement = isVirtual ? this.element : this.element.cloneNode(true); + } + + var clonedPanel = new Panel(cloneElement, state.index, viewport); + var clonedState = clonedPanel.state; + clonedPanel.original = state.isClone ? this.original : this; + clonedState.isClone = true; + clonedState.isVirtual = isVirtual; + clonedState.cloneIndex = cloneIndex; // Inherit some state values + + clonedState.size = state.size; + clonedState.relativeAnchorPosition = state.relativeAnchorPosition; + clonedState.originalStyle = state.originalStyle; + clonedState.cachedBbox = state.cachedBbox; + + if (!isVirtual) { + this.clonedPanels.push(clonedPanel); + } else { + clonedPanel.prevSibling = this.prevSibling; + clonedPanel.nextSibling = this.nextSibling; + } + + return clonedPanel; + }; + + __proto.removeElement = function () { + if (!this.viewport.options.renderExternal) { + var element = this.element; + element.parentNode && element.parentNode.removeChild(element); + } // Do the same thing for clones + + + if (!this.state.isClone) { + this.removeClonedPanelsAfter(0); + } + }; + + __proto.removeClonedPanelsAfter = function (start) { + var options = this.viewport.options; + var removingPanels = this.clonedPanels.splice(start); + + if (!options.renderExternal) { + removingPanels.forEach(function (panel) { + panel.removeElement(); + }); + } + }; + + __proto.setElement = function (element) { + if (!element) { + return; + } + + var currentElement = this.element; + + if (element !== currentElement) { + var options = this.viewport.options; + + if (currentElement) { + if (options.horizontal) { + element.style.left = currentElement.style.left; + } else { + element.style.top = currentElement.style.top; + } + } else { + var originalStyle = this.state.originalStyle; + originalStyle.className = element.getAttribute("class"); + originalStyle.style = element.getAttribute("style"); + } + + this.element = element; + + if (options.classPrefix) { + addClass(element, options.classPrefix + "-panel"); + } // Update size info after applying panel css + + + applyCSS(this.element, DEFAULT_PANEL_CSS); + } + }; + + return Panel; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var PanelManager = + /*#__PURE__*/ + function () { + function PanelManager(cameraElement, options) { + this.cameraElement = cameraElement; + this.panels = []; + this.clones = []; + this.range = { + min: -1, + max: -1 + }; + this.length = 0; + this.cloneCount = 0; + this.options = options; + this.lastIndex = options.lastIndex; + } + + var __proto = PanelManager.prototype; + + __proto.firstPanel = function () { + return this.panels[this.range.min]; + }; + + __proto.lastPanel = function () { + return this.panels[this.range.max]; + }; + + __proto.allPanels = function () { + return __spreadArrays(this.panels, this.clones.reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, [])); + }; + + __proto.originalPanels = function () { + return this.panels; + }; + + __proto.clonedPanels = function () { + return this.clones; + }; + + __proto.replacePanels = function (newPanels, newClones) { + this.panels = newPanels; + this.clones = newClones; + this.range = { + min: findIndex(newPanels, function (panel) { + return Boolean(panel); + }), + max: newPanels.length - 1 + }; + this.length = newPanels.filter(function (panel) { + return Boolean(panel); + }).length; + }; + + __proto.has = function (index) { + return !!this.panels[index]; + }; + + __proto.get = function (index) { + return this.panels[index]; + }; + + __proto.getPanelCount = function () { + return this.length; + }; + + __proto.getLastIndex = function () { + return this.lastIndex; + }; + + __proto.getRange = function () { + return this.range; + }; + + __proto.getCloneCount = function () { + return this.cloneCount; + }; + + __proto.setLastIndex = function (lastIndex) { + this.lastIndex = lastIndex; + var firstPanel = this.firstPanel(); + var lastPanel = this.lastPanel(); + + if (!firstPanel || !lastPanel) { + return; // no meaning of updating range & length + } // Remove panels above new last index + + + var range = this.range; + + if (lastPanel.getIndex() > lastIndex) { + var removingPanels = this.panels.splice(lastIndex + 1); + this.length -= removingPanels.length; + var firstRemovedPanel = removingPanels.filter(function (panel) { + return !!panel; + })[0]; + var possibleLastPanel = firstRemovedPanel.prevSibling; + + if (possibleLastPanel) { + range.max = possibleLastPanel.getIndex(); + } else { + range.min = -1; + range.max = -1; + } + + if (this.shouldRender()) { + removingPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + }; + + __proto.setCloneCount = function (cloneCount) { + this.cloneCount = cloneCount; + }; // Insert at index + // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it + + + __proto.insert = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var isCircular = this.options.circular; + var lastIndex = this.lastIndex; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + var pushedIndex = newPanels.length; // Like when setting index 50 while visible panels are 0, 1, 2 + + if (index > range.max) { + newPanels.forEach(function (panel, offset) { + panels[index + offset] = panel; + }); + } else { + var panelsAfterIndex = panels.slice(index, index + newPanels.length); // Find empty from beginning + + var emptyPanelCount = findIndex(panelsAfterIndex, function (panel) { + return !!panel; + }); + + if (emptyPanelCount < 0) { + // All empty + emptyPanelCount = panelsAfterIndex.length; + } + + pushedIndex = newPanels.length - emptyPanelCount; // Insert removing empty panels + + panels.splice.apply(panels, __spreadArrays([index, emptyPanelCount], newPanels)); // Remove panels after last index + + if (panels.length > lastIndex + 1) { + var removedPanels = panels.splice(lastIndex + 1).filter(function (panel) { + return Boolean(panel); + }); + this.length -= removedPanels.length; // Find first + + var newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), function (panel) { + return !!panel; + }); // Can be filled with empty after newLastIndex + + this.panels.splice(newLastIndex + 1); + this.range.max = newLastIndex; + + if (this.shouldRender()) { + removedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + } // Update index of previous panels + + + if (pushedIndex > 0) { + panels.slice(index + newPanels.length).forEach(function (panel) { + panel.setIndex(panel.getIndex() + pushedIndex); + }); + } // Update state + + + this.length += newPanels.length; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling); + var clones = this.clones; + var panelCount_1 = this.panels.length; + + if (clones[0] && clones[0].length > lastIndex + 1) { + clones.forEach(function (cloneSet) { + cloneSet.splice(panelCount_1); + }); + } + } + + return pushedIndex; + }; + + __proto.replace = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var options = this.options; + var isCircular = options.circular; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index + newPanels.length); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + + if (index > range.max) { + // Temporarily insert null at index to use splice() + panels[index] = null; + } + + var replacedPanels = panels.splice.apply(panels, __spreadArrays([index, newPanels.length], newPanels)); + var wasNonEmptyCount = replacedPanels.filter(function (panel) { + return Boolean(panel); + }).length; // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1] + // So length should be increased by 3(inserting panels) - 1(non-empty panels) + + this.length += newPanels.length - wasNonEmptyCount; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length, nextSibling); + } + + if (this.shouldRender()) { + replacedPanels.forEach(function (panel) { + return panel && panel.removeElement(); + }); + } + + return replacedPanels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var isCircular = this.options.circular; + var panels = this.panels; + var clones = this.clones; // Delete count should be equal or larger than 0 + + deleteCount = Math.max(deleteCount, 0); + var deletedPanels = panels.splice(index, deleteCount).filter(function (panel) { + return !!panel; + }); + + if (this.shouldRender()) { + deletedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(index, deleteCount); + }); + } // Update indexes + + + panels.slice(index).forEach(function (panel) { + panel.setIndex(panel.getIndex() - deleteCount); + }); // Check last panel is empty + + var lastIndex = panels.length - 1; + + if (!panels[lastIndex]) { + var reversedPanels = panels.concat().reverse(); + var nonEmptyIndexFromLast = findIndex(reversedPanels, function (panel) { + return !!panel; + }); + lastIndex = nonEmptyIndexFromLast < 0 ? -1 // All empty + : lastIndex - nonEmptyIndexFromLast; // Remove all empty panels from last + + panels.splice(lastIndex + 1); + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(lastIndex + 1); + }); + } + } // Update range & length + + + this.range = { + min: findIndex(panels, function (panel) { + return !!panel; + }), + max: lastIndex + }; + this.length -= deletedPanels.length; + + if (this.length <= 0) { + // Reset clones + this.clones = []; + this.cloneCount = 0; + } + + return deletedPanels; + }; + + __proto.chainAllPanels = function () { + var allPanels = this.allPanels().filter(function (panel) { + return !!panel; + }); + var allPanelsCount = allPanels.length; + + if (allPanelsCount <= 1) { + return; + } + + allPanels.slice(1, allPanels.length - 1).forEach(function (panel, idx) { + var prevPanel = allPanels[idx]; + var nextPanel = allPanels[idx + 2]; + panel.prevSibling = prevPanel; + panel.nextSibling = nextPanel; + }); + var firstPanel = allPanels[0]; + var lastPanel = allPanels[allPanelsCount - 1]; + firstPanel.prevSibling = null; + firstPanel.nextSibling = allPanels[1]; + lastPanel.prevSibling = allPanels[allPanelsCount - 2]; + lastPanel.nextSibling = null; + + if (this.options.circular) { + firstPanel.prevSibling = lastPanel; + lastPanel.nextSibling = firstPanel; + } + }; + + __proto.insertClones = function (cloneIndex, index, clonedPanels, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 0; + } + + var clones = this.clones; + var lastIndex = this.lastIndex; + + if (!clones[cloneIndex]) { + var newClones_1 = []; + clonedPanels.forEach(function (panel, offset) { + newClones_1[index + offset] = panel; + }); + clones[cloneIndex] = newClones_1; + } else { + var insertTarget_1 = clones[cloneIndex]; + + if (index >= insertTarget_1.length) { + clonedPanels.forEach(function (panel, offset) { + insertTarget_1[index + offset] = panel; + }); + } else { + insertTarget_1.splice.apply(insertTarget_1, __spreadArrays([index, deleteCount], clonedPanels)); // Remove panels after last index + + if (clonedPanels.length > lastIndex + 1) { + clonedPanels.splice(lastIndex + 1); + } + } + } + }; // clones are operating in set + + + __proto.removeClonesAfter = function (cloneIndex) { + var panels = this.panels; + panels.forEach(function (panel) { + panel.removeClonedPanelsAfter(cloneIndex); + }); + this.clones.splice(cloneIndex); + }; + + __proto.findPanelOf = function (element) { + var allPanels = this.allPanels(); + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var panelElement = panel.getElement(); + + if (panelElement.contains(element)) { + return panel; + } + } + }; + + __proto.findFirstPanelFrom = function (index) { + for (var _i = 0, _a = this.panels.slice(index); _i < _a.length; _i++) { + var panel = _a[_i]; + + if (panel && panel.getIndex() >= index && panel.getElement().parentNode) { + return panel; + } + } + }; + + __proto.addNewClones = function (index, originalPanels, deleteCount, nextSibling) { + var _this = this; + + var cameraElement = this.cameraElement; + var cloneCount = this.getCloneCount(); + var lastPanel = this.lastPanel(); + var lastPanelClones = lastPanel ? lastPanel.getClonedPanels() : []; + var nextSiblingClones = nextSibling ? nextSibling.getClonedPanels() : []; + + var _loop_1 = function (cloneIndex) { + var cloneNextSibling = nextSiblingClones[cloneIndex]; + var lastPanelSibling = lastPanelClones[cloneIndex]; + var cloneSiblingElement = cloneNextSibling ? cloneNextSibling.getElement() : lastPanelSibling ? lastPanelSibling.getElement().nextElementSibling : null; + var newClones = originalPanels.map(function (panel) { + var clone = panel.clone(cloneIndex); + + if (_this.shouldRender()) { + cameraElement.insertBefore(clone.getElement(), cloneSiblingElement); + } + + return clone; + }); + this_1.insertClones(cloneIndex, index, newClones, deleteCount); + }; + + var this_1 = this; + + for (var _i = 0, _a = counter(cloneCount); _i < _a.length; _i++) { + var cloneIndex = _a[_i]; + + _loop_1(cloneIndex); + } + }; + + __proto.updateIndex = function (insertingIndex) { + var panels = this.panels; + var range = this.range; + var newLastIndex = panels.length - 1; + + if (newLastIndex > range.max) { + range.max = newLastIndex; + } + + if (insertingIndex < range.min || range.min < 0) { + range.min = insertingIndex; + } + }; + + __proto.insertNewPanels = function (newPanels, siblingElement) { + if (this.shouldRender()) { + var fragment_1 = document.createDocumentFragment(); + newPanels.forEach(function (panel) { + return fragment_1.appendChild(panel.getElement()); + }); + this.cameraElement.insertBefore(fragment_1, siblingElement); + } + }; + + __proto.shouldRender = function () { + var options = this.options; + return !options.renderExternal && !options.renderOnlyVisible; + }; + + return PanelManager; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + var State = + /*#__PURE__*/ + function () { + function State() { + this.delta = 0; + this.direction = null; + this.targetPanel = null; + this.lastPosition = 0; + } + + var __proto = State.prototype; + + __proto.onEnter = function (prevState) { + this.delta = prevState.delta; + this.direction = prevState.direction; + this.targetPanel = prevState.targetPanel; + this.lastPosition = prevState.lastPosition; + }; + + __proto.onExit = function (nextState) {// DO NOTHING + }; + + __proto.onHold = function (e, context) {// DO NOTHING + }; + + __proto.onChange = function (e, context) {// DO NOTHING + }; + + __proto.onRelease = function (e, context) {// DO NOTHING + }; + + __proto.onAnimationEnd = function (e, context) {// DO NOTHING + }; + + __proto.onFinish = function (e, context) {// DO NOTHING + }; + + return State; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var IdleState = + /*#__PURE__*/ + function (_super) { + __extends(IdleState, _super); + + function IdleState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.IDLE; + _this.holding = false; + _this.playing = false; + return _this; + } + + var __proto = IdleState.prototype; + + __proto.onEnter = function () { + this.direction = null; + this.targetPanel = null; + this.delta = 0; + this.lastPosition = 0; + }; + + __proto.onHold = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Shouldn't do any action until any panels on flicking area + + if (flicking.getPanelCount() <= 0) { + if (viewport.options.infinite) { + viewport.moveCamera(viewport.getCameraPosition(), e); + } + + transitTo(STATE_TYPE.DISABLED); + return; + } + + this.lastPosition = viewport.getCameraPosition(); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.HOLDING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; // By methods call + + + __proto.onChange = function (e, context) { + var triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.MOVE_START, e, false).onSuccess(function () { + // Trigger AnimatingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.ANIMATING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + return IdleState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var HoldingState = + /*#__PURE__*/ + function (_super) { + __extends(HoldingState, _super); + + function HoldingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.HOLDING; + _this.holding = true; + _this.playing = true; + _this.releaseEvent = null; + return _this; + } + + var __proto = HoldingState.prototype; + + __proto.onChange = function (e, context) { + var flicking = context.flicking, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + var offset = flicking.options.horizontal ? e.inputEvent.offsetX : e.inputEvent.offsetY; + this.direction = offset < 0 ? DIRECTION.NEXT : DIRECTION.PREV; + triggerEvent(EVENTS.MOVE_START, e, true).onSuccess(function () { + // Trigger DraggingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.DRAGGING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.HOLD_END, e, true); + + if (e.delta.flick !== 0) { + // Sometimes "release" event on axes triggered before "change" event + // Especially if user flicked panel fast in really short amount of time + // if delta is not zero, that means above case happened. + // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END + // At least one move event should be included between holdStart and holdEnd + e.setTo({ + flick: viewport.getCameraPosition() + }, 0); + transitTo(STATE_TYPE.IDLE); + return; + } // Can't handle select event here, + // As "finish" axes event happens + + + this.releaseEvent = e; + }; + + __proto.onFinish = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Should transite to IDLE state before select event + // As user expects hold is already finished + + transitTo(STATE_TYPE.IDLE); + + if (!this.releaseEvent) { + return; + } // Handle release event here + // To prevent finish event called twice + + + var releaseEvent = this.releaseEvent; // Static click + + var srcEvent = releaseEvent.inputEvent.srcEvent; + var clickedElement; + + if (srcEvent.type === "touchend") { + var touchEvent = srcEvent; + var touch = touchEvent.changedTouches[0]; + clickedElement = document.elementFromPoint(touch.clientX, touch.clientY); + } else { + clickedElement = srcEvent.target; + } + + var clickedPanel = viewport.panelManager.findPanelOf(clickedElement); + var cameraPosition = viewport.getCameraPosition(); + + if (clickedPanel) { + var clickedPanelPosition = clickedPanel.getPosition(); + var direction = clickedPanelPosition > cameraPosition ? DIRECTION.NEXT : clickedPanelPosition < cameraPosition ? DIRECTION.PREV : null; // Don't provide axes event, to use axes instance instead + + triggerEvent(EVENTS.SELECT, null, true, { + direction: direction, + index: clickedPanel.getIndex(), + panel: clickedPanel + }); + } + }; + + return HoldingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var DraggingState = + /*#__PURE__*/ + function (_super) { + __extends(DraggingState, _super); + + function DraggingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DRAGGING; + _this.holding = true; + _this.playing = true; + return _this; + } + + var __proto = DraggingState.prototype; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var flicking = context.flicking, + viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo, + stopCamera = context.stopCamera; + var delta = this.delta; + var absDelta = Math.abs(delta); + var options = flicking.options; + var horizontal = options.horizontal; + var moveType = viewport.moveType; + var inputEvent = e.inputEvent; + var velocity = horizontal ? inputEvent.velocityX : inputEvent.velocityY; + var inputDelta = horizontal ? inputEvent.deltaX : inputEvent.deltaY; + var isNextDirection = Math.abs(velocity) > 1 ? velocity < 0 : absDelta > 0 ? delta > 0 : inputDelta < 0; + var swipeDistance = viewport.options.bound ? Math.max(absDelta, Math.abs(inputDelta)) : absDelta; + var swipeAngle = inputEvent.deltaX ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI) : 90; + var belowAngleThreshold = horizontal ? swipeAngle <= options.thresholdAngle : swipeAngle > options.thresholdAngle; + var overThreshold = swipeDistance >= options.threshold && belowAngleThreshold; + var moveTypeContext = { + viewport: viewport, + axesEvent: e, + state: this, + swipeDistance: swipeDistance, + isNextDirection: isNextDirection + }; // Update last position to cope with Axes's animating behavior + // Axes uses start position when animation start + + triggerEvent(EVENTS.HOLD_END, e, true); + var targetPanel = this.targetPanel; + + if (!overThreshold && targetPanel) { + // Interrupted while animating + var interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext); + viewport.moveTo(interruptDestInfo.panel, interruptDestInfo.destPos, interruptDestInfo.eventType, e, interruptDestInfo.duration); + transitTo(STATE_TYPE.ANIMATING); + return; + } + + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + + if (!currentPanel || !nearestPanel) { + // There're no panels + e.stop(); + transitTo(STATE_TYPE.IDLE); + return; + } + + var destInfo = overThreshold ? moveType.findTargetPanel(moveTypeContext) : moveType.findRestorePanel(moveTypeContext); + viewport.moveTo(destInfo.panel, destInfo.destPos, destInfo.eventType, e, destInfo.duration).onSuccess(function () { + transitTo(STATE_TYPE.ANIMATING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + stopCamera(e); + }); + }; + + return DraggingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var AnimatingState = + /*#__PURE__*/ + function (_super) { + __extends(AnimatingState, _super); + + function AnimatingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.ANIMATING; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = AnimatingState.prototype; + + __proto.onHold = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var options = viewport.options; + var scrollArea = viewport.getScrollArea(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize); + var targetPanel = this.targetPanel; + + if (options.circular && loopCount !== 0 && targetPanel) { + var cloneCount = viewport.panelManager.getCloneCount(); + var originalTargetPosition = targetPanel.getPosition(); // cloneIndex is from -1 to cloneCount - 1 + + var newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true); + var newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize; + var newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true); // Set new target panel considering looped count + + newTargetPanel.setPosition(newTargetPosition); + this.targetPanel = newTargetPanel; + } // Reset last position and delta + + + this.delta = 0; + this.lastPosition = viewport.getCameraPosition(); // Update current panel as current nearest panel + + viewport.setCurrentPanel(viewport.getNearestPanel()); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.DRAGGING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onFinish = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var isTrusted = e && e.isTrusted; + viewport.options.bound ? viewport.setCurrentPanel(this.targetPanel) : viewport.setCurrentPanel(viewport.getNearestPanel()); + + if (flicking.options.adaptive) { + viewport.updateAdaptiveSize(); + } + + transitTo(STATE_TYPE.IDLE); + viewport.updateCameraPosition(); + triggerEvent(EVENTS.MOVE_END, e, isTrusted, { + direction: this.direction + }); + }; + + return AnimatingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var DisabledState = + /*#__PURE__*/ + function (_super) { + __extends(DisabledState, _super); + + function DisabledState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DISABLED; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = DisabledState.prototype; + + __proto.onAnimationEnd = function (e, _a) { + var transitTo = _a.transitTo; + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onChange = function (e, _a) { + var viewport = _a.viewport, + transitTo = _a.transitTo; // Can stop Axes's change event + + e.stop(); // Should update axes position as it's already changed at this moment + + viewport.updateAxesPosition(viewport.getCameraPosition()); + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onRelease = function (e, _a) { + var transitTo = _a.transitTo; // This is needed when stopped hold start event + + if (e.delta.flick === 0) { + transitTo(STATE_TYPE.IDLE); + } + }; + + return DisabledState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var StateMachine = + /*#__PURE__*/ + function () { + function StateMachine() { + var _this = this; + + this.state = new IdleState(); + + this.transitTo = function (nextStateType) { + var currentState = _this.state; + + if (currentState.type !== nextStateType) { + var nextState = void 0; + + switch (nextStateType) { + case STATE_TYPE.IDLE: + nextState = new IdleState(); + break; + + case STATE_TYPE.HOLDING: + nextState = new HoldingState(); + break; + + case STATE_TYPE.DRAGGING: + nextState = new DraggingState(); + break; + + case STATE_TYPE.ANIMATING: + nextState = new AnimatingState(); + break; + + case STATE_TYPE.DISABLED: + nextState = new DisabledState(); + break; + } + + currentState.onExit(nextState); + nextState.onEnter(currentState); + _this.state = nextState; + } + + return _this.state; + }; + } + + var __proto = StateMachine.prototype; + + __proto.fire = function (eventType, e, context) { + var currentState = this.state; + + switch (eventType) { + case AXES_EVENTS.HOLD: + currentState.onHold(e, context); + break; + + case AXES_EVENTS.CHANGE: + currentState.onChange(e, context); + break; + + case AXES_EVENTS.RELEASE: + currentState.onRelease(e, context); + break; + + case AXES_EVENTS.ANIMATION_END: + currentState.onAnimationEnd(e, context); + break; + + case AXES_EVENTS.FINISH: + currentState.onFinish(e, context); + break; + } + }; + + __proto.getState = function () { + return this.state; + }; + + return StateMachine; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var MoveType = + /*#__PURE__*/ + function () { + function MoveType() {} + + var __proto = MoveType.prototype; + + __proto.is = function (type) { + return type === this.type; + }; + + __proto.findRestorePanel = function (ctx) { + var viewport = ctx.viewport; + var options = viewport.options; + var panel = options.circular ? this.findRestorePanelInCircularMode(ctx) : viewport.getCurrentPanel(); + return { + panel: panel, + destPos: viewport.findEstimatedPosition(panel), + duration: options.duration, + eventType: EVENTS.RESTORE + }; + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var state = ctx.state, + viewport = ctx.viewport; + var targetPanel = state.targetPanel; + return { + panel: targetPanel, + destPos: viewport.findEstimatedPosition(targetPanel), + duration: viewport.options.duration, + eventType: "" + }; + }; // Calculate minimum distance to "change" panel + + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var relativeAnchorPosition = currentPanel.getRelativeAnchorPosition(); // Minimum distance needed to decide prev/next panel as nearest + + /* + * | Prev | Next | + * |--------|--------------| + * [][ |<-Anchor ][] <- Panel + Half-Gap + */ + + var minimumDistanceToChange = isNextDirection ? currentPanel.getSize() - relativeAnchorPosition + halfGap : relativeAnchorPosition + halfGap; + minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold); + return minimumDistanceToChange; + }; + + __proto.findRestorePanelInCircularMode = function (ctx) { + var viewport = ctx.viewport; + var originalPanel = viewport.getCurrentPanel().getOriginalPanel(); + var hangerPosition = viewport.getHangerPosition(); + var firstClonedPanel = originalPanel.getIdenticalPanels()[1]; + var lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); + return !ctx.isNextDirection && lapped ? firstClonedPanel : originalPanel; + }; + + return MoveType; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var Snap = + /*#__PURE__*/ + function (_super) { + __extends(Snap, _super); + + function Snap(count) { + var _this = _super.call(this) || this; + + _this.type = MOVE_TYPE.SNAP; + _this.count = count; + return _this; + } + + var __proto = Snap.prototype; + + __proto.findTargetPanel = function (ctx) { + var viewport = ctx.viewport, + axesEvent = ctx.axesEvent, + swipeDistance = ctx.swipeDistance; + var snapCount = this.count; + var eventDelta = Math.abs(axesEvent.delta.flick); + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex(); // This can happen when bounce is 0 + + var shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent; + var shouldMoveToAdjacent = !viewport.isOutOfBound() && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0); + + if (snapCount > 1 && eventDelta > minimumDistanceToChange) { + return this.findSnappedPanel(ctx); + } else if (shouldMoveToAdjacent) { + return this.findAdjacentPanel(ctx); + } else { + return { + panel: nearestPanel, + duration: viewport.options.duration, + destPos: viewport.findEstimatedPosition(nearestPanel), + // As swipeDistance holds mouse/touch position change regardless of bounce option value + // swipDistance > minimumDistanceToChange can happen in bounce area + // Second condition is for handling that. + eventType: swipeDistance <= minimumDistanceToChange || viewport.isOutOfBound() && nearestIsCurrent ? EVENTS.RESTORE : EVENTS.CHANGE + }; + } + }; + + __proto.findSnappedPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + viewport = ctx.viewport, + state = ctx.state, + isNextDirection = ctx.isNextDirection; + var eventDelta = Math.abs(axesEvent.delta.flick); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var snapCount = this.count; + var options = viewport.options; + var scrollAreaSize = viewport.getScrollAreaSize(); + var halfGap = options.gap / 2; + var estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition(); + var panelToMove = viewport.getNearestPanel(); + var cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone) + + var passedPanelCount = 0; + + while (passedPanelCount < snapCount) { + // Since panelToMove holds also cloned panels, we should use original panel's position + var originalPanel = panelToMove.getOriginalPanel(); + var panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize; + var panelSize = originalPanel.getSize(); + var panelNextPosition = panelPosition + panelSize + halfGap; + var panelPrevPosition = panelPosition - halfGap; // Current panelToMove contains destPos + + if (isNextDirection && panelNextPosition > estimatedHangerPos || !isNextDirection && panelPrevPosition < estimatedHangerPos) { + break; + } + + var siblingPanel = isNextDirection ? panelToMove.nextSibling : panelToMove.prevSibling; + + if (!siblingPanel) { + break; + } + + var panelIndex = panelToMove.getIndex(); + var siblingIndex = siblingPanel.getIndex(); + + if (isNextDirection && siblingIndex <= panelIndex || !isNextDirection && siblingIndex >= panelIndex) { + cycleIndex = isNextDirection ? cycleIndex + 1 : cycleIndex - 1; + } + + panelToMove = siblingPanel; + passedPanelCount += 1; + } + + var originalPosition = panelToMove.getOriginalPanel().getPosition(); + + if (cycleIndex !== 0) { + panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true); + panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize); + } + + var defaultDuration = viewport.options.duration; + var duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount); + return { + panel: panelToMove, + destPos: viewport.findEstimatedPosition(panelToMove), + duration: duration, + eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange ? EVENTS.CHANGE : EVENTS.RESTORE + }; + }; + + __proto.findAdjacentPanel = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentIndex = viewport.getCurrentIndex(); + var currentPanel = viewport.panelManager.get(currentIndex); + var hangerPosition = viewport.getHangerPosition(); + var scrollArea = viewport.getScrollArea(); + var firstClonedPanel = currentPanel.getIdenticalPanels()[1]; + var lapped = options.circular && Math.abs(currentPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); // If lapped in circular mode, use first cloned panel as base panel + + var basePanel = lapped ? firstClonedPanel : currentPanel; + var basePosition = basePanel.getPosition(); + var adjacentPanel = isNextDirection ? basePanel.nextSibling : basePanel.prevSibling; + var eventType = adjacentPanel ? EVENTS.CHANGE : EVENTS.RESTORE; + var panelToMove = adjacentPanel ? adjacentPanel : basePanel; + var targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition(); + var estimatedPanelPosition = options.circular ? isNextDirection ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap : panelToMove.getAnchorPosition(); + var estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition(); + var destPos = viewport.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return { + panel: panelToMove, + destPos: destPos, + duration: options.duration, + eventType: eventType + }; + }; + + return Snap; + }(MoveType); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var FreeScroll = + /*#__PURE__*/ + function (_super) { + __extends(FreeScroll, _super); + + function FreeScroll() { + var _this = // Set snap count to Infinity + _super.call(this, Infinity) || this; + + _this.type = MOVE_TYPE.FREE_SCROLL; + return _this; + } + + var __proto = FreeScroll.prototype; + + __proto.findTargetPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + state = ctx.state, + viewport = ctx.viewport; + var destPos = axesEvent.destPos.flick; + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var scrollArea = viewport.getScrollArea(); + var currentPanel = viewport.getCurrentPanel(); + var options = viewport.options; + var delta = Math.abs(axesEvent.delta.flick + state.delta); + + if (delta > minimumDistanceToChange) { + var destInfo = _super.prototype.findSnappedPanel.call(this, ctx); + + destInfo.duration = axesEvent.duration; + destInfo.destPos = destPos; + destInfo.eventType = !options.circular && destInfo.panel === currentPanel ? "" : EVENTS.CHANGE; + return destInfo; + } else { + var estimatedPosition = options.circular ? circulate(destPos, scrollArea.prev, scrollArea.next, false) : destPos; + estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next); + estimatedPosition += viewport.getRelativeHangerPosition(); + var estimatedPanel = viewport.findNearestPanelAt(estimatedPosition); + return { + panel: estimatedPanel, + destPos: destPos, + duration: axesEvent.duration, + eventType: "" + }; + } + }; + + __proto.findRestorePanel = function (ctx) { + return this.findTargetPanel(ctx); + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var viewport = ctx.viewport; + return { + panel: viewport.getNearestPanel(), + destPos: viewport.getCameraPosition(), + duration: 0, + eventType: "" + }; + }; + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var lastPosition = viewport.stateMachine.getState().lastPosition; + var currentPanelPosition = currentPanel.getPosition(); // As camera can stop anywhere in free scroll mode, + // minimumDistanceToChange should be calculated differently. + // Ref #191(https://github.com/naver/egjs-flicking/issues/191) + + var lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var minimumDistanceToChange = isNextDirection ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap : lastHangerPosition - currentPanelPosition + halfGap; + minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize); + return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange); + }; + + return FreeScroll; + }(Snap); + + var Viewport = + /*#__PURE__*/ + function () { + function Viewport(flicking, options, triggerEvent) { + var _this = this; + + this.plugins = []; + + this.stopCamera = function (axesEvent) { + if (axesEvent && axesEvent.setTo) { + axesEvent.setTo({ + flick: _this.state.position + }, 0); + } + + _this.stateMachine.transitTo(STATE_TYPE.IDLE); + }; + + this.flicking = flicking; + this.triggerEvent = triggerEvent; + this.state = { + size: 0, + position: 0, + panelMaintainRatio: 0, + relativeHangerPosition: 0, + positionOffset: 0, + scrollArea: { + prev: 0, + next: 0 + }, + translate: TRANSFORM, + infiniteThreshold: 0, + checkedIndexes: [], + isAdaptiveCached: false, + isViewportGiven: false, + isCameraGiven: false, + originalViewportStyle: { + className: null, + style: null + }, + originalCameraStyle: { + className: null, + style: null + }, + cachedBbox: null + }; + this.options = options; + this.stateMachine = new StateMachine(); + this.visiblePanels = []; + this.panelBboxes = {}; + this.build(); + } + + var __proto = Viewport.prototype; + + __proto.moveTo = function (panel, destPos, eventType, axesEvent, duration) { + var _this = this; + + if (duration === void 0) { + duration = this.options.duration; + } + + var state = this.state; + var currentState = this.stateMachine.getState(); + var currentPosition = state.position; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + var direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + var eventResult; + + if (eventType === EVENTS.CHANGE) { + eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, { + index: panel.getIndex(), + panel: panel, + direction: direction + }); + } else if (eventType === EVENTS.RESTORE) { + eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted); + } else { + eventResult = { + onSuccess: function (callback) { + callback(); + return this; + }, + onStopped: function () { + return this; + } + }; + } + + eventResult.onSuccess(function () { + currentState.delta = 0; + currentState.lastPosition = _this.getCameraPosition(); + currentState.targetPanel = panel; + currentState.direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + + if (destPos === currentPosition) { + // no move + _this.nearestPanel = panel; + _this.currentPanel = panel; + } + + if (axesEvent && axesEvent.setTo) { + // freeScroll only occurs in release events + axesEvent.setTo({ + flick: destPos + }, duration); + } else { + _this.axes.setTo({ + flick: destPos + }, duration); + } + }); + return eventResult; + }; + + __proto.moveCamera = function (pos, axesEvent) { + var state = this.state; + var options = this.options; + var transform = state.translate.name; + var scrollArea = state.scrollArea; // Update position & nearestPanel + + if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) { + pos = circulate(pos, scrollArea.prev, scrollArea.next, false); + } + + state.position = pos; + this.nearestPanel = this.findNearestPanel(); + var nearestPanel = this.nearestPanel; + var originalNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; // From 0(panel position) to 1(panel position + panel size) + // When it's on gap area value will be (val > 1 || val < 0) + + if (nearestPanel) { + var hangerPosition = this.getHangerPosition(); + var panelPosition = nearestPanel.getPosition(); + var panelSize = nearestPanel.getSize(); + var halfGap = options.gap / 2; // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap + + state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap); + } else { + state.panelMaintainRatio = 0; + } + + this.checkNeedPanel(axesEvent); // Possibly modified after need panel, if it's looped + + var modifiedNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; + pos += modifiedNearestPosition - originalNearestPosition; + state.position = pos; + this.updateVisiblePanels(); // Offset is needed to fix camera layer size in visible-only rendering mode + + var posOffset = options.renderOnlyVisible ? state.positionOffset : 0; + var moveVector = options.horizontal ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)]; + var moveCoord = moveVector.map(function (coord) { + return Math.round(coord) + "px"; + }).join(", "); + this.cameraElement.style[transform] = state.translate.has3d ? "translate3d(" + moveCoord + ", 0px)" : "translate(" + moveCoord + ")"; + }; + + __proto.unCacheBbox = function () { + var state = this.state; + var options = this.options; + state.cachedBbox = null; + this.visiblePanels = []; + var viewportElement = this.viewportElement; + + if (!options.horizontal) { + // Don't preserve previous width for adaptive resizing + viewportElement.style.width = ""; + } else { + viewportElement.style.height = ""; + } + + state.isAdaptiveCached = false; + this.panelBboxes = {}; + }; + + __proto.resize = function () { + this.updateSize(); + this.updateOriginalPanelPositions(); + this.updateAdaptiveSize(); + this.updateScrollArea(); + this.updateClonePanels(); + this.updateVisiblePanelPositions(); + this.updateCameraPosition(); + this.updatePlugins(); + }; // Find nearest anchor from current hanger position + + + __proto.findNearestPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var hangerPosition = this.getHangerPosition(); + + if (this.isOutOfBound()) { + var position = state.position; + return position <= state.scrollArea.prev ? panelManager.firstPanel() : panelManager.lastPanel(); + } + + return this.findNearestPanelAt(hangerPosition); + }; + + __proto.findNearestPanelAt = function (position) { + var panelManager = this.panelManager; + var allPanels = panelManager.allPanels(); + var minimumDistance = Infinity; + var nearestPanel; + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var prevPosition = panel.getPosition(); + var nextPosition = prevPosition + panel.getSize(); // Use shortest distance from panel's range + + var distance = isBetween(position, prevPosition, nextPosition) ? 0 : Math.min(Math.abs(prevPosition - position), Math.abs(nextPosition - position)); + + if (distance > minimumDistance) { + break; + } else if (distance === minimumDistance) { + var minimumAnchorDistance = Math.abs(position - nearestPanel.getAnchorPosition()); + var anchorDistance = Math.abs(position - panel.getAnchorPosition()); + + if (anchorDistance > minimumAnchorDistance) { + break; + } + } + + minimumDistance = distance; + nearestPanel = panel; + } + + return nearestPanel; + }; + + __proto.findNearestIdenticalPanel = function (panel) { + var nearest = panel; + var shortestDistance = Infinity; + var hangerPosition = this.getHangerPosition(); + var identicals = panel.getIdenticalPanels(); + identicals.forEach(function (identical) { + var anchorPosition = identical.getAnchorPosition(); + var distance = Math.abs(anchorPosition - hangerPosition); + + if (distance < shortestDistance) { + nearest = identical; + shortestDistance = distance; + } + }); + return nearest; + }; // Find shortest camera position that distance is minimum + + + __proto.findShortestPositionToPanel = function (panel) { + var state = this.state; + var options = this.options; + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = this.getHangerPosition(); + var distance = Math.abs(hangerPosition - anchorPosition); + var scrollAreaSize = state.scrollArea.next - state.scrollArea.prev; + + if (!options.circular) { + var position = anchorPosition - state.relativeHangerPosition; + return this.canSetBoundMode() ? clamp(position, state.scrollArea.prev, state.scrollArea.next) : position; + } else { + // If going out of viewport border is more efficient way of moving, choose that position + return distance <= scrollAreaSize - distance ? anchorPosition - state.relativeHangerPosition : anchorPosition > hangerPosition // PREV TO NEXT + ? anchorPosition - state.relativeHangerPosition - scrollAreaSize // NEXT TO PREV + : anchorPosition - state.relativeHangerPosition + scrollAreaSize; + } + }; + + __proto.findEstimatedPosition = function (panel) { + var scrollArea = this.getScrollArea(); + var estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition(); + estimatedPosition = this.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return estimatedPosition; + }; + + __proto.addVisiblePanel = function (panel) { + if (this.getVisibleIndexOf(panel) < 0) { + this.visiblePanels.push(panel); + } + }; + + __proto.enable = function () { + if (!this.panInput) { + this.createPanInput(); + } + }; + + __proto.disable = function () { + if (this.panInput) { + this.panInput.destroy(); + this.panInput = null; + this.stateMachine.transitTo(STATE_TYPE.IDLE); + } + }; + + __proto.insert = function (index, element) { + var _this = this; + + var lastIndex = this.panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var state = this.state; + var options = this.options; + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var pushedIndex = this.panelManager.insert(index, panels); // ...then calc bbox for all panels + + this.resizePanels(panels); + + if (!this.currentPanel) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + }); + state.checkedIndexes.forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; + + if (index < min) { + // Push checked index + state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + } + }); + this.resize(); + return panels; + }; + + __proto.replace = function (index, element) { + var _this = this; + + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var lastIndex = panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var replacedPanels = panelManager.replace(index, panels); + replacedPanels.forEach(function (panel) { + var visibleIndex = _this.getVisibleIndexOf(panel); + + if (visibleIndex > -1) { + _this.visiblePanels.splice(visibleIndex, 1); + } + }); // ...then calc bbox for all panels + + this.resizePanels(panels); + var currentPanel = this.currentPanel; + var wasEmpty = !currentPanel; + + if (wasEmpty) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } else if (isBetween(currentPanel.getIndex(), index, index + panels.length - 1)) { + // Current panel is replaced + this.currentPanel = panelManager.get(currentPanel.getIndex()); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + panels.length - 1 + }); + this.resize(); + return panels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var state = this.state; // Index should not below 0 + + index = Math.max(index, 0); + var panelManager = this.panelManager; + var currentIndex = this.getCurrentIndex(); + var removedPanels = panelManager.remove(index, deleteCount); + + if (isBetween(currentIndex, index, index + deleteCount - 1)) { + // Current panel is removed + // Use panel at removing index - 1 as new current panel if it exists + var newCurrentIndex = Math.max(index - 1, panelManager.getRange().min); + this.currentPanel = panelManager.get(newCurrentIndex); + } // Update checked indexes in infinite mode + + + if (deleteCount > 0) { + // Check whether removing index will affect checked indexes + // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa. + this.updateCheckedIndexes({ + min: index - 1, + max: index + deleteCount + }); // Uncache visible panels to refresh panels + + this.visiblePanels = []; + } + + if (panelManager.getPanelCount() <= 0) { + this.currentPanel = undefined; + this.nearestPanel = undefined; + } + + this.resize(); + var scrollArea = state.scrollArea; + + if (state.position < scrollArea.prev || state.position > scrollArea.next) { + var newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false); + this.moveCamera(newPosition); + this.updateAxesPosition(newPosition); + } + + return removedPanels; + }; + + __proto.updateAdaptiveSize = function () { + var state = this.state; + var options = this.options; + var horizontal = options.horizontal; + var currentPanel = this.getCurrentPanel(); + + if (!currentPanel) { + return; + } + + var shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached; + var viewportStyle = this.viewportElement.style; + + if (shouldApplyAdaptive) { + var sizeToApply = void 0; + + if (options.adaptive) { + var panelBbox = currentPanel.getBbox(); + sizeToApply = horizontal ? panelBbox.height : panelBbox.width; + } else { + // Find minimum height of panels to maximum panel size + var maximumPanelSize = this.panelManager.originalPanels().reduce(function (maximum, panel) { + var panelBbox = panel.getBbox(); + return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width); + }, 0); + sizeToApply = maximumPanelSize; + } + + if (!state.isAdaptiveCached) { + var viewportBbox = this.updateBbox(); + sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width); + state.isAdaptiveCached = true; + } + + var viewportSize = sizeToApply + "px"; + + if (horizontal) { + viewportStyle.height = viewportSize; + state.cachedBbox.height = sizeToApply; + } else { + viewportStyle.width = viewportSize; + state.cachedBbox.width = sizeToApply; + } + } + }; // Update camera position after resizing + + + __proto.updateCameraPosition = function () { + var state = this.state; + var currentPanel = this.getCurrentPanel(); + var cameraPosition = this.getCameraPosition(); + var currentState = this.stateMachine.getState(); + var isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var halfGap = this.options.gap / 2; + + if (currentState.holding || currentState.playing) { + this.updateVisiblePanels(); + return; + } + + var newPosition; + + if (isFreeScroll) { + var positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next); + var nearestPanel = this.getNearestPanel(); // Preserve camera position if it is bound to scroll area limit + + newPosition = positionBounded || !nearestPanel ? cameraPosition : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition; + } else { + newPosition = currentPanel ? currentPanel.getAnchorPosition() - relativeHangerPosition : cameraPosition; + } + + if (this.canSetBoundMode()) { + newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next); + } // Pause & resume axes to prevent axes's "change" event triggered + // This should be done before moveCamera, as moveCamera can trigger needPanel + + + this.updateAxesPosition(newPosition); + this.moveCamera(newPosition); + }; + + __proto.updateBbox = function () { + var state = this.state; + var options = this.options; + var viewportElement = this.viewportElement; + + if (!state.cachedBbox) { + state.cachedBbox = getBbox(viewportElement, options.useOffset); + } + + return state.cachedBbox; + }; + + __proto.updatePlugins = function () { + var _this = this; // update for resize + + + this.plugins.forEach(function (plugin) { + plugin.update && plugin.update(_this.flicking); + }); + }; + + __proto.destroy = function (option) { + var _a; + + var state = this.state; + var wrapper = this.flicking.getElement(); + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var originalPanels = this.panelManager.originalPanels(); + this.removePlugins(this.plugins); + + if (!option.preserveUI) { + restoreStyle(viewportElement, state.originalViewportStyle); + restoreStyle(cameraElement, state.originalCameraStyle); + + if (!state.isCameraGiven && !this.options.renderExternal) { + var topmostElement_1 = state.isViewportGiven ? viewportElement : wrapper; + var deletingElement = state.isViewportGiven ? cameraElement : viewportElement; + originalPanels.forEach(function (panel) { + topmostElement_1.appendChild(panel.getElement()); + }); + topmostElement_1.removeChild(deletingElement); + } + } + + this.axes.destroy(); + (_a = this.panInput) === null || _a === void 0 ? void 0 : _a.destroy(); + originalPanels.forEach(function (panel) { + panel.destroy(option); + }); // release resources + + for (var x in this) { + this[x] = null; + } + }; + + __proto.restore = function (status) { + var panels = status.panels; + var defaultIndex = this.options.defaultIndex; + var cameraElement = this.cameraElement; + var panelManager = this.panelManager; // Restore index + + cameraElement.innerHTML = panels.map(function (panel) { + return panel.html; + }).join(""); // Create panels first + + this.refreshPanels(); + var createdPanels = panelManager.originalPanels(); // ...then order it by its index + + var orderedPanels = []; + panels.forEach(function (panel, idx) { + var createdPanel = createdPanels[idx]; + createdPanel.setIndex(panel.index); + orderedPanels[panel.index] = createdPanel; + }); + panelManager.replacePanels(orderedPanels, []); + panelManager.setCloneCount(0); // No clones at this point + + var panelCount = panelManager.getPanelCount(); + + if (panelCount > 0) { + this.currentPanel = panelManager.get(status.index) || panelManager.get(defaultIndex) || panelManager.firstPanel(); + } else { + this.currentPanel = undefined; + } + + this.visiblePanels = orderedPanels.filter(function (panel) { + return Boolean(panel); + }); + this.resize(); + this.axes.setTo({ + flick: status.position + }, 0); + this.moveCamera(status.position); + }; + + __proto.calcVisiblePanels = function () { + var allPanels = this.panelManager.allPanels(); + + if (this.options.renderOnlyVisible) { + var cameraPos_1 = this.getCameraPosition(); + var viewportSize_1 = this.getSize(); + var basePanel = this.nearestPanel; + + var getNextPanel = function (panel) { + var nextPanel = panel.nextSibling; + + if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) { + return nextPanel; + } else { + return null; + } + }; + + var getPrevPanel = function (panel) { + var prevPanel = panel.prevSibling; + + if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) { + return prevPanel; + } else { + return null; + } + }; + + var isOutOfBoundNext = function (panel) { + return panel.getPosition() >= cameraPos_1 + viewportSize_1; + }; + + var isOutOfBoundPrev = function (panel) { + return panel.getPosition() + panel.getSize() <= cameraPos_1; + }; + + var getVisiblePanels = function (panel, getNext, isOutOfViewport) { + var visiblePanels = []; + var lastPanel = panel; + + while (true) { + var nextPanel = getNext(lastPanel); + + if (!nextPanel || isOutOfViewport(nextPanel)) { + break; + } + + visiblePanels.push(nextPanel); + lastPanel = nextPanel; + } + + return visiblePanels; + }; + + var panelCount_1 = this.panelManager.getPanelCount(); + + var getAbsIndex_1 = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount_1; + }; + + var nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext); + var prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev); + return __spreadArrays([basePanel], nextPanels, prevPanels).sort(function (panel1, panel2) { + return getAbsIndex_1(panel1) - getAbsIndex_1(panel2); + }); + } else { + return allPanels.filter(function (panel) { + var outsetProgress = panel.getOutsetProgress(); + return outsetProgress > -1 && outsetProgress < 1; + }); + } + }; + + __proto.getCurrentPanel = function () { + return this.currentPanel; + }; + + __proto.getCurrentIndex = function () { + var currentPanel = this.currentPanel; + return currentPanel ? currentPanel.getIndex() : -1; + }; + + __proto.getNearestPanel = function () { + return this.nearestPanel; + }; // Get progress from nearest panel + + + __proto.getCurrentProgress = function () { + var currentState = this.stateMachine.getState(); + var nearestPanel = currentState.playing || currentState.holding ? this.nearestPanel : this.currentPanel; + var panelManager = this.panelManager; + + if (!nearestPanel) { + // There're no panels + return NaN; + } + + var _a = this.getScrollArea(), + prevRange = _a.prev, + nextRange = _a.next; + + var cameraPosition = this.getCameraPosition(); + var isOutOfBound = this.isOutOfBound(); + var prevPanel = nearestPanel.prevSibling; + var nextPanel = nearestPanel.nextSibling; + var hangerPosition = this.getHangerPosition(); + var nearestAnchorPos = nearestPanel.getAnchorPosition(); + + if (isOutOfBound && prevPanel && nextPanel && cameraPosition < nextRange // On the basis of anchor, prevPanel is nearestPanel. + && hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition) { + nearestPanel = prevPanel; + nextPanel = nearestPanel.nextSibling; + prevPanel = nearestPanel.prevSibling; + nearestAnchorPos = nearestPanel.getAnchorPosition(); + } + + var nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount(); + var nearestSize = nearestPanel.getSize(); + + if (isOutOfBound) { + var relativeHangerPosition = this.getRelativeHangerPosition(); + + if (nearestAnchorPos > nextRange + relativeHangerPosition) { + // next bounce area: hangerPosition - relativeHangerPosition - nextRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange; + } else if (nearestAnchorPos < prevRange + relativeHangerPosition) { + // prev bounce area: hangerPosition - relativeHangerPosition - prevRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange; + } + } + + var hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos; + var gap = this.options.gap; + var basePosition = nearestAnchorPos; + var targetPosition = nearestAnchorPos; + + if (hangerIsNextToNearestPanel) { + targetPosition = nextPanel ? nextPanel.getAnchorPosition() : nearestAnchorPos + nearestSize + gap; + } else { + basePosition = prevPanel ? prevPanel.getAnchorPosition() : nearestAnchorPos - nearestSize - gap; + } + + var progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition); + var startIndex = hangerIsNextToNearestPanel ? nearestIndex : prevPanel ? prevPanel.getIndex() : nearestIndex - 1; + return startIndex + progressBetween; + }; // Update axes flick position without triggering event + + + __proto.updateAxesPosition = function (position) { + var axes = this.axes; + axes.off(); + axes.setTo({ + flick: position + }, 0); + axes.on(this.axesHandlers); + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getScrollArea = function () { + return this.state.scrollArea; + }; + + __proto.isOutOfBound = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + return !options.circular && options.bound && (state.position <= scrollArea.prev || state.position >= scrollArea.next); + }; + + __proto.canSetBoundMode = function () { + var options = this.options; + return options.bound && !options.circular; + }; + + __proto.getViewportElement = function () { + return this.viewportElement; + }; + + __proto.getCameraElement = function () { + return this.cameraElement; + }; + + __proto.getScrollAreaSize = function () { + var scrollArea = this.state.scrollArea; + return scrollArea.next - scrollArea.prev; + }; + + __proto.getRelativeHangerPosition = function () { + return this.state.relativeHangerPosition; + }; + + __proto.getHangerPosition = function () { + return this.state.position + this.state.relativeHangerPosition; + }; + + __proto.getCameraPosition = function () { + return this.state.position; + }; + + __proto.getPositionOffset = function () { + return this.state.positionOffset; + }; + + __proto.getCheckedIndexes = function () { + return this.state.checkedIndexes; + }; + + __proto.getVisiblePanels = function () { + return this.visiblePanels; + }; + + __proto.setCurrentPanel = function (panel) { + this.currentPanel = panel; + }; + + __proto.setLastIndex = function (index) { + var currentPanel = this.currentPanel; + var panelManager = this.panelManager; + panelManager.setLastIndex(index); + + if (currentPanel && currentPanel.getIndex() > index) { + this.currentPanel = panelManager.lastPanel(); + } + + this.resize(); + }; + + __proto.setVisiblePanels = function (panels) { + this.visiblePanels = panels; + }; + + __proto.connectAxesHandler = function (handlers) { + var axes = this.axes; + this.axesHandlers = handlers; + axes.on(handlers); + }; + + __proto.addPlugins = function (plugins) { + var _this = this; + + var newPlugins = [].concat(plugins); + newPlugins.forEach(function (plugin) { + plugin.init(_this.flicking); + }); + this.plugins = this.plugins.concat(newPlugins); + return this; + }; + + __proto.removePlugins = function (plugins) { + var _this = this; + + var currentPlugins = this.plugins; + var removedPlugins = [].concat(plugins); + removedPlugins.forEach(function (plugin) { + var index = currentPlugins.indexOf(plugin); + + if (index > -1) { + currentPlugins.splice(index, 1); + } + + plugin.destroy(_this.flicking); + }); + return this; + }; + + __proto.updateCheckedIndexes = function (changedRange) { + var state = this.state; + var removed = 0; + state.checkedIndexes.concat().forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; // Can fill part of indexes in range + + if (changedRange.min <= max && changedRange.max >= min) { + // Remove checked index from list + state.checkedIndexes.splice(idx - removed, 1); + removed++; + } + }); + }; + + __proto.appendUncachedPanelElements = function (panels) { + var _this = this; + + var options = this.options; + var fragment = document.createDocumentFragment(); + + if (options.isEqualSize) { + var prevVisiblePanels = this.visiblePanels; + var equalSizeClasses_1 = options.isEqualSize; // for readability + + var cached_1 = {}; + this.visiblePanels = []; + Object.keys(this.panelBboxes).forEach(function (className) { + cached_1[className] = true; + }); + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_1); + + if (overlappedClass && !cached_1[overlappedClass]) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + + cached_1[overlappedClass] = true; + } else if (!overlappedClass) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + } + }); + prevVisiblePanels.forEach(function (panel) { + _this.addVisiblePanel(panel); + }); + } else { + if (!options.renderExternal) { + panels.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + } + + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + } + + if (!options.renderExternal) { + this.cameraElement.appendChild(fragment); + } + }; + + __proto.updateClonePanels = function () { + var panelManager = this.panelManager; // Clone panels in circular mode + + if (this.options.circular && panelManager.getPanelCount() > 0) { + this.clonePanels(); + this.updateClonedPanelPositions(); + } + + panelManager.chainAllPanels(); + }; + + __proto.getVisibleIndexOf = function (panel) { + return findIndex(this.visiblePanels, function (visiblePanel) { + return visiblePanel === panel; + }); + }; + + __proto.build = function () { + this.setElements(); + this.applyCSSValue(); + this.setMoveType(); + this.setAxesInstance(); + this.refreshPanels(); + this.setDefaultPanel(); + this.resize(); + this.moveToDefaultPanel(); + }; + + __proto.setElements = function () { + var state = this.state; + var options = this.options; + var wrapper = this.flicking.getElement(); + var classPrefix = options.classPrefix; + var viewportCandidate = wrapper.children[0]; + var hasViewportElement = viewportCandidate && hasClass(viewportCandidate, classPrefix + "-viewport"); + var viewportElement = hasViewportElement ? viewportCandidate : document.createElement("div"); + var cameraCandidate = hasViewportElement ? viewportElement.children[0] : wrapper.children[0]; + var hasCameraElement = cameraCandidate && hasClass(cameraCandidate, classPrefix + "-camera"); + var cameraElement = hasCameraElement ? cameraCandidate : document.createElement("div"); + + if (!hasCameraElement) { + cameraElement.className = classPrefix + "-camera"; + var panelElements = hasViewportElement ? viewportElement.children : wrapper.children; // Make all panels to be a child of camera element + // wrapper <- viewport <- camera <- panels[1...n] + + toArray(panelElements).forEach(function (child) { + cameraElement.appendChild(child); + }); + } else { + state.originalCameraStyle = { + className: cameraElement.getAttribute("class"), + style: cameraElement.getAttribute("style") + }; + } + + if (!hasViewportElement) { + viewportElement.className = classPrefix + "-viewport"; // Add viewport element to wrapper + + wrapper.appendChild(viewportElement); + } else { + state.originalViewportStyle = { + className: viewportElement.getAttribute("class"), + style: viewportElement.getAttribute("style") + }; + } + + if (!hasCameraElement || !hasViewportElement) { + viewportElement.appendChild(cameraElement); + } + + this.viewportElement = viewportElement; + this.cameraElement = cameraElement; + state.isViewportGiven = hasViewportElement; + state.isCameraGiven = hasCameraElement; + }; + + __proto.applyCSSValue = function () { + var options = this.options; + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var viewportStyle = this.viewportElement.style; // Set default css values for each element + + applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS); + applyCSS(cameraElement, DEFAULT_CAMERA_CSS); + viewportElement.style.zIndex = "" + options.zIndex; + + if (options.horizontal) { + viewportStyle.minHeight = "100%"; + viewportStyle.width = "100%"; + } else { + viewportStyle.minWidth = "100%"; + viewportStyle.height = "100%"; + } + + if (options.overflow) { + viewportStyle.overflow = "visible"; + } + + this.panelManager = new PanelManager(this.cameraElement, options); + }; + + __proto.setMoveType = function () { + var moveType = this.options.moveType; + + switch (moveType.type) { + case MOVE_TYPE.SNAP: + this.moveType = new Snap(moveType.count); + break; + + case MOVE_TYPE.FREE_SCROLL: + this.moveType = new FreeScroll(); + break; + + default: + throw new Error("moveType is not correct!"); + } + }; + + __proto.setAxesInstance = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + this.axes = new Axes({ + flick: { + range: [scrollArea.prev, scrollArea.next], + circular: options.circular, + bounce: [0, 0] + } + }, { + easing: options.panelEffect, + deceleration: options.deceleration, + interruptable: true + }); + this.createPanInput(); + }; + + __proto.refreshPanels = function () { + var _this = this; + + var panelManager = this.panelManager; // Panel elements were attached to camera element by Flicking class + + var panelElements = this.cameraElement.children; // Initialize panels + + var panels = toArray(panelElements).map(function (el, idx) { + return new Panel(el, idx, _this); + }); + panelManager.replacePanels(panels, []); + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + }; + + __proto.setDefaultPanel = function () { + var options = this.options; + var panelManager = this.panelManager; + var indexRange = this.panelManager.getRange(); + var index = clamp(options.defaultIndex, indexRange.min, indexRange.max); + this.currentPanel = panelManager.get(index); + }; + + __proto.clonePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var gap = options.gap; + var viewportSize = state.size; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); // There're no panels exist + + if (!firstPanel) { + return; + } // For each panels, clone itself while last panel's position + size is below viewport size + + + var panels = panelManager.originalPanels(); + var reversedPanels = panels.concat().reverse(); + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap; + var relativeAnchorPosition = firstPanel.getRelativeAnchorPosition(); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize; + var sizeSum = 0; + var panelAtLeftBoundary; + + for (var _i = 0, reversedPanels_1 = reversedPanels; _i < reversedPanels_1.length; _i++) { + var panel = reversedPanels_1[_i]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaPrev) { + panelAtLeftBoundary = panel; + break; + } + } + + var areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize; + sizeSum = 0; + var panelAtRightBoundary; + + for (var _a = 0, panels_1 = panels; _a < panels_1.length; _a++) { + var panel = panels_1[_a]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaNext) { + panelAtRightBoundary = panel; + break; + } + } // Need one more set of clones on prev area of original panel 0 + + + var needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0 && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex(); // Visible count of panel 0 on first screen + + var panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize) + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize) - 1; // duplication + + var cloneCount = panel0OnFirstscreen + (needCloneOnPrev ? 1 : 0); + var prevCloneCount = panelManager.getCloneCount(); + panelManager.setCloneCount(cloneCount); + + if (options.renderExternal) { + return; + } + + if (cloneCount > prevCloneCount) { + var _loop_1 = function (cloneIndex) { + var _a; + + var clones = panels.map(function (origPanel) { + return origPanel.clone(cloneIndex); + }); + var fragment = document.createDocumentFragment(); + clones.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + this_1.cameraElement.appendChild(fragment); + + (_a = this_1.visiblePanels).push.apply(_a, clones.filter(function (clone) { + return Boolean(clone); + })); + + panelManager.insertClones(cloneIndex, 0, clones); + }; + + var this_1 = this; // should clone more + + for (var cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) { + _loop_1(cloneIndex); + } + } else if (cloneCount < prevCloneCount) { + // should remove some + panelManager.removeClonesAfter(cloneCount); + } + }; + + __proto.moveToDefaultPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var indexRange = this.panelManager.getRange(); + var defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max); + var defaultPanel = panelManager.get(defaultIndex); + var defaultPosition = 0; + + if (defaultPanel) { + defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition; + defaultPosition = this.canSetBoundMode() ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next) : defaultPosition; + } + + this.moveCamera(defaultPosition); + this.axes.setTo({ + flick: defaultPosition + }, 0); + }; + + __proto.updateSize = function () { + var state = this.state; + var options = this.options; + var panels = this.panelManager.originalPanels().filter(function (panel) { + return Boolean(panel); + }); + var bbox = this.updateBbox(); + var prevSize = state.size; // Update size & hanger position + + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size); + state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size); + } + + if (panels.length <= 0) { + return; + } + + this.resizePanels(panels); + }; + + __proto.updateOriginalPanelPositions = function () { + var gap = this.options.gap; + var panelManager = this.panelManager; + var firstPanel = panelManager.firstPanel(); + var panels = panelManager.originalPanels(); + + if (!firstPanel) { + return; + } + + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + var scrollArea = this.state.scrollArea; // Update panel position && fit to wrapper + + var nextPanelPos = firstPanel.getPosition(); + var maintainingPanel = firstPanel; + + if (nearestPanel) { + // We should maintain nearestPanel's position + var looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next); + maintainingPanel = looped ? currentPanel : nearestPanel; + } else if (firstPanel.getIndex() > 0) { + maintainingPanel = currentPanel; + } + + var panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length); + var accumulatedSize = panelsBeforeMaintainPanel.reduce(function (total, panel) { + return total + panel.getSize() + gap; + }, 0); + nextPanelPos = maintainingPanel.getPosition() - accumulatedSize; + panels.forEach(function (panel) { + var newPosition = nextPanelPos; + var panelSize = panel.getSize(); + panel.setPosition(newPosition); + nextPanelPos += panelSize + gap; + }); + + if (!this.options.renderOnlyVisible) { + panels.forEach(function (panel) { + return panel.setPositionCSS(); + }); + } + }; + + __proto.updateClonedPanelPositions = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var clonedPanels = panelManager.clonedPanels().reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, []).filter(function (panel) { + return Boolean(panel); + }); + var scrollArea = state.scrollArea; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + + if (!firstPanel) { + return; + } + + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Locate all cloned panels linearly first + + for (var _i = 0, clonedPanels_1 = clonedPanels; _i < clonedPanels_1.length; _i++) { + var panel = clonedPanels_1[_i]; + var origPanel = panel.getOriginalPanel(); + var cloneIndex = panel.getCloneIndex(); + var cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1); + var clonedPanelPos = cloneBasePos + origPanel.getPosition(); + panel.setPosition(clonedPanelPos); + } + + var lastReplacePosition = firstPanel.getPosition(); // reverse() pollutes original array, so copy it with concat() + + for (var _a = 0, _b = clonedPanels.concat().reverse(); _a < _b.length; _a++) { + var panel = _b[_a]; + var panelSize = panel.getSize(); + var replacePosition = lastReplacePosition - panelSize - options.gap; + + if (replacePosition + panelSize <= scrollArea.prev) { + // Replace is not meaningful, as it won't be seen in current scroll area + break; + } + + panel.setPosition(replacePosition); + lastReplacePosition = replacePosition; + } + + if (!this.options.renderOnlyVisible) { + clonedPanels.forEach(function (panel) { + panel.setPositionCSS(); + }); + } + }; + + __proto.updateVisiblePanelPositions = function () { + var _this = this; + + if (this.options.renderOnlyVisible) { + this.visiblePanels.forEach(function (panel) { + panel.setPositionCSS(_this.state.positionOffset); + }); + } + }; + + __proto.updateScrollArea = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var axes = this.axes; // Set viewport scrollable area + + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + var relativeHangerPosition = state.relativeHangerPosition; + + if (!firstPanel) { + state.scrollArea = { + prev: 0, + next: 0 + }; + } else if (this.canSetBoundMode()) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition(); + + if (sumOriginalPanelSize >= state.size) { + state.scrollArea = { + prev: firstPanel.getPosition(), + next: lastPanel.getPosition() + lastPanel.getSize() - state.size + }; + } else { + // Find anchor position of set of the combined panels + var relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize); + var anchorPos = firstPanel.getPosition() + clamp(relAnchorPosOfCombined, sumOriginalPanelSize - (state.size - relativeHangerPosition), relativeHangerPosition); + state.scrollArea = { + prev: anchorPos - relativeHangerPosition, + next: anchorPos - relativeHangerPosition + }; + } + } else if (options.circular) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Maximum scroll extends to first clone sequence's first panel + + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition + }; + } else { + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: lastPanel.getAnchorPosition() - relativeHangerPosition + }; + } + + var viewportSize = state.size; + var bounce = options.bounce; + var parsedBounce; + + if (isArray(bounce)) { + parsedBounce = bounce.map(function (val) { + return parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce); + }); + } else { + var parsedVal = parseArithmeticExpression(bounce, viewportSize, DEFAULT_OPTIONS.bounce); + parsedBounce = [parsedVal, parsedVal]; + } // Update axes range and bounce + + + var flick = axes.axis.flick; + flick.range = [state.scrollArea.prev, state.scrollArea.next]; + flick.bounce = parsedBounce; + }; + + __proto.checkNeedPanel = function (axesEvent) { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + + if (!options.infinite) { + return; + } + + var gap = options.gap; + var infiniteThreshold = state.infiniteThreshold; + var maxLastIndex = panelManager.getLastIndex(); + + if (maxLastIndex < 0) { + return; + } + + if (!currentPanel || !nearestPanel) { + // There're no panels + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: null, + direction: null, + indexRange: { + min: 0, + max: maxLastIndex, + length: maxLastIndex + 1 + } + }); + return; + } + + var originalNearestPosition = nearestPanel.getPosition(); // Check next direction + + var checkingPanel = !currentState.holding && !currentState.playing ? currentPanel : nearestPanel; + + while (checkingPanel) { + var currentIndex = checkingPanel.getIndex(); + var nextSibling = checkingPanel.nextSibling; + var lastPanel = panelManager.lastPanel(); + var atLastPanel = currentIndex === lastPanel.getIndex(); + var nextIndex = !atLastPanel && nextSibling ? nextSibling.getIndex() : maxLastIndex + 1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition); + var cameraNext = state.position + state.size; // There're empty panels between + + var emptyPanelExistsBetween = nextIndex - currentIndex > 1; // Expected prev panel's left position is smaller than camera position + + var overThreshold = panelRight + gap - infiniteThreshold <= cameraNext; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: currentIndex + 1, + max: nextIndex - 1, + length: nextIndex - currentIndex - 1 + } + }); + } // Trigger needPanel in circular & at max panel index + + + if (options.circular && currentIndex === maxLastIndex && overThreshold) { + var firstPanel = panelManager.firstPanel(); + var firstIndex = firstPanel ? firstPanel.getIndex() : -1; + + if (firstIndex > 0) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: 0, + max: firstIndex - 1, + length: firstIndex + } + }); + } + } // Check whether panels are changed + + + var lastPanelAfterNeed = panelManager.lastPanel(); + var atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex(); + + if (atLastPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.nextSibling; + } // Check prev direction + + + checkingPanel = nearestPanel; + + while (checkingPanel) { + var cameraPrev = state.position; + var checkingIndex = checkingPanel.getIndex(); + var prevSibling = checkingPanel.prevSibling; + var firstPanel = panelManager.firstPanel(); + var atFirstPanel = checkingIndex === firstPanel.getIndex(); + var prevIndex = !atFirstPanel && prevSibling ? prevSibling.getIndex() : -1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition); // There're empty panels between + + var emptyPanelExistsBetween = checkingIndex - prevIndex > 1; // Expected prev panel's right position is smaller than camera position + + var overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: prevIndex + 1, + max: checkingIndex - 1, + length: checkingIndex - prevIndex - 1 + } + }); + } // Trigger needPanel in circular & at panel 0 + + + if (options.circular && checkingIndex === 0 && overThreshold) { + var lastPanel = panelManager.lastPanel(); + + if (lastPanel && lastPanel.getIndex() < maxLastIndex) { + var lastIndex = lastPanel.getIndex(); + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: lastIndex + 1, + max: maxLastIndex, + length: maxLastIndex - lastIndex + } + }); + } + } // Check whether panels were changed + + + var firstPanelAfterNeed = panelManager.firstPanel(); + var atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex(); // Looped in circular mode + + if (atFirstPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.prevSibling; + } + }; + + __proto.triggerNeedPanel = function (params) { + var _this = this; + + var axesEvent = params.axesEvent, + siblingPanel = params.siblingPanel, + direction = params.direction, + indexRange = params.indexRange; + var options = this.options; + var checkedIndexes = this.state.checkedIndexes; + var alreadyTriggered = checkedIndexes.some(function (_a) { + var min = _a[0], + max = _a[1]; + return min === indexRange.min || max === indexRange.max; + }); + var hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL); + + if (alreadyTriggered || !hasHandler) { + return; + } // Should done before triggering event, as we can directly add panels by event callback + + + checkedIndexes.push([indexRange.min, indexRange.max]); + var index = siblingPanel ? siblingPanel.getIndex() : 0; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + this.triggerEvent(EVENTS.NEED_PANEL, axesEvent, isTrusted, { + index: index, + panel: siblingPanel, + direction: direction, + range: indexRange, + fill: function (element) { + var panelManager = _this.panelManager; + + if (!siblingPanel) { + return _this.insert(panelManager.getRange().max + 1, element); + } + + var parsedElements = parseElement(element); // Slice elements to fit size equal to empty spaces + + var elements = direction === DIRECTION.NEXT ? parsedElements.slice(0, indexRange.length) : parsedElements.slice(-indexRange.length); + + if (direction === DIRECTION.NEXT) { + if (options.circular && index === panelManager.getLastIndex()) { + // needPanel event is triggered on last index, insert at index 0 + return _this.insert(0, elements); + } else { + return siblingPanel.insertAfter(elements); + } + } else if (direction === DIRECTION.PREV) { + if (options.circular && index === 0) { + // needPanel event is triggered on first index(0), insert at the last index + return _this.insert(indexRange.max - elements.length + 1, elements); + } else { + return siblingPanel.insertBefore(elements); + } + } else { + // direction is null when there're no panels exist + return _this.insert(0, elements); + } + } + }); + }; + + __proto.updateVisiblePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentState = this.stateMachine.getState(); + var cameraElement = this.cameraElement; + var renderExternal = options.renderExternal, + renderOnlyVisible = options.renderOnlyVisible; + + if (!renderOnlyVisible) { + return; + } + + if (!this.nearestPanel) { + this.visiblePanels = []; + + while (cameraElement.firstChild) { + cameraElement.removeChild(cameraElement.firstChild); + } + + return; + } + + var prevVisiblePanels = this.visiblePanels; + var newVisiblePanels = this.calcVisiblePanels(); + + var _a = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels), + addedPanels = _a.addedPanels, + removedPanels = _a.removedPanels; + + if (addedPanels.length <= 0 && removedPanels.length <= 0) { + // Visible panels not changed + return; + } + + if (currentState.holding) { + newVisiblePanels.push.apply(newVisiblePanels, removedPanels); + } else { + var firstVisiblePanelPos = newVisiblePanels[0].getPosition(); + state.positionOffset = firstVisiblePanelPos; + } + + newVisiblePanels.forEach(function (panel) { + panel.setPositionCSS(state.positionOffset); + }); + + if (!renderExternal) { + if (!currentState.holding) { + removedPanels.forEach(function (panel) { + var panelElement = panel.getElement(); + panelElement.parentNode && cameraElement.removeChild(panelElement); + }); + } + + var fragment_1 = document.createDocumentFragment(); + addedPanels.forEach(function (panel) { + fragment_1.appendChild(panel.getElement()); + }); + cameraElement.appendChild(fragment_1); + } + + var firstVisiblePanel = newVisiblePanels[0]; + var lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1]; + + var getAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount(); + }; + + var newVisibleRange = { + min: getAbsIndex(firstVisiblePanel), + max: getAbsIndex(lastVisiblePanel) + }; + this.visiblePanels = newVisiblePanels; + this.flicking.trigger(EVENTS.VISIBLE_CHANGE, { + type: EVENTS.VISIBLE_CHANGE, + range: newVisibleRange + }); + }; + + __proto.checkVisiblePanelChange = function (prevVisiblePanels, newVisiblePanels) { + var prevRefCount = prevVisiblePanels.map(function () { + return 0; + }); + var newRefCount = newVisiblePanels.map(function () { + return 0; + }); + prevVisiblePanels.forEach(function (prevPanel, prevIndex) { + newVisiblePanels.forEach(function (newPanel, newIndex) { + if (prevPanel === newPanel) { + prevRefCount[prevIndex]++; + newRefCount[newIndex]++; + } + }); + }); + var removedPanels = prevRefCount.reduce(function (removed, count, index) { + return count === 0 ? __spreadArrays(removed, [prevVisiblePanels[index]]) : removed; + }, []); + var addedPanels = newRefCount.reduce(function (added, count, index) { + return count === 0 ? __spreadArrays(added, [newVisiblePanels[index]]) : added; + }, []); + return { + removedPanels: removedPanels, + addedPanels: addedPanels + }; + }; + + __proto.resizePanels = function (panels) { + var options = this.options; + var panelBboxes = this.panelBboxes; + + if (options.isEqualSize === true) { + if (!panelBboxes.default) { + var defaultPanel = panels[0]; + panelBboxes.default = defaultPanel.getBbox(); + } + + var defaultBbox_1 = panelBboxes.default; + panels.forEach(function (panel) { + panel.resize(defaultBbox_1); + }); + return; + } else if (options.isEqualSize) { + var equalSizeClasses_2 = options.isEqualSize; + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_2); + + if (overlappedClass) { + panel.resize(panelBboxes[overlappedClass]); + panelBboxes[overlappedClass] = panel.getBbox(); + } else { + panel.resize(); + } + }); + return; + } + + panels.forEach(function (panel) { + panel.resize(); + }); + }; + + __proto.createPanInput = function () { + var options = this.options; + this.panInput = new Axes.PanInput(this.viewportElement, { + inputType: options.inputType, + thresholdAngle: options.thresholdAngle, + iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold, + scale: options.horizontal ? [-1, 0] : [0, -1] + }); + this.axes.connect(options.horizontal ? ["flick", ""] : ["", "flick"], this.panInput); + }; + + return Viewport; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + /** + * @memberof eg + * @extends eg.Component + * @support {"ie": "10+", "ch" : "latest", "ff" : "latest", "sf" : "latest" , "edge" : "latest", "ios" : "7+", "an" : "4.X+"} + * @requires {@link https://github.com/naver/egjs-component|eg.Component} + * @requires {@link https://github.com/naver/egjs-axes|eg.Axes} + * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/} + */ + + var Flicking = + /*#__PURE__*/ + function (_super) { + __extends(Flicking, _super); + /** + * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다. + * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체 + * @param {string} [options.classPrefix="eg-flick"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사. + * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다. + * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향) + * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다. + * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다. + * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리. + * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
+ * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다. + * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다. + * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수. + * @param {string[]} [options.inputType=["touch,"mouse"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고}) + * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
+ * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, "10px", "20%")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, "10px", "20%")
+ * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부. + * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부. + * @param {number|""} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값. + * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다. + * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다. + * @param {string} [options.hanger="50%"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {string} [options.anchor="50%"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px) + * @param {eg.Flicking.MoveTypeOption} [options.moveType="snap"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll) + * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
+ * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다. + * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
+ * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다. + * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다. + * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
+ * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다. + */ + + + function Flicking(element, options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.contentsReadyChecker = null; + _this.isPanelChangedAtBeforeSync = false; + /** + * Update panels to current state. + * @ko 패널들을 현재 상태에 맞춰 갱신한다. + * @method + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + _this.resize = function () { + var viewport = _this.viewport; + var options = _this.options; + + var wrapper = _this.getElement(); + + var allPanels = viewport.panelManager.allPanels(); + + if (!options.isConstantSize) { + allPanels.forEach(function (panel) { + return panel.unCacheBbox(); + }); + } + + var shouldResetElements = options.renderOnlyVisible && !options.isConstantSize && options.isEqualSize !== true; // Temporarily set parent's height to prevent scroll (#333) + + var parent = wrapper.parentElement; + var origStyle = parent.style.height; + parent.style.height = parent.offsetHeight + "px"; + viewport.unCacheBbox(); // This should be done before adding panels, to lower performance issue + + viewport.updateBbox(); + + if (shouldResetElements) { + viewport.appendUncachedPanelElements(allPanels); + } + + viewport.resize(); + parent.style.height = origStyle; + return _this; + }; + + _this.triggerEvent = function (eventName, // visibleChange event has no common event definition from other events + axesEvent, isTrusted, params) { + if (params === void 0) { + params = {}; + } + + var viewport = _this.viewport; + var canceled = true; // Ignore events before viewport is initialized + + if (viewport) { + var state = viewport.stateMachine.getState(); + + var _a = viewport.getScrollArea(), + prev = _a.prev, + next = _a.next; + + var pos = viewport.getCameraPosition(); + var progress = getProgress(pos, [prev, prev, next]); + + if (_this.options.circular) { + progress %= 1; + } + + canceled = !_super.prototype.trigger.call(_this, eventName, merge({ + type: eventName, + index: _this.getIndex(), + panel: _this.getCurrentPanel(), + direction: state.direction, + holding: state.holding, + progress: progress, + axesEvent: axesEvent, + isTrusted: isTrusted + }, params)); + } + + return { + onSuccess: function (callback) { + if (!canceled) { + callback(); + } + + return this; + }, + onStopped: function (callback) { + if (canceled) { + callback(); + } + + return this; + } + }; + }; // Return result of "move" event triggered + + + _this.moveCamera = function (axesEvent) { + var viewport = _this.viewport; + var state = viewport.stateMachine.getState(); + var options = _this.options; + var pos = axesEvent.pos.flick; + var previousPosition = viewport.getCameraPosition(); + + if (axesEvent.isTrusted && state.holding) { + var inputOffset = options.horizontal ? axesEvent.inputEvent.offsetX : axesEvent.inputEvent.offsetY; + var isNextDirection = inputOffset < 0; + var cameraChange = pos - previousPosition; + var looped = isNextDirection === pos < previousPosition; + + if (options.circular && looped) { + // Reached at max/min range of axes + var scrollAreaSize = viewport.getScrollAreaSize(); + cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange)); + } + + var currentDirection = cameraChange === 0 ? state.direction : cameraChange > 0 ? DIRECTION.NEXT : DIRECTION.PREV; + state.direction = currentDirection; + } + + state.delta += axesEvent.delta.flick; + viewport.moveCamera(pos, axesEvent); + return _this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted).onStopped(function () { + // Undo camera movement + viewport.moveCamera(previousPosition, axesEvent); + }); + }; // Set flicking wrapper user provided + + + var wrapper; + + if (isString(element)) { + wrapper = document.querySelector(element); + + if (!wrapper) { + throw new Error("Base element doesn't exist."); + } + } else if (element.nodeName && element.nodeType === 1) { + wrapper = element; + } else { + throw new Error("Element should be provided in string or HTMLElement."); + } + + _this.wrapper = wrapper; // Override default options + + _this.options = merge({}, DEFAULT_OPTIONS, options); // Override moveType option + + var currentOptions = _this.options; + var moveType = currentOptions.moveType; + + if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) { + currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType]; + } // Make viewport instance with panel container element + + + _this.viewport = new Viewport(_this, _this.options, _this.triggerEvent); + + _this.listenInput(); + + _this.listenResize(); + + return _this; // if (this.options.collectStatistics) { + // sendEvent( + // "usage", + // "options", + // options, + // ); + // } + } + /** + * Move to the previous panel if it exists. + * @ko 이전 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + var __proto = Flicking.prototype; + + __proto.prev = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var prevPanel = currentPanel.prev(); + + if (prevPanel) { + prevPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the next panel if it exists. + * @ko 다음 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.next = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var nextPanel = currentPanel.next(); + + if (nextPanel) { + nextPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the panel of given index. + * @ko 주어진 인덱스에 해당하는 패널로 이동한다. + * @param index The index number of the panel to move.이동할 패널의 인덱스 번호. + * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.moveTo = function (index, duration) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + var state = viewport.stateMachine.getState(); + + if (!panel || state.type !== STATE_TYPE.IDLE) { + return this; + } + + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = viewport.getHangerPosition(); + var targetPanel = panel; + + if (this.options.circular) { + var scrollAreaSize = viewport.getScrollAreaSize(); // Check all three possible locations, find the nearest position among them. + + var possiblePositions = [anchorPosition - scrollAreaSize, anchorPosition, anchorPosition + scrollAreaSize]; + var nearestPosition = possiblePositions.reduce(function (nearest, current) { + return Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition) ? current : nearest; + }, Infinity) - panel.getRelativeAnchorPosition(); + var identicals = panel.getIdenticalPanels(); + var offset = nearestPosition - anchorPosition; + + if (offset > 0) { + // First cloned panel is nearest + targetPanel = identicals[1]; + } else if (offset < 0) { + // Last cloned panel is nearest + targetPanel = identicals[identicals.length - 1]; + } + + targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true); + targetPanel.setPosition(nearestPosition); + } + + var currentIndex = this.getIndex(); + + if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) { + return this; + } + + var eventType = panel.getIndex() === viewport.getCurrentIndex() ? "" : EVENTS.CHANGE; + viewport.moveTo(targetPanel, viewport.findEstimatedPosition(targetPanel), eventType, null, duration); + return this; + }; + /** + * Return index of the current panel. `-1` if no panel exists. + * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다. + * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수. + */ + + + __proto.getIndex = function () { + return this.viewport.getCurrentIndex(); + }; + /** + * Return the wrapper element user provided in constructor. + * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다. + * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트. + */ + + + __proto.getElement = function () { + return this.wrapper; + }; + /** + * Return the viewport element's size. + * @ko 뷰포트 엘리먼트의 크기를 반환한다. + * @return Width if horizontal: true, height if horizontal: false + */ + + + __proto.getSize = function () { + return this.viewport.getSize(); + }; + /** + * Return current panel. `null` if no panel exists. + * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다. + * @return Current panel.현재 패널. + */ + + + __proto.getCurrentPanel = function () { + var viewport = this.viewport; + var panel = viewport.getCurrentPanel(); + return panel ? panel : null; + }; + /** + * Return the panel of given index. `null` if it doesn't exists. + * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다. + * @return Panel of given index.주어진 인덱스에 해당하는 패널. + */ + + + __proto.getPanel = function (index) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + return panel ? panel : null; + }; + /** + * Return all panels. + * @ko 모든 패널들을 반환한다. + * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부. + * @return All panels.모든 패널들. + */ + + + __proto.getAllPanels = function (includeClone) { + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var panels = includeClone ? panelManager.allPanels() : panelManager.originalPanels(); + return panels.filter(function (panel) { + return !!panel; + }); + }; + /** + * Return the panels currently shown in viewport area. + * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다. + * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들 + */ + + + __proto.getVisiblePanels = function () { + return this.viewport.calcVisiblePanels(); + }; + /** + * Return length of original panels. + * @ko 원본 패널의 개수를 반환한다. + * @return Length of original panels.원본 패널의 개수 + */ + + + __proto.getPanelCount = function () { + return this.viewport.panelManager.getPanelCount(); + }; + /** + * Return how many groups of clones are created. + * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다. + * @return Length of cloned panel groups.클론된 패널 그룹의 개수 + */ + + + __proto.getCloneCount = function () { + return this.viewport.panelManager.getCloneCount(); + }; + /** + * Get maximum panel index for `infinite` mode. + * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다. + * @see {@link eg.Flicking.FlickingOptions} + * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스. + */ + + + __proto.getLastIndex = function () { + return this.viewport.panelManager.getLastIndex(); + }; + /** + * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it. + * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다. + * @param - Maximum panel index. + * @see {@link eg.Flicking.FlickingOptions} + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.setLastIndex = function (index) { + this.viewport.setLastIndex(index); + return this; + }; + /** + * Return panel movement animation. + * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다. + * @return Is animating or not.애니메이션 진행 여부. + */ + + + __proto.isPlaying = function () { + return this.viewport.stateMachine.getState().playing; + }; + /** + * Unblock input devices. + * @ko 막았던 입력 장치로부터의 입력을 푼다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.enableInput = function () { + this.viewport.enable(); + return this; + }; + /** + * Block input devices. + * @ko 입력 장치로부터의 입력을 막는다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.disableInput = function () { + this.viewport.disable(); + return this; + }; + /** + * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}. + * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다. + * @return An object with current status value information.현재 상태값 정보를 가진 객체. + */ + + + __proto.getStatus = function () { + var viewport = this.viewport; + var panels = viewport.panelManager.originalPanels().filter(function (panel) { + return !!panel; + }).map(function (panel) { + return { + html: panel.getElement().outerHTML, + index: panel.getIndex() + }; + }); + return { + index: viewport.getCurrentIndex(), + panels: panels, + position: viewport.getCameraPosition() + }; + }; + /** + * Restore to the state of the `status`. + * @ko `status`의 상태로 복원한다. + * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다. + */ + + + __proto.setStatus = function (status) { + this.viewport.restore(status); + }; + /** + * Add plugins that can have different effects on Flicking. + * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다. + * @param - The plugin(s) to add.추가할 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.addPlugins = function (plugins) { + this.viewport.addPlugins(plugins); + return this; + }; + /** + * Remove plugins from Flicking. + * @ko 플리킹으로부터 플러그인들을 제거한다. + * @param - The plugin(s) to remove.제거 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.removePlugins = function (plugins) { + this.viewport.removePlugins(plugins); + return this; + }; + /** + * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes). + * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다. + * @example + * const flick = new eg.Flicking("#flick"); + * flick.destroy(); + * console.log(flick.moveTo); // null + */ + + + __proto.destroy = function (option) { + var _a; + + if (option === void 0) { + option = {}; + } + + this.off(); + + if (this.options.autoResize) { + window.removeEventListener("resize", this.resize); + } + + this.viewport.destroy(option); + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.destroy(); // release resources + + for (var x in this) { + this[x] = null; + } + }; + /** + * Add new panels at the beginning of panels. + * @ko 제일 앞에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.replace(3, document.createElement("div")); // Add new panel at index 3 + * flicking.prepend("\Panel\"); // Prepended at index 2 + * flicking.prepend(["\Panel\", document.createElement("div")]); // Prepended at index 0, 1 + * flicking.prepend("\Panel\"); // Prepended at index 0, pushing every panels behind it. + */ + + + __proto.prepend = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0); + var prependedPanels = viewport.insert(insertingIndex, parsedElements); + this.checkContentsReady(prependedPanels); + return prependedPanels; + }; + /** + * Add new panels at the end of panels. + * @ko 제일 끝에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.append(document.createElement("div")); // Appended at index 0 + * flicking.append("\Panel\"); // Appended at index 1 + * flicking.append(["\Panel\", document.createElement("div")]); // Appended at index 2, 3 + * // Even this is possible + * flicking.append("\Panel 1\\Panel 2\"); // Appended at index 4, 5 + */ + + + __proto.append = function (element) { + var viewport = this.viewport; + var appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element); + this.checkContentsReady(appendedPanels); + return appendedPanels; + }; + /** + * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index. + * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다. + * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스 + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * + * // This will add new panel at index 3, + * // Index 0, 1, 2 is empty at this moment. + * // [empty, empty, empty, PANEL] + * flicking.replace(3, document.createElement("div")); + * + * // As index 2 was empty, this will also add new panel at index 2. + * // [empty, empty, PANEL, PANEL] + * flicking.replace(2, "\Panel\"); + * + * // Index 3 was not empty, so it will replace previous one. + * // It will also add new panels at index 4 and 5. + * // before - [empty, empty, PANEL, PANEL] + * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL] + * flicking.replace(3, ["\Panel\", "\Panel\", "\Panel\"]) + */ + + + __proto.replace = function (index, element) { + var replacedPanels = this.viewport.replace(index, element); + this.checkContentsReady(replacedPanels); + return replacedPanels; + }; + /** + * Remove panel at target index. This will decrease index of panels behind it. + * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다. + * @param index - Index of panel to remove.제거할 패널의 인덱스 + * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수. + * @return Array of removed panels제거된 패널들의 배열 + */ + + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + return this.viewport.remove(index, deleteCount); + }; + /** + * Get indexes to render. Should be used with `renderOnlyVisible` option. + * `beforeSync` should be called before this method for a correct result. + * @private + * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다. + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @return Array of indexes to render.렌더링할 인덱스의 배열 + */ + + + __proto.getRenderingIndexes = function (diffResult) { + var viewport = this.viewport; + var visiblePanels = viewport.getVisiblePanels(); + var maintained = diffResult.maintained.reduce(function (values, _a) { + var before = _a[0], + after = _a[1]; + values[after] = before; + return values; + }, {}); + var panelCount = diffResult.list.length; + var added = diffResult.added; + + var getPanelAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount; + }; + + var visibleIndexes = visiblePanels.map(function (panel) { + return getPanelAbsIndex(panel); + }).filter(function (val) { + return maintained[val % panelCount] != null; + }); + + var renderingPanels = __spreadArrays(visibleIndexes, added); + + var allPanels = viewport.panelManager.allPanels(); + viewport.setVisiblePanels(renderingPanels.map(function (index) { + return allPanels[index]; + })); + return renderingPanels; + }; + /** + * Synchronize info of panels instance with info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다. + * @private + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 + */ + + + __proto.beforeSync = function (diffInfo) { + var _this = this; + + var maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var isCircular = this.options.circular; + var cloneCount = panelManager.getCloneCount(); + var prevClonedPanels = panelManager.clonedPanels(); // Update visible panels + + var newVisiblePanels = viewport.getVisiblePanels().filter(function (panel) { + return findIndex(removed, function (index) { + return index === panel.getIndex(); + }) < 0; + }); + viewport.setVisiblePanels(newVisiblePanels); // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0 && cloneCount === prevClonedPanels.length) { + return this; + } + + var prevOriginalPanels = panelManager.originalPanels(); + var newPanels = []; + var newClones = counter(cloneCount).map(function () { + return []; + }); + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newPanels[afterIdx] = prevOriginalPanels[beforeIdx]; + newPanels[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + newPanels[addIndex] = new Panel(null, addIndex, _this.viewport); + }); + + if (isCircular) { + counter(cloneCount).forEach(function (groupIndex) { + var prevCloneGroup = prevClonedPanels[groupIndex]; + var newCloneGroup = newClones[groupIndex]; + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newCloneGroup[afterIdx] = prevCloneGroup ? prevCloneGroup[beforeIdx] : newPanels[afterIdx].clone(groupIndex, false); + newCloneGroup[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + var newPanel = newPanels[addIndex]; + newCloneGroup[addIndex] = newPanel.clone(groupIndex, false); + }); + }); + } + + added.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index, + max: index + }); + }); + removed.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index - 1, + max: index + 1 + }); + }); + var checkedIndexes = viewport.getCheckedIndexes(); + checkedIndexes.forEach(function (_a, idx) { + var min = _a[0], + max = _a[1]; // Push checked indexes backward + + var pushedIndex = added.filter(function (index) { + return index < min && panelManager.has(index); + }).length - removed.filter(function (index) { + return index < min; + }).length; + checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + }); // Only effective only when there are least one panel which have changed its index + + if (changed.length > 0) { + // Removed checked index by changed ones after pushing + maintained.forEach(function (_a) { + var next = _a[1]; + viewport.updateCheckedIndexes({ + min: next, + max: next + }); + }); + } + + panelManager.replacePanels(newPanels, newClones); + this.isPanelChangedAtBeforeSync = true; + }; + /** + * Synchronize info of panels with DOM info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다. + * @private + * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트. + */ + + + __proto.sync = function (diffInfo) { + var list = diffInfo.list, + maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) { + return this; + } + + var viewport = this.viewport; + var _a = this.options, + renderOnlyVisible = _a.renderOnlyVisible, + circular = _a.circular; + var panelManager = viewport.panelManager; + + if (!renderOnlyVisible) { + var indexRange = panelManager.getRange(); + var beforeDiffInfo = diffInfo; + + if (circular) { + var prevOriginalPanelCount_1 = indexRange.max; + var originalPanelCount_1 = list.length / (panelManager.getCloneCount() + 1) >> 0; + var originalAdded = added.filter(function (index) { + return index < originalPanelCount_1; + }); + var originalRemoved = removed.filter(function (index) { + return index <= prevOriginalPanelCount_1; + }); + var originalMaintained = maintained.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + var originalChanged = changed.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + beforeDiffInfo = { + added: originalAdded, + maintained: originalMaintained, + removed: originalRemoved, + changed: originalChanged + }; + } + + this.beforeSync(beforeDiffInfo); + } + + var visiblePanels = renderOnlyVisible ? viewport.getVisiblePanels() : this.getAllPanels(true); + added.forEach(function (addedIndex) { + var addedElement = list[addedIndex]; + var beforePanel = visiblePanels[addedIndex]; + beforePanel.setElement(addedElement); // As it can be 0 + + beforePanel.unCacheBbox(); + }); + + if (this.isPanelChangedAtBeforeSync) { + // Reset visible panels + viewport.setVisiblePanels([]); + this.isPanelChangedAtBeforeSync = false; + } + + viewport.resize(); + return this; + }; + + __proto.listenInput = function () { + var flicking = this; + var viewport = flicking.viewport; + var stateMachine = viewport.stateMachine; // Set event context + + flicking.eventContext = { + flicking: flicking, + viewport: flicking.viewport, + transitTo: stateMachine.transitTo, + triggerEvent: flicking.triggerEvent, + moveCamera: flicking.moveCamera, + stopCamera: viewport.stopCamera + }; + var handlers = {}; + + var _loop_1 = function (key) { + var eventType = AXES_EVENTS[key]; + + handlers[eventType] = function (e) { + return stateMachine.fire(eventType, e, flicking.eventContext); + }; + }; + + for (var key in AXES_EVENTS) { + _loop_1(key); + } // Connect Axes instance with PanInput + + + flicking.viewport.connectAxesHandler(handlers); + }; + + __proto.listenResize = function () { + var _this = this; + + var options = this.options; + + if (options.autoResize) { + window.addEventListener("resize", this.resize); + } + + if (options.resizeOnContentsReady) { + var contentsReadyChecker = new ImReady(); + contentsReadyChecker.on("preReady", function () { + _this.resize(); + }); + contentsReadyChecker.on("readyElement", function (e) { + if (e.hasLoading && e.isPreReadyOver) { + _this.resize(); + } + }); + contentsReadyChecker.on("error", function (e) { + _this.trigger(EVENTS.CONTENT_ERROR, { + type: EVENTS.CONTENT_ERROR, + element: e.element + }); + }); + contentsReadyChecker.check([this.wrapper]); + this.contentsReadyChecker = contentsReadyChecker; + } + }; + + __proto.checkContentsReady = function (panels) { + var _a; + + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.check(panels.map(function (panel) { + return panel.getElement(); + })); + }; + /** + * Version info string + * @ko 버전정보 문자열 + * @example + * eg.Flicking.VERSION; // ex) 3.0.0 + * @memberof eg.Flicking + */ + + + Flicking.VERSION = "3.7.2"; + /** + * Direction constant - "PREV" or "NEXT" + * @ko 방향 상수 - "PREV" 또는 "NEXT" + * @type {object} + * @property {"PREV"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
+ * @property {"NEXT"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
+ * @example + * eg.Flicking.DIRECTION.PREV; // "PREV" + * eg.Flicking.DIRECTION.NEXT; // "NEXT" + */ + + Flicking.DIRECTION = DIRECTION; + /** + * Event type object with event name strings. + * @ko 이벤트 이름 문자열들을 담은 객체 + * @type {object} + * @property {"holdStart"} HOLD_START - holdStart eventholdStart 이벤트 + * @property {"holdEnd"} HOLD_END - holdEnd eventholdEnd 이벤트 + * @property {"moveStart"} MOVE_START - moveStart eventmoveStart 이벤트 + * @property {"move"} MOVE - move eventmove 이벤트 + * @property {"moveEnd"} MOVE_END - moveEnd eventmoveEnd 이벤트 + * @property {"change"} CHANGE - change eventchange 이벤트 + * @property {"restore"} RESTORE - restore eventrestore 이벤트 + * @property {"select"} SELECT - select eventselect 이벤트 + * @property {"needPanel"} NEED_PANEL - needPanel eventneedPanel 이벤트 + * @example + * eg.Flicking.EVENTS.MOVE_START; // "MOVE_START" + */ + + Flicking.EVENTS = EVENTS; + return Flicking; + }(Component); + + Flicking.withFlickingMethods = withFlickingMethods; + Flicking.DEFAULT_OPTIONS = DEFAULT_OPTIONS; + Flicking.MOVE_TYPE = MOVE_TYPE; + + return Flicking; + +}))); +//# sourceMappingURL=flicking.js.map diff --git a/dist/flicking.js.map b/dist/flicking.js.map new file mode 100644 index 0000000000..e00e491bdd --- /dev/null +++ b/dist/flicking.js.map @@ -0,0 +1 @@ +{"version":3,"file":"flicking.js","sources":["../src/consts.ts","../src/utils.ts","../src/components/Panel.ts","../src/components/PanelManager.ts","../src/states/State.ts","../src/states/IdleState.ts","../src/states/HoldingState.ts","../src/states/DraggingState.ts","../src/states/AnimatingState.ts","../src/states/DisabledState.ts","../src/components/StateMachine.ts","../src/moves/MoveType.ts","../src/moves/Snap.ts","../src/moves/FreeScroll.ts","../src/components/Viewport.ts","../src/Flicking.ts","../src/index.umd.ts"],"sourcesContent":["/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { FlickingOptions, EventType, Direction, AxesEventType, StateType, MoveTypeSnapOption, MoveTypeFreeScrollOption, FlickingMethodsKeys } from \"./types\";\n\nexport const MOVE_TYPE: {\n SNAP: \"snap\";\n FREE_SCROLL: \"freeScroll\";\n} = {\n SNAP: \"snap\",\n FREE_SCROLL: \"freeScroll\",\n};\n\nexport const DEFAULT_MOVE_TYPE_OPTIONS: {\n snap: MoveTypeSnapOption,\n freeScroll: MoveTypeFreeScrollOption,\n} = {\n snap: {\n type: \"snap\",\n count: 1,\n },\n freeScroll: {\n type: \"freeScroll\",\n },\n};\nexport const isBrowser = typeof document !== \"undefined\";\n\n/**\n * Default options for creating Flicking.\n * @ko 플리킹을 만들 때 사용하는 기본 옵션들\n * @private\n * @memberof eg.Flicking\n */\nexport const DEFAULT_OPTIONS: Readonly = {\n classPrefix: \"eg-flick\",\n deceleration: 0.0075,\n horizontal: true,\n circular: false,\n infinite: false,\n infiniteThreshold: 0,\n lastIndex: Infinity,\n threshold: 40,\n duration: 100,\n panelEffect: x => 1 - Math.pow(1 - x, 3),\n defaultIndex: 0,\n inputType: [\"touch\", \"mouse\"],\n thresholdAngle: 45,\n bounce: 10,\n autoResize: false,\n adaptive: false,\n zIndex: 2000,\n bound: false,\n overflow: false,\n hanger: \"50%\",\n anchor: \"50%\",\n gap: 0,\n moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap,\n useOffset: false,\n isEqualSize: false,\n isConstantSize: false,\n renderOnlyVisible: false,\n renderExternal: false,\n resizeOnContentsReady: false,\n iOSEdgeSwipeThreshold: 30,\n collectStatistics: true,\n};\n\nexport const DEFAULT_VIEWPORT_CSS = {\n position: \"relative\",\n zIndex: DEFAULT_OPTIONS.zIndex,\n overflow: \"hidden\",\n};\n\nexport const DEFAULT_CAMERA_CSS = {\n width: \"100%\",\n height: \"100%\",\n willChange: \"transform\",\n};\n\nexport const DEFAULT_PANEL_CSS = {\n position: \"absolute\",\n};\n\nexport const EVENTS: EventType = {\n HOLD_START: \"holdStart\",\n HOLD_END: \"holdEnd\",\n MOVE_START: \"moveStart\",\n MOVE: \"move\",\n MOVE_END: \"moveEnd\",\n CHANGE: \"change\",\n RESTORE: \"restore\",\n SELECT: \"select\",\n NEED_PANEL: \"needPanel\",\n VISIBLE_CHANGE: \"visibleChange\",\n CONTENT_ERROR: \"contentError\",\n};\n\nexport const AXES_EVENTS: AxesEventType = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\",\n};\n\nexport const STATE_TYPE: StateType = {\n IDLE: 0,\n HOLDING: 1,\n DRAGGING: 2,\n ANIMATING: 3,\n DISABLED: 4,\n};\n\nexport const DIRECTION: Direction = {\n PREV: \"PREV\",\n NEXT: \"NEXT\",\n};\nexport const FLICKING_METHODS: {[key in FlickingMethodsKeys]: true} = {\n prev: true,\n next: true,\n moveTo: true,\n getIndex: true,\n getAllPanels: true,\n getCurrentPanel: true,\n getElement: true,\n getSize: true,\n getPanel: true,\n getPanelCount: true,\n getStatus: true,\n getVisiblePanels: true,\n enableInput: true,\n disableInput: true,\n destroy: true,\n resize: true,\n setStatus: true,\n isPlaying: true,\n};\n\n// Check whether browser supports transform: translate3d\n// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\nexport let checkTranslateSupport = () => {\n const transforms = {\n webkitTransform: \"-webkit-transform\",\n msTransform: \"-ms-transform\",\n MozTransform: \"-moz-transform\",\n OTransform: \"-o-transform\",\n transform: \"transform\",\n };\n\n if (!isBrowser) {\n return {\n name: transforms.transform,\n has3d: true,\n };\n }\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform in transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new Error(\"Browser doesn't support CSS3 2D Transforms.\");\n }\n\n const el = document.createElement(\"div\");\n\n document.documentElement.insertBefore(el, null);\n\n el.style[transformName] = \"translate3d(1px, 1px, 1px)\";\n const styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]);\n\n el.parentElement!.removeChild(el);\n\n const transformInfo = {\n name: transformName,\n has3d: styleVal.length > 0 && styleVal !== \"none\",\n };\n\n checkTranslateSupport = () => transformInfo;\n\n return transformInfo;\n};\n\nexport const TRANSFORM = checkTranslateSupport();\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ElementLike, OriginalStyle, BoundingBox } from \"./types\";\nimport Flicking from \"./Flicking\";\nimport { FLICKING_METHODS } from \"./consts\";\n\nexport function merge(target: object, ...srcs: object[]): object {\n srcs.forEach(source => {\n Object.keys(source).forEach(key => {\n const value = source[key];\n target[key] = value;\n });\n });\n\n return target;\n}\n\nexport function parseElement(element: ElementLike | ElementLike[]): HTMLElement[] {\n if (!Array.isArray(element)) {\n element = [element];\n }\n\n const elements: HTMLElement[] = [];\n element.forEach(el => {\n if (isString(el)) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = el;\n\n elements.push(...toArray(tempDiv.children) as HTMLElement[]);\n while (tempDiv.firstChild) {\n tempDiv.removeChild(tempDiv.firstChild);\n }\n } else {\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n// Get class list of element as string array\nexport function classList(element: HTMLElement): string[] {\n return element.classList\n ? toArray(element.classList)\n : element.className.split(\" \");\n}\n\n// Add class to specified element\nexport function addClass(element: HTMLElement, className: string): void {\n if (element.classList) {\n element.classList.add(className);\n } else {\n if (!hasClass(element, className)) {\n element.className = (`${element.className} ${className}`).replace(/\\s{2,}/g, \" \");\n }\n }\n}\n\nexport function hasClass(element: HTMLElement, className: string): boolean {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return (element.className.split(\" \").indexOf(className) >= 0);\n }\n}\n\nexport function applyCSS(element: HTMLElement, cssObj: object): void {\n Object.keys(cssObj).forEach(property => {\n element.style[property] = cssObj[property];\n });\n}\n\nexport function clamp(val: number, min: number, max: number) {\n return Math.max(Math.min(val, max), min);\n}\n\n// Min: inclusive, Max: exclusive\nexport function isBetween(val: number, min: number, max: number) {\n return val >= min && val <= max;\n}\n\nexport interface ArrayLike {\n length: number;\n [index: number]: T;\n}\n\nexport function toArray(iterable: ArrayLike): T[] {\n return [].slice.call(iterable);\n}\n\nexport function isArray(arr: any): boolean {\n return arr && arr.constructor === Array;\n}\n\nexport function parseArithmeticExpression(cssValue: number | string, base: number, defaultVal?: number): number {\n // Set base / 2 to default value, if it's undefined\n const defaultValue = defaultVal != null ? defaultVal : base / 2;\n const cssRegex = /(?:(\\+|\\-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return clamp(cssValue, 0, base);\n }\n\n let idx = 0;\n let calculatedValue = 0;\n let matchResult = cssRegex.exec(cssValue);\n while (matchResult != null) {\n let sign = matchResult[1];\n const value = matchResult[2];\n const unit = matchResult[3];\n\n let parsedValue = parseFloat(value);\n\n if (idx <= 0) {\n sign = sign || \"+\";\n }\n\n // Return default value for values not in good form\n if (!sign) {\n return defaultValue;\n }\n\n if (unit === \"%\") {\n parsedValue = (parsedValue / 100) * base;\n }\n\n calculatedValue += sign === \"+\"\n ? parsedValue\n : -parsedValue;\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return defaultValue;\n }\n\n // Clamp between 0 ~ base\n return clamp(calculatedValue, 0, base);\n}\n\nexport function getProgress(pos: number, range: number[]) {\n // start, anchor, end\n // -1 , 0 , 1\n const [min, center, max] = range;\n\n if (pos > center && (max - center)) {\n // 0 ~ 1\n return (pos - center) / (max - center);\n } else if (pos < center && (center - min)) {\n // -1 ~ 0\n return (pos - center) / (center - min);\n } else if (pos !== center && max - min) {\n return (pos - min) / (max - min);\n }\n return 0;\n}\n\nexport function findIndex(iterable: T[], callback: (el: T) => boolean): number {\n for (let i = 0; i < iterable.length; i += 1) {\n const element = iterable[i];\n if (element && callback(element)) {\n return i;\n }\n }\n\n return -1;\n}\n\n// return [0, 1, ...., max - 1]\nexport function counter(max: number): number[] {\n const counterArray: number[] = [];\n for (let i = 0; i < max; i += 1) {\n counterArray[i] = i;\n }\n return counterArray;\n}\n\n// Circulate number between range [min, max]\n/*\n * \"indexed\" means min and max is not same, so if it's true \"min - 1\" should be max\n * While if it's false, \"min - 1\" should be \"max - 1\"\n * use `indexed: true` when it should be used for circulating integers like index\n * or `indexed: false` when it should be used for something like positions.\n */\nexport function circulate(value: number, min: number, max: number, indexed: boolean): number {\n const size = indexed\n ? max - min + 1\n : max - min;\n if (value < min) {\n const offset = indexed\n ? (min - value - 1) % size\n : (min - value) % size;\n value = max - offset;\n } else if (value > max) {\n const offset = indexed\n ? (value - max - 1) % size\n : (value - max) % size;\n value = min + offset;\n }\n\n return value;\n}\n\nexport function restoreStyle(element: HTMLElement, originalStyle: OriginalStyle): void {\n originalStyle.className\n ? element.setAttribute(\"class\", originalStyle.className)\n : element.removeAttribute(\"class\");\n originalStyle.style\n ? element.setAttribute(\"style\", originalStyle.style)\n : element.removeAttribute(\"style\");\n}\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터.\n * @memberof eg.Flicking\n * @private\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nexport function withFlickingMethods(prototype: any, flickingName: string) {\n Object.keys(FLICKING_METHODS).forEach((name: keyof Flicking) => {\n if (prototype[name]) {\n return;\n }\n prototype[name] = function(...args) {\n const result = this[flickingName][name](...args);\n\n // fix `this` type to return your own `flicking` instance to the instance using the decorator.\n if (result === this[flickingName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n}\n\nexport function getBbox(element: HTMLElement, useOffset: boolean) {\n let bbox: BoundingBox;\n if (useOffset) {\n bbox = {\n x: 0,\n y: 0,\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n } else {\n const clientRect = element.getBoundingClientRect();\n bbox = {\n x: clientRect.left,\n y: clientRect.top,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n return bbox;\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Viewport from \"./Viewport\";\nimport { OriginalStyle, FlickingPanel, ElementLike, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_PANEL_CSS, EVENTS } from \"../consts\";\nimport { addClass, applyCSS, parseArithmeticExpression, parseElement, getProgress, restoreStyle, hasClass, getBbox } from \"../utils\";\n\nclass Panel implements FlickingPanel {\n public viewport: Viewport;\n public prevSibling: Panel | null;\n public nextSibling: Panel | null;\n\n protected state: {\n index: number;\n position: number;\n relativeAnchorPosition: number;\n size: number;\n isClone: boolean;\n isVirtual: boolean;\n // Index of cloned panel, zero-based integer(original: -1, cloned: [0, 1, 2, ...])\n // if cloneIndex is 0, that means it's first cloned panel of original panel\n cloneIndex: number;\n originalStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n private element: HTMLElement;\n private original?: Panel;\n private clonedPanels: Panel[];\n\n public constructor(\n element?: HTMLElement | null,\n index?: number,\n viewport?: Viewport,\n ) {\n this.viewport = viewport!;\n this.prevSibling = null;\n this.nextSibling = null;\n this.clonedPanels = [];\n\n this.state = {\n index: index!,\n position: 0,\n relativeAnchorPosition: 0,\n size: 0,\n isClone: false,\n isVirtual: false,\n cloneIndex: -1,\n originalStyle: {\n className: \"\",\n style: \"\",\n },\n cachedBbox: null,\n };\n this.setElement(element);\n }\n\n public resize(givenBbox?: BoundingBox): void {\n const state = this.state;\n const options = this.viewport.options;\n const bbox = givenBbox\n ? givenBbox\n : this.getBbox();\n this.state.cachedBbox = bbox;\n const prevSize = state.size;\n\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size);\n }\n\n if (!state.isClone) {\n this.clonedPanels.forEach(panel => {\n const cloneState = panel.state;\n\n cloneState.size = state.size;\n cloneState.cachedBbox = state.cachedBbox;\n cloneState.relativeAnchorPosition = state.relativeAnchorPosition;\n });\n }\n }\n\n public unCacheBbox(): void {\n this.state.cachedBbox = null;\n }\n\n public getProgress() {\n const viewport = this.viewport;\n const options = viewport.options;\n const panelCount = viewport.panelManager.getPanelCount();\n const scrollAreaSize = viewport.getScrollAreaSize();\n\n const relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex();\n const progress = relativeIndex - viewport.getCurrentProgress();\n\n return progress;\n }\n\n public getOutsetProgress() {\n const viewport = this.viewport;\n const outsetRange = [\n -this.getSize(),\n viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(),\n viewport.getSize(),\n ];\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const outsetProgress = getProgress(relativePanelPosition, outsetRange);\n\n return outsetProgress;\n }\n\n public getVisibleRatio() {\n const viewport = this.viewport;\n const panelSize = this.getSize();\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const rightRelativePanelPosition = relativePanelPosition + panelSize;\n\n const visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0);\n const visibleRatio = visibleSize >= 0\n ? visibleSize / panelSize\n : 0;\n\n return visibleRatio;\n }\n\n public focus(duration?: number): void {\n const viewport = this.viewport;\n const currentPanel = viewport.getCurrentPanel();\n const hangerPosition = viewport.getHangerPosition();\n const anchorPosition = this.getAnchorPosition();\n if (hangerPosition === anchorPosition || !currentPanel) {\n return;\n }\n\n const currentPosition = currentPanel.getPosition();\n const eventType = currentPosition === this.getPosition()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration);\n }\n\n public update(updateFunction: ((element: HTMLElement) => any) | null = null, shouldResize: boolean = true): void {\n const identicalPanels = this.getIdenticalPanels();\n\n if (updateFunction) {\n identicalPanels.forEach(eachPanel => {\n updateFunction(eachPanel.getElement());\n });\n }\n\n if (shouldResize) {\n identicalPanels.forEach(eachPanel => {\n eachPanel.unCacheBbox();\n });\n this.viewport.addVisiblePanel(this);\n this.viewport.resize();\n }\n }\n\n public prev(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const prevSibling = this.prevSibling;\n\n if (!prevSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const prevPanelIndex = prevSibling.getIndex();\n const prevPanelPosition = prevSibling.getPosition();\n const prevPanelSize = prevSibling.getSize();\n\n const hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1;\n const notYetMinPanel = options.infinite\n && currentIndex > 0\n && prevPanelIndex > currentIndex;\n\n if (hasEmptyPanelBetween || notYetMinPanel) {\n // Empty panel exists between\n return null;\n }\n\n const newPosition = currentPosition - prevPanelSize - options.gap;\n\n let prevPanel = prevSibling;\n if (prevPanelPosition !== newPosition) {\n prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true);\n prevPanel.setPosition(newPosition);\n }\n\n return prevPanel;\n }\n\n public next(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const nextSibling = this.nextSibling;\n const lastIndex = viewport.panelManager.getLastIndex();\n\n if (!nextSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const nextPanelIndex = nextSibling.getIndex();\n const nextPanelPosition = nextSibling.getPosition();\n\n const hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1;\n const notYetMaxPanel = options.infinite\n && currentIndex < lastIndex\n && nextPanelIndex < currentIndex;\n\n if (hasEmptyPanelBetween || notYetMaxPanel) {\n return null;\n }\n\n const newPosition = currentPosition + this.getSize() + options.gap;\n\n let nextPanel = nextSibling;\n if (nextPanelPosition !== newPosition) {\n nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true);\n nextPanel.setPosition(newPosition);\n }\n\n return nextPanel;\n }\n\n public insertBefore(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n const firstPanel = viewport.panelManager.firstPanel()!;\n const prevSibling = this.prevSibling;\n // Finding correct inserting index\n // While it should insert removing empty spaces,\n // It also should have to be bigger than prevSibling' s index\n const targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex()\n ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length)\n : Math.max(this.getIndex() - parsedElements.length, 0);\n\n return viewport.insert(targetIndex, parsedElements);\n }\n\n public insertAfter(element: ElementLike | ElementLike[]): FlickingPanel[] {\n return this.viewport.insert(this.getIndex() + 1, element);\n }\n\n public remove(): FlickingPanel {\n this.viewport.remove(this.getIndex());\n\n return this;\n }\n\n public destroy(option: Partial): void {\n if (!option.preserveUI) {\n const originalStyle = this.state.originalStyle;\n\n restoreStyle(this.element, originalStyle);\n }\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getAnchorPosition(): number {\n return this.state.position + this.state.relativeAnchorPosition;\n }\n\n public getRelativeAnchorPosition(): number {\n return this.state.relativeAnchorPosition;\n }\n\n public getIndex(): number {\n return this.state.index;\n }\n\n public getPosition(): number {\n return this.state.position;\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getBbox(): BoundingBox {\n const state = this.state;\n const viewport = this.viewport;\n const element = this.element;\n const options = viewport.options;\n\n if (!element) {\n state.cachedBbox = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n } else if (!state.cachedBbox) {\n const wasVisible = Boolean(element.parentNode);\n const cameraElement = viewport.getCameraElement();\n if (!wasVisible) {\n cameraElement.appendChild(element);\n viewport.addVisiblePanel(this);\n }\n state.cachedBbox = getBbox(element, options.useOffset);\n\n if (!wasVisible && viewport.options.renderExternal) {\n cameraElement.removeChild(element);\n }\n }\n return state.cachedBbox!;\n }\n\n public isClone(): boolean {\n return this.state.isClone;\n }\n\n public getOverlappedClass(classes: string[]): string | undefined {\n const element = this.element;\n\n for (const className of classes) {\n if (hasClass(element, className)) {\n return className;\n }\n }\n }\n\n public getCloneIndex(): number {\n return this.state.cloneIndex;\n }\n\n public getClonedPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getClonedPanels()\n : this.clonedPanels;\n }\n\n public getIdenticalPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getIdenticalPanels()\n : [this, ...this.clonedPanels];\n }\n\n public getOriginalPanel(): Panel {\n return this.state.isClone\n ? this.original!\n : this;\n }\n\n public setIndex(index: number): void {\n const state = this.state;\n\n state.index = index;\n this.clonedPanels.forEach(panel => panel.state.index = index);\n }\n\n public setPosition(pos: number): this {\n this.state.position = pos;\n\n return this;\n }\n\n public setPositionCSS(offset: number = 0): void {\n if (!this.element) {\n return;\n }\n const state = this.state;\n const pos = state.position;\n const options = this.viewport.options;\n const elementStyle = this.element.style;\n const currentElementStyle = options.horizontal\n ? elementStyle.left\n : elementStyle.top;\n const styleToApply = `${pos - offset}px`;\n\n if (!state.isVirtual && currentElementStyle !== styleToApply) {\n options.horizontal\n ? elementStyle.left = styleToApply\n : elementStyle.top = styleToApply;\n }\n }\n\n public clone(cloneIndex: number, isVirtual: boolean = false, element?: HTMLElement | null): Panel {\n const state = this.state;\n const viewport = this.viewport;\n let cloneElement = element;\n\n if (!cloneElement && this.element) {\n cloneElement = isVirtual ? this.element : this.element.cloneNode(true) as HTMLElement;\n }\n const clonedPanel = new Panel(cloneElement, state.index, viewport);\n const clonedState = clonedPanel.state;\n\n clonedPanel.original = state.isClone\n ? this.original\n : this;\n clonedState.isClone = true;\n clonedState.isVirtual = isVirtual;\n clonedState.cloneIndex = cloneIndex;\n // Inherit some state values\n clonedState.size = state.size;\n clonedState.relativeAnchorPosition = state.relativeAnchorPosition;\n clonedState.originalStyle = state.originalStyle;\n clonedState.cachedBbox = state.cachedBbox;\n\n if (!isVirtual) {\n this.clonedPanels.push(clonedPanel);\n } else {\n clonedPanel.prevSibling = this.prevSibling;\n clonedPanel.nextSibling = this.nextSibling;\n }\n\n return clonedPanel;\n }\n\n public removeElement(): void {\n if (!this.viewport.options.renderExternal) {\n const element = this.element;\n element.parentNode && element.parentNode.removeChild(element);\n }\n\n // Do the same thing for clones\n if (!this.state.isClone) {\n this.removeClonedPanelsAfter(0);\n }\n }\n\n public removeClonedPanelsAfter(start: number): void {\n const options = this.viewport.options;\n const removingPanels = this.clonedPanels.splice(start);\n\n if (!options.renderExternal) {\n removingPanels.forEach(panel => {\n panel.removeElement();\n });\n }\n }\n\n public setElement(element?: HTMLElement | null): void {\n if (!element) {\n return;\n }\n const currentElement = this.element;\n if (element !== currentElement) {\n const options = this.viewport.options;\n\n if (currentElement) {\n if (options.horizontal) {\n element.style.left = currentElement.style.left;\n } else {\n element.style.top = currentElement.style.top;\n }\n } else {\n const originalStyle = this.state.originalStyle;\n\n originalStyle.className = element.getAttribute(\"class\");\n originalStyle.style = element.getAttribute(\"style\");\n }\n\n this.element = element;\n\n if (options.classPrefix) {\n addClass(element, `${options.classPrefix}-panel`);\n }\n\n // Update size info after applying panel css\n applyCSS(this.element, DEFAULT_PANEL_CSS);\n }\n }\n}\n\nexport default Panel;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"./Panel\";\nimport { FlickingOptions } from \"../types\";\nimport { findIndex, counter } from \"../utils\";\n\nclass PanelManager {\n private cameraElement: HTMLElement;\n private options: FlickingOptions;\n private panels: Panel[];\n private clones: Panel[][];\n // index range of existing panels\n private range: {\n min: number;\n max: number;\n };\n private length: number;\n private lastIndex: number;\n private cloneCount: number;\n\n constructor(\n cameraElement: HTMLElement,\n options: FlickingOptions,\n ) {\n this.cameraElement = cameraElement;\n this.panels = [];\n this.clones = [];\n this.range = {\n min: -1,\n max: -1,\n };\n this.length = 0;\n this.cloneCount = 0;\n this.options = options;\n this.lastIndex = options.lastIndex;\n }\n\n public firstPanel(): Panel | undefined {\n return this.panels[this.range.min];\n }\n\n public lastPanel(): Panel | undefined {\n return this.panels[this.range.max];\n }\n\n public allPanels(): ReadonlyArray {\n return [\n ...this.panels,\n ...this.clones.reduce((allClones, clones) => [...allClones, ...clones], []),\n ];\n }\n\n public originalPanels(): ReadonlyArray {\n return this.panels;\n }\n\n public clonedPanels(): ReadonlyArray {\n return this.clones;\n }\n\n public replacePanels(newPanels: Panel[], newClones: Panel[][]): void {\n this.panels = newPanels;\n this.clones = newClones;\n\n this.range = {\n min: findIndex(newPanels, panel => Boolean(panel)),\n max: newPanels.length - 1,\n };\n this.length = newPanels.filter(panel => Boolean(panel)).length;\n }\n\n public has(index: number): boolean {\n return !!this.panels[index];\n }\n\n public get(index: number): Panel | undefined {\n return this.panels[index];\n }\n\n public getPanelCount(): number {\n return this.length;\n }\n\n public getLastIndex(): number {\n return this.lastIndex;\n }\n\n public getRange(): Readonly<{ min: number, max: number }> {\n return this.range;\n }\n\n public getCloneCount(): number {\n return this.cloneCount;\n }\n\n public setLastIndex(lastIndex: number): void {\n this.lastIndex = lastIndex;\n\n const firstPanel = this.firstPanel();\n const lastPanel = this.lastPanel();\n\n if (!firstPanel || !lastPanel) {\n return; // no meaning of updating range & length\n }\n\n // Remove panels above new last index\n const range = this.range;\n if (lastPanel.getIndex() > lastIndex) {\n const removingPanels = this.panels.splice(lastIndex + 1);\n this.length -= removingPanels.length;\n\n const firstRemovedPanel = removingPanels.filter(panel => !!panel)[0];\n const possibleLastPanel = firstRemovedPanel.prevSibling;\n if (possibleLastPanel) {\n range.max = possibleLastPanel.getIndex();\n } else {\n range.min = -1;\n range.max = -1;\n }\n\n if (this.shouldRender()) {\n removingPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n public setCloneCount(cloneCount: number): void {\n this.cloneCount = cloneCount;\n }\n\n // Insert at index\n // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it\n public insert(index: number, newPanels: Panel[]): number {\n const panels = this.panels;\n const range = this.range;\n const isCircular = this.options.circular;\n const lastIndex = this.lastIndex;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n let pushedIndex = newPanels.length;\n // Like when setting index 50 while visible panels are 0, 1, 2\n if (index > range.max) {\n newPanels.forEach((panel, offset) => {\n panels[index + offset] = panel;\n });\n } else {\n const panelsAfterIndex = panels.slice(index, index + newPanels.length);\n // Find empty from beginning\n let emptyPanelCount = findIndex(panelsAfterIndex, panel => !!panel);\n if (emptyPanelCount < 0) {\n // All empty\n emptyPanelCount = panelsAfterIndex.length;\n }\n pushedIndex = newPanels.length - emptyPanelCount;\n\n // Insert removing empty panels\n panels.splice(index, emptyPanelCount, ...newPanels);\n\n // Remove panels after last index\n if (panels.length > lastIndex + 1) {\n const removedPanels = panels.splice(lastIndex + 1)\n .filter(panel => Boolean(panel));\n this.length -= removedPanels.length;\n\n // Find first\n const newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), panel => !!panel);\n\n // Can be filled with empty after newLastIndex\n this.panels.splice(newLastIndex + 1);\n this.range.max = newLastIndex;\n\n if (this.shouldRender()) {\n removedPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n // Update index of previous panels\n if (pushedIndex > 0) {\n panels.slice(index + newPanels.length).forEach(panel => {\n panel.setIndex(panel.getIndex() + pushedIndex);\n });\n }\n\n // Update state\n this.length += newPanels.length;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling);\n const clones = this.clones;\n const panelCount = this.panels.length;\n if (clones[0] && clones[0].length > lastIndex + 1) {\n clones.forEach(cloneSet => {\n cloneSet.splice(panelCount);\n });\n }\n }\n\n return pushedIndex;\n }\n\n public replace(index: number, newPanels: Panel[]): Panel[] {\n const panels = this.panels;\n const range = this.range;\n const options = this.options;\n const isCircular = options.circular;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index + newPanels.length);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n if (index > range.max) {\n // Temporarily insert null at index to use splice()\n (panels[index] as any) = null;\n }\n\n const replacedPanels = panels.splice(index, newPanels.length, ...newPanels);\n const wasNonEmptyCount = replacedPanels.filter(panel => Boolean(panel)).length;\n\n // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1]\n // So length should be increased by 3(inserting panels) - 1(non-empty panels)\n this.length += newPanels.length - wasNonEmptyCount;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length, nextSibling);\n }\n\n if (this.shouldRender()) {\n replacedPanels.forEach(panel => panel && panel.removeElement());\n }\n\n return replacedPanels;\n }\n\n public remove(index: number, deleteCount: number = 1): Panel[] {\n const isCircular = this.options.circular;\n const panels = this.panels;\n const clones = this.clones;\n // Delete count should be equal or larger than 0\n deleteCount = Math.max(deleteCount, 0);\n\n const deletedPanels = panels\n .splice(index, deleteCount)\n .filter(panel => !!panel);\n\n if (this.shouldRender()) {\n deletedPanels.forEach(panel => panel.removeElement());\n }\n\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(index, deleteCount);\n });\n }\n\n // Update indexes\n panels\n .slice(index)\n .forEach(panel => {\n panel.setIndex(panel.getIndex() - deleteCount);\n });\n\n // Check last panel is empty\n let lastIndex = panels.length - 1;\n if (!panels[lastIndex]) {\n const reversedPanels = panels.concat().reverse();\n const nonEmptyIndexFromLast = findIndex(reversedPanels, panel => !!panel);\n lastIndex = nonEmptyIndexFromLast < 0\n ? -1 // All empty\n : lastIndex - nonEmptyIndexFromLast;\n\n // Remove all empty panels from last\n panels.splice(lastIndex + 1);\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(lastIndex + 1);\n });\n }\n }\n\n // Update range & length\n this.range = {\n min: findIndex(panels, panel => !!panel),\n max: lastIndex,\n };\n this.length -= deletedPanels.length;\n\n if (this.length <= 0) {\n // Reset clones\n this.clones = [];\n this.cloneCount = 0;\n }\n\n return deletedPanels;\n }\n\n public chainAllPanels() {\n const allPanels = this.allPanels().filter(panel => !!panel);\n const allPanelsCount = allPanels.length;\n\n if (allPanelsCount <= 1) {\n return;\n }\n\n allPanels.slice(1, allPanels.length - 1).forEach((panel, idx) => {\n const prevPanel = allPanels[idx];\n const nextPanel = allPanels[idx + 2];\n\n panel.prevSibling = prevPanel;\n panel.nextSibling = nextPanel;\n });\n\n const firstPanel = allPanels[0];\n const lastPanel = allPanels[allPanelsCount - 1];\n\n firstPanel.prevSibling = null;\n firstPanel.nextSibling = allPanels[1];\n lastPanel.prevSibling = allPanels[allPanelsCount - 2];\n lastPanel.nextSibling = null;\n\n if (this.options.circular) {\n firstPanel.prevSibling = lastPanel;\n lastPanel.nextSibling = firstPanel;\n }\n }\n\n public insertClones(cloneIndex: number, index: number, clonedPanels: Panel[], deleteCount: number = 0): void {\n const clones = this.clones;\n const lastIndex = this.lastIndex;\n\n if (!clones[cloneIndex]) {\n const newClones: Panel[] = [];\n clonedPanels.forEach((panel, offset) => {\n newClones[index + offset] = panel;\n });\n\n clones[cloneIndex] = newClones;\n } else {\n const insertTarget = clones[cloneIndex];\n\n if (index >= insertTarget.length) {\n clonedPanels.forEach((panel, offset) => {\n insertTarget[index + offset] = panel;\n });\n } else {\n insertTarget.splice(index, deleteCount, ...clonedPanels);\n // Remove panels after last index\n if (clonedPanels.length > lastIndex + 1) {\n clonedPanels.splice(lastIndex + 1);\n }\n }\n }\n }\n\n // clones are operating in set\n public removeClonesAfter(cloneIndex: number): void {\n const panels = this.panels;\n\n panels.forEach(panel => {\n panel.removeClonedPanelsAfter(cloneIndex);\n });\n this.clones.splice(cloneIndex);\n }\n\n public findPanelOf(element: HTMLElement): Panel | undefined {\n const allPanels = this.allPanels();\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const panelElement = panel.getElement();\n if (panelElement.contains(element)) {\n return panel;\n }\n }\n }\n\n public findFirstPanelFrom(index: number): Panel | undefined {\n for (const panel of this.panels.slice(index)) {\n if (panel && panel.getIndex() >= index && panel.getElement().parentNode) {\n return panel;\n }\n }\n }\n\n private addNewClones(index: number, originalPanels: Panel[], deleteCount: number, nextSibling: Panel | undefined) {\n const cameraElement = this.cameraElement;\n const cloneCount = this.getCloneCount();\n const lastPanel = this.lastPanel();\n const lastPanelClones: Panel[] = lastPanel\n ? lastPanel.getClonedPanels()\n : [];\n const nextSiblingClones: Panel[] = nextSibling\n ? nextSibling.getClonedPanels()\n : [];\n\n for (const cloneIndex of counter(cloneCount)) {\n const cloneNextSibling = nextSiblingClones[cloneIndex];\n const lastPanelSibling = lastPanelClones[cloneIndex];\n\n const cloneSiblingElement = cloneNextSibling\n ? cloneNextSibling.getElement()\n : lastPanelSibling\n ? lastPanelSibling.getElement().nextElementSibling\n : null;\n\n const newClones = originalPanels.map(panel => {\n const clone = panel.clone(cloneIndex);\n\n if (this.shouldRender()) {\n cameraElement.insertBefore(clone.getElement(), cloneSiblingElement);\n }\n\n return clone;\n });\n\n this.insertClones(cloneIndex, index, newClones, deleteCount);\n }\n }\n\n private updateIndex(insertingIndex: number) {\n const panels = this.panels;\n const range = this.range;\n\n const newLastIndex = panels.length - 1;\n if (newLastIndex > range.max) {\n range.max = newLastIndex;\n }\n if (insertingIndex < range.min || range.min < 0) {\n range.min = insertingIndex;\n }\n }\n\n private insertNewPanels(newPanels: Panel[], siblingElement: HTMLElement | null) {\n if (this.shouldRender()) {\n const fragment = document.createDocumentFragment();\n newPanels.forEach(panel => fragment.appendChild(panel.getElement()));\n this.cameraElement.insertBefore(fragment, siblingElement);\n }\n }\n\n private shouldRender(): boolean {\n const options = this.options;\n\n return !options.renderExternal && !options.renderOnlyVisible;\n }\n}\n\nexport default PanelManager;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"../components/Panel\";\nimport { ValueOf, Direction, StateType, FlickingContext } from \"../types\";\n\nabstract class State {\n public delta: number = 0;\n public direction: ValueOf | null = null;\n public targetPanel: Panel | null = null;\n public lastPosition: number = 0;\n public abstract readonly type: ValueOf;\n public abstract readonly holding: boolean;\n public abstract readonly playing: boolean;\n\n public onEnter(prevState: State): void {\n this.delta = prevState.delta;\n this.direction = prevState.direction;\n this.targetPanel = prevState.targetPanel;\n this.lastPosition = prevState.lastPosition;\n }\n\n public onExit(nextState: State): void {\n // DO NOTHING\n }\n\n public onHold(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onChange(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onAnimationEnd(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onFinish(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n}\n\nexport default State;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { EVENTS, STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass IdleState extends State {\n public readonly type = STATE_TYPE.IDLE;\n public readonly holding = false;\n public readonly playing = false;\n\n public onEnter() {\n this.direction = null;\n this.targetPanel = null;\n this.delta = 0;\n this.lastPosition = 0;\n }\n\n public onHold(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Shouldn't do any action until any panels on flicking area\n if (flicking.getPanelCount() <= 0) {\n if (viewport.options.infinite) {\n viewport.moveCamera(viewport.getCameraPosition(), e);\n }\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n this.lastPosition = viewport.getCameraPosition();\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.HOLDING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n // By methods call\n public onChange(e: any, context: FlickingContext): void {\n const { triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.MOVE_START, e, false)\n .onSuccess(() => {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n}\n\nexport default IdleState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS, DIRECTION } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass HoldingState extends State {\n public readonly type = STATE_TYPE.HOLDING;\n public readonly holding = true;\n public readonly playing = true;\n\n private releaseEvent: any = null;\n\n public onChange(e: any, context: FlickingContext): void {\n const { flicking, triggerEvent, transitTo } = context;\n\n const offset = flicking.options.horizontal\n ? e.inputEvent.offsetX\n : e.inputEvent.offsetY;\n this.direction = offset < 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n triggerEvent(EVENTS.MOVE_START, e, true)\n .onSuccess(() => {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { viewport, triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n if (e.delta.flick !== 0) {\n // Sometimes \"release\" event on axes triggered before \"change\" event\n // Especially if user flicked panel fast in really short amount of time\n // if delta is not zero, that means above case happened.\n\n // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END\n // At least one move event should be included between holdStart and holdEnd\n e.setTo({ flick: viewport.getCameraPosition() }, 0);\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n // Can't handle select event here,\n // As \"finish\" axes event happens\n this.releaseEvent = e;\n }\n\n public onFinish(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Should transite to IDLE state before select event\n // As user expects hold is already finished\n transitTo(STATE_TYPE.IDLE);\n\n if (!this.releaseEvent) {\n return;\n }\n\n // Handle release event here\n // To prevent finish event called twice\n const releaseEvent = this.releaseEvent;\n\n // Static click\n const srcEvent = releaseEvent.inputEvent.srcEvent;\n\n let clickedElement: HTMLElement;\n if (srcEvent.type === \"touchend\") {\n const touchEvent = srcEvent as TouchEvent;\n const touch = touchEvent.changedTouches[0];\n clickedElement = document.elementFromPoint(touch.clientX, touch.clientY) as HTMLElement;\n } else {\n clickedElement = srcEvent.target;\n }\n const clickedPanel = viewport.panelManager.findPanelOf(clickedElement);\n const cameraPosition = viewport.getCameraPosition();\n\n if (clickedPanel) {\n const clickedPanelPosition = clickedPanel.getPosition();\n const direction = clickedPanelPosition > cameraPosition\n ? DIRECTION.NEXT\n : clickedPanelPosition < cameraPosition\n ? DIRECTION.PREV\n : null;\n\n // Don't provide axes event, to use axes instance instead\n triggerEvent(EVENTS.SELECT, null, true, {\n direction, // Direction to the clicked panel\n index: clickedPanel.getIndex(),\n panel: clickedPanel,\n });\n }\n }\n}\n\nexport default HoldingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DraggingState extends State {\n public readonly type = STATE_TYPE.DRAGGING;\n public readonly holding = true;\n public readonly playing = true;\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { flicking, viewport, triggerEvent, transitTo, stopCamera } = context;\n\n const delta = this.delta;\n const absDelta = Math.abs(delta);\n const options = flicking.options;\n const horizontal = options.horizontal;\n const moveType = viewport.moveType;\n const inputEvent = e.inputEvent;\n\n const velocity = horizontal\n ? inputEvent.velocityX\n : inputEvent.velocityY;\n const inputDelta = horizontal\n ? inputEvent.deltaX\n : inputEvent.deltaY;\n const isNextDirection = Math.abs(velocity) > 1\n ? velocity < 0\n : absDelta > 0\n ? delta > 0\n : inputDelta < 0;\n\n const swipeDistance = viewport.options.bound\n ? Math.max(absDelta, Math.abs(inputDelta))\n : absDelta;\n const swipeAngle = inputEvent.deltaX\n ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI)\n : 90;\n const belowAngleThreshold = horizontal\n ? swipeAngle <= options.thresholdAngle\n : swipeAngle > options.thresholdAngle;\n const overThreshold = swipeDistance >= options.threshold\n && belowAngleThreshold;\n\n const moveTypeContext = {\n viewport,\n axesEvent: e,\n state: this,\n swipeDistance,\n isNextDirection,\n };\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n const targetPanel = this.targetPanel;\n if (!overThreshold && targetPanel) {\n // Interrupted while animating\n const interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext);\n\n viewport.moveTo(\n interruptDestInfo.panel,\n interruptDestInfo.destPos,\n interruptDestInfo.eventType,\n e,\n interruptDestInfo.duration,\n );\n transitTo(STATE_TYPE.ANIMATING);\n return;\n }\n\n const currentPanel = viewport.getCurrentPanel();\n const nearestPanel = viewport.getNearestPanel();\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n e.stop();\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n const destInfo = overThreshold\n ? moveType.findTargetPanel(moveTypeContext)\n : moveType.findRestorePanel(moveTypeContext);\n\n viewport.moveTo(\n destInfo.panel,\n destInfo.destPos,\n destInfo.eventType,\n e,\n destInfo.duration,\n ).onSuccess(() => {\n transitTo(STATE_TYPE.ANIMATING);\n }).onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n stopCamera(e);\n });\n }\n}\n\nexport default DraggingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\nimport { circulate } from \"../utils\";\n\nclass AnimatingState extends State {\n public readonly type = STATE_TYPE.ANIMATING;\n public readonly holding = false;\n public readonly playing = true;\n\n public onHold(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n const options = viewport.options;\n const scrollArea = viewport.getScrollArea();\n const scrollAreaSize = viewport.getScrollAreaSize();\n const loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize);\n\n const targetPanel = this.targetPanel;\n if (options.circular && loopCount !== 0 && targetPanel) {\n const cloneCount = viewport.panelManager.getCloneCount();\n const originalTargetPosition = targetPanel.getPosition();\n\n // cloneIndex is from -1 to cloneCount - 1\n const newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true);\n const newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize;\n const newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true);\n\n // Set new target panel considering looped count\n newTargetPanel.setPosition(newTargetPosition);\n this.targetPanel = newTargetPanel;\n }\n\n // Reset last position and delta\n this.delta = 0;\n this.lastPosition = viewport.getCameraPosition();\n\n // Update current panel as current nearest panel\n viewport.setCurrentPanel(viewport.getNearestPanel()!);\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.DRAGGING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onFinish(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext) {\n const isTrusted = e && e.isTrusted;\n\n viewport.options.bound\n ? viewport.setCurrentPanel(this.targetPanel!)\n : viewport.setCurrentPanel(viewport.getNearestPanel()!);\n\n if (flicking.options.adaptive) {\n viewport.updateAdaptiveSize();\n }\n\n transitTo(STATE_TYPE.IDLE);\n viewport.updateCameraPosition();\n triggerEvent(EVENTS.MOVE_END, e, isTrusted, {\n direction: this.direction,\n });\n }\n}\n\nexport default AnimatingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DisabledState extends State {\n public readonly type = STATE_TYPE.DISABLED;\n public readonly holding = false;\n public readonly playing = true;\n\n public onAnimationEnd(e: any, { transitTo }: FlickingContext): void {\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(e: any, { viewport, transitTo }: FlickingContext): void {\n // Can stop Axes's change event\n e.stop();\n\n // Should update axes position as it's already changed at this moment\n viewport.updateAxesPosition(viewport.getCameraPosition());\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(e: any, { transitTo }: FlickingContext): void {\n // This is needed when stopped hold start event\n if (e.delta.flick === 0) {\n transitTo(STATE_TYPE.IDLE);\n }\n }\n}\n\nexport default DisabledState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"../states/State\";\nimport { AxesEventType, ValueOf, FlickingContext, StateType } from \"../types\";\nimport { AXES_EVENTS, STATE_TYPE } from \"../consts\";\nimport IdleState from \"../states/IdleState\";\nimport HoldingState from \"../states/HoldingState\";\nimport DraggingState from \"../states/DraggingState\";\nimport AnimatingState from \"../states/AnimatingState\";\nimport DisabledState from \"../states/DisabledState\";\n\nclass StateMachine {\n private state: State = new IdleState();\n\n public fire(eventType: ValueOf, e: any, context: FlickingContext) {\n const currentState = this.state;\n switch (eventType) {\n case AXES_EVENTS.HOLD:\n currentState.onHold(e, context);\n break;\n case AXES_EVENTS.CHANGE:\n currentState.onChange(e, context);\n break;\n case AXES_EVENTS.RELEASE:\n currentState.onRelease(e, context);\n break;\n case AXES_EVENTS.ANIMATION_END:\n currentState.onAnimationEnd(e, context);\n break;\n case AXES_EVENTS.FINISH:\n currentState.onFinish(e, context);\n break;\n }\n }\n\n public getState(): State {\n return this.state;\n }\n\n public transitTo = (nextStateType: ValueOf): State => {\n const currentState = this.state;\n\n if (currentState.type !== nextStateType) {\n let nextState: State;\n\n switch (nextStateType) {\n case STATE_TYPE.IDLE:\n nextState = new IdleState();\n break;\n case STATE_TYPE.HOLDING:\n nextState = new HoldingState();\n break;\n case STATE_TYPE.DRAGGING:\n nextState = new DraggingState();\n break;\n case STATE_TYPE.ANIMATING:\n nextState = new AnimatingState();\n break;\n case STATE_TYPE.DISABLED:\n nextState = new DisabledState();\n break;\n }\n\n currentState.onExit(nextState!);\n nextState!.onEnter(currentState);\n\n this.state = nextState!;\n }\n return this.state;\n }\n}\n\nexport default StateMachine;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { MoveTypeStringOption, MoveTypeContext, DestinationInfo } from \"../types\";\nimport Panel from \"../components/Panel\";\nimport { EVENTS } from \"../consts\";\n\nabstract class MoveType {\n protected readonly abstract type: string;\n\n public abstract findTargetPanel(ctx: MoveTypeContext): DestinationInfo;\n\n public is(type: MoveTypeStringOption): boolean {\n return type === this.type;\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n const viewport = ctx.viewport;\n const options = viewport.options;\n\n const panel = options.circular\n ? this.findRestorePanelInCircularMode(ctx)\n : viewport.getCurrentPanel()!;\n\n return {\n panel,\n destPos: viewport.findEstimatedPosition(panel),\n duration: options.duration,\n eventType: EVENTS.RESTORE,\n };\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { state, viewport } = ctx;\n const targetPanel = state.targetPanel!;\n\n return {\n panel: targetPanel,\n destPos: viewport.findEstimatedPosition(targetPanel),\n duration: viewport.options.duration,\n eventType: \"\",\n };\n }\n\n // Calculate minimum distance to \"change\" panel\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const relativeAnchorPosition = currentPanel.getRelativeAnchorPosition();\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |--------|--------------|\n * [][ |<-Anchor ][] <- Panel + Half-Gap\n */\n let minimumDistanceToChange = isNextDirection\n ? currentPanel.getSize() - relativeAnchorPosition + halfGap\n : relativeAnchorPosition + halfGap;\n\n minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold);\n\n return minimumDistanceToChange;\n }\n\n private findRestorePanelInCircularMode(ctx: MoveTypeContext): Panel {\n const viewport = ctx.viewport;\n const originalPanel = viewport.getCurrentPanel()!.getOriginalPanel();\n const hangerPosition = viewport.getHangerPosition();\n\n const firstClonedPanel = originalPanel.getIdenticalPanels()[1];\n const lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition);\n\n return (!ctx.isNextDirection && lapped)\n ? firstClonedPanel\n : originalPanel;\n }\n}\n\nexport default MoveType;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport MoveType from \"./MoveType\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { clamp } from \"../utils\";\n\nclass Snap extends MoveType {\n protected readonly type: string = MOVE_TYPE.SNAP;\n protected count: number;\n\n constructor(count: number) {\n super();\n this.count = count;\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, axesEvent, swipeDistance } = ctx;\n const snapCount = this.count;\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const currentPanel = viewport.getCurrentPanel()!;\n const nearestPanel = viewport.getNearestPanel()!;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex();\n\n // This can happen when bounce is 0\n const shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent;\n const shouldMoveToAdjacent = !viewport.isOutOfBound()\n && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0);\n\n if (snapCount > 1 && eventDelta > minimumDistanceToChange) {\n return this.findSnappedPanel(ctx);\n } else if (shouldMoveToAdjacent) {\n return this.findAdjacentPanel(ctx);\n } else {\n return {\n panel: nearestPanel,\n duration: viewport.options.duration,\n destPos: viewport.findEstimatedPosition(nearestPanel),\n // As swipeDistance holds mouse/touch position change regardless of bounce option value\n // swipDistance > minimumDistanceToChange can happen in bounce area\n // Second condition is for handling that.\n eventType: (swipeDistance <= minimumDistanceToChange)\n || (viewport.isOutOfBound() && nearestIsCurrent)\n ? EVENTS.RESTORE\n : EVENTS.CHANGE,\n };\n }\n }\n\n protected findSnappedPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, viewport, state, isNextDirection } = ctx;\n\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const snapCount = this.count;\n const options = viewport.options;\n const scrollAreaSize = viewport.getScrollAreaSize();\n const halfGap = options.gap / 2;\n const estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition();\n\n let panelToMove = viewport.getNearestPanel()!;\n let cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone)\n let passedPanelCount = 0;\n\n while (passedPanelCount < snapCount) {\n // Since panelToMove holds also cloned panels, we should use original panel's position\n const originalPanel = panelToMove.getOriginalPanel();\n const panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize;\n const panelSize = originalPanel.getSize();\n\n const panelNextPosition = panelPosition + panelSize + halfGap;\n const panelPrevPosition = panelPosition - halfGap;\n\n // Current panelToMove contains destPos\n if (\n (isNextDirection && panelNextPosition > estimatedHangerPos)\n || (!isNextDirection && panelPrevPosition < estimatedHangerPos)\n ) {\n break;\n }\n\n const siblingPanel = isNextDirection\n ? panelToMove.nextSibling\n : panelToMove.prevSibling;\n if (!siblingPanel) {\n break;\n }\n\n const panelIndex = panelToMove.getIndex();\n const siblingIndex = siblingPanel.getIndex();\n if ((isNextDirection && siblingIndex <= panelIndex)\n || (!isNextDirection && siblingIndex >= panelIndex)\n ) {\n cycleIndex = isNextDirection\n ? cycleIndex + 1\n : cycleIndex - 1;\n }\n panelToMove = siblingPanel;\n passedPanelCount += 1;\n }\n\n const originalPosition = panelToMove.getOriginalPanel().getPosition();\n\n if (cycleIndex !== 0) {\n panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true);\n panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize);\n }\n\n const defaultDuration = viewport.options.duration;\n const duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount);\n\n return {\n panel: panelToMove,\n destPos: viewport.findEstimatedPosition(panelToMove),\n duration,\n eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange\n ? EVENTS.CHANGE\n : EVENTS.RESTORE,\n };\n }\n\n private findAdjacentPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentIndex = viewport.getCurrentIndex();\n const currentPanel = viewport.panelManager.get(currentIndex)!;\n const hangerPosition = viewport.getHangerPosition();\n const scrollArea = viewport.getScrollArea();\n\n const firstClonedPanel = currentPanel.getIdenticalPanels()[1];\n const lapped = options.circular\n && (Math.abs(currentPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition));\n\n // If lapped in circular mode, use first cloned panel as base panel\n const basePanel = lapped\n ? firstClonedPanel\n : currentPanel;\n const basePosition = basePanel.getPosition();\n\n const adjacentPanel = isNextDirection\n ? basePanel.nextSibling\n : basePanel.prevSibling;\n\n const eventType = adjacentPanel\n ? EVENTS.CHANGE\n : EVENTS.RESTORE;\n const panelToMove = adjacentPanel\n ? adjacentPanel\n : basePanel;\n const targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition();\n\n const estimatedPanelPosition = options.circular\n ? isNextDirection\n ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap\n : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap\n : panelToMove.getAnchorPosition();\n const estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition();\n const destPos = viewport.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return {\n panel: panelToMove,\n destPos,\n duration: options.duration,\n eventType,\n };\n }\n}\n\nexport default Snap;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Snap from \"./Snap\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { circulate, clamp } from \"../utils\";\n\nclass FreeScroll extends Snap {\n protected readonly type: string = MOVE_TYPE.FREE_SCROLL;\n\n constructor() {\n // Set snap count to Infinity\n super(Infinity);\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, state, viewport } = ctx;\n const destPos = axesEvent.destPos.flick;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const scrollArea = viewport.getScrollArea();\n const currentPanel = viewport.getCurrentPanel()!;\n const options = viewport.options;\n\n const delta = Math.abs(axesEvent.delta.flick + state.delta);\n if (delta > minimumDistanceToChange) {\n const destInfo = super.findSnappedPanel(ctx);\n\n destInfo.duration = axesEvent.duration;\n destInfo.destPos = destPos;\n destInfo.eventType = !options.circular && destInfo.panel === currentPanel\n ? \"\"\n : EVENTS.CHANGE;\n\n return destInfo;\n } else {\n let estimatedPosition = options.circular\n ? circulate(destPos, scrollArea.prev, scrollArea.next, false)\n : destPos;\n estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next);\n estimatedPosition += viewport.getRelativeHangerPosition();\n\n const estimatedPanel = viewport.findNearestPanelAt(estimatedPosition)!;\n\n return {\n panel: estimatedPanel,\n destPos,\n duration: axesEvent.duration,\n eventType: \"\",\n };\n }\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n return this.findTargetPanel(ctx);\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { viewport } = ctx;\n\n return {\n panel: viewport.getNearestPanel()!,\n destPos: viewport.getCameraPosition(),\n duration: 0,\n eventType: \"\",\n };\n }\n\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const lastPosition = viewport.stateMachine.getState().lastPosition;\n const currentPanelPosition = currentPanel.getPosition();\n\n // As camera can stop anywhere in free scroll mode,\n // minimumDistanceToChange should be calculated differently.\n // Ref #191(https://github.com/naver/egjs-flicking/issues/191)\n const lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition();\n\n const scrollAreaSize = viewport.getScrollAreaSize();\n let minimumDistanceToChange = isNextDirection\n ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap\n : lastHangerPosition - currentPanelPosition + halfGap;\n minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize);\n\n return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange);\n }\n}\n\nexport default FreeScroll;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Axes, { PanInput } from \"@egjs/axes\";\n\nimport Flicking from \"../Flicking\";\nimport Panel from \"./Panel\";\nimport PanelManager from \"./PanelManager\";\nimport StateMachine from \"./StateMachine\";\nimport MoveType from \"../moves/MoveType\";\nimport { FlickingOptions, FlickingPanel, FlickingStatus, ElementLike, EventType, TriggerCallback, NeedPanelEvent, FlickingEvent, MoveTypeObjectOption, OriginalStyle, Plugin, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_VIEWPORT_CSS, DEFAULT_CAMERA_CSS, TRANSFORM, DEFAULT_OPTIONS, EVENTS, DIRECTION, STATE_TYPE, MOVE_TYPE } from \"../consts\";\nimport { clamp, applyCSS, toArray, parseArithmeticExpression, isBetween, isArray, parseElement, hasClass, restoreStyle, circulate, findIndex, getBbox } from \"../utils\";\nimport Snap from \"../moves/Snap\";\nimport FreeScroll from \"../moves/FreeScroll\";\n\nexport default class Viewport {\n public options: FlickingOptions;\n public stateMachine: StateMachine;\n public panelManager: PanelManager;\n public moveType: MoveType;\n\n private flicking: Flicking;\n private axes: Axes;\n private panInput: PanInput | null;\n\n private viewportElement: HTMLElement;\n private cameraElement: HTMLElement;\n\n private triggerEvent: Flicking[\"triggerEvent\"];\n private axesHandlers: { [key: string]: any };\n\n private currentPanel: Panel | undefined;\n private nearestPanel: Panel | undefined;\n private visiblePanels: Panel[];\n\n private plugins: Plugin[] = [];\n private panelBboxes: { [className: string]: BoundingBox };\n private state: {\n size: number;\n position: number;\n panelMaintainRatio: number;\n relativeHangerPosition: number;\n positionOffset: number;\n scrollArea: {\n prev: number;\n next: number;\n };\n translate: {\n name: string,\n has3d: boolean,\n };\n infiniteThreshold: number;\n checkedIndexes: Array<[number, number]>;\n isAdaptiveCached: boolean;\n isViewportGiven: boolean;\n isCameraGiven: boolean;\n originalViewportStyle: OriginalStyle;\n originalCameraStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n\n constructor(\n flicking: Flicking,\n options: FlickingOptions,\n triggerEvent: Flicking[\"triggerEvent\"],\n ) {\n this.flicking = flicking;\n this.triggerEvent = triggerEvent;\n\n this.state = {\n size: 0,\n position: 0,\n panelMaintainRatio: 0,\n relativeHangerPosition: 0,\n positionOffset: 0,\n scrollArea: {\n prev: 0,\n next: 0,\n },\n translate: TRANSFORM,\n infiniteThreshold: 0,\n checkedIndexes: [],\n isAdaptiveCached: false,\n isViewportGiven: false,\n isCameraGiven: false,\n originalViewportStyle: {\n className: null,\n style: null,\n },\n originalCameraStyle: {\n className: null,\n style: null,\n },\n cachedBbox: null,\n };\n this.options = options;\n this.stateMachine = new StateMachine();\n this.visiblePanels = [];\n this.panelBboxes = {};\n\n this.build();\n }\n\n public moveTo(\n panel: Panel,\n destPos: number,\n eventType: EventType[\"CHANGE\"] | EventType[\"RESTORE\"] | \"\",\n axesEvent: any,\n duration: number = this.options.duration,\n ): TriggerCallback {\n const state = this.state;\n const currentState = this.stateMachine.getState();\n const currentPosition = state.position;\n\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n const direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n let eventResult: TriggerCallback;\n if (eventType === EVENTS.CHANGE) {\n eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, {\n index: panel.getIndex(),\n panel,\n direction,\n });\n } else if (eventType === EVENTS.RESTORE) {\n eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted);\n } else {\n eventResult = {\n onSuccess(callback: () => void): TriggerCallback {\n callback();\n return this;\n },\n onStopped(): TriggerCallback {\n return this;\n },\n };\n }\n\n eventResult.onSuccess(() => {\n currentState.delta = 0;\n currentState.lastPosition = this.getCameraPosition();\n currentState.targetPanel = panel;\n currentState.direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n if (destPos === currentPosition) {\n // no move\n this.nearestPanel = panel;\n this.currentPanel = panel;\n }\n\n if (axesEvent && axesEvent.setTo) {\n // freeScroll only occurs in release events\n axesEvent.setTo({ flick: destPos }, duration);\n } else {\n this.axes.setTo({ flick: destPos }, duration);\n }\n });\n\n return eventResult;\n }\n\n public moveCamera(pos: number, axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const transform = state.translate.name;\n const scrollArea = state.scrollArea;\n\n // Update position & nearestPanel\n if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) {\n pos = circulate(pos, scrollArea.prev, scrollArea.next, false);\n }\n state.position = pos;\n this.nearestPanel = this.findNearestPanel();\n const nearestPanel = this.nearestPanel;\n const originalNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n // From 0(panel position) to 1(panel position + panel size)\n // When it's on gap area value will be (val > 1 || val < 0)\n if (nearestPanel) {\n const hangerPosition = this.getHangerPosition();\n const panelPosition = nearestPanel.getPosition();\n const panelSize = nearestPanel.getSize();\n const halfGap = options.gap / 2;\n\n // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap\n state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap);\n } else {\n state.panelMaintainRatio = 0;\n }\n\n this.checkNeedPanel(axesEvent);\n\n // Possibly modified after need panel, if it's looped\n const modifiedNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n pos += (modifiedNearestPosition - originalNearestPosition);\n state.position = pos;\n\n this.updateVisiblePanels();\n\n // Offset is needed to fix camera layer size in visible-only rendering mode\n const posOffset = options.renderOnlyVisible\n ? state.positionOffset\n : 0;\n const moveVector = options.horizontal\n ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)];\n const moveCoord = moveVector.map(coord => `${Math.round(coord)}px`).join(\", \");\n\n this.cameraElement.style[transform] = state.translate.has3d\n ? `translate3d(${moveCoord}, 0px)`\n : `translate(${moveCoord})`;\n }\n\n public stopCamera = (axesEvent: any): void => {\n if (axesEvent && axesEvent.setTo) {\n axesEvent.setTo({ flick: this.state.position }, 0);\n }\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n\n public unCacheBbox(): void {\n const state = this.state;\n const options = this.options;\n\n state.cachedBbox = null;\n this.visiblePanels = [];\n\n const viewportElement = this.viewportElement;\n if (!options.horizontal) {\n // Don't preserve previous width for adaptive resizing\n viewportElement.style.width = \"\";\n } else {\n viewportElement.style.height = \"\";\n }\n state.isAdaptiveCached = false;\n this.panelBboxes = {};\n }\n\n public resize(): void {\n this.updateSize();\n this.updateOriginalPanelPositions();\n this.updateAdaptiveSize();\n this.updateScrollArea();\n this.updateClonePanels();\n this.updateVisiblePanelPositions();\n this.updateCameraPosition();\n this.updatePlugins();\n }\n\n // Find nearest anchor from current hanger position\n public findNearestPanel(): Panel | undefined {\n const state = this.state;\n const panelManager = this.panelManager;\n const hangerPosition = this.getHangerPosition();\n\n if (this.isOutOfBound()) {\n const position = state.position;\n\n return position <= state.scrollArea.prev\n ? panelManager.firstPanel()\n : panelManager.lastPanel();\n }\n\n return this.findNearestPanelAt(hangerPosition);\n }\n\n public findNearestPanelAt(position: number): Panel | undefined {\n const panelManager = this.panelManager;\n\n const allPanels = panelManager.allPanels();\n let minimumDistance = Infinity;\n let nearestPanel: Panel | undefined;\n\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const prevPosition = panel.getPosition();\n const nextPosition = prevPosition + panel.getSize();\n\n // Use shortest distance from panel's range\n const distance = isBetween(position, prevPosition, nextPosition)\n ? 0\n : Math.min(\n Math.abs(prevPosition - position),\n Math.abs(nextPosition - position),\n );\n\n if (distance > minimumDistance) {\n break;\n } else if (distance === minimumDistance) {\n const minimumAnchorDistance = Math.abs(position - nearestPanel!.getAnchorPosition());\n const anchorDistance = Math.abs(position - panel.getAnchorPosition());\n\n if (anchorDistance > minimumAnchorDistance) {\n break;\n }\n }\n\n minimumDistance = distance;\n nearestPanel = panel;\n }\n\n return nearestPanel;\n }\n\n public findNearestIdenticalPanel(panel: Panel): Panel {\n let nearest = panel;\n let shortestDistance = Infinity;\n const hangerPosition = this.getHangerPosition();\n\n const identicals = panel.getIdenticalPanels();\n identicals.forEach(identical => {\n const anchorPosition = identical.getAnchorPosition();\n const distance = Math.abs(anchorPosition - hangerPosition);\n\n if (distance < shortestDistance) {\n nearest = identical;\n shortestDistance = distance;\n }\n });\n\n return nearest;\n }\n\n // Find shortest camera position that distance is minimum\n public findShortestPositionToPanel(panel: Panel): number {\n const state = this.state;\n const options = this.options;\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = this.getHangerPosition();\n const distance = Math.abs(hangerPosition - anchorPosition);\n const scrollAreaSize = state.scrollArea.next - state.scrollArea.prev;\n\n if (!options.circular) {\n const position = anchorPosition - state.relativeHangerPosition;\n return this.canSetBoundMode()\n ? clamp(position, state.scrollArea.prev, state.scrollArea.next)\n : position;\n } else {\n // If going out of viewport border is more efficient way of moving, choose that position\n return distance <= scrollAreaSize - distance\n ? anchorPosition - state.relativeHangerPosition\n : anchorPosition > hangerPosition\n // PREV TO NEXT\n ? anchorPosition - state.relativeHangerPosition - scrollAreaSize\n // NEXT TO PREV\n : anchorPosition - state.relativeHangerPosition + scrollAreaSize;\n }\n }\n\n public findEstimatedPosition(panel: Panel): number {\n const scrollArea = this.getScrollArea();\n\n let estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition();\n estimatedPosition = this.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return estimatedPosition;\n }\n\n public addVisiblePanel(panel: Panel): void {\n if (this.getVisibleIndexOf(panel) < 0) {\n this.visiblePanels.push(panel);\n }\n }\n\n public enable(): void {\n if (!this.panInput) {\n this.createPanInput();\n }\n }\n\n public disable(): void {\n if (this.panInput) {\n this.panInput.destroy();\n this.panInput = null;\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n }\n\n public insert(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const lastIndex = this.panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const state = this.state;\n const options = this.options;\n const parsedElements = parseElement(element);\n\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const pushedIndex = this.panelManager.insert(index, panels);\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n if (!this.currentPanel) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index });\n state.checkedIndexes.forEach((indexes, idx) => {\n const [min, max] = indexes;\n if (index < min) {\n // Push checked index\n state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n }\n });\n\n this.resize();\n\n return panels;\n }\n\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const lastIndex = panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const parsedElements = parseElement(element);\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const replacedPanels = panelManager.replace(index, panels);\n\n replacedPanels.forEach(panel => {\n const visibleIndex = this.getVisibleIndexOf(panel);\n if (visibleIndex > -1) {\n this.visiblePanels.splice(visibleIndex, 1);\n }\n });\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n const currentPanel = this.currentPanel;\n const wasEmpty = !currentPanel;\n if (wasEmpty) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n } else if (isBetween(currentPanel!.getIndex(), index, index + panels.length - 1)) {\n // Current panel is replaced\n this.currentPanel = panelManager.get(currentPanel!.getIndex());\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index + panels.length - 1 });\n\n this.resize();\n\n return panels;\n }\n\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n const state = this.state;\n // Index should not below 0\n index = Math.max(index, 0);\n\n const panelManager = this.panelManager;\n const currentIndex = this.getCurrentIndex();\n\n const removedPanels = panelManager.remove(index, deleteCount);\n if (isBetween(currentIndex, index, index + deleteCount - 1)) {\n // Current panel is removed\n // Use panel at removing index - 1 as new current panel if it exists\n const newCurrentIndex = Math.max(index - 1, panelManager.getRange().min);\n this.currentPanel = panelManager.get(newCurrentIndex);\n }\n\n // Update checked indexes in infinite mode\n if (deleteCount > 0) {\n // Check whether removing index will affect checked indexes\n // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa.\n this.updateCheckedIndexes({ min: index - 1, max: index + deleteCount });\n // Uncache visible panels to refresh panels\n this.visiblePanels = [];\n }\n\n if (panelManager.getPanelCount() <= 0) {\n this.currentPanel = undefined;\n this.nearestPanel = undefined;\n }\n\n this.resize();\n\n const scrollArea = state.scrollArea;\n if (state.position < scrollArea.prev || state.position > scrollArea.next) {\n const newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false);\n this.moveCamera(newPosition);\n this.updateAxesPosition(newPosition);\n }\n\n return removedPanels;\n }\n\n public updateAdaptiveSize(): void {\n const state = this.state;\n const options = this.options;\n const horizontal = options.horizontal;\n const currentPanel = this.getCurrentPanel();\n\n if (!currentPanel) {\n return;\n }\n\n const shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached;\n const viewportStyle = this.viewportElement.style;\n if (shouldApplyAdaptive) {\n let sizeToApply: number;\n if (options.adaptive) {\n const panelBbox = currentPanel.getBbox();\n\n sizeToApply = horizontal ? panelBbox.height : panelBbox.width;\n } else {\n // Find minimum height of panels to maximum panel size\n const maximumPanelSize = this.panelManager.originalPanels().reduce((maximum, panel) => {\n const panelBbox = panel.getBbox();\n return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width);\n }, 0);\n\n sizeToApply = maximumPanelSize;\n }\n\n if (!state.isAdaptiveCached) {\n const viewportBbox = this.updateBbox();\n sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width);\n state.isAdaptiveCached = true;\n }\n\n const viewportSize = `${sizeToApply}px`;\n if (horizontal) {\n viewportStyle.height = viewportSize;\n state.cachedBbox!.height = sizeToApply;\n } else {\n viewportStyle.width = viewportSize;\n state.cachedBbox!.width = sizeToApply;\n }\n }\n }\n\n // Update camera position after resizing\n public updateCameraPosition(): void {\n const state = this.state;\n const currentPanel = this.getCurrentPanel();\n const cameraPosition = this.getCameraPosition();\n const currentState = this.stateMachine.getState();\n const isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL);\n const relativeHangerPosition = this.getRelativeHangerPosition();\n const halfGap = this.options.gap / 2;\n\n if (currentState.holding || currentState.playing) {\n this.updateVisiblePanels();\n return;\n }\n\n let newPosition: number;\n if (isFreeScroll) {\n const positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next);\n const nearestPanel = this.getNearestPanel();\n\n // Preserve camera position if it is bound to scroll area limit\n newPosition = positionBounded || !nearestPanel\n ? cameraPosition\n : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition;\n } else {\n newPosition = currentPanel\n ? currentPanel.getAnchorPosition() - relativeHangerPosition\n : cameraPosition;\n }\n\n if (this.canSetBoundMode()) {\n newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next);\n }\n\n // Pause & resume axes to prevent axes's \"change\" event triggered\n // This should be done before moveCamera, as moveCamera can trigger needPanel\n this.updateAxesPosition(newPosition);\n\n this.moveCamera(newPosition);\n }\n\n public updateBbox(): BoundingBox {\n const state = this.state;\n const options = this.options;\n const viewportElement = this.viewportElement;\n\n if (!state.cachedBbox) {\n state.cachedBbox = getBbox(viewportElement, options.useOffset);\n }\n\n return state.cachedBbox!;\n }\n\n public updatePlugins(): void {\n // update for resize\n this.plugins.forEach(plugin => {\n plugin.update && plugin.update(this.flicking);\n });\n }\n\n public destroy(option: Partial): void {\n const state = this.state;\n const wrapper = this.flicking.getElement();\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const originalPanels = this.panelManager.originalPanels();\n\n this.removePlugins(this.plugins);\n if (!option.preserveUI) {\n restoreStyle(viewportElement, state.originalViewportStyle);\n restoreStyle(cameraElement, state.originalCameraStyle);\n\n if (!state.isCameraGiven && !this.options.renderExternal) {\n const topmostElement = state.isViewportGiven\n ? viewportElement\n : wrapper;\n const deletingElement = state.isViewportGiven\n ? cameraElement\n : viewportElement;\n\n originalPanels.forEach(panel => {\n topmostElement.appendChild(panel.getElement());\n });\n\n topmostElement.removeChild(deletingElement);\n }\n }\n\n this.axes.destroy();\n this.panInput?.destroy();\n\n originalPanels.forEach(panel => { panel.destroy(option); });\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public restore(status: FlickingStatus): void {\n const panels = status.panels;\n const defaultIndex = this.options.defaultIndex;\n const cameraElement = this.cameraElement;\n const panelManager = this.panelManager;\n\n // Restore index\n cameraElement.innerHTML = panels.map(panel => panel.html).join(\"\");\n\n // Create panels first\n this.refreshPanels();\n const createdPanels = panelManager.originalPanels();\n\n // ...then order it by its index\n const orderedPanels: Panel[] = [];\n panels.forEach((panel, idx) => {\n const createdPanel = createdPanels[idx];\n createdPanel.setIndex(panel.index);\n orderedPanels[panel.index] = createdPanel;\n });\n panelManager.replacePanels(orderedPanels, []);\n panelManager.setCloneCount(0); // No clones at this point\n\n const panelCount = panelManager.getPanelCount();\n if (panelCount > 0) {\n this.currentPanel = panelManager.get(status.index)\n || panelManager.get(defaultIndex)\n || panelManager.firstPanel();\n } else {\n this.currentPanel = undefined;\n }\n this.visiblePanels = orderedPanels.filter(panel => Boolean(panel));\n\n this.resize();\n\n this.axes.setTo({ flick: status.position }, 0);\n this.moveCamera(status.position);\n }\n\n public calcVisiblePanels(): Panel[] {\n const allPanels = this.panelManager.allPanels();\n if (this.options.renderOnlyVisible) {\n const cameraPos = this.getCameraPosition();\n const viewportSize = this.getSize();\n const basePanel = this.nearestPanel!;\n\n const getNextPanel = (panel: Panel) => {\n const nextPanel = panel.nextSibling;\n\n if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) {\n return nextPanel;\n } else {\n return null;\n }\n };\n\n const getPrevPanel = (panel: Panel) => {\n const prevPanel = panel.prevSibling;\n\n if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) {\n return prevPanel;\n } else {\n return null;\n }\n };\n\n const isOutOfBoundNext = (panel: Panel) => panel.getPosition() >= cameraPos + viewportSize;\n const isOutOfBoundPrev = (panel: Panel) => panel.getPosition() + panel.getSize() <= cameraPos;\n\n const getVisiblePanels = (\n panel: Panel,\n getNext: (panel: Panel) => Panel | null,\n isOutOfViewport: (panel: Panel) => boolean,\n ): Panel[] => {\n const visiblePanels: Panel[] = [];\n\n let lastPanel = panel;\n while (true) {\n const nextPanel = getNext(lastPanel);\n if (!nextPanel || isOutOfViewport(nextPanel)) {\n break;\n }\n visiblePanels.push(nextPanel);\n lastPanel = nextPanel;\n }\n return visiblePanels;\n };\n\n const panelCount = this.panelManager.getPanelCount();\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n const nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext);\n const prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev);\n\n return [basePanel, ...nextPanels, ...prevPanels].sort((panel1, panel2) => getAbsIndex(panel1) - getAbsIndex(panel2));\n } else {\n return allPanels.filter(panel => {\n const outsetProgress = panel.getOutsetProgress();\n\n return outsetProgress > -1 && outsetProgress < 1;\n });\n }\n }\n\n public getCurrentPanel(): Panel | undefined {\n return this.currentPanel;\n }\n\n public getCurrentIndex(): number {\n const currentPanel = this.currentPanel;\n\n return currentPanel\n ? currentPanel.getIndex()\n : -1;\n }\n\n public getNearestPanel(): Panel | undefined {\n return this.nearestPanel;\n }\n\n // Get progress from nearest panel\n public getCurrentProgress(): number {\n const currentState = this.stateMachine.getState();\n let nearestPanel = currentState.playing || currentState.holding\n ? this.nearestPanel\n : this.currentPanel;\n\n const panelManager = this.panelManager;\n if (!nearestPanel) {\n // There're no panels\n return NaN;\n }\n const { prev: prevRange, next: nextRange } = this.getScrollArea();\n const cameraPosition = this.getCameraPosition();\n const isOutOfBound = this.isOutOfBound();\n let prevPanel = nearestPanel.prevSibling;\n let nextPanel = nearestPanel.nextSibling;\n let hangerPosition = this.getHangerPosition();\n let nearestAnchorPos = nearestPanel.getAnchorPosition();\n\n if (\n isOutOfBound\n && prevPanel\n && nextPanel\n && cameraPosition < nextRange\n // On the basis of anchor, prevPanel is nearestPanel.\n && (hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition)\n ) {\n nearestPanel = prevPanel;\n nextPanel = nearestPanel.nextSibling;\n prevPanel = nearestPanel.prevSibling;\n nearestAnchorPos = nearestPanel.getAnchorPosition();\n }\n const nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount();\n const nearestSize = nearestPanel.getSize();\n\n if (isOutOfBound) {\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n if (nearestAnchorPos > nextRange + relativeHangerPosition) {\n // next bounce area: hangerPosition - relativeHangerPosition - nextRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange;\n } else if (nearestAnchorPos < prevRange + relativeHangerPosition) {\n // prev bounce area: hangerPosition - relativeHangerPosition - prevRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange;\n }\n }\n const hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos;\n const gap = this.options.gap;\n\n let basePosition = nearestAnchorPos;\n let targetPosition = nearestAnchorPos;\n if (hangerIsNextToNearestPanel) {\n targetPosition = nextPanel\n ? nextPanel.getAnchorPosition()\n : nearestAnchorPos + nearestSize + gap;\n } else {\n basePosition = prevPanel\n ? prevPanel.getAnchorPosition()\n : nearestAnchorPos - nearestSize - gap;\n }\n\n const progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition);\n const startIndex = hangerIsNextToNearestPanel\n ? nearestIndex\n : prevPanel\n ? prevPanel.getIndex()\n : nearestIndex - 1;\n\n return startIndex + progressBetween;\n }\n\n // Update axes flick position without triggering event\n public updateAxesPosition(position: number) {\n const axes = this.axes;\n axes.off();\n axes.setTo({\n flick: position,\n }, 0);\n axes.on(this.axesHandlers);\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getScrollArea(): { prev: number, next: number } {\n return this.state.scrollArea;\n }\n\n public isOutOfBound(): boolean {\n const state = this.state;\n const options = this.options;\n const scrollArea = state.scrollArea;\n\n return !options.circular\n && options.bound\n && (state.position <= scrollArea.prev || state.position >= scrollArea.next);\n }\n\n public canSetBoundMode(): boolean {\n const options = this.options;\n\n return options.bound && !options.circular;\n }\n\n public getViewportElement(): HTMLElement {\n return this.viewportElement;\n }\n\n public getCameraElement(): HTMLElement {\n return this.cameraElement;\n }\n\n public getScrollAreaSize(): number {\n const scrollArea = this.state.scrollArea;\n\n return scrollArea.next - scrollArea.prev;\n }\n\n public getRelativeHangerPosition(): number {\n return this.state.relativeHangerPosition;\n }\n\n public getHangerPosition(): number {\n return this.state.position + this.state.relativeHangerPosition;\n }\n\n public getCameraPosition(): number {\n return this.state.position;\n }\n\n public getPositionOffset(): number {\n return this.state.positionOffset;\n }\n\n public getCheckedIndexes(): Array<[number, number]> {\n return this.state.checkedIndexes;\n }\n\n public getVisiblePanels(): Panel[] {\n return this.visiblePanels;\n }\n\n public setCurrentPanel(panel: Panel): void {\n this.currentPanel = panel;\n }\n\n public setLastIndex(index: number): void {\n const currentPanel = this.currentPanel;\n const panelManager = this.panelManager;\n\n panelManager.setLastIndex(index);\n if (currentPanel && currentPanel.getIndex() > index) {\n this.currentPanel = panelManager.lastPanel();\n }\n\n this.resize();\n }\n\n public setVisiblePanels(panels: Panel[]): void {\n this.visiblePanels = panels;\n }\n\n public connectAxesHandler(handlers: { [key: string]: (event: { [key: string]: any; }) => any }): void {\n const axes = this.axes;\n\n this.axesHandlers = handlers;\n axes.on(handlers);\n }\n\n public addPlugins(plugins: Plugin | Plugin[]) {\n const newPlugins = ([] as Plugin[]).concat(plugins);\n\n newPlugins.forEach(plugin => {\n plugin.init(this.flicking);\n });\n\n this.plugins = this.plugins.concat(newPlugins);\n return this;\n }\n\n public removePlugins(plugins: Plugin | Plugin[]) {\n const currentPlugins = this.plugins;\n const removedPlugins = ([] as Plugin[]).concat(plugins);\n\n removedPlugins.forEach(plugin => {\n const index = currentPlugins.indexOf(plugin);\n\n if (index > -1) {\n currentPlugins.splice(index, 1);\n }\n\n plugin.destroy(this.flicking);\n });\n return this;\n }\n\n public updateCheckedIndexes(changedRange: { min: number, max: number }): void {\n const state = this.state;\n\n let removed = 0;\n state.checkedIndexes.concat().forEach((indexes, idx) => {\n const [min, max] = indexes;\n // Can fill part of indexes in range\n if (changedRange.min <= max && changedRange.max >= min) {\n // Remove checked index from list\n state.checkedIndexes.splice(idx - removed, 1);\n removed++;\n }\n });\n }\n\n public appendUncachedPanelElements(panels: Panel[]): void {\n const options = this.options;\n const fragment = document.createDocumentFragment();\n\n if (options.isEqualSize) {\n const prevVisiblePanels = this.visiblePanels;\n const equalSizeClasses = options.isEqualSize as string[]; // for readability\n const cached: { [className: string]: boolean } = {};\n\n this.visiblePanels = [];\n\n Object.keys(this.panelBboxes).forEach(className => {\n cached[className] = true;\n });\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass && !cached[overlappedClass]) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n cached[overlappedClass] = true;\n } else if (!overlappedClass) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n }\n });\n prevVisiblePanels.forEach(panel => {\n this.addVisiblePanel(panel);\n });\n } else {\n if (!options.renderExternal) {\n panels.forEach(panel => fragment.appendChild(panel.getElement()));\n }\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n if (!options.renderExternal) {\n this.cameraElement.appendChild(fragment);\n }\n }\n\n private updateClonePanels() {\n const panelManager = this.panelManager;\n\n // Clone panels in circular mode\n if (this.options.circular && panelManager.getPanelCount() > 0) {\n this.clonePanels();\n this.updateClonedPanelPositions();\n }\n panelManager.chainAllPanels();\n }\n\n private getVisibleIndexOf(panel: Panel): number {\n return findIndex(this.visiblePanels, visiblePanel => visiblePanel === panel);\n }\n\n private build(): void {\n this.setElements();\n this.applyCSSValue();\n this.setMoveType();\n this.setAxesInstance();\n this.refreshPanels();\n this.setDefaultPanel();\n this.resize();\n this.moveToDefaultPanel();\n }\n\n private setElements(): void {\n const state = this.state;\n const options = this.options;\n const wrapper = this.flicking.getElement();\n const classPrefix = options.classPrefix;\n\n const viewportCandidate = wrapper.children[0] as HTMLElement;\n const hasViewportElement = viewportCandidate && hasClass(viewportCandidate, `${classPrefix}-viewport`);\n\n const viewportElement = hasViewportElement\n ? viewportCandidate\n : document.createElement(\"div\");\n\n const cameraCandidate = hasViewportElement\n ? viewportElement.children[0] as HTMLElement\n : wrapper.children[0] as HTMLElement;\n const hasCameraElement = cameraCandidate && hasClass(cameraCandidate, `${classPrefix}-camera`);\n\n const cameraElement = hasCameraElement\n ? cameraCandidate\n : document.createElement(\"div\");\n\n if (!hasCameraElement) {\n cameraElement.className = `${classPrefix}-camera`;\n\n const panelElements = hasViewportElement\n ? viewportElement.children\n : wrapper.children;\n\n // Make all panels to be a child of camera element\n // wrapper <- viewport <- camera <- panels[1...n]\n toArray(panelElements).forEach(child => {\n cameraElement.appendChild(child);\n });\n } else {\n state.originalCameraStyle = {\n className: cameraElement.getAttribute(\"class\"),\n style: cameraElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasViewportElement) {\n viewportElement.className = `${classPrefix}-viewport`;\n\n // Add viewport element to wrapper\n wrapper.appendChild(viewportElement);\n } else {\n state.originalViewportStyle = {\n className: viewportElement.getAttribute(\"class\"),\n style: viewportElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasCameraElement || !hasViewportElement) {\n viewportElement.appendChild(cameraElement);\n }\n\n this.viewportElement = viewportElement;\n this.cameraElement = cameraElement;\n state.isViewportGiven = hasViewportElement;\n state.isCameraGiven = hasCameraElement;\n }\n\n private applyCSSValue(): void {\n const options = this.options;\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const viewportStyle = this.viewportElement.style;\n\n // Set default css values for each element\n applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS);\n applyCSS(cameraElement, DEFAULT_CAMERA_CSS);\n\n viewportElement.style.zIndex = `${options.zIndex}`;\n if (options.horizontal) {\n viewportStyle.minHeight = \"100%\";\n viewportStyle.width = \"100%\";\n } else {\n viewportStyle.minWidth = \"100%\";\n viewportStyle.height = \"100%\";\n }\n if (options.overflow) {\n viewportStyle.overflow = \"visible\";\n }\n\n this.panelManager = new PanelManager(this.cameraElement, options);\n }\n\n private setMoveType(): void {\n const moveType = this.options.moveType as MoveTypeObjectOption;\n\n switch (moveType.type) {\n case MOVE_TYPE.SNAP:\n this.moveType = new Snap(moveType.count);\n break;\n case MOVE_TYPE.FREE_SCROLL:\n this.moveType = new FreeScroll();\n break;\n default:\n throw new Error(\"moveType is not correct!\");\n }\n }\n\n private setAxesInstance(): void {\n const state = this.state;\n const options = this.options;\n\n const scrollArea = state.scrollArea;\n\n this.axes = new Axes({\n flick: {\n range: [scrollArea.prev, scrollArea.next],\n circular: options.circular,\n bounce: [0, 0], // will be updated in resize()\n },\n }, {\n easing: options.panelEffect,\n deceleration: options.deceleration,\n interruptable: true,\n });\n\n this.createPanInput();\n }\n\n private refreshPanels(): void {\n const panelManager = this.panelManager;\n // Panel elements were attached to camera element by Flicking class\n const panelElements = this.cameraElement.children;\n\n // Initialize panels\n const panels = toArray(panelElements).map(\n (el: HTMLElement, idx: number) => new Panel(el, idx, this),\n );\n\n panelManager.replacePanels(panels, []);\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n private setDefaultPanel(): void {\n const options = this.options;\n const panelManager = this.panelManager;\n const indexRange = this.panelManager.getRange();\n const index = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n\n this.currentPanel = panelManager.get(index);\n }\n\n private clonePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n\n const gap = options.gap;\n const viewportSize = state.size;\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n // There're no panels exist\n if (!firstPanel) {\n return;\n }\n\n // For each panels, clone itself while last panel's position + size is below viewport size\n const panels = panelManager.originalPanels();\n const reversedPanels = panels.concat().reverse();\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap;\n const relativeAnchorPosition = firstPanel.getRelativeAnchorPosition();\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n const areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize;\n let sizeSum = 0;\n let panelAtLeftBoundary!: Panel;\n for (const panel of reversedPanels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaPrev) {\n panelAtLeftBoundary = panel;\n break;\n }\n }\n\n const areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize;\n sizeSum = 0;\n let panelAtRightBoundary!: Panel;\n for (const panel of panels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaNext) {\n panelAtRightBoundary = panel;\n break;\n }\n }\n\n // Need one more set of clones on prev area of original panel 0\n const needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0\n && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex();\n\n // Visible count of panel 0 on first screen\n const panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize)\n + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize)\n - 1; // duplication\n\n const cloneCount = panel0OnFirstscreen\n + (needCloneOnPrev ? 1 : 0);\n const prevCloneCount = panelManager.getCloneCount();\n\n panelManager.setCloneCount(cloneCount);\n if (options.renderExternal) {\n return;\n }\n\n if (cloneCount > prevCloneCount) {\n // should clone more\n for (let cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) {\n const clones = panels.map(origPanel => origPanel.clone(cloneIndex));\n const fragment = document.createDocumentFragment();\n clones.forEach(panel => fragment.appendChild(panel.getElement()));\n\n this.cameraElement.appendChild(fragment);\n this.visiblePanels.push(...clones.filter(clone => Boolean(clone)));\n panelManager.insertClones(cloneIndex, 0, clones);\n }\n } else if (cloneCount < prevCloneCount) {\n // should remove some\n panelManager.removeClonesAfter(cloneCount);\n }\n }\n\n private moveToDefaultPanel(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const indexRange = this.panelManager.getRange();\n\n const defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n const defaultPanel = panelManager.get(defaultIndex);\n\n let defaultPosition = 0;\n if (defaultPanel) {\n defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition;\n defaultPosition = this.canSetBoundMode()\n ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next)\n : defaultPosition;\n }\n\n this.moveCamera(defaultPosition);\n this.axes.setTo({ flick: defaultPosition }, 0);\n }\n\n private updateSize(): void {\n const state = this.state;\n const options = this.options;\n const panels = this.panelManager.originalPanels()\n .filter(panel => Boolean(panel));\n const bbox = this.updateBbox();\n\n const prevSize = state.size;\n // Update size & hanger position\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size);\n state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size);\n }\n\n if (panels.length <= 0) {\n return;\n }\n\n this.resizePanels(panels);\n }\n\n private updateOriginalPanelPositions(): void {\n const gap = this.options.gap;\n const panelManager = this.panelManager;\n\n const firstPanel = panelManager.firstPanel();\n const panels = panelManager.originalPanels();\n\n if (!firstPanel) {\n return;\n }\n\n const currentPanel = this.currentPanel!;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n const scrollArea = this.state.scrollArea;\n\n // Update panel position && fit to wrapper\n let nextPanelPos = firstPanel.getPosition();\n let maintainingPanel: Panel = firstPanel;\n if (nearestPanel) {\n // We should maintain nearestPanel's position\n const looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next);\n\n maintainingPanel = looped\n ? currentPanel\n : nearestPanel;\n } else if (firstPanel.getIndex() > 0) {\n maintainingPanel = currentPanel;\n }\n\n const panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length);\n const accumulatedSize = panelsBeforeMaintainPanel.reduce((total, panel) => {\n return total + panel.getSize() + gap;\n }, 0);\n\n nextPanelPos = maintainingPanel.getPosition() - accumulatedSize;\n\n panels.forEach(panel => {\n const newPosition = nextPanelPos;\n const panelSize = panel.getSize();\n\n panel.setPosition(newPosition);\n nextPanelPos += panelSize + gap;\n });\n\n if (!this.options.renderOnlyVisible) {\n panels.forEach(panel => panel.setPositionCSS());\n }\n }\n\n private updateClonedPanelPositions(): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const clonedPanels = panelManager.clonedPanels()\n .reduce((allClones, clones) => [...allClones, ...clones], [])\n .filter(panel => Boolean(panel));\n\n const scrollArea = state.scrollArea;\n\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n if (!firstPanel) {\n return;\n }\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Locate all cloned panels linearly first\n for (const panel of clonedPanels) {\n const origPanel = panel.getOriginalPanel();\n const cloneIndex = panel.getCloneIndex();\n const cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1);\n const clonedPanelPos = cloneBasePos + origPanel.getPosition();\n\n panel.setPosition(clonedPanelPos);\n }\n\n let lastReplacePosition = firstPanel.getPosition();\n // reverse() pollutes original array, so copy it with concat()\n for (const panel of clonedPanels.concat().reverse()) {\n const panelSize = panel.getSize();\n const replacePosition = lastReplacePosition - panelSize - options.gap;\n\n if (replacePosition + panelSize <= scrollArea.prev) {\n // Replace is not meaningful, as it won't be seen in current scroll area\n break;\n }\n\n panel.setPosition(replacePosition);\n lastReplacePosition = replacePosition;\n }\n\n if (!this.options.renderOnlyVisible) {\n clonedPanels.forEach(panel => {\n panel.setPositionCSS();\n });\n }\n }\n\n private updateVisiblePanelPositions(): void {\n if (this.options.renderOnlyVisible) {\n this.visiblePanels.forEach(panel => {\n panel.setPositionCSS(this.state.positionOffset);\n });\n }\n }\n\n private updateScrollArea(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const axes = this.axes;\n\n // Set viewport scrollable area\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel() as Panel;\n const relativeHangerPosition = state.relativeHangerPosition;\n\n if (!firstPanel) {\n state.scrollArea = {\n prev: 0,\n next: 0,\n };\n } else if (this.canSetBoundMode()) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition();\n\n if (sumOriginalPanelSize >= state.size) {\n state.scrollArea = {\n prev: firstPanel.getPosition(),\n next: lastPanel.getPosition() + lastPanel.getSize() - state.size,\n };\n } else {\n // Find anchor position of set of the combined panels\n const relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize);\n const anchorPos = firstPanel.getPosition() + clamp(\n relAnchorPosOfCombined,\n sumOriginalPanelSize - (state.size - relativeHangerPosition),\n relativeHangerPosition,\n );\n\n state.scrollArea = {\n prev: anchorPos - relativeHangerPosition,\n next: anchorPos - relativeHangerPosition,\n };\n }\n } else if (options.circular) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Maximum scroll extends to first clone sequence's first panel\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition,\n };\n } else {\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: lastPanel.getAnchorPosition() - relativeHangerPosition,\n };\n }\n\n const viewportSize = state.size;\n const bounce = options.bounce;\n\n let parsedBounce: number[];\n if (isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce as number));\n } else {\n const parsedVal = parseArithmeticExpression(bounce as number | string, viewportSize, DEFAULT_OPTIONS.bounce as number);\n parsedBounce = [parsedVal, parsedVal];\n }\n\n // Update axes range and bounce\n const flick = axes.axis.flick;\n flick.range = [state.scrollArea.prev, state.scrollArea.next];\n flick.bounce = parsedBounce;\n }\n\n private checkNeedPanel(axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentPanel = this.currentPanel;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n\n if (!options.infinite) {\n return;\n }\n\n const gap = options.gap;\n const infiniteThreshold = state.infiniteThreshold;\n const maxLastIndex = panelManager.getLastIndex();\n\n if (maxLastIndex < 0) {\n return;\n }\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: null,\n direction: null,\n indexRange: {\n min: 0,\n max: maxLastIndex,\n length: maxLastIndex + 1,\n },\n });\n return;\n }\n\n const originalNearestPosition = nearestPanel.getPosition();\n\n // Check next direction\n let checkingPanel: Panel | null = !currentState.holding && !currentState.playing\n ? currentPanel\n : nearestPanel;\n\n while (checkingPanel) {\n const currentIndex = checkingPanel.getIndex();\n const nextSibling = checkingPanel.nextSibling;\n const lastPanel = panelManager.lastPanel()!;\n const atLastPanel = currentIndex === lastPanel.getIndex();\n const nextIndex = !atLastPanel && nextSibling\n ? nextSibling.getIndex()\n : maxLastIndex + 1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition);\n const cameraNext = state.position + state.size;\n\n // There're empty panels between\n const emptyPanelExistsBetween = (nextIndex - currentIndex > 1);\n // Expected prev panel's left position is smaller than camera position\n const overThreshold = panelRight + gap - infiniteThreshold <= cameraNext;\n\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: currentIndex + 1,\n max: nextIndex - 1,\n length: nextIndex - currentIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at max panel index\n if (options.circular && currentIndex === maxLastIndex && overThreshold) {\n const firstPanel = panelManager.firstPanel();\n const firstIndex = firstPanel\n ? firstPanel.getIndex()\n : -1;\n\n if (firstIndex > 0) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: 0,\n max: firstIndex - 1,\n length: firstIndex,\n },\n });\n }\n }\n\n // Check whether panels are changed\n const lastPanelAfterNeed = panelManager.lastPanel()!;\n const atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex();\n\n if (atLastPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.nextSibling;\n }\n\n // Check prev direction\n checkingPanel = nearestPanel;\n while (checkingPanel) {\n const cameraPrev = state.position;\n const checkingIndex = checkingPanel.getIndex();\n const prevSibling = checkingPanel.prevSibling;\n const firstPanel = panelManager.firstPanel()!;\n const atFirstPanel = checkingIndex === firstPanel.getIndex();\n const prevIndex = !atFirstPanel && prevSibling\n ? prevSibling.getIndex()\n : -1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition);\n\n // There're empty panels between\n const emptyPanelExistsBetween = checkingIndex - prevIndex > 1;\n // Expected prev panel's right position is smaller than camera position\n const overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev;\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: prevIndex + 1,\n max: checkingIndex - 1,\n length: checkingIndex - prevIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at panel 0\n if (options.circular && checkingIndex === 0 && overThreshold) {\n const lastPanel = panelManager.lastPanel();\n\n if (lastPanel && lastPanel.getIndex() < maxLastIndex) {\n const lastIndex = lastPanel.getIndex();\n\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: lastIndex + 1,\n max: maxLastIndex,\n length: maxLastIndex - lastIndex,\n },\n });\n }\n }\n\n // Check whether panels were changed\n const firstPanelAfterNeed = panelManager.firstPanel();\n const atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex();\n\n // Looped in circular mode\n if (atFirstPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.prevSibling;\n }\n }\n\n private triggerNeedPanel(params: {\n axesEvent: any;\n siblingPanel: Panel | null,\n direction: FlickingEvent[\"direction\"];\n indexRange: NeedPanelEvent[\"range\"];\n }): void {\n const { axesEvent, siblingPanel, direction, indexRange } = params;\n const options = this.options;\n const checkedIndexes = this.state.checkedIndexes;\n const alreadyTriggered = checkedIndexes.some(([min, max]) => min === indexRange.min || max === indexRange.max);\n const hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL);\n\n if (alreadyTriggered || !hasHandler) {\n return;\n }\n\n // Should done before triggering event, as we can directly add panels by event callback\n checkedIndexes.push([indexRange.min, indexRange.max]);\n\n const index = siblingPanel\n ? siblingPanel.getIndex()\n : 0;\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n\n this.triggerEvent(\n EVENTS.NEED_PANEL,\n axesEvent,\n isTrusted,\n {\n index,\n panel: siblingPanel,\n direction,\n range: indexRange,\n fill: (element: ElementLike | ElementLike[]) => {\n const panelManager = this.panelManager;\n if (!siblingPanel) {\n return this.insert(panelManager.getRange().max + 1, element);\n }\n\n const parsedElements = parseElement(element);\n // Slice elements to fit size equal to empty spaces\n const elements = direction === DIRECTION.NEXT\n ? parsedElements.slice(0, indexRange.length)\n : parsedElements.slice(-indexRange.length);\n\n if (direction === DIRECTION.NEXT) {\n if (options.circular && index === panelManager.getLastIndex()) {\n // needPanel event is triggered on last index, insert at index 0\n return this.insert(0, elements);\n } else {\n return siblingPanel.insertAfter(elements);\n }\n } else if (direction === DIRECTION.PREV) {\n if (options.circular && index === 0) {\n // needPanel event is triggered on first index(0), insert at the last index\n return this.insert(indexRange.max - elements.length + 1, elements);\n } else {\n return siblingPanel.insertBefore(elements);\n }\n } else {\n // direction is null when there're no panels exist\n return this.insert(0, elements);\n }\n },\n } as Partial,\n );\n }\n\n private updateVisiblePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentState = this.stateMachine.getState();\n const cameraElement = this.cameraElement;\n const { renderExternal, renderOnlyVisible } = options;\n if (!renderOnlyVisible) {\n return;\n }\n\n if (!this.nearestPanel) {\n this.visiblePanels = [];\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n return;\n }\n\n const prevVisiblePanels = this.visiblePanels;\n const newVisiblePanels = this.calcVisiblePanels();\n\n const { addedPanels, removedPanels } = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels);\n\n if (addedPanels.length <= 0 && removedPanels.length <= 0) {\n // Visible panels not changed\n return;\n }\n\n if (currentState.holding) {\n newVisiblePanels.push(...removedPanels);\n } else {\n const firstVisiblePanelPos = newVisiblePanels[0].getPosition();\n state.positionOffset = firstVisiblePanelPos;\n }\n\n newVisiblePanels.forEach(panel => {\n panel.setPositionCSS(state.positionOffset);\n });\n\n if (!renderExternal) {\n if (!currentState.holding) {\n removedPanels.forEach(panel => {\n const panelElement = panel.getElement();\n panelElement.parentNode && cameraElement.removeChild(panelElement);\n });\n }\n\n const fragment = document.createDocumentFragment();\n addedPanels.forEach(panel => {\n fragment.appendChild(panel.getElement());\n });\n\n cameraElement.appendChild(fragment);\n }\n\n const firstVisiblePanel = newVisiblePanels[0];\n const lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1];\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount();\n\n const newVisibleRange = {\n min: getAbsIndex(firstVisiblePanel),\n max: getAbsIndex(lastVisiblePanel),\n };\n this.visiblePanels = newVisiblePanels;\n this.flicking.trigger(EVENTS.VISIBLE_CHANGE, {\n type: EVENTS.VISIBLE_CHANGE,\n range: newVisibleRange,\n });\n }\n\n private checkVisiblePanelChange(prevVisiblePanels: Panel[], newVisiblePanels: Panel[]) {\n const prevRefCount = prevVisiblePanels.map(() => 0);\n const newRefCount = newVisiblePanels.map(() => 0);\n\n prevVisiblePanels.forEach((prevPanel, prevIndex) => {\n newVisiblePanels.forEach((newPanel, newIndex) => {\n if (prevPanel === newPanel) {\n prevRefCount[prevIndex]++;\n newRefCount[newIndex]++;\n }\n });\n });\n\n const removedPanels = prevRefCount.reduce((removed: Panel[], count, index) => {\n return count === 0\n ? [...removed, prevVisiblePanels[index]]\n : removed;\n }, []);\n const addedPanels = newRefCount.reduce((added: Panel[], count, index) => {\n return count === 0\n ? [...added, newVisiblePanels[index]]\n : added;\n }, []);\n\n return { removedPanels, addedPanels };\n }\n\n private resizePanels(panels: Panel[]): void {\n const options = this.options;\n const panelBboxes = this.panelBboxes;\n\n if (options.isEqualSize === true) {\n if (!panelBboxes.default) {\n const defaultPanel = panels[0];\n panelBboxes.default = defaultPanel.getBbox();\n }\n\n const defaultBbox = panelBboxes.default;\n\n panels.forEach(panel => {\n panel.resize(defaultBbox);\n });\n return;\n } else if (options.isEqualSize) {\n const equalSizeClasses = options.isEqualSize;\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass) {\n panel.resize(panelBboxes[overlappedClass]);\n panelBboxes[overlappedClass] = panel.getBbox();\n } else {\n panel.resize();\n }\n });\n return;\n }\n panels.forEach(panel => {\n panel.resize();\n });\n }\n\n private createPanInput() {\n const options = this.options;\n\n this.panInput = new PanInput(this.viewportElement, {\n inputType: options.inputType,\n thresholdAngle: options.thresholdAngle,\n iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold,\n scale: options.horizontal ? [-1, 0] : [0, -1],\n });\n\n this.axes.connect(options.horizontal ? [\"flick\", \"\"] : [\"\", \"flick\"], this.panInput);\n }\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Component from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport Viewport from \"./components/Viewport\";\nimport Panel from \"./components/Panel\";\n\nimport { merge, getProgress, parseElement, isString, counter, findIndex } from \"./utils\";\nimport { DEFAULT_OPTIONS, EVENTS, DIRECTION, AXES_EVENTS, STATE_TYPE, DEFAULT_MOVE_TYPE_OPTIONS } from \"./consts\";\nimport {\n FlickingOptions,\n FlickingEvent,\n Direction,\n EventType,\n FlickingPanel,\n TriggerCallback,\n FlickingContext,\n FlickingStatus,\n Plugin,\n ElementLike,\n DestroyOption,\n BeforeSyncResult,\n SyncResult,\n ChangeEvent,\n SelectEvent,\n NeedPanelEvent,\n VisibleChangeEvent,\n ContentErrorEvent,\n MoveTypeStringOption,\n ValueOf,\n} from \"./types\";\n// import { sendEvent } from \"./ga/ga\";\nimport { DiffResult } from \"@egjs/list-differ\";\n\n/**\n * @memberof eg\n * @extends eg.Component\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"4.X+\"}\n * @requires {@link https://github.com/naver/egjs-component|eg.Component}\n * @requires {@link https://github.com/naver/egjs-axes|eg.Axes}\n * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/}\n */\nclass Flicking extends Component<{\n holdStart: FlickingEvent;\n holdEnd: FlickingEvent;\n moveStart: FlickingEvent;\n move: FlickingEvent;\n moveEnd: FlickingEvent;\n change: ChangeEvent;\n restore: FlickingEvent;\n select: SelectEvent;\n needPanel: NeedPanelEvent;\n visibleChange: VisibleChangeEvent;\n contentError: ContentErrorEvent;\n}> {\n /**\n * Version info string\n * @ko 버전정보 문자열\n * @example\n * eg.Flicking.VERSION; // ex) 3.0.0\n * @memberof eg.Flicking\n */\n public static VERSION: string = \"#__VERSION__#\";\n /**\n * Direction constant - \"PREV\" or \"NEXT\"\n * @ko 방향 상수 - \"PREV\" 또는 \"NEXT\"\n * @type {object}\n * @property {\"PREV\"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
\n * @property {\"NEXT\"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
\n * @example\n * eg.Flicking.DIRECTION.PREV; // \"PREV\"\n * eg.Flicking.DIRECTION.NEXT; // \"NEXT\"\n */\n public static DIRECTION: Direction = DIRECTION;\n\n /**\n * Event type object with event name strings.\n * @ko 이벤트 이름 문자열들을 담은 객체\n * @type {object}\n * @property {\"holdStart\"} HOLD_START - holdStart eventholdStart 이벤트\n * @property {\"holdEnd\"} HOLD_END - holdEnd eventholdEnd 이벤트\n * @property {\"moveStart\"} MOVE_START - moveStart eventmoveStart 이벤트\n * @property {\"move\"} MOVE - move eventmove 이벤트\n * @property {\"moveEnd\"} MOVE_END - moveEnd eventmoveEnd 이벤트\n * @property {\"change\"} CHANGE - change eventchange 이벤트\n * @property {\"restore\"} RESTORE - restore eventrestore 이벤트\n * @property {\"select\"} SELECT - select eventselect 이벤트\n * @property {\"needPanel\"} NEED_PANEL - needPanel eventneedPanel 이벤트\n * @example\n * eg.Flicking.EVENTS.MOVE_START; // \"MOVE_START\"\n */\n public static EVENTS: EventType = EVENTS;\n\n public options: FlickingOptions;\n\n private wrapper: HTMLElement;\n private viewport: Viewport;\n private contentsReadyChecker: ImReady | null = null;\n\n private eventContext: FlickingContext;\n private isPanelChangedAtBeforeSync: boolean = false;\n\n /**\n * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체\n * @param {string} [options.classPrefix=\"eg-flick\"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사.\n * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향)\n * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다.\n * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다.\n * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리.\n * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
\n * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다.\n * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다.\n * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수.\n * @param {string[]} [options.inputType=[\"touch,\"mouse\"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고})\n * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
\n * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, \"10px\", \"20%\")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, \"10px\", \"20%\")
\n * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부.\n * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부.\n * @param {number|\"\"} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값.\n * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다.\n * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다.\n * @param {string} [options.hanger=\"50%\"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {string} [options.anchor=\"50%\"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px)\n * @param {eg.Flicking.MoveTypeOption} [options.moveType=\"snap\"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll)\n * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
\n * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다.\n * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
\n * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.\n * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다.\n * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
\n * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다.\n */\n constructor(\n element: string | HTMLElement,\n options: Partial = {},\n ) {\n super();\n\n // Set flicking wrapper user provided\n let wrapper: HTMLElement | null;\n if (isString(element)) {\n wrapper = document.querySelector(element);\n if (!wrapper) {\n throw new Error(\"Base element doesn't exist.\");\n }\n } else if (element.nodeName && element.nodeType === 1) {\n wrapper = element;\n } else {\n throw new Error(\"Element should be provided in string or HTMLElement.\");\n }\n\n this.wrapper = wrapper;\n // Override default options\n this.options = merge({}, DEFAULT_OPTIONS, options) as FlickingOptions;\n // Override moveType option\n const currentOptions = this.options;\n const moveType = currentOptions.moveType as MoveTypeStringOption;\n\n if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) {\n currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType as keyof typeof DEFAULT_MOVE_TYPE_OPTIONS];\n }\n\n // Make viewport instance with panel container element\n this.viewport = new Viewport(this, this.options, this.triggerEvent);\n this.listenInput();\n this.listenResize();\n\n // if (this.options.collectStatistics) {\n // sendEvent(\n // \"usage\",\n // \"options\",\n // options,\n // );\n // }\n }\n\n /**\n * Move to the previous panel if it exists.\n * @ko 이전 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public prev(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const prevPanel = currentPanel.prev();\n if (prevPanel) {\n prevPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the next panel if it exists.\n * @ko 다음 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public next(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const nextPanel = currentPanel.next();\n if (nextPanel) {\n nextPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the panel of given index.\n * @ko 주어진 인덱스에 해당하는 패널로 이동한다.\n * @param index The index number of the panel to move.이동할 패널의 인덱스 번호.\n * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public moveTo(index: number, duration?: number): this {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n const state = viewport.stateMachine.getState();\n\n if (!panel || state.type !== STATE_TYPE.IDLE) {\n return this;\n }\n\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = viewport.getHangerPosition();\n\n let targetPanel = panel;\n if (this.options.circular) {\n const scrollAreaSize = viewport.getScrollAreaSize();\n // Check all three possible locations, find the nearest position among them.\n const possiblePositions = [\n anchorPosition - scrollAreaSize,\n anchorPosition,\n anchorPosition + scrollAreaSize,\n ];\n const nearestPosition = possiblePositions.reduce((nearest, current) => {\n return (Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition))\n ? current\n : nearest;\n }, Infinity) - panel.getRelativeAnchorPosition();\n\n const identicals = panel.getIdenticalPanels();\n const offset = nearestPosition - anchorPosition;\n if (offset > 0) {\n // First cloned panel is nearest\n targetPanel = identicals[1];\n } else if (offset < 0) {\n // Last cloned panel is nearest\n targetPanel = identicals[identicals.length - 1];\n }\n\n targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true);\n targetPanel.setPosition(nearestPosition);\n }\n const currentIndex = this.getIndex();\n\n if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) {\n return this;\n }\n\n const eventType = panel.getIndex() === viewport.getCurrentIndex()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(\n targetPanel,\n viewport.findEstimatedPosition(targetPanel),\n eventType,\n null,\n duration,\n );\n return this;\n }\n\n /**\n * Return index of the current panel. `-1` if no panel exists.\n * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다.\n * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n */\n public getIndex(): number {\n return this.viewport.getCurrentIndex();\n }\n\n /**\n * Return the wrapper element user provided in constructor.\n * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다.\n * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트.\n */\n public getElement(): HTMLElement {\n return this.wrapper;\n }\n\n /**\n * Return the viewport element's size.\n * @ko 뷰포트 엘리먼트의 크기를 반환한다.\n * @return Width if horizontal: true, height if horizontal: false\n */\n public getSize(): number {\n return this.viewport.getSize();\n }\n\n /**\n * Return current panel. `null` if no panel exists.\n * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다.\n * @return Current panel.현재 패널.\n */\n public getCurrentPanel(): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.getCurrentPanel();\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return the panel of given index. `null` if it doesn't exists.\n * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다.\n * @return Panel of given index.주어진 인덱스에 해당하는 패널.\n */\n public getPanel(index: number): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return all panels.\n * @ko 모든 패널들을 반환한다.\n * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부.\n * @return All panels.모든 패널들.\n */\n public getAllPanels(includeClone?: boolean): FlickingPanel[] {\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const panels = includeClone\n ? panelManager.allPanels()\n : panelManager.originalPanels();\n\n return panels\n .filter(panel => !!panel);\n }\n\n /**\n * Return the panels currently shown in viewport area.\n * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다.\n * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들\n */\n public getVisiblePanels(): FlickingPanel[] {\n return this.viewport.calcVisiblePanels();\n }\n\n /**\n * Return length of original panels.\n * @ko 원본 패널의 개수를 반환한다.\n * @return Length of original panels.원본 패널의 개수\n */\n public getPanelCount(): number {\n return this.viewport.panelManager.getPanelCount();\n }\n\n /**\n * Return how many groups of clones are created.\n * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다.\n * @return Length of cloned panel groups.클론된 패널 그룹의 개수\n */\n public getCloneCount(): number {\n return this.viewport.panelManager.getCloneCount();\n }\n\n /**\n * Get maximum panel index for `infinite` mode.\n * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스.\n */\n public getLastIndex(): number {\n return this.viewport.panelManager.getLastIndex();\n }\n\n /**\n * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it.\n * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다.\n * @param - Maximum panel index.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public setLastIndex(index: number): this {\n this.viewport.setLastIndex(index);\n\n return this;\n }\n\n /**\n * Return panel movement animation.\n * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다.\n * @return Is animating or not.애니메이션 진행 여부.\n */\n public isPlaying(): boolean {\n return this.viewport.stateMachine.getState().playing;\n }\n\n /**\n * Unblock input devices.\n * @ko 막았던 입력 장치로부터의 입력을 푼다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public enableInput(): this {\n this.viewport.enable();\n\n return this;\n }\n\n /**\n * Block input devices.\n * @ko 입력 장치로부터의 입력을 막는다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public disableInput(): this {\n this.viewport.disable();\n\n return this;\n }\n\n /**\n * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}.\n * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다.\n * @return An object with current status value information.현재 상태값 정보를 가진 객체.\n */\n public getStatus(): FlickingStatus {\n const viewport = this.viewport;\n\n const panels = viewport.panelManager.originalPanels()\n .filter(panel => !!panel)\n .map(panel => {\n return {\n html: panel.getElement().outerHTML,\n index: panel.getIndex(),\n };\n });\n\n return {\n index: viewport.getCurrentIndex(),\n panels,\n position: viewport.getCameraPosition(),\n };\n }\n\n /**\n * Restore to the state of the `status`.\n * @ko `status`의 상태로 복원한다.\n * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다.\n */\n public setStatus(status: FlickingStatus): void {\n this.viewport.restore(status);\n }\n\n /**\n * Add plugins that can have different effects on Flicking.\n * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다.\n * @param - The plugin(s) to add.추가할 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public addPlugins(plugins: Plugin | Plugin[]) {\n this.viewport.addPlugins(plugins);\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @ko 플리킹으로부터 플러그인들을 제거한다.\n * @param - The plugin(s) to remove.제거 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public removePlugins(plugins: Plugin | Plugin[]) {\n this.viewport.removePlugins(plugins);\n return this;\n }\n\n /**\n * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n * @example\n * const flick = new eg.Flicking(\"#flick\");\n * flick.destroy();\n * console.log(flick.moveTo); // null\n */\n public destroy(option: Partial = {}): void {\n this.off();\n\n if (this.options.autoResize) {\n window.removeEventListener(\"resize\", this.resize);\n }\n\n this.viewport.destroy(option);\n this.contentsReadyChecker?.destroy();\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n /**\n * Update panels to current state.\n * @ko 패널들을 현재 상태에 맞춰 갱신한다.\n * @method\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public resize = (): this => {\n const viewport = this.viewport;\n const options = this.options;\n const wrapper = this.getElement();\n\n const allPanels = viewport.panelManager.allPanels();\n if (!options.isConstantSize) {\n allPanels.forEach(panel => panel.unCacheBbox());\n }\n\n const shouldResetElements = options.renderOnlyVisible\n && !options.isConstantSize\n && options.isEqualSize !== true;\n\n // Temporarily set parent's height to prevent scroll (#333)\n const parent = wrapper.parentElement!;\n const origStyle = parent.style.height;\n parent.style.height = `${parent.offsetHeight}px`;\n\n viewport.unCacheBbox();\n // This should be done before adding panels, to lower performance issue\n viewport.updateBbox();\n\n if (shouldResetElements) {\n viewport.appendUncachedPanelElements(allPanels as Panel[]);\n }\n\n viewport.resize();\n parent.style.height = origStyle;\n\n return this;\n }\n\n /**\n * Add new panels at the beginning of panels.\n * @ko 제일 앞에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.replace(3, document.createElement(\"div\")); // Add new panel at index 3\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 2\n * flicking.prepend([\"\\Panel\\\", document.createElement(\"div\")]); // Prepended at index 0, 1\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 0, pushing every panels behind it.\n */\n public prepend(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n\n const insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0);\n const prependedPanels = viewport.insert(insertingIndex, parsedElements);\n\n this.checkContentsReady(prependedPanels);\n\n return prependedPanels;\n }\n\n /**\n * Add new panels at the end of panels.\n * @ko 제일 끝에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\")); // Appended at index 0\n * flicking.append(\"\\Panel\\\"); // Appended at index 1\n * flicking.append([\"\\Panel\\\", document.createElement(\"div\")]); // Appended at index 2, 3\n * // Even this is possible\n * flicking.append(\"\\Panel 1\\\\Panel 2\\\"); // Appended at index 4, 5\n */\n public append(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element);\n\n this.checkContentsReady(appendedPanels);\n\n return appendedPanels;\n }\n\n /**\n * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index.\n * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다.\n * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n *\n * // This will add new panel at index 3,\n * // Index 0, 1, 2 is empty at this moment.\n * // [empty, empty, empty, PANEL]\n * flicking.replace(3, document.createElement(\"div\"));\n *\n * // As index 2 was empty, this will also add new panel at index 2.\n * // [empty, empty, PANEL, PANEL]\n * flicking.replace(2, \"\\Panel\\\");\n *\n * // Index 3 was not empty, so it will replace previous one.\n * // It will also add new panels at index 4 and 5.\n * // before - [empty, empty, PANEL, PANEL]\n * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL]\n * flicking.replace(3, [\"\\Panel\\\", \"\\Panel\\\", \"\\Panel\\\"])\n */\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const replacedPanels = this.viewport.replace(index, element);\n\n this.checkContentsReady(replacedPanels);\n\n return replacedPanels;\n }\n\n /**\n * Remove panel at target index. This will decrease index of panels behind it.\n * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다.\n * @param index - Index of panel to remove.제거할 패널의 인덱스\n * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수.\n * @return Array of removed panels제거된 패널들의 배열\n */\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n return this.viewport.remove(index, deleteCount);\n }\n\n /**\n * Get indexes to render. Should be used with `renderOnlyVisible` option.\n * `beforeSync` should be called before this method for a correct result.\n * @private\n * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다.\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @return Array of indexes to render.렌더링할 인덱스의 배열\n */\n public getRenderingIndexes(diffResult: DiffResult): number[] {\n const viewport = this.viewport;\n const visiblePanels = viewport.getVisiblePanels();\n const maintained = diffResult.maintained.reduce((values: {[key: number]: number}, [before, after]) => {\n values[after] = before;\n return values;\n }, {});\n\n const panelCount = diffResult.list.length;\n const added = diffResult.added;\n const getPanelAbsIndex = (panel: Panel) => {\n return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n };\n\n const visibleIndexes = visiblePanels.map(panel => getPanelAbsIndex(panel))\n .filter(val => maintained[val % panelCount] != null);\n\n const renderingPanels = [...visibleIndexes, ...added];\n const allPanels = viewport.panelManager.allPanels();\n\n viewport.setVisiblePanels(renderingPanels.map(index => allPanels[index]));\n\n return renderingPanels;\n }\n\n /**\n * Synchronize info of panels instance with info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다.\n * @private\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 \n */\n public beforeSync(diffInfo: BeforeSyncResult) {\n const { maintained, added, changed, removed } = diffInfo;\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const isCircular = this.options.circular;\n const cloneCount = panelManager.getCloneCount();\n const prevClonedPanels = panelManager.clonedPanels();\n\n // Update visible panels\n const newVisiblePanels = viewport.getVisiblePanels()\n .filter(panel => findIndex(removed, index => {\n return index === panel.getIndex();\n }) < 0);\n viewport.setVisiblePanels(newVisiblePanels);\n\n // Did not changed at all\n if (\n added.length <= 0\n && removed.length <= 0\n && changed.length <= 0\n && cloneCount === prevClonedPanels.length\n ) {\n return this;\n }\n const prevOriginalPanels = panelManager.originalPanels();\n const newPanels: Panel[] = [];\n const newClones: Panel[][] = counter(cloneCount).map(() => []);\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newPanels[afterIdx] = prevOriginalPanels[beforeIdx];\n newPanels[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n newPanels[addIndex] = new Panel(null, addIndex, this.viewport);\n });\n\n if (isCircular) {\n counter(cloneCount).forEach(groupIndex => {\n const prevCloneGroup = prevClonedPanels[groupIndex];\n const newCloneGroup = newClones[groupIndex];\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newCloneGroup[afterIdx] = prevCloneGroup\n ? prevCloneGroup[beforeIdx]\n : newPanels[afterIdx].clone(groupIndex, false);\n\n newCloneGroup[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n const newPanel = newPanels[addIndex];\n\n newCloneGroup[addIndex] = newPanel.clone(groupIndex, false);\n });\n });\n }\n\n added.forEach(index => { viewport.updateCheckedIndexes({ min: index, max: index }); });\n removed.forEach(index => { viewport.updateCheckedIndexes({ min: index - 1, max: index + 1 }); });\n\n const checkedIndexes = viewport.getCheckedIndexes();\n checkedIndexes.forEach(([min, max], idx) => {\n // Push checked indexes backward\n const pushedIndex = added.filter(index => index < min && panelManager.has(index)).length\n - removed.filter(index => index < min).length;\n checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n });\n\n // Only effective only when there are least one panel which have changed its index\n if (changed.length > 0) {\n // Removed checked index by changed ones after pushing\n maintained.forEach(([, next]) => { viewport.updateCheckedIndexes({ min: next, max: next }); });\n }\n panelManager.replacePanels(newPanels, newClones);\n this.isPanelChangedAtBeforeSync = true;\n }\n\n /**\n * Synchronize info of panels with DOM info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다.\n * @private\n * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트.\n */\n public sync(diffInfo: SyncResult): this {\n const { list, maintained, added, changed, removed } = diffInfo;\n\n // Did not changed at all\n if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) {\n return this;\n }\n const viewport = this.viewport;\n const { renderOnlyVisible, circular } = this.options;\n const panelManager = viewport.panelManager;\n\n if (!renderOnlyVisible) {\n const indexRange = panelManager.getRange();\n let beforeDiffInfo: BeforeSyncResult = diffInfo;\n\n if (circular) {\n const prevOriginalPanelCount = indexRange.max;\n const originalPanelCount = (list.length / (panelManager.getCloneCount() + 1)) >> 0;\n const originalAdded = added.filter(index => index < originalPanelCount);\n const originalRemoved = removed.filter(index => index <= prevOriginalPanelCount);\n const originalMaintained = maintained.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n const originalChanged = changed.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n\n beforeDiffInfo = {\n added: originalAdded,\n maintained: originalMaintained,\n removed: originalRemoved,\n changed: originalChanged,\n };\n }\n this.beforeSync(beforeDiffInfo);\n }\n\n const visiblePanels = renderOnlyVisible\n ? viewport.getVisiblePanels()\n : this.getAllPanels(true);\n\n added.forEach(addedIndex => {\n const addedElement = list[addedIndex];\n const beforePanel = visiblePanels[addedIndex] as Panel;\n\n beforePanel.setElement(addedElement);\n // As it can be 0\n beforePanel.unCacheBbox();\n });\n if (this.isPanelChangedAtBeforeSync) {\n // Reset visible panels\n viewport.setVisiblePanels([]);\n this.isPanelChangedAtBeforeSync = false;\n }\n viewport.resize();\n\n return this;\n }\n\n private listenInput(): void {\n const flicking = this;\n const viewport = flicking.viewport;\n const stateMachine = viewport.stateMachine;\n\n // Set event context\n flicking.eventContext = {\n flicking,\n viewport: flicking.viewport,\n transitTo: stateMachine.transitTo,\n triggerEvent: flicking.triggerEvent,\n moveCamera: flicking.moveCamera,\n stopCamera: viewport.stopCamera,\n };\n\n const handlers = {};\n for (const key in AXES_EVENTS) {\n const eventType = AXES_EVENTS[key];\n\n handlers[eventType] = (e: any) => stateMachine.fire(eventType, e, flicking.eventContext);\n }\n\n // Connect Axes instance with PanInput\n flicking.viewport.connectAxesHandler(handlers);\n }\n\n private listenResize(): void {\n const options = this.options;\n\n if (options.autoResize) {\n window.addEventListener(\"resize\", this.resize);\n }\n\n if (options.resizeOnContentsReady) {\n const contentsReadyChecker = new ImReady();\n\n contentsReadyChecker.on(\"preReady\", () => {\n this.resize();\n });\n contentsReadyChecker.on(\"readyElement\", e => {\n if (e.hasLoading && e.isPreReadyOver) {\n this.resize();\n }\n });\n contentsReadyChecker.on(\"error\", e => {\n this.trigger(EVENTS.CONTENT_ERROR, {\n type: EVENTS.CONTENT_ERROR,\n element: e.element,\n });\n });\n contentsReadyChecker.check([this.wrapper]);\n\n this.contentsReadyChecker = contentsReadyChecker;\n }\n }\n\n private triggerEvent = (\n eventName: ValueOf>, // visibleChange event has no common event definition from other events\n axesEvent: any,\n isTrusted: boolean,\n params: Partial = {},\n ): TriggerCallback => {\n const viewport = this.viewport;\n\n let canceled: boolean = true;\n\n // Ignore events before viewport is initialized\n if (viewport) {\n const state = viewport.stateMachine.getState();\n const { prev, next } = viewport.getScrollArea();\n const pos = viewport.getCameraPosition();\n let progress = getProgress(pos, [prev, prev, next]);\n\n if (this.options.circular) {\n progress %= 1;\n }\n canceled = !super.trigger(eventName, merge({\n type: eventName,\n index: this.getIndex(),\n panel: this.getCurrentPanel(),\n direction: state.direction,\n holding: state.holding,\n progress,\n axesEvent,\n isTrusted,\n }, params) as FlickingEvent);\n }\n\n return {\n onSuccess(callback: () => void): TriggerCallback {\n if (!canceled) {\n callback();\n }\n return this;\n },\n onStopped(callback: () => void): TriggerCallback {\n if (canceled) {\n callback();\n }\n return this;\n },\n } as TriggerCallback;\n }\n\n // Return result of \"move\" event triggered\n private moveCamera = (axesEvent: any): TriggerCallback => {\n const viewport = this.viewport;\n const state = viewport.stateMachine.getState();\n const options = this.options;\n\n const pos = axesEvent.pos.flick;\n const previousPosition = viewport.getCameraPosition();\n\n if (axesEvent.isTrusted && state.holding) {\n const inputOffset = options.horizontal\n ? axesEvent.inputEvent.offsetX\n : axesEvent.inputEvent.offsetY;\n\n const isNextDirection = inputOffset < 0;\n\n let cameraChange = pos - previousPosition;\n const looped = isNextDirection === (pos < previousPosition);\n if (options.circular && looped) {\n // Reached at max/min range of axes\n const scrollAreaSize = viewport.getScrollAreaSize();\n cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange));\n }\n\n const currentDirection = cameraChange === 0\n ? state.direction\n : cameraChange > 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n state.direction = currentDirection;\n }\n state.delta += axesEvent.delta.flick;\n\n viewport.moveCamera(pos, axesEvent);\n return this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted)\n .onStopped(() => {\n // Undo camera movement\n viewport.moveCamera(previousPosition, axesEvent);\n });\n }\n\n private checkContentsReady(panels: FlickingPanel[]) {\n this.contentsReadyChecker?.check(panels.map(panel => panel.getElement()));\n }\n}\n\nexport default Flicking;\n","import Flicking from \"./Flicking\";\nimport { withFlickingMethods } from \"./utils\";\nimport { DEFAULT_OPTIONS, MOVE_TYPE } from \"./consts\";\n\n(Flicking as any).withFlickingMethods = withFlickingMethods;\n(Flicking as any).DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n(Flicking as any).MOVE_TYPE = MOVE_TYPE;\nexport default Flicking;\n"],"names":["MOVE_TYPE","SNAP","FREE_SCROLL","DEFAULT_MOVE_TYPE_OPTIONS","snap","type","count","freeScroll","isBrowser","document","DEFAULT_OPTIONS","classPrefix","deceleration","horizontal","circular","infinite","infiniteThreshold","lastIndex","Infinity","threshold","duration","panelEffect","x","Math","pow","defaultIndex","inputType","thresholdAngle","bounce","autoResize","adaptive","zIndex","bound","overflow","hanger","anchor","gap","moveType","useOffset","isEqualSize","isConstantSize","renderOnlyVisible","renderExternal","resizeOnContentsReady","iOSEdgeSwipeThreshold","collectStatistics","DEFAULT_VIEWPORT_CSS","position","DEFAULT_CAMERA_CSS","width","height","willChange","DEFAULT_PANEL_CSS","EVENTS","HOLD_START","HOLD_END","MOVE_START","MOVE","MOVE_END","CHANGE","RESTORE","SELECT","NEED_PANEL","VISIBLE_CHANGE","CONTENT_ERROR","AXES_EVENTS","HOLD","RELEASE","ANIMATION_END","FINISH","STATE_TYPE","IDLE","HOLDING","DRAGGING","ANIMATING","DISABLED","DIRECTION","PREV","NEXT","FLICKING_METHODS","prev","next","moveTo","getIndex","getAllPanels","getCurrentPanel","getElement","getSize","getPanel","getPanelCount","getStatus","getVisiblePanels","enableInput","disableInput","destroy","resize","setStatus","isPlaying","checkTranslateSupport","transforms","webkitTransform","msTransform","MozTransform","OTransform","transform","name","has3d","supportedStyle","documentElement","style","transformName","prefixedTransform","Error","el","createElement","insertBefore","styleVal","window","getComputedStyle","getPropertyValue","parentElement","removeChild","transformInfo","length","TRANSFORM","merge","target","_i","srcs","forEach","source","Object","keys","key","value","parseElement","element","Array","isArray","elements","isString","tempDiv","innerHTML","push","toArray","children","firstChild","addClass","className","classList","add","hasClass","replace","contains","split","indexOf","applyCSS","cssObj","property","clamp","val","min","max","isBetween","iterable","slice","call","arr","constructor","parseArithmeticExpression","cssValue","base","defaultVal","defaultValue","cssRegex","idx","calculatedValue","matchResult","exec","sign","unit","parsedValue","parseFloat","getProgress","pos","range","center","findIndex","callback","i","counter","counterArray","circulate","indexed","size","offset","restoreStyle","originalStyle","setAttribute","removeAttribute","withFlickingMethods","prototype","flickingName","args","result","_a","getBbox","bbox","y","offsetWidth","offsetHeight","clientRect","getBoundingClientRect","left","top","index","viewport","prevSibling","nextSibling","clonedPanels","state","relativeAnchorPosition","isClone","isVirtual","cloneIndex","cachedBbox","setElement","givenBbox","options","prevSize","panel","cloneState","panelCount","panelManager","scrollAreaSize","getScrollAreaSize","relativeIndex","floor","getPosition","progress","getCurrentProgress","outsetRange","getRelativeHangerPosition","getRelativeAnchorPosition","relativePanelPosition","getCameraPosition","outsetProgress","panelSize","rightRelativePanelPosition","visibleSize","visibleRatio","currentPanel","hangerPosition","getHangerPosition","anchorPosition","getAnchorPosition","currentPosition","eventType","findEstimatedPosition","updateFunction","shouldResize","identicalPanels","getIdenticalPanels","eachPanel","unCacheBbox","addVisiblePanel","currentIndex","prevPanelIndex","prevPanelPosition","prevPanelSize","hasEmptyPanelBetween","notYetMinPanel","newPosition","prevPanel","clone","getCloneIndex","setPosition","getLastIndex","nextPanelIndex","nextPanelPosition","notYetMaxPanel","nextPanel","parsedElements","firstPanel","targetIndex","insert","remove","option","preserveUI","wasVisible","Boolean","parentNode","cameraElement","getCameraElement","appendChild","classes","classes_1","original","getClonedPanels","elementStyle","currentElementStyle","styleToApply","cloneElement","cloneNode","clonedPanel","Panel","clonedState","removeClonedPanelsAfter","start","removingPanels","splice","removeElement","currentElement","getAttribute","panels","clones","cloneCount","reduce","allClones","newPanels","newClones","filter","lastPanel","firstRemovedPanel","possibleLastPanel","shouldRender","isCircular","findFirstPanelFrom","siblingElement","insertNewPanels","pushedIndex","panelsAfterIndex","emptyPanelCount","removedPanels","newLastIndex","concat","reverse","setIndex","updateIndex","addNewClones","panelCount_1","cloneSet","replacedPanels","wasNonEmptyCount","deleteCount","deletedPanels","reversedPanels","nonEmptyIndexFromLast","allPanels","allPanelsCount","newClones_1","insertTarget_1","allPanels_1","panelElement","originalPanels","getCloneCount","lastPanelClones","nextSiblingClones","cloneNextSibling","lastPanelSibling","cloneSiblingElement","nextElementSibling","map","_this","this_1","insertClones","insertingIndex","fragment_1","createDocumentFragment","prevState","delta","direction","targetPanel","lastPosition","nextState","e","context","__extends","flicking","triggerEvent","transitTo","moveCamera","onSuccess","onStopped","onChange","State","inputEvent","offsetX","offsetY","flick","setTo","releaseEvent","srcEvent","clickedElement","touchEvent","touch","changedTouches","elementFromPoint","clientX","clientY","clickedPanel","findPanelOf","cameraPosition","clickedPanelPosition","stopCamera","absDelta","abs","velocity","velocityX","velocityY","inputDelta","deltaX","deltaY","isNextDirection","swipeDistance","swipeAngle","atan","PI","belowAngleThreshold","overThreshold","moveTypeContext","axesEvent","interruptDestInfo","findPanelWhenInterrupted","destPos","nearestPanel","getNearestPanel","stop","destInfo","findTargetPanel","findRestorePanel","scrollArea","getScrollArea","loopCount","originalTargetPosition","newCloneIndex","newTargetPosition","newTargetPanel","setCurrentPanel","isTrusted","updateAdaptiveSize","updateCameraPosition","updateAxesPosition","IdleState","nextStateType","currentState","HoldingState","DraggingState","AnimatingState","DisabledState","onExit","onEnter","onHold","onRelease","onAnimationEnd","onFinish","ctx","findRestorePanelInCircularMode","halfGap","minimumDistanceToChange","originalPanel","getOriginalPanel","firstClonedPanel","lapped","_super","snapCount","eventDelta","calcBrinkOfChange","nearestIsCurrent","shouldMoveWhenBounceIs0","canSetBoundMode","shouldMoveToAdjacent","isOutOfBound","findSnappedPanel","findAdjacentPanel","estimatedHangerPos","panelToMove","cycleIndex","passedPanelCount","panelPosition","panelNextPosition","panelPrevPosition","siblingPanel","panelIndex","siblingIndex","originalPosition","defaultDuration","getCurrentIndex","get","basePanel","basePosition","adjacentPanel","targetRelativeAnchorPosition","estimatedPanelPosition","estimatedPosition","MoveType","estimatedPanel","findNearestPanelAt","stateMachine","getState","currentPanelPosition","lastHangerPosition","Snap","panelMaintainRatio","relativeHangerPosition","positionOffset","translate","checkedIndexes","isAdaptiveCached","isViewportGiven","isCameraGiven","originalViewportStyle","originalCameraStyle","StateMachine","visiblePanels","panelBboxes","build","eventResult","axes","findNearestPanel","originalNearestPosition","checkNeedPanel","modifiedNearestPosition","updateVisiblePanels","posOffset","moveVector","moveCoord","coord","round","join","viewportElement","updateSize","updateOriginalPanelPositions","updateScrollArea","updateClonePanels","updateVisiblePanelPositions","updatePlugins","minimumDistance","prevPosition","nextPosition","distance","minimumAnchorDistance","anchorDistance","nearest","shortestDistance","identicals","identical","getVisibleIndexOf","panInput","createPanInput","resizePanels","newCenterPanel","newPanelPosition","updateCheckedIndexes","indexes","visibleIndex","wasEmpty","newCurrentIndex","getRange","undefined","shouldApplyAdaptive","viewportStyle","sizeToApply","panelBbox","maximumPanelSize","maximum","viewportBbox","updateBbox","viewportSize","isFreeScroll","is","holding","playing","positionBounded","plugins","plugin","update","wrapper","removePlugins","topmostElement_1","deletingElement","status","html","refreshPanels","createdPanels","orderedPanels","createdPanel","replacePanels","setCloneCount","cameraPos_1","viewportSize_1","getNextPanel","getPrevPanel","isOutOfBoundNext","isOutOfBoundPrev","getNext","isOutOfViewport","getAbsIndex_1","nextPanels","prevPanels","__spreadArrays","sort","panel1","panel2","getOutsetProgress","NaN","prevRange","nextRange","nearestAnchorPos","nearestIndex","nearestSize","hangerIsNextToNearestPanel","targetPosition","progressBetween","startIndex","off","on","axesHandlers","setLastIndex","handlers","newPlugins","init","currentPlugins","removedPlugins","changedRange","removed","fragment","prevVisiblePanels","equalSizeClasses_1","cached_1","overlappedClass","getOverlappedClass","clonePanels","updateClonedPanelPositions","chainAllPanels","visiblePanel","setElements","applyCSSValue","setMoveType","setAxesInstance","setDefaultPanel","moveToDefaultPanel","viewportCandidate","hasViewportElement","cameraCandidate","hasCameraElement","panelElements","child","minHeight","minWidth","PanelManager","FreeScroll","Axes","easing","interruptable","indexRange","sumOriginalPanelSize","areaPrev","sizeSum","panelAtLeftBoundary","reversedPanels_1","areaNext","panelAtRightBoundary","panels_1","needCloneOnPrev","panel0OnFirstscreen","ceil","prevCloneCount","origPanel","removeClonesAfter","defaultPanel","defaultPosition","nextPanelPos","maintainingPanel","looped","panelsBeforeMaintainPanel","accumulatedSize","total","setPositionCSS","clonedPanels_1","cloneBasePos","clonedPanelPos","lastReplacePosition","_b","replacePosition","relAnchorPosOfCombined","anchorPos","parsedBounce","parsedVal","axis","maxLastIndex","triggerNeedPanel","checkingPanel","atLastPanel","nextIndex","currentNearestPosition","panelRight","cameraNext","emptyPanelExistsBetween","firstIndex","lastPanelAfterNeed","atLastPanelAfterNeed","cameraPrev","checkingIndex","atFirstPanel","prevIndex","panelLeft","firstPanelAfterNeed","atFirstPanelAfterNeed","params","alreadyTriggered","some","hasHandler","hasOn","fill","insertAfter","newVisiblePanels","calcVisiblePanels","checkVisiblePanelChange","addedPanels","firstVisiblePanelPos","firstVisiblePanel","lastVisiblePanel","getAbsIndex","newVisibleRange","trigger","prevRefCount","newRefCount","newPanel","newIndex","added","default","defaultBbox_1","equalSizeClasses_2","PanInput","scale","connect","shouldResetElements","parent","origStyle","appendUncachedPanelElements","eventName","canceled","previousPosition","inputOffset","cameraChange","currentDirection","querySelector","nodeName","nodeType","currentOptions","Viewport","listenInput","listenResize","focus","possiblePositions","nearestPosition","current","includeClone","enable","disable","outerHTML","restore","addPlugins","removeEventListener","contentsReadyChecker","prependedPanels","checkContentsReady","appendedPanels","diffResult","maintained","values","before","after","list","getPanelAbsIndex","visibleIndexes","renderingPanels","setVisiblePanels","diffInfo","changed","prevClonedPanels","prevOriginalPanels","beforeIdx","afterIdx","addIndex","groupIndex","prevCloneGroup","newCloneGroup","getCheckedIndexes","has","isPanelChangedAtBeforeSync","beforeDiffInfo","prevOriginalPanelCount_1","originalPanelCount_1","originalAdded","originalRemoved","originalMaintained","originalChanged","beforeSync","addedIndex","addedElement","beforePanel","eventContext","fire","connectAxesHandler","addEventListener","ImReady","hasLoading","isPreReadyOver","check","Flicking","Component"],"mappings":"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"} \ No newline at end of file diff --git a/dist/flicking.min.js b/dist/flicking.min.js new file mode 100644 index 0000000000..00c91fbfac --- /dev/null +++ b/dist/flicking.min.js @@ -0,0 +1,10 @@ +/* +Copyright (c) 2015-present NAVER Corp. +name: @egjs/flicking +license: MIT +author: NAVER Corp. +repository: https://github.com/naver/egjs-flicking +version: 3.7.2 +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@egjs/component"),require("@egjs/imready"),require("@egjs/axes")):"function"==typeof define&&define.amd?define(["@egjs/component","@egjs/imready","@egjs/axes"],t):((e=e||self).eg=e.eg||{},e.eg.Flicking=t(e.eg.Component,e.ImReady,e.eg.Axes))}(this,function(e,i,r){"use strict";var a=function(e,t){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function o(e,t){function n(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function m(){for(var e=0,t=0,n=arguments.length;te&&(n=this.panels.splice(e+1),this.length-=n.length,(i=n.filter(function(e){return!!e})[0].prevSibling)?t.max=i.getIndex():(t.min=-1,t.max=-1),this.shouldRender()&&n.forEach(function(e){return e.removeElement()})))},t.setCloneCount=function(e){this.cloneCount=e},t.insert=function(n,e){var i=this.panels,t=this.range,r=this.options.circular,a=this.lastIndex,o=this.findFirstPanelFrom(n),s=this.firstPanel(),l=o?o.getElement():r&&s?s.getClonedPanels()[0].getElement():null;this.insertNewPanels(e,l);var h,c,u,g,f,d,p=e.length;return n>t.max?e.forEach(function(e,t){i[n+t]=e}):((c=B(h=i.slice(n,n+e.length),function(e){return e}))<0&&(c=h.length),p=e.length-c,i.splice.apply(i,m([n,c],e)),i.length>a+1&&(u=i.splice(a+1).filter(function(e){return Boolean(e)}),this.length-=u.length,g=a-B(this.panels.concat().reverse(),function(e){return e}),this.panels.splice(1+g),this.range.max=g,this.shouldRender()&&u.forEach(function(e){return e.removeElement()}))),0a+1&&f.forEach(function(e){e.splice(d)})),p},t.replace=function(e,t){var n=this.panels,i=this.range,r=this.options.circular,a=this.findFirstPanelFrom(e+t.length),o=this.firstPanel(),s=a?a.getElement():r&&o?o.getClonedPanels()[0].getElement():null;this.insertNewPanels(t,s),e>i.max&&(n[e]=null);var l=n.splice.apply(n,m([e,t.length],t)),h=l.filter(function(e){return Boolean(e)}).length;return this.length+=t.length-h,this.updateIndex(e),r&&this.addNewClones(e,t,t.length,a),this.shouldRender()&&l.forEach(function(e){return e&&e.removeElement()}),l},t.remove=function(t,n){void 0===n&&(n=1);var e=this.options.circular,i=this.panels,r=this.clones;n=Math.max(n,0);var a=i.splice(t,n).filter(function(e){return!!e});this.shouldRender()&&a.forEach(function(e){return e.removeElement()}),e&&r.forEach(function(e){e.splice(t,n)}),i.slice(t).forEach(function(e){e.setIndex(e.getIndex()-n)});var o,s=i.length-1;return i[s]||(o=B(i.concat().reverse(),function(e){return e}),s=o<0?-1:s-o,i.splice(s+1),e&&r.forEach(function(e){e.splice(s+1)})),this.range={min:B(i,function(e){return e}),max:s},this.length-=a.length,this.length<=0&&(this.clones=[],this.cloneCount=0),a},t.chainAllPanels=function(){var e,t,r=this.allPanels().filter(function(e){return!!e}),n=r.length;n<=1||(r.slice(1,r.length-1).forEach(function(e,t){var n=r[t],i=r[t+2];e.prevSibling=n,e.nextSibling=i}),e=r[0],t=r[n-1],e.prevSibling=null,e.nextSibling=r[1],t.prevSibling=r[n-2],t.nextSibling=null,this.options.circular&&((e.prevSibling=t).nextSibling=e))},t.insertClones=function(e,n,t,i){void 0===i&&(i=0);var r,a,o=this.clones,s=this.lastIndex;o[e]?(r=o[e],n>=r.length?t.forEach(function(e,t){r[n+t]=e}):(r.splice.apply(r,m([n,i],t)),t.length>s+1&&t.splice(s+1))):(a=[],t.forEach(function(e,t){a[n+t]=e}),o[e]=a)},t.removeClonesAfter=function(t){this.panels.forEach(function(e){e.removeClonedPanelsAfter(t)}),this.clones.splice(t)},t.findPanelOf=function(e){for(var t=0,n=this.allPanels();t=e&&i.getElement().parentNode)return i}},t.addNewClones=function(a,o,s,e){for(var l=this,h=this.cameraElement,t=this.getCloneCount(),n=this.lastPanel(),c=n?n.getClonedPanels():[],u=e?e.getClonedPanels():[],g=this,i=0,r=V(t);in.max&&(n.max=i),(eh.thresholdAngle,x=v>=h.threshold&&m,E={viewport:i,axesEvent:e,state:this,swipeDistance:v,isNextDirection:p};r(A.HOLD_END,e,!0);var C=this.targetPanel;if(!x&&C){var S=u.findPanelWhenInterrupted(E);return i.moveTo(S.panel,S.destPos,S.eventType,e,S.duration),void a(M)}var b=i.getCurrentPanel(),y=i.getNearestPanel();if(!b||!y)return e.stop(),void a(w);var I=x?u.findTargetPanel(E):u.findRestorePanel(E);i.moveTo(I.panel,I.destPos,I.eventType,e,I.duration).onSuccess(function(){a(M)}).onStopped(function(){a(z),o(e)})},e}(n),q=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=M,e.holding=!1,e.playing=!0,e}o(e,t);var n=e.prototype;return n.onHold=function(e,t){var n,i,r,a,o,s=t.viewport,l=t.triggerEvent,h=t.transitTo,c=s.options,u=s.getScrollArea(),g=s.getScrollAreaSize(),f=Math.floor((this.lastPosition+this.delta-u.prev)/g),d=this.targetPanel;c.circular&&0!==f&&d&&(n=s.panelManager.getCloneCount(),i=d.getPosition(),r=H(d.getCloneIndex()-f,-1,n-1,!0),a=i-f*g,(o=d.getIdenticalPanels()[r+1].clone(r,!0)).setPosition(a),this.targetPanel=o),this.delta=0,this.lastPosition=s.getCameraPosition(),s.setCurrentPanel(s.getNearestPanel()),l(A.HOLD_START,e,!0).onSuccess(function(){h(p)}).onStopped(function(){h(z)})},n.onChange=function(e,t){var n=t.moveCamera,i=t.transitTo;e.delta.flick&&n(e).onStopped(function(){i(z)})},n.onFinish=function(e,t){var n=t.flicking,i=t.viewport,r=t.triggerEvent,a=t.transitTo,o=e&&e.isTrusted;i.options.bound?i.setCurrentPanel(this.targetPanel):i.setCurrentPanel(i.getNearestPanel()),n.options.adaptive&&i.updateAdaptiveSize(),a(w),i.updateCameraPosition(),r(A.MOVE_END,e,o,{direction:this.direction})},e}(n),Y=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type=z,e.holding=!1,e.playing=!0,e}o(e,t);var n=e.prototype;return n.onAnimationEnd=function(e,t){(0,t.transitTo)(w)},n.onChange=function(e,t){var n=t.viewport,i=t.transitTo;e.stop(),n.updateAxesPosition(n.getCameraPosition()),i(w)},n.onRelease=function(e,t){var n=t.transitTo;0===e.delta.flick&&n(w)},e}(n),U=function(){function e(){var i=this;this.state=new G,this.transitTo=function(e){var t=i.state;if(t.type!==e){var n=void 0;switch(e){case w:n=new G;break;case d:n=new X;break;case p:n=new j;break;case M:n=new q;break;case z:n=new Y}t.onExit(n),n.onEnter(t),i.state=n}return i.state}}var t=e.prototype;return t.fire=function(e,t,n){var i=this.state;switch(e){case f.HOLD:i.onHold(t,n);break;case f.CHANGE:i.onChange(t,n);break;case f.RELEASE:i.onRelease(t,n);break;case f.ANIMATION_END:i.onAnimationEnd(t,n);break;case f.FINISH:i.onFinish(t,n)}},t.getState=function(){return this.state},e}(),W=function(n){function e(e){var t=n.call(this)||this;return t.type=c.SNAP,t.count=e,t}o(e,n);var t=e.prototype;return t.findTargetPanel=function(e){var t=e.viewport,n=e.axesEvent,i=e.swipeDistance,r=this.count,a=Math.abs(n.delta.flick),o=t.getCurrentPanel(),s=t.getNearestPanel(),l=this.calcBrinkOfChange(e),h=s.getIndex()===o.getIndex(),c=t.canSetBoundMode()&&h,u=!t.isOutOfBound()&&(i<=l||c);return 1o?A.CHANGE:A.RESTORE}},t.findAdjacentPanel=function(e){var t=e.viewport,n=e.isNextDirection,i=t.options,r=t.getCurrentIndex(),a=t.panelManager.get(r),o=t.getHangerPosition(),s=t.getScrollArea(),l=a.getIdenticalPanels()[1],h=i.circular&&Math.abs(a.getAnchorPosition()-o)>Math.abs(l.getAnchorPosition()-o)?l:a,c=h.getPosition(),u=n?h.nextSibling:h.prevSibling,g=u?A.CHANGE:A.RESTORE,f=u||h,d=f.getRelativeAnchorPosition(),p=(i.circular?n?c+h.getSize()+d+i.gap:c-(f.getSize()-d)-i.gap:f.getAnchorPosition())-t.getRelativeHangerPosition();return{panel:f,destPos:t.canSetBoundMode()?I(p,s.prev,s.next):p,duration:i.duration,eventType:g}},e}(function(){function e(){}var t=e.prototype;return t.is=function(e){return e===this.type},t.findRestorePanel=function(e){var t=e.viewport,n=t.options,i=n.circular?this.findRestorePanelInCircularMode(e):t.getCurrentPanel();return{panel:i,destPos:t.findEstimatedPosition(i),duration:n.duration,eventType:A.RESTORE}},t.findPanelWhenInterrupted=function(e){var t=e.state,n=e.viewport,i=t.targetPanel;return{panel:i,destPos:n.findEstimatedPosition(i),duration:n.options.duration,eventType:""}},t.calcBrinkOfChange=function(e){var t=e.viewport,n=e.isNextDirection,i=t.options,r=t.getCurrentPanel(),a=i.gap/2,o=r.getRelativeAnchorPosition(),s=n?r.getSize()-o+a:o+a;return s=Math.max(s,i.threshold)},t.findRestorePanelInCircularMode=function(e){var t=e.viewport,n=t.getCurrentPanel().getOriginalPanel(),i=t.getHangerPosition(),r=n.getIdenticalPanels()[1],a=Math.abs(n.getAnchorPosition()-i)>Math.abs(r.getAnchorPosition()-i);return!e.isNextDirection&&a?r:n},e}()),J=function(u){function e(){var e=u.call(this,1/0)||this;return e.type=c.FREE_SCROLL,e}o(e,u);var t=e.prototype;return t.findTargetPanel=function(e){var t=e.axesEvent,n=e.state,i=e.viewport,r=t.destPos.flick,a=this.calcBrinkOfChange(e),o=i.getScrollArea(),s=i.getCurrentPanel(),l=i.options;if(al.next)&&(s=H(n.position,l.prev,l.next,!1),this.moveCamera(s),this.updateAxesPosition(s)),o},t.updateAdaptiveSize=function(){var e,t,n,i,r,a,o=this.state,s=this.options,l=s.horizontal,h=this.getCurrentPanel();h&&(e=s.adaptive||!o.isAdaptiveCached,t=this.viewportElement.style,e&&(i=void 0,i=s.adaptive?(n=h.getBbox(),l?n.height:n.width):this.panelManager.originalPanels().reduce(function(e,t){var n=t.getBbox();return Math.max(e,l?n.height:n.width)},0),o.isAdaptiveCached||(r=this.updateBbox(),i=Math.max(i,l?r.height:r.width),o.isAdaptiveCached=!0),a=i+"px",l?(t.height=a,o.cachedBbox.height=i):(t.width=a,o.cachedBbox.width=i)))},t.updateCameraPosition=function(){var e,t,n,i=this.state,r=this.getCurrentPanel(),a=this.getCameraPosition(),o=this.stateMachine.getState(),s=this.moveType.is(c.FREE_SCROLL),l=this.getRelativeHangerPosition(),h=this.options.gap/2;o.holding||o.playing?this.updateVisiblePanels():(n=s?(e=this.canSetBoundMode()&&(a===i.scrollArea.prev||a===i.scrollArea.next),t=this.getNearestPanel(),e||!t?a:t.getPosition()-h+(t.getSize()+2*h)*i.panelMaintainRatio-l):r?r.getAnchorPosition()-l:a,this.canSetBoundMode()&&(n=I(n,i.scrollArea.prev,i.scrollArea.next)),this.updateAxesPosition(n),this.moveCamera(n))},t.updateBbox=function(){var e=this.state,t=this.options,n=this.viewportElement;return e.cachedBbox||(e.cachedBbox=D(n,t.useOffset)),e.cachedBbox},t.updatePlugins=function(){var t=this;this.plugins.forEach(function(e){e.update&&e.update(t.flicking)})},t.destroy=function(t){var e,n,i,r=this.state,a=this.flicking.getElement(),o=this.viewportElement,s=this.cameraElement,l=this.panelManager.originalPanels();for(var h in this.removePlugins(this.plugins),t.preserveUI||(L(o,r.originalViewportStyle),L(s,r.originalCameraStyle),r.isCameraGiven||this.options.renderExternal||(n=r.isViewportGiven?o:a,i=r.isViewportGiven?s:o,l.forEach(function(e){n.appendChild(e.getElement())}),n.removeChild(i))),this.axes.destroy(),null!==(e=this.panInput)&&void 0!==e&&e.destroy(),l.forEach(function(e){e.destroy(t)}),this)this[h]=null},t.restore=function(e){var t=e.panels,n=this.options.defaultIndex,i=this.cameraElement,r=this.panelManager;i.innerHTML=t.map(function(e){return e.html}).join(""),this.refreshPanels();var a=r.originalPanels(),o=[];t.forEach(function(e,t){var n=a[t];n.setIndex(e.index),o[e.index]=n}),r.replacePanels(o,[]),r.setCloneCount(0);var s=r.getPanelCount();this.currentPanel=0=e.getPosition()?t:null},function(e){return e.getPosition()>=t+n}),r(i,function(e){var t=e.prevSibling;return t&&t.getPosition()<=e.getPosition()?t:null},function(e){return e.getPosition()+e.getSize()<=t})).sort(function(e,t){return o(e)-o(t)})}return e.filter(function(e){var t=e.getOutsetProgress();return-1=n.next)},t.canSetBoundMode=function(){var e=this.options;return e.bound&&!e.circular},t.getViewportElement=function(){return this.viewportElement},t.getCameraElement=function(){return this.cameraElement},t.getScrollAreaSize=function(){var e=this.state.scrollArea;return e.next-e.prev},t.getRelativeHangerPosition=function(){return this.state.relativeHangerPosition},t.getHangerPosition=function(){return this.state.position+this.state.relativeHangerPosition},t.getCameraPosition=function(){return this.state.position},t.getPositionOffset=function(){return this.state.positionOffset},t.getCheckedIndexes=function(){return this.state.checkedIndexes},t.getVisiblePanels=function(){return this.visiblePanels},t.setCurrentPanel=function(e){this.currentPanel=e},t.setLastIndex=function(e){var t=this.currentPanel,n=this.panelManager;n.setLastIndex(e),t&&t.getIndex()>e&&(this.currentPanel=n.lastPanel()),this.resize()},t.setVisiblePanels=function(e){this.visiblePanels=e},t.connectAxesHandler=function(e){var t=this.axes;this.axesHandlers=e,t.on(e)},t.addPlugins=function(e){var t=this,n=[].concat(e);return n.forEach(function(e){e.init(t.flicking)}),this.plugins=this.plugins.concat(n),this},t.removePlugins=function(e){var n=this,i=this.plugins;return[].concat(e).forEach(function(e){var t=i.indexOf(e);-1=n&&(a.checkedIndexes.splice(t-o,1),o++)})},t.appendUncachedPanelElements=function(e){var t,n,i,r=this,a=this.options,o=document.createDocumentFragment();a.isEqualSize?(t=this.visiblePanels,n=a.isEqualSize,i={},this.visiblePanels=[],Object.keys(this.panelBboxes).forEach(function(e){i[e]=!0}),e.forEach(function(e){var t=e.getOverlappedClass(n);t&&!i[t]?(a.renderExternal||o.appendChild(e.getElement()),r.visiblePanels.push(e),i[t]=!0):t||(a.renderExternal||o.appendChild(e.getElement()),r.visiblePanels.push(e))}),t.forEach(function(e){r.addVisiblePanel(e)})):(a.renderExternal||e.forEach(function(e){return o.appendChild(e.getElement())}),this.visiblePanels=e.filter(function(e){return Boolean(e)})),a.renderExternal||this.cameraElement.appendChild(o)},t.updateClonePanels=function(){var e=this.panelManager;this.options.circular&&0=i.size?i.scrollArea={prev:s.getPosition(),next:l.getPosition()+l.getSize()-i.size}:(e=O(a.anchor,n),t=s.getPosition()+I(e,n-(i.size-h),h),i.scrollArea={prev:t-h,next:t-h}):a.circular?(n=l.getPosition()+l.getSize()-s.getPosition()+a.gap,i.scrollArea={prev:s.getAnchorPosition()-h,next:n+s.getAnchorPosition()-h}):i.scrollArea={prev:s.getAnchorPosition()-h,next:l.getAnchorPosition()-h}:i.scrollArea={prev:0,next:0};var c,u,g,f=i.size,d=a.bounce;u=(g=d)&&g.constructor===Array?d.map(function(e){return O(e,f,v.bounce)}):[c=O(d,f,v.bounce),c];var p=o.axis.flick;p.range=[i.scrollArea.prev,i.scrollArea.next],p.bounce=u},t.checkNeedPanel=function(e){var t=this.state,n=this.options,i=this.panelManager,r=this.currentPanel,a=this.nearestPanel,o=this.stateMachine.getState();if(n.infinite){var s=n.gap,l=t.infiniteThreshold,h=i.getLastIndex();if(!(h<0))if(r&&a){for(var c=a.getPosition(),u=o.holding||o.playing?a:r;u;){var g,f=u.getIndex(),d=u.nextSibling,p=!(f===(E=i.lastPanel()).getIndex())&&d?d.getIndex():h+1,v=a.getPosition(),P=u.getPosition()+u.getSize()-(v-c)+s-l<=t.position+t.size;1>0,h=n.filter(function(e){return e = {\n classPrefix: \"eg-flick\",\n deceleration: 0.0075,\n horizontal: true,\n circular: false,\n infinite: false,\n infiniteThreshold: 0,\n lastIndex: Infinity,\n threshold: 40,\n duration: 100,\n panelEffect: x => 1 - Math.pow(1 - x, 3),\n defaultIndex: 0,\n inputType: [\"touch\", \"mouse\"],\n thresholdAngle: 45,\n bounce: 10,\n autoResize: false,\n adaptive: false,\n zIndex: 2000,\n bound: false,\n overflow: false,\n hanger: \"50%\",\n anchor: \"50%\",\n gap: 0,\n moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap,\n useOffset: false,\n isEqualSize: false,\n isConstantSize: false,\n renderOnlyVisible: false,\n renderExternal: false,\n resizeOnContentsReady: false,\n iOSEdgeSwipeThreshold: 30,\n collectStatistics: true,\n};\n\nexport const DEFAULT_VIEWPORT_CSS = {\n position: \"relative\",\n zIndex: DEFAULT_OPTIONS.zIndex,\n overflow: \"hidden\",\n};\n\nexport const DEFAULT_CAMERA_CSS = {\n width: \"100%\",\n height: \"100%\",\n willChange: \"transform\",\n};\n\nexport const DEFAULT_PANEL_CSS = {\n position: \"absolute\",\n};\n\nexport const EVENTS: EventType = {\n HOLD_START: \"holdStart\",\n HOLD_END: \"holdEnd\",\n MOVE_START: \"moveStart\",\n MOVE: \"move\",\n MOVE_END: \"moveEnd\",\n CHANGE: \"change\",\n RESTORE: \"restore\",\n SELECT: \"select\",\n NEED_PANEL: \"needPanel\",\n VISIBLE_CHANGE: \"visibleChange\",\n CONTENT_ERROR: \"contentError\",\n};\n\nexport const AXES_EVENTS: AxesEventType = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\",\n};\n\nexport const STATE_TYPE: StateType = {\n IDLE: 0,\n HOLDING: 1,\n DRAGGING: 2,\n ANIMATING: 3,\n DISABLED: 4,\n};\n\nexport const DIRECTION: Direction = {\n PREV: \"PREV\",\n NEXT: \"NEXT\",\n};\nexport const FLICKING_METHODS: {[key in FlickingMethodsKeys]: true} = {\n prev: true,\n next: true,\n moveTo: true,\n getIndex: true,\n getAllPanels: true,\n getCurrentPanel: true,\n getElement: true,\n getSize: true,\n getPanel: true,\n getPanelCount: true,\n getStatus: true,\n getVisiblePanels: true,\n enableInput: true,\n disableInput: true,\n destroy: true,\n resize: true,\n setStatus: true,\n isPlaying: true,\n};\n\n// Check whether browser supports transform: translate3d\n// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\nexport let checkTranslateSupport = () => {\n const transforms = {\n webkitTransform: \"-webkit-transform\",\n msTransform: \"-ms-transform\",\n MozTransform: \"-moz-transform\",\n OTransform: \"-o-transform\",\n transform: \"transform\",\n };\n\n if (!isBrowser) {\n return {\n name: transforms.transform,\n has3d: true,\n };\n }\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform in transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new Error(\"Browser doesn't support CSS3 2D Transforms.\");\n }\n\n const el = document.createElement(\"div\");\n\n document.documentElement.insertBefore(el, null);\n\n el.style[transformName] = \"translate3d(1px, 1px, 1px)\";\n const styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]);\n\n el.parentElement!.removeChild(el);\n\n const transformInfo = {\n name: transformName,\n has3d: styleVal.length > 0 && styleVal !== \"none\",\n };\n\n checkTranslateSupport = () => transformInfo;\n\n return transformInfo;\n};\n\nexport const TRANSFORM = checkTranslateSupport();\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ElementLike, OriginalStyle, BoundingBox } from \"./types\";\nimport Flicking from \"./Flicking\";\nimport { FLICKING_METHODS } from \"./consts\";\n\nexport function merge(target: object, ...srcs: object[]): object {\n srcs.forEach(source => {\n Object.keys(source).forEach(key => {\n const value = source[key];\n target[key] = value;\n });\n });\n\n return target;\n}\n\nexport function parseElement(element: ElementLike | ElementLike[]): HTMLElement[] {\n if (!Array.isArray(element)) {\n element = [element];\n }\n\n const elements: HTMLElement[] = [];\n element.forEach(el => {\n if (isString(el)) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = el;\n\n elements.push(...toArray(tempDiv.children) as HTMLElement[]);\n while (tempDiv.firstChild) {\n tempDiv.removeChild(tempDiv.firstChild);\n }\n } else {\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n// Get class list of element as string array\nexport function classList(element: HTMLElement): string[] {\n return element.classList\n ? toArray(element.classList)\n : element.className.split(\" \");\n}\n\n// Add class to specified element\nexport function addClass(element: HTMLElement, className: string): void {\n if (element.classList) {\n element.classList.add(className);\n } else {\n if (!hasClass(element, className)) {\n element.className = (`${element.className} ${className}`).replace(/\\s{2,}/g, \" \");\n }\n }\n}\n\nexport function hasClass(element: HTMLElement, className: string): boolean {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return (element.className.split(\" \").indexOf(className) >= 0);\n }\n}\n\nexport function applyCSS(element: HTMLElement, cssObj: object): void {\n Object.keys(cssObj).forEach(property => {\n element.style[property] = cssObj[property];\n });\n}\n\nexport function clamp(val: number, min: number, max: number) {\n return Math.max(Math.min(val, max), min);\n}\n\n// Min: inclusive, Max: exclusive\nexport function isBetween(val: number, min: number, max: number) {\n return val >= min && val <= max;\n}\n\nexport interface ArrayLike {\n length: number;\n [index: number]: T;\n}\n\nexport function toArray(iterable: ArrayLike): T[] {\n return [].slice.call(iterable);\n}\n\nexport function isArray(arr: any): boolean {\n return arr && arr.constructor === Array;\n}\n\nexport function parseArithmeticExpression(cssValue: number | string, base: number, defaultVal?: number): number {\n // Set base / 2 to default value, if it's undefined\n const defaultValue = defaultVal != null ? defaultVal : base / 2;\n const cssRegex = /(?:(\\+|\\-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return clamp(cssValue, 0, base);\n }\n\n let idx = 0;\n let calculatedValue = 0;\n let matchResult = cssRegex.exec(cssValue);\n while (matchResult != null) {\n let sign = matchResult[1];\n const value = matchResult[2];\n const unit = matchResult[3];\n\n let parsedValue = parseFloat(value);\n\n if (idx <= 0) {\n sign = sign || \"+\";\n }\n\n // Return default value for values not in good form\n if (!sign) {\n return defaultValue;\n }\n\n if (unit === \"%\") {\n parsedValue = (parsedValue / 100) * base;\n }\n\n calculatedValue += sign === \"+\"\n ? parsedValue\n : -parsedValue;\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return defaultValue;\n }\n\n // Clamp between 0 ~ base\n return clamp(calculatedValue, 0, base);\n}\n\nexport function getProgress(pos: number, range: number[]) {\n // start, anchor, end\n // -1 , 0 , 1\n const [min, center, max] = range;\n\n if (pos > center && (max - center)) {\n // 0 ~ 1\n return (pos - center) / (max - center);\n } else if (pos < center && (center - min)) {\n // -1 ~ 0\n return (pos - center) / (center - min);\n } else if (pos !== center && max - min) {\n return (pos - min) / (max - min);\n }\n return 0;\n}\n\nexport function findIndex(iterable: T[], callback: (el: T) => boolean): number {\n for (let i = 0; i < iterable.length; i += 1) {\n const element = iterable[i];\n if (element && callback(element)) {\n return i;\n }\n }\n\n return -1;\n}\n\n// return [0, 1, ...., max - 1]\nexport function counter(max: number): number[] {\n const counterArray: number[] = [];\n for (let i = 0; i < max; i += 1) {\n counterArray[i] = i;\n }\n return counterArray;\n}\n\n// Circulate number between range [min, max]\n/*\n * \"indexed\" means min and max is not same, so if it's true \"min - 1\" should be max\n * While if it's false, \"min - 1\" should be \"max - 1\"\n * use `indexed: true` when it should be used for circulating integers like index\n * or `indexed: false` when it should be used for something like positions.\n */\nexport function circulate(value: number, min: number, max: number, indexed: boolean): number {\n const size = indexed\n ? max - min + 1\n : max - min;\n if (value < min) {\n const offset = indexed\n ? (min - value - 1) % size\n : (min - value) % size;\n value = max - offset;\n } else if (value > max) {\n const offset = indexed\n ? (value - max - 1) % size\n : (value - max) % size;\n value = min + offset;\n }\n\n return value;\n}\n\nexport function restoreStyle(element: HTMLElement, originalStyle: OriginalStyle): void {\n originalStyle.className\n ? element.setAttribute(\"class\", originalStyle.className)\n : element.removeAttribute(\"class\");\n originalStyle.style\n ? element.setAttribute(\"style\", originalStyle.style)\n : element.removeAttribute(\"style\");\n}\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터.\n * @memberof eg.Flicking\n * @private\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nexport function withFlickingMethods(prototype: any, flickingName: string) {\n Object.keys(FLICKING_METHODS).forEach((name: keyof Flicking) => {\n if (prototype[name]) {\n return;\n }\n prototype[name] = function(...args) {\n const result = this[flickingName][name](...args);\n\n // fix `this` type to return your own `flicking` instance to the instance using the decorator.\n if (result === this[flickingName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n}\n\nexport function getBbox(element: HTMLElement, useOffset: boolean) {\n let bbox: BoundingBox;\n if (useOffset) {\n bbox = {\n x: 0,\n y: 0,\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n } else {\n const clientRect = element.getBoundingClientRect();\n bbox = {\n x: clientRect.left,\n y: clientRect.top,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n return bbox;\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Viewport from \"./Viewport\";\nimport { OriginalStyle, FlickingPanel, ElementLike, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_PANEL_CSS, EVENTS } from \"../consts\";\nimport { addClass, applyCSS, parseArithmeticExpression, parseElement, getProgress, restoreStyle, hasClass, getBbox } from \"../utils\";\n\nclass Panel implements FlickingPanel {\n public viewport: Viewport;\n public prevSibling: Panel | null;\n public nextSibling: Panel | null;\n\n protected state: {\n index: number;\n position: number;\n relativeAnchorPosition: number;\n size: number;\n isClone: boolean;\n isVirtual: boolean;\n // Index of cloned panel, zero-based integer(original: -1, cloned: [0, 1, 2, ...])\n // if cloneIndex is 0, that means it's first cloned panel of original panel\n cloneIndex: number;\n originalStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n private element: HTMLElement;\n private original?: Panel;\n private clonedPanels: Panel[];\n\n public constructor(\n element?: HTMLElement | null,\n index?: number,\n viewport?: Viewport,\n ) {\n this.viewport = viewport!;\n this.prevSibling = null;\n this.nextSibling = null;\n this.clonedPanels = [];\n\n this.state = {\n index: index!,\n position: 0,\n relativeAnchorPosition: 0,\n size: 0,\n isClone: false,\n isVirtual: false,\n cloneIndex: -1,\n originalStyle: {\n className: \"\",\n style: \"\",\n },\n cachedBbox: null,\n };\n this.setElement(element);\n }\n\n public resize(givenBbox?: BoundingBox): void {\n const state = this.state;\n const options = this.viewport.options;\n const bbox = givenBbox\n ? givenBbox\n : this.getBbox();\n this.state.cachedBbox = bbox;\n const prevSize = state.size;\n\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size);\n }\n\n if (!state.isClone) {\n this.clonedPanels.forEach(panel => {\n const cloneState = panel.state;\n\n cloneState.size = state.size;\n cloneState.cachedBbox = state.cachedBbox;\n cloneState.relativeAnchorPosition = state.relativeAnchorPosition;\n });\n }\n }\n\n public unCacheBbox(): void {\n this.state.cachedBbox = null;\n }\n\n public getProgress() {\n const viewport = this.viewport;\n const options = viewport.options;\n const panelCount = viewport.panelManager.getPanelCount();\n const scrollAreaSize = viewport.getScrollAreaSize();\n\n const relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex();\n const progress = relativeIndex - viewport.getCurrentProgress();\n\n return progress;\n }\n\n public getOutsetProgress() {\n const viewport = this.viewport;\n const outsetRange = [\n -this.getSize(),\n viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(),\n viewport.getSize(),\n ];\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const outsetProgress = getProgress(relativePanelPosition, outsetRange);\n\n return outsetProgress;\n }\n\n public getVisibleRatio() {\n const viewport = this.viewport;\n const panelSize = this.getSize();\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const rightRelativePanelPosition = relativePanelPosition + panelSize;\n\n const visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0);\n const visibleRatio = visibleSize >= 0\n ? visibleSize / panelSize\n : 0;\n\n return visibleRatio;\n }\n\n public focus(duration?: number): void {\n const viewport = this.viewport;\n const currentPanel = viewport.getCurrentPanel();\n const hangerPosition = viewport.getHangerPosition();\n const anchorPosition = this.getAnchorPosition();\n if (hangerPosition === anchorPosition || !currentPanel) {\n return;\n }\n\n const currentPosition = currentPanel.getPosition();\n const eventType = currentPosition === this.getPosition()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration);\n }\n\n public update(updateFunction: ((element: HTMLElement) => any) | null = null, shouldResize: boolean = true): void {\n const identicalPanels = this.getIdenticalPanels();\n\n if (updateFunction) {\n identicalPanels.forEach(eachPanel => {\n updateFunction(eachPanel.getElement());\n });\n }\n\n if (shouldResize) {\n identicalPanels.forEach(eachPanel => {\n eachPanel.unCacheBbox();\n });\n this.viewport.addVisiblePanel(this);\n this.viewport.resize();\n }\n }\n\n public prev(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const prevSibling = this.prevSibling;\n\n if (!prevSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const prevPanelIndex = prevSibling.getIndex();\n const prevPanelPosition = prevSibling.getPosition();\n const prevPanelSize = prevSibling.getSize();\n\n const hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1;\n const notYetMinPanel = options.infinite\n && currentIndex > 0\n && prevPanelIndex > currentIndex;\n\n if (hasEmptyPanelBetween || notYetMinPanel) {\n // Empty panel exists between\n return null;\n }\n\n const newPosition = currentPosition - prevPanelSize - options.gap;\n\n let prevPanel = prevSibling;\n if (prevPanelPosition !== newPosition) {\n prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true);\n prevPanel.setPosition(newPosition);\n }\n\n return prevPanel;\n }\n\n public next(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const nextSibling = this.nextSibling;\n const lastIndex = viewport.panelManager.getLastIndex();\n\n if (!nextSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const nextPanelIndex = nextSibling.getIndex();\n const nextPanelPosition = nextSibling.getPosition();\n\n const hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1;\n const notYetMaxPanel = options.infinite\n && currentIndex < lastIndex\n && nextPanelIndex < currentIndex;\n\n if (hasEmptyPanelBetween || notYetMaxPanel) {\n return null;\n }\n\n const newPosition = currentPosition + this.getSize() + options.gap;\n\n let nextPanel = nextSibling;\n if (nextPanelPosition !== newPosition) {\n nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true);\n nextPanel.setPosition(newPosition);\n }\n\n return nextPanel;\n }\n\n public insertBefore(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n const firstPanel = viewport.panelManager.firstPanel()!;\n const prevSibling = this.prevSibling;\n // Finding correct inserting index\n // While it should insert removing empty spaces,\n // It also should have to be bigger than prevSibling' s index\n const targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex()\n ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length)\n : Math.max(this.getIndex() - parsedElements.length, 0);\n\n return viewport.insert(targetIndex, parsedElements);\n }\n\n public insertAfter(element: ElementLike | ElementLike[]): FlickingPanel[] {\n return this.viewport.insert(this.getIndex() + 1, element);\n }\n\n public remove(): FlickingPanel {\n this.viewport.remove(this.getIndex());\n\n return this;\n }\n\n public destroy(option: Partial): void {\n if (!option.preserveUI) {\n const originalStyle = this.state.originalStyle;\n\n restoreStyle(this.element, originalStyle);\n }\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getAnchorPosition(): number {\n return this.state.position + this.state.relativeAnchorPosition;\n }\n\n public getRelativeAnchorPosition(): number {\n return this.state.relativeAnchorPosition;\n }\n\n public getIndex(): number {\n return this.state.index;\n }\n\n public getPosition(): number {\n return this.state.position;\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getBbox(): BoundingBox {\n const state = this.state;\n const viewport = this.viewport;\n const element = this.element;\n const options = viewport.options;\n\n if (!element) {\n state.cachedBbox = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n } else if (!state.cachedBbox) {\n const wasVisible = Boolean(element.parentNode);\n const cameraElement = viewport.getCameraElement();\n if (!wasVisible) {\n cameraElement.appendChild(element);\n viewport.addVisiblePanel(this);\n }\n state.cachedBbox = getBbox(element, options.useOffset);\n\n if (!wasVisible && viewport.options.renderExternal) {\n cameraElement.removeChild(element);\n }\n }\n return state.cachedBbox!;\n }\n\n public isClone(): boolean {\n return this.state.isClone;\n }\n\n public getOverlappedClass(classes: string[]): string | undefined {\n const element = this.element;\n\n for (const className of classes) {\n if (hasClass(element, className)) {\n return className;\n }\n }\n }\n\n public getCloneIndex(): number {\n return this.state.cloneIndex;\n }\n\n public getClonedPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getClonedPanels()\n : this.clonedPanels;\n }\n\n public getIdenticalPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getIdenticalPanels()\n : [this, ...this.clonedPanels];\n }\n\n public getOriginalPanel(): Panel {\n return this.state.isClone\n ? this.original!\n : this;\n }\n\n public setIndex(index: number): void {\n const state = this.state;\n\n state.index = index;\n this.clonedPanels.forEach(panel => panel.state.index = index);\n }\n\n public setPosition(pos: number): this {\n this.state.position = pos;\n\n return this;\n }\n\n public setPositionCSS(offset: number = 0): void {\n if (!this.element) {\n return;\n }\n const state = this.state;\n const pos = state.position;\n const options = this.viewport.options;\n const elementStyle = this.element.style;\n const currentElementStyle = options.horizontal\n ? elementStyle.left\n : elementStyle.top;\n const styleToApply = `${pos - offset}px`;\n\n if (!state.isVirtual && currentElementStyle !== styleToApply) {\n options.horizontal\n ? elementStyle.left = styleToApply\n : elementStyle.top = styleToApply;\n }\n }\n\n public clone(cloneIndex: number, isVirtual: boolean = false, element?: HTMLElement | null): Panel {\n const state = this.state;\n const viewport = this.viewport;\n let cloneElement = element;\n\n if (!cloneElement && this.element) {\n cloneElement = isVirtual ? this.element : this.element.cloneNode(true) as HTMLElement;\n }\n const clonedPanel = new Panel(cloneElement, state.index, viewport);\n const clonedState = clonedPanel.state;\n\n clonedPanel.original = state.isClone\n ? this.original\n : this;\n clonedState.isClone = true;\n clonedState.isVirtual = isVirtual;\n clonedState.cloneIndex = cloneIndex;\n // Inherit some state values\n clonedState.size = state.size;\n clonedState.relativeAnchorPosition = state.relativeAnchorPosition;\n clonedState.originalStyle = state.originalStyle;\n clonedState.cachedBbox = state.cachedBbox;\n\n if (!isVirtual) {\n this.clonedPanels.push(clonedPanel);\n } else {\n clonedPanel.prevSibling = this.prevSibling;\n clonedPanel.nextSibling = this.nextSibling;\n }\n\n return clonedPanel;\n }\n\n public removeElement(): void {\n if (!this.viewport.options.renderExternal) {\n const element = this.element;\n element.parentNode && element.parentNode.removeChild(element);\n }\n\n // Do the same thing for clones\n if (!this.state.isClone) {\n this.removeClonedPanelsAfter(0);\n }\n }\n\n public removeClonedPanelsAfter(start: number): void {\n const options = this.viewport.options;\n const removingPanels = this.clonedPanels.splice(start);\n\n if (!options.renderExternal) {\n removingPanels.forEach(panel => {\n panel.removeElement();\n });\n }\n }\n\n public setElement(element?: HTMLElement | null): void {\n if (!element) {\n return;\n }\n const currentElement = this.element;\n if (element !== currentElement) {\n const options = this.viewport.options;\n\n if (currentElement) {\n if (options.horizontal) {\n element.style.left = currentElement.style.left;\n } else {\n element.style.top = currentElement.style.top;\n }\n } else {\n const originalStyle = this.state.originalStyle;\n\n originalStyle.className = element.getAttribute(\"class\");\n originalStyle.style = element.getAttribute(\"style\");\n }\n\n this.element = element;\n\n if (options.classPrefix) {\n addClass(element, `${options.classPrefix}-panel`);\n }\n\n // Update size info after applying panel css\n applyCSS(this.element, DEFAULT_PANEL_CSS);\n }\n }\n}\n\nexport default Panel;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"./Panel\";\nimport { FlickingOptions } from \"../types\";\nimport { findIndex, counter } from \"../utils\";\n\nclass PanelManager {\n private cameraElement: HTMLElement;\n private options: FlickingOptions;\n private panels: Panel[];\n private clones: Panel[][];\n // index range of existing panels\n private range: {\n min: number;\n max: number;\n };\n private length: number;\n private lastIndex: number;\n private cloneCount: number;\n\n constructor(\n cameraElement: HTMLElement,\n options: FlickingOptions,\n ) {\n this.cameraElement = cameraElement;\n this.panels = [];\n this.clones = [];\n this.range = {\n min: -1,\n max: -1,\n };\n this.length = 0;\n this.cloneCount = 0;\n this.options = options;\n this.lastIndex = options.lastIndex;\n }\n\n public firstPanel(): Panel | undefined {\n return this.panels[this.range.min];\n }\n\n public lastPanel(): Panel | undefined {\n return this.panels[this.range.max];\n }\n\n public allPanels(): ReadonlyArray {\n return [\n ...this.panels,\n ...this.clones.reduce((allClones, clones) => [...allClones, ...clones], []),\n ];\n }\n\n public originalPanels(): ReadonlyArray {\n return this.panels;\n }\n\n public clonedPanels(): ReadonlyArray {\n return this.clones;\n }\n\n public replacePanels(newPanels: Panel[], newClones: Panel[][]): void {\n this.panels = newPanels;\n this.clones = newClones;\n\n this.range = {\n min: findIndex(newPanels, panel => Boolean(panel)),\n max: newPanels.length - 1,\n };\n this.length = newPanels.filter(panel => Boolean(panel)).length;\n }\n\n public has(index: number): boolean {\n return !!this.panels[index];\n }\n\n public get(index: number): Panel | undefined {\n return this.panels[index];\n }\n\n public getPanelCount(): number {\n return this.length;\n }\n\n public getLastIndex(): number {\n return this.lastIndex;\n }\n\n public getRange(): Readonly<{ min: number, max: number }> {\n return this.range;\n }\n\n public getCloneCount(): number {\n return this.cloneCount;\n }\n\n public setLastIndex(lastIndex: number): void {\n this.lastIndex = lastIndex;\n\n const firstPanel = this.firstPanel();\n const lastPanel = this.lastPanel();\n\n if (!firstPanel || !lastPanel) {\n return; // no meaning of updating range & length\n }\n\n // Remove panels above new last index\n const range = this.range;\n if (lastPanel.getIndex() > lastIndex) {\n const removingPanels = this.panels.splice(lastIndex + 1);\n this.length -= removingPanels.length;\n\n const firstRemovedPanel = removingPanels.filter(panel => !!panel)[0];\n const possibleLastPanel = firstRemovedPanel.prevSibling;\n if (possibleLastPanel) {\n range.max = possibleLastPanel.getIndex();\n } else {\n range.min = -1;\n range.max = -1;\n }\n\n if (this.shouldRender()) {\n removingPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n public setCloneCount(cloneCount: number): void {\n this.cloneCount = cloneCount;\n }\n\n // Insert at index\n // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it\n public insert(index: number, newPanels: Panel[]): number {\n const panels = this.panels;\n const range = this.range;\n const isCircular = this.options.circular;\n const lastIndex = this.lastIndex;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n let pushedIndex = newPanels.length;\n // Like when setting index 50 while visible panels are 0, 1, 2\n if (index > range.max) {\n newPanels.forEach((panel, offset) => {\n panels[index + offset] = panel;\n });\n } else {\n const panelsAfterIndex = panels.slice(index, index + newPanels.length);\n // Find empty from beginning\n let emptyPanelCount = findIndex(panelsAfterIndex, panel => !!panel);\n if (emptyPanelCount < 0) {\n // All empty\n emptyPanelCount = panelsAfterIndex.length;\n }\n pushedIndex = newPanels.length - emptyPanelCount;\n\n // Insert removing empty panels\n panels.splice(index, emptyPanelCount, ...newPanels);\n\n // Remove panels after last index\n if (panels.length > lastIndex + 1) {\n const removedPanels = panels.splice(lastIndex + 1)\n .filter(panel => Boolean(panel));\n this.length -= removedPanels.length;\n\n // Find first\n const newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), panel => !!panel);\n\n // Can be filled with empty after newLastIndex\n this.panels.splice(newLastIndex + 1);\n this.range.max = newLastIndex;\n\n if (this.shouldRender()) {\n removedPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n // Update index of previous panels\n if (pushedIndex > 0) {\n panels.slice(index + newPanels.length).forEach(panel => {\n panel.setIndex(panel.getIndex() + pushedIndex);\n });\n }\n\n // Update state\n this.length += newPanels.length;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling);\n const clones = this.clones;\n const panelCount = this.panels.length;\n if (clones[0] && clones[0].length > lastIndex + 1) {\n clones.forEach(cloneSet => {\n cloneSet.splice(panelCount);\n });\n }\n }\n\n return pushedIndex;\n }\n\n public replace(index: number, newPanels: Panel[]): Panel[] {\n const panels = this.panels;\n const range = this.range;\n const options = this.options;\n const isCircular = options.circular;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index + newPanels.length);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n if (index > range.max) {\n // Temporarily insert null at index to use splice()\n (panels[index] as any) = null;\n }\n\n const replacedPanels = panels.splice(index, newPanels.length, ...newPanels);\n const wasNonEmptyCount = replacedPanels.filter(panel => Boolean(panel)).length;\n\n // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1]\n // So length should be increased by 3(inserting panels) - 1(non-empty panels)\n this.length += newPanels.length - wasNonEmptyCount;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length, nextSibling);\n }\n\n if (this.shouldRender()) {\n replacedPanels.forEach(panel => panel && panel.removeElement());\n }\n\n return replacedPanels;\n }\n\n public remove(index: number, deleteCount: number = 1): Panel[] {\n const isCircular = this.options.circular;\n const panels = this.panels;\n const clones = this.clones;\n // Delete count should be equal or larger than 0\n deleteCount = Math.max(deleteCount, 0);\n\n const deletedPanels = panels\n .splice(index, deleteCount)\n .filter(panel => !!panel);\n\n if (this.shouldRender()) {\n deletedPanels.forEach(panel => panel.removeElement());\n }\n\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(index, deleteCount);\n });\n }\n\n // Update indexes\n panels\n .slice(index)\n .forEach(panel => {\n panel.setIndex(panel.getIndex() - deleteCount);\n });\n\n // Check last panel is empty\n let lastIndex = panels.length - 1;\n if (!panels[lastIndex]) {\n const reversedPanels = panels.concat().reverse();\n const nonEmptyIndexFromLast = findIndex(reversedPanels, panel => !!panel);\n lastIndex = nonEmptyIndexFromLast < 0\n ? -1 // All empty\n : lastIndex - nonEmptyIndexFromLast;\n\n // Remove all empty panels from last\n panels.splice(lastIndex + 1);\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(lastIndex + 1);\n });\n }\n }\n\n // Update range & length\n this.range = {\n min: findIndex(panels, panel => !!panel),\n max: lastIndex,\n };\n this.length -= deletedPanels.length;\n\n if (this.length <= 0) {\n // Reset clones\n this.clones = [];\n this.cloneCount = 0;\n }\n\n return deletedPanels;\n }\n\n public chainAllPanels() {\n const allPanels = this.allPanels().filter(panel => !!panel);\n const allPanelsCount = allPanels.length;\n\n if (allPanelsCount <= 1) {\n return;\n }\n\n allPanels.slice(1, allPanels.length - 1).forEach((panel, idx) => {\n const prevPanel = allPanels[idx];\n const nextPanel = allPanels[idx + 2];\n\n panel.prevSibling = prevPanel;\n panel.nextSibling = nextPanel;\n });\n\n const firstPanel = allPanels[0];\n const lastPanel = allPanels[allPanelsCount - 1];\n\n firstPanel.prevSibling = null;\n firstPanel.nextSibling = allPanels[1];\n lastPanel.prevSibling = allPanels[allPanelsCount - 2];\n lastPanel.nextSibling = null;\n\n if (this.options.circular) {\n firstPanel.prevSibling = lastPanel;\n lastPanel.nextSibling = firstPanel;\n }\n }\n\n public insertClones(cloneIndex: number, index: number, clonedPanels: Panel[], deleteCount: number = 0): void {\n const clones = this.clones;\n const lastIndex = this.lastIndex;\n\n if (!clones[cloneIndex]) {\n const newClones: Panel[] = [];\n clonedPanels.forEach((panel, offset) => {\n newClones[index + offset] = panel;\n });\n\n clones[cloneIndex] = newClones;\n } else {\n const insertTarget = clones[cloneIndex];\n\n if (index >= insertTarget.length) {\n clonedPanels.forEach((panel, offset) => {\n insertTarget[index + offset] = panel;\n });\n } else {\n insertTarget.splice(index, deleteCount, ...clonedPanels);\n // Remove panels after last index\n if (clonedPanels.length > lastIndex + 1) {\n clonedPanels.splice(lastIndex + 1);\n }\n }\n }\n }\n\n // clones are operating in set\n public removeClonesAfter(cloneIndex: number): void {\n const panels = this.panels;\n\n panels.forEach(panel => {\n panel.removeClonedPanelsAfter(cloneIndex);\n });\n this.clones.splice(cloneIndex);\n }\n\n public findPanelOf(element: HTMLElement): Panel | undefined {\n const allPanels = this.allPanels();\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const panelElement = panel.getElement();\n if (panelElement.contains(element)) {\n return panel;\n }\n }\n }\n\n public findFirstPanelFrom(index: number): Panel | undefined {\n for (const panel of this.panels.slice(index)) {\n if (panel && panel.getIndex() >= index && panel.getElement().parentNode) {\n return panel;\n }\n }\n }\n\n private addNewClones(index: number, originalPanels: Panel[], deleteCount: number, nextSibling: Panel | undefined) {\n const cameraElement = this.cameraElement;\n const cloneCount = this.getCloneCount();\n const lastPanel = this.lastPanel();\n const lastPanelClones: Panel[] = lastPanel\n ? lastPanel.getClonedPanels()\n : [];\n const nextSiblingClones: Panel[] = nextSibling\n ? nextSibling.getClonedPanels()\n : [];\n\n for (const cloneIndex of counter(cloneCount)) {\n const cloneNextSibling = nextSiblingClones[cloneIndex];\n const lastPanelSibling = lastPanelClones[cloneIndex];\n\n const cloneSiblingElement = cloneNextSibling\n ? cloneNextSibling.getElement()\n : lastPanelSibling\n ? lastPanelSibling.getElement().nextElementSibling\n : null;\n\n const newClones = originalPanels.map(panel => {\n const clone = panel.clone(cloneIndex);\n\n if (this.shouldRender()) {\n cameraElement.insertBefore(clone.getElement(), cloneSiblingElement);\n }\n\n return clone;\n });\n\n this.insertClones(cloneIndex, index, newClones, deleteCount);\n }\n }\n\n private updateIndex(insertingIndex: number) {\n const panels = this.panels;\n const range = this.range;\n\n const newLastIndex = panels.length - 1;\n if (newLastIndex > range.max) {\n range.max = newLastIndex;\n }\n if (insertingIndex < range.min || range.min < 0) {\n range.min = insertingIndex;\n }\n }\n\n private insertNewPanels(newPanels: Panel[], siblingElement: HTMLElement | null) {\n if (this.shouldRender()) {\n const fragment = document.createDocumentFragment();\n newPanels.forEach(panel => fragment.appendChild(panel.getElement()));\n this.cameraElement.insertBefore(fragment, siblingElement);\n }\n }\n\n private shouldRender(): boolean {\n const options = this.options;\n\n return !options.renderExternal && !options.renderOnlyVisible;\n }\n}\n\nexport default PanelManager;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"../components/Panel\";\nimport { ValueOf, Direction, StateType, FlickingContext } from \"../types\";\n\nabstract class State {\n public delta: number = 0;\n public direction: ValueOf | null = null;\n public targetPanel: Panel | null = null;\n public lastPosition: number = 0;\n public abstract readonly type: ValueOf;\n public abstract readonly holding: boolean;\n public abstract readonly playing: boolean;\n\n public onEnter(prevState: State): void {\n this.delta = prevState.delta;\n this.direction = prevState.direction;\n this.targetPanel = prevState.targetPanel;\n this.lastPosition = prevState.lastPosition;\n }\n\n public onExit(nextState: State): void {\n // DO NOTHING\n }\n\n public onHold(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onChange(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onAnimationEnd(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onFinish(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n}\n\nexport default State;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { EVENTS, STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass IdleState extends State {\n public readonly type = STATE_TYPE.IDLE;\n public readonly holding = false;\n public readonly playing = false;\n\n public onEnter() {\n this.direction = null;\n this.targetPanel = null;\n this.delta = 0;\n this.lastPosition = 0;\n }\n\n public onHold(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Shouldn't do any action until any panels on flicking area\n if (flicking.getPanelCount() <= 0) {\n if (viewport.options.infinite) {\n viewport.moveCamera(viewport.getCameraPosition(), e);\n }\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n this.lastPosition = viewport.getCameraPosition();\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.HOLDING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n // By methods call\n public onChange(e: any, context: FlickingContext): void {\n const { triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.MOVE_START, e, false)\n .onSuccess(() => {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n}\n\nexport default IdleState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS, DIRECTION } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass HoldingState extends State {\n public readonly type = STATE_TYPE.HOLDING;\n public readonly holding = true;\n public readonly playing = true;\n\n private releaseEvent: any = null;\n\n public onChange(e: any, context: FlickingContext): void {\n const { flicking, triggerEvent, transitTo } = context;\n\n const offset = flicking.options.horizontal\n ? e.inputEvent.offsetX\n : e.inputEvent.offsetY;\n this.direction = offset < 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n triggerEvent(EVENTS.MOVE_START, e, true)\n .onSuccess(() => {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { viewport, triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n if (e.delta.flick !== 0) {\n // Sometimes \"release\" event on axes triggered before \"change\" event\n // Especially if user flicked panel fast in really short amount of time\n // if delta is not zero, that means above case happened.\n\n // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END\n // At least one move event should be included between holdStart and holdEnd\n e.setTo({ flick: viewport.getCameraPosition() }, 0);\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n // Can't handle select event here,\n // As \"finish\" axes event happens\n this.releaseEvent = e;\n }\n\n public onFinish(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Should transite to IDLE state before select event\n // As user expects hold is already finished\n transitTo(STATE_TYPE.IDLE);\n\n if (!this.releaseEvent) {\n return;\n }\n\n // Handle release event here\n // To prevent finish event called twice\n const releaseEvent = this.releaseEvent;\n\n // Static click\n const srcEvent = releaseEvent.inputEvent.srcEvent;\n\n let clickedElement: HTMLElement;\n if (srcEvent.type === \"touchend\") {\n const touchEvent = srcEvent as TouchEvent;\n const touch = touchEvent.changedTouches[0];\n clickedElement = document.elementFromPoint(touch.clientX, touch.clientY) as HTMLElement;\n } else {\n clickedElement = srcEvent.target;\n }\n const clickedPanel = viewport.panelManager.findPanelOf(clickedElement);\n const cameraPosition = viewport.getCameraPosition();\n\n if (clickedPanel) {\n const clickedPanelPosition = clickedPanel.getPosition();\n const direction = clickedPanelPosition > cameraPosition\n ? DIRECTION.NEXT\n : clickedPanelPosition < cameraPosition\n ? DIRECTION.PREV\n : null;\n\n // Don't provide axes event, to use axes instance instead\n triggerEvent(EVENTS.SELECT, null, true, {\n direction, // Direction to the clicked panel\n index: clickedPanel.getIndex(),\n panel: clickedPanel,\n });\n }\n }\n}\n\nexport default HoldingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DraggingState extends State {\n public readonly type = STATE_TYPE.DRAGGING;\n public readonly holding = true;\n public readonly playing = true;\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { flicking, viewport, triggerEvent, transitTo, stopCamera } = context;\n\n const delta = this.delta;\n const absDelta = Math.abs(delta);\n const options = flicking.options;\n const horizontal = options.horizontal;\n const moveType = viewport.moveType;\n const inputEvent = e.inputEvent;\n\n const velocity = horizontal\n ? inputEvent.velocityX\n : inputEvent.velocityY;\n const inputDelta = horizontal\n ? inputEvent.deltaX\n : inputEvent.deltaY;\n const isNextDirection = Math.abs(velocity) > 1\n ? velocity < 0\n : absDelta > 0\n ? delta > 0\n : inputDelta < 0;\n\n const swipeDistance = viewport.options.bound\n ? Math.max(absDelta, Math.abs(inputDelta))\n : absDelta;\n const swipeAngle = inputEvent.deltaX\n ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI)\n : 90;\n const belowAngleThreshold = horizontal\n ? swipeAngle <= options.thresholdAngle\n : swipeAngle > options.thresholdAngle;\n const overThreshold = swipeDistance >= options.threshold\n && belowAngleThreshold;\n\n const moveTypeContext = {\n viewport,\n axesEvent: e,\n state: this,\n swipeDistance,\n isNextDirection,\n };\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n const targetPanel = this.targetPanel;\n if (!overThreshold && targetPanel) {\n // Interrupted while animating\n const interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext);\n\n viewport.moveTo(\n interruptDestInfo.panel,\n interruptDestInfo.destPos,\n interruptDestInfo.eventType,\n e,\n interruptDestInfo.duration,\n );\n transitTo(STATE_TYPE.ANIMATING);\n return;\n }\n\n const currentPanel = viewport.getCurrentPanel();\n const nearestPanel = viewport.getNearestPanel();\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n e.stop();\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n const destInfo = overThreshold\n ? moveType.findTargetPanel(moveTypeContext)\n : moveType.findRestorePanel(moveTypeContext);\n\n viewport.moveTo(\n destInfo.panel,\n destInfo.destPos,\n destInfo.eventType,\n e,\n destInfo.duration,\n ).onSuccess(() => {\n transitTo(STATE_TYPE.ANIMATING);\n }).onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n stopCamera(e);\n });\n }\n}\n\nexport default DraggingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\nimport { circulate } from \"../utils\";\n\nclass AnimatingState extends State {\n public readonly type = STATE_TYPE.ANIMATING;\n public readonly holding = false;\n public readonly playing = true;\n\n public onHold(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n const options = viewport.options;\n const scrollArea = viewport.getScrollArea();\n const scrollAreaSize = viewport.getScrollAreaSize();\n const loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize);\n\n const targetPanel = this.targetPanel;\n if (options.circular && loopCount !== 0 && targetPanel) {\n const cloneCount = viewport.panelManager.getCloneCount();\n const originalTargetPosition = targetPanel.getPosition();\n\n // cloneIndex is from -1 to cloneCount - 1\n const newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true);\n const newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize;\n const newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true);\n\n // Set new target panel considering looped count\n newTargetPanel.setPosition(newTargetPosition);\n this.targetPanel = newTargetPanel;\n }\n\n // Reset last position and delta\n this.delta = 0;\n this.lastPosition = viewport.getCameraPosition();\n\n // Update current panel as current nearest panel\n viewport.setCurrentPanel(viewport.getNearestPanel()!);\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.DRAGGING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onFinish(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext) {\n const isTrusted = e && e.isTrusted;\n\n viewport.options.bound\n ? viewport.setCurrentPanel(this.targetPanel!)\n : viewport.setCurrentPanel(viewport.getNearestPanel()!);\n\n if (flicking.options.adaptive) {\n viewport.updateAdaptiveSize();\n }\n\n transitTo(STATE_TYPE.IDLE);\n viewport.updateCameraPosition();\n triggerEvent(EVENTS.MOVE_END, e, isTrusted, {\n direction: this.direction,\n });\n }\n}\n\nexport default AnimatingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DisabledState extends State {\n public readonly type = STATE_TYPE.DISABLED;\n public readonly holding = false;\n public readonly playing = true;\n\n public onAnimationEnd(e: any, { transitTo }: FlickingContext): void {\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(e: any, { viewport, transitTo }: FlickingContext): void {\n // Can stop Axes's change event\n e.stop();\n\n // Should update axes position as it's already changed at this moment\n viewport.updateAxesPosition(viewport.getCameraPosition());\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(e: any, { transitTo }: FlickingContext): void {\n // This is needed when stopped hold start event\n if (e.delta.flick === 0) {\n transitTo(STATE_TYPE.IDLE);\n }\n }\n}\n\nexport default DisabledState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"../states/State\";\nimport { AxesEventType, ValueOf, FlickingContext, StateType } from \"../types\";\nimport { AXES_EVENTS, STATE_TYPE } from \"../consts\";\nimport IdleState from \"../states/IdleState\";\nimport HoldingState from \"../states/HoldingState\";\nimport DraggingState from \"../states/DraggingState\";\nimport AnimatingState from \"../states/AnimatingState\";\nimport DisabledState from \"../states/DisabledState\";\n\nclass StateMachine {\n private state: State = new IdleState();\n\n public fire(eventType: ValueOf, e: any, context: FlickingContext) {\n const currentState = this.state;\n switch (eventType) {\n case AXES_EVENTS.HOLD:\n currentState.onHold(e, context);\n break;\n case AXES_EVENTS.CHANGE:\n currentState.onChange(e, context);\n break;\n case AXES_EVENTS.RELEASE:\n currentState.onRelease(e, context);\n break;\n case AXES_EVENTS.ANIMATION_END:\n currentState.onAnimationEnd(e, context);\n break;\n case AXES_EVENTS.FINISH:\n currentState.onFinish(e, context);\n break;\n }\n }\n\n public getState(): State {\n return this.state;\n }\n\n public transitTo = (nextStateType: ValueOf): State => {\n const currentState = this.state;\n\n if (currentState.type !== nextStateType) {\n let nextState: State;\n\n switch (nextStateType) {\n case STATE_TYPE.IDLE:\n nextState = new IdleState();\n break;\n case STATE_TYPE.HOLDING:\n nextState = new HoldingState();\n break;\n case STATE_TYPE.DRAGGING:\n nextState = new DraggingState();\n break;\n case STATE_TYPE.ANIMATING:\n nextState = new AnimatingState();\n break;\n case STATE_TYPE.DISABLED:\n nextState = new DisabledState();\n break;\n }\n\n currentState.onExit(nextState!);\n nextState!.onEnter(currentState);\n\n this.state = nextState!;\n }\n return this.state;\n }\n}\n\nexport default StateMachine;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport MoveType from \"./MoveType\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { clamp } from \"../utils\";\n\nclass Snap extends MoveType {\n protected readonly type: string = MOVE_TYPE.SNAP;\n protected count: number;\n\n constructor(count: number) {\n super();\n this.count = count;\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, axesEvent, swipeDistance } = ctx;\n const snapCount = this.count;\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const currentPanel = viewport.getCurrentPanel()!;\n const nearestPanel = viewport.getNearestPanel()!;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex();\n\n // This can happen when bounce is 0\n const shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent;\n const shouldMoveToAdjacent = !viewport.isOutOfBound()\n && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0);\n\n if (snapCount > 1 && eventDelta > minimumDistanceToChange) {\n return this.findSnappedPanel(ctx);\n } else if (shouldMoveToAdjacent) {\n return this.findAdjacentPanel(ctx);\n } else {\n return {\n panel: nearestPanel,\n duration: viewport.options.duration,\n destPos: viewport.findEstimatedPosition(nearestPanel),\n // As swipeDistance holds mouse/touch position change regardless of bounce option value\n // swipDistance > minimumDistanceToChange can happen in bounce area\n // Second condition is for handling that.\n eventType: (swipeDistance <= minimumDistanceToChange)\n || (viewport.isOutOfBound() && nearestIsCurrent)\n ? EVENTS.RESTORE\n : EVENTS.CHANGE,\n };\n }\n }\n\n protected findSnappedPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, viewport, state, isNextDirection } = ctx;\n\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const snapCount = this.count;\n const options = viewport.options;\n const scrollAreaSize = viewport.getScrollAreaSize();\n const halfGap = options.gap / 2;\n const estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition();\n\n let panelToMove = viewport.getNearestPanel()!;\n let cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone)\n let passedPanelCount = 0;\n\n while (passedPanelCount < snapCount) {\n // Since panelToMove holds also cloned panels, we should use original panel's position\n const originalPanel = panelToMove.getOriginalPanel();\n const panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize;\n const panelSize = originalPanel.getSize();\n\n const panelNextPosition = panelPosition + panelSize + halfGap;\n const panelPrevPosition = panelPosition - halfGap;\n\n // Current panelToMove contains destPos\n if (\n (isNextDirection && panelNextPosition > estimatedHangerPos)\n || (!isNextDirection && panelPrevPosition < estimatedHangerPos)\n ) {\n break;\n }\n\n const siblingPanel = isNextDirection\n ? panelToMove.nextSibling\n : panelToMove.prevSibling;\n if (!siblingPanel) {\n break;\n }\n\n const panelIndex = panelToMove.getIndex();\n const siblingIndex = siblingPanel.getIndex();\n if ((isNextDirection && siblingIndex <= panelIndex)\n || (!isNextDirection && siblingIndex >= panelIndex)\n ) {\n cycleIndex = isNextDirection\n ? cycleIndex + 1\n : cycleIndex - 1;\n }\n panelToMove = siblingPanel;\n passedPanelCount += 1;\n }\n\n const originalPosition = panelToMove.getOriginalPanel().getPosition();\n\n if (cycleIndex !== 0) {\n panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true);\n panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize);\n }\n\n const defaultDuration = viewport.options.duration;\n const duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount);\n\n return {\n panel: panelToMove,\n destPos: viewport.findEstimatedPosition(panelToMove),\n duration,\n eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange\n ? EVENTS.CHANGE\n : EVENTS.RESTORE,\n };\n }\n\n private findAdjacentPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentIndex = viewport.getCurrentIndex();\n const currentPanel = viewport.panelManager.get(currentIndex)!;\n const hangerPosition = viewport.getHangerPosition();\n const scrollArea = viewport.getScrollArea();\n\n const firstClonedPanel = currentPanel.getIdenticalPanels()[1];\n const lapped = options.circular\n && (Math.abs(currentPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition));\n\n // If lapped in circular mode, use first cloned panel as base panel\n const basePanel = lapped\n ? firstClonedPanel\n : currentPanel;\n const basePosition = basePanel.getPosition();\n\n const adjacentPanel = isNextDirection\n ? basePanel.nextSibling\n : basePanel.prevSibling;\n\n const eventType = adjacentPanel\n ? EVENTS.CHANGE\n : EVENTS.RESTORE;\n const panelToMove = adjacentPanel\n ? adjacentPanel\n : basePanel;\n const targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition();\n\n const estimatedPanelPosition = options.circular\n ? isNextDirection\n ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap\n : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap\n : panelToMove.getAnchorPosition();\n const estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition();\n const destPos = viewport.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return {\n panel: panelToMove,\n destPos,\n duration: options.duration,\n eventType,\n };\n }\n}\n\nexport default Snap;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { MoveTypeStringOption, MoveTypeContext, DestinationInfo } from \"../types\";\nimport Panel from \"../components/Panel\";\nimport { EVENTS } from \"../consts\";\n\nabstract class MoveType {\n protected readonly abstract type: string;\n\n public abstract findTargetPanel(ctx: MoveTypeContext): DestinationInfo;\n\n public is(type: MoveTypeStringOption): boolean {\n return type === this.type;\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n const viewport = ctx.viewport;\n const options = viewport.options;\n\n const panel = options.circular\n ? this.findRestorePanelInCircularMode(ctx)\n : viewport.getCurrentPanel()!;\n\n return {\n panel,\n destPos: viewport.findEstimatedPosition(panel),\n duration: options.duration,\n eventType: EVENTS.RESTORE,\n };\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { state, viewport } = ctx;\n const targetPanel = state.targetPanel!;\n\n return {\n panel: targetPanel,\n destPos: viewport.findEstimatedPosition(targetPanel),\n duration: viewport.options.duration,\n eventType: \"\",\n };\n }\n\n // Calculate minimum distance to \"change\" panel\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const relativeAnchorPosition = currentPanel.getRelativeAnchorPosition();\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |--------|--------------|\n * [][ |<-Anchor ][] <- Panel + Half-Gap\n */\n let minimumDistanceToChange = isNextDirection\n ? currentPanel.getSize() - relativeAnchorPosition + halfGap\n : relativeAnchorPosition + halfGap;\n\n minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold);\n\n return minimumDistanceToChange;\n }\n\n private findRestorePanelInCircularMode(ctx: MoveTypeContext): Panel {\n const viewport = ctx.viewport;\n const originalPanel = viewport.getCurrentPanel()!.getOriginalPanel();\n const hangerPosition = viewport.getHangerPosition();\n\n const firstClonedPanel = originalPanel.getIdenticalPanels()[1];\n const lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition);\n\n return (!ctx.isNextDirection && lapped)\n ? firstClonedPanel\n : originalPanel;\n }\n}\n\nexport default MoveType;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Snap from \"./Snap\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { circulate, clamp } from \"../utils\";\n\nclass FreeScroll extends Snap {\n protected readonly type: string = MOVE_TYPE.FREE_SCROLL;\n\n constructor() {\n // Set snap count to Infinity\n super(Infinity);\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, state, viewport } = ctx;\n const destPos = axesEvent.destPos.flick;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const scrollArea = viewport.getScrollArea();\n const currentPanel = viewport.getCurrentPanel()!;\n const options = viewport.options;\n\n const delta = Math.abs(axesEvent.delta.flick + state.delta);\n if (delta > minimumDistanceToChange) {\n const destInfo = super.findSnappedPanel(ctx);\n\n destInfo.duration = axesEvent.duration;\n destInfo.destPos = destPos;\n destInfo.eventType = !options.circular && destInfo.panel === currentPanel\n ? \"\"\n : EVENTS.CHANGE;\n\n return destInfo;\n } else {\n let estimatedPosition = options.circular\n ? circulate(destPos, scrollArea.prev, scrollArea.next, false)\n : destPos;\n estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next);\n estimatedPosition += viewport.getRelativeHangerPosition();\n\n const estimatedPanel = viewport.findNearestPanelAt(estimatedPosition)!;\n\n return {\n panel: estimatedPanel,\n destPos,\n duration: axesEvent.duration,\n eventType: \"\",\n };\n }\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n return this.findTargetPanel(ctx);\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { viewport } = ctx;\n\n return {\n panel: viewport.getNearestPanel()!,\n destPos: viewport.getCameraPosition(),\n duration: 0,\n eventType: \"\",\n };\n }\n\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const lastPosition = viewport.stateMachine.getState().lastPosition;\n const currentPanelPosition = currentPanel.getPosition();\n\n // As camera can stop anywhere in free scroll mode,\n // minimumDistanceToChange should be calculated differently.\n // Ref #191(https://github.com/naver/egjs-flicking/issues/191)\n const lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition();\n\n const scrollAreaSize = viewport.getScrollAreaSize();\n let minimumDistanceToChange = isNextDirection\n ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap\n : lastHangerPosition - currentPanelPosition + halfGap;\n minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize);\n\n return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange);\n }\n}\n\nexport default FreeScroll;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Axes, { PanInput } from \"@egjs/axes\";\n\nimport Flicking from \"../Flicking\";\nimport Panel from \"./Panel\";\nimport PanelManager from \"./PanelManager\";\nimport StateMachine from \"./StateMachine\";\nimport MoveType from \"../moves/MoveType\";\nimport { FlickingOptions, FlickingPanel, FlickingStatus, ElementLike, EventType, TriggerCallback, NeedPanelEvent, FlickingEvent, MoveTypeObjectOption, OriginalStyle, Plugin, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_VIEWPORT_CSS, DEFAULT_CAMERA_CSS, TRANSFORM, DEFAULT_OPTIONS, EVENTS, DIRECTION, STATE_TYPE, MOVE_TYPE } from \"../consts\";\nimport { clamp, applyCSS, toArray, parseArithmeticExpression, isBetween, isArray, parseElement, hasClass, restoreStyle, circulate, findIndex, getBbox } from \"../utils\";\nimport Snap from \"../moves/Snap\";\nimport FreeScroll from \"../moves/FreeScroll\";\n\nexport default class Viewport {\n public options: FlickingOptions;\n public stateMachine: StateMachine;\n public panelManager: PanelManager;\n public moveType: MoveType;\n\n private flicking: Flicking;\n private axes: Axes;\n private panInput: PanInput | null;\n\n private viewportElement: HTMLElement;\n private cameraElement: HTMLElement;\n\n private triggerEvent: Flicking[\"triggerEvent\"];\n private axesHandlers: { [key: string]: any };\n\n private currentPanel: Panel | undefined;\n private nearestPanel: Panel | undefined;\n private visiblePanels: Panel[];\n\n private plugins: Plugin[] = [];\n private panelBboxes: { [className: string]: BoundingBox };\n private state: {\n size: number;\n position: number;\n panelMaintainRatio: number;\n relativeHangerPosition: number;\n positionOffset: number;\n scrollArea: {\n prev: number;\n next: number;\n };\n translate: {\n name: string,\n has3d: boolean,\n };\n infiniteThreshold: number;\n checkedIndexes: Array<[number, number]>;\n isAdaptiveCached: boolean;\n isViewportGiven: boolean;\n isCameraGiven: boolean;\n originalViewportStyle: OriginalStyle;\n originalCameraStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n\n constructor(\n flicking: Flicking,\n options: FlickingOptions,\n triggerEvent: Flicking[\"triggerEvent\"],\n ) {\n this.flicking = flicking;\n this.triggerEvent = triggerEvent;\n\n this.state = {\n size: 0,\n position: 0,\n panelMaintainRatio: 0,\n relativeHangerPosition: 0,\n positionOffset: 0,\n scrollArea: {\n prev: 0,\n next: 0,\n },\n translate: TRANSFORM,\n infiniteThreshold: 0,\n checkedIndexes: [],\n isAdaptiveCached: false,\n isViewportGiven: false,\n isCameraGiven: false,\n originalViewportStyle: {\n className: null,\n style: null,\n },\n originalCameraStyle: {\n className: null,\n style: null,\n },\n cachedBbox: null,\n };\n this.options = options;\n this.stateMachine = new StateMachine();\n this.visiblePanels = [];\n this.panelBboxes = {};\n\n this.build();\n }\n\n public moveTo(\n panel: Panel,\n destPos: number,\n eventType: EventType[\"CHANGE\"] | EventType[\"RESTORE\"] | \"\",\n axesEvent: any,\n duration: number = this.options.duration,\n ): TriggerCallback {\n const state = this.state;\n const currentState = this.stateMachine.getState();\n const currentPosition = state.position;\n\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n const direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n let eventResult: TriggerCallback;\n if (eventType === EVENTS.CHANGE) {\n eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, {\n index: panel.getIndex(),\n panel,\n direction,\n });\n } else if (eventType === EVENTS.RESTORE) {\n eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted);\n } else {\n eventResult = {\n onSuccess(callback: () => void): TriggerCallback {\n callback();\n return this;\n },\n onStopped(): TriggerCallback {\n return this;\n },\n };\n }\n\n eventResult.onSuccess(() => {\n currentState.delta = 0;\n currentState.lastPosition = this.getCameraPosition();\n currentState.targetPanel = panel;\n currentState.direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n if (destPos === currentPosition) {\n // no move\n this.nearestPanel = panel;\n this.currentPanel = panel;\n }\n\n if (axesEvent && axesEvent.setTo) {\n // freeScroll only occurs in release events\n axesEvent.setTo({ flick: destPos }, duration);\n } else {\n this.axes.setTo({ flick: destPos }, duration);\n }\n });\n\n return eventResult;\n }\n\n public moveCamera(pos: number, axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const transform = state.translate.name;\n const scrollArea = state.scrollArea;\n\n // Update position & nearestPanel\n if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) {\n pos = circulate(pos, scrollArea.prev, scrollArea.next, false);\n }\n state.position = pos;\n this.nearestPanel = this.findNearestPanel();\n const nearestPanel = this.nearestPanel;\n const originalNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n // From 0(panel position) to 1(panel position + panel size)\n // When it's on gap area value will be (val > 1 || val < 0)\n if (nearestPanel) {\n const hangerPosition = this.getHangerPosition();\n const panelPosition = nearestPanel.getPosition();\n const panelSize = nearestPanel.getSize();\n const halfGap = options.gap / 2;\n\n // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap\n state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap);\n } else {\n state.panelMaintainRatio = 0;\n }\n\n this.checkNeedPanel(axesEvent);\n\n // Possibly modified after need panel, if it's looped\n const modifiedNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n pos += (modifiedNearestPosition - originalNearestPosition);\n state.position = pos;\n\n this.updateVisiblePanels();\n\n // Offset is needed to fix camera layer size in visible-only rendering mode\n const posOffset = options.renderOnlyVisible\n ? state.positionOffset\n : 0;\n const moveVector = options.horizontal\n ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)];\n const moveCoord = moveVector.map(coord => `${Math.round(coord)}px`).join(\", \");\n\n this.cameraElement.style[transform] = state.translate.has3d\n ? `translate3d(${moveCoord}, 0px)`\n : `translate(${moveCoord})`;\n }\n\n public stopCamera = (axesEvent: any): void => {\n if (axesEvent && axesEvent.setTo) {\n axesEvent.setTo({ flick: this.state.position }, 0);\n }\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n\n public unCacheBbox(): void {\n const state = this.state;\n const options = this.options;\n\n state.cachedBbox = null;\n this.visiblePanels = [];\n\n const viewportElement = this.viewportElement;\n if (!options.horizontal) {\n // Don't preserve previous width for adaptive resizing\n viewportElement.style.width = \"\";\n } else {\n viewportElement.style.height = \"\";\n }\n state.isAdaptiveCached = false;\n this.panelBboxes = {};\n }\n\n public resize(): void {\n this.updateSize();\n this.updateOriginalPanelPositions();\n this.updateAdaptiveSize();\n this.updateScrollArea();\n this.updateClonePanels();\n this.updateVisiblePanelPositions();\n this.updateCameraPosition();\n this.updatePlugins();\n }\n\n // Find nearest anchor from current hanger position\n public findNearestPanel(): Panel | undefined {\n const state = this.state;\n const panelManager = this.panelManager;\n const hangerPosition = this.getHangerPosition();\n\n if (this.isOutOfBound()) {\n const position = state.position;\n\n return position <= state.scrollArea.prev\n ? panelManager.firstPanel()\n : panelManager.lastPanel();\n }\n\n return this.findNearestPanelAt(hangerPosition);\n }\n\n public findNearestPanelAt(position: number): Panel | undefined {\n const panelManager = this.panelManager;\n\n const allPanels = panelManager.allPanels();\n let minimumDistance = Infinity;\n let nearestPanel: Panel | undefined;\n\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const prevPosition = panel.getPosition();\n const nextPosition = prevPosition + panel.getSize();\n\n // Use shortest distance from panel's range\n const distance = isBetween(position, prevPosition, nextPosition)\n ? 0\n : Math.min(\n Math.abs(prevPosition - position),\n Math.abs(nextPosition - position),\n );\n\n if (distance > minimumDistance) {\n break;\n } else if (distance === minimumDistance) {\n const minimumAnchorDistance = Math.abs(position - nearestPanel!.getAnchorPosition());\n const anchorDistance = Math.abs(position - panel.getAnchorPosition());\n\n if (anchorDistance > minimumAnchorDistance) {\n break;\n }\n }\n\n minimumDistance = distance;\n nearestPanel = panel;\n }\n\n return nearestPanel;\n }\n\n public findNearestIdenticalPanel(panel: Panel): Panel {\n let nearest = panel;\n let shortestDistance = Infinity;\n const hangerPosition = this.getHangerPosition();\n\n const identicals = panel.getIdenticalPanels();\n identicals.forEach(identical => {\n const anchorPosition = identical.getAnchorPosition();\n const distance = Math.abs(anchorPosition - hangerPosition);\n\n if (distance < shortestDistance) {\n nearest = identical;\n shortestDistance = distance;\n }\n });\n\n return nearest;\n }\n\n // Find shortest camera position that distance is minimum\n public findShortestPositionToPanel(panel: Panel): number {\n const state = this.state;\n const options = this.options;\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = this.getHangerPosition();\n const distance = Math.abs(hangerPosition - anchorPosition);\n const scrollAreaSize = state.scrollArea.next - state.scrollArea.prev;\n\n if (!options.circular) {\n const position = anchorPosition - state.relativeHangerPosition;\n return this.canSetBoundMode()\n ? clamp(position, state.scrollArea.prev, state.scrollArea.next)\n : position;\n } else {\n // If going out of viewport border is more efficient way of moving, choose that position\n return distance <= scrollAreaSize - distance\n ? anchorPosition - state.relativeHangerPosition\n : anchorPosition > hangerPosition\n // PREV TO NEXT\n ? anchorPosition - state.relativeHangerPosition - scrollAreaSize\n // NEXT TO PREV\n : anchorPosition - state.relativeHangerPosition + scrollAreaSize;\n }\n }\n\n public findEstimatedPosition(panel: Panel): number {\n const scrollArea = this.getScrollArea();\n\n let estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition();\n estimatedPosition = this.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return estimatedPosition;\n }\n\n public addVisiblePanel(panel: Panel): void {\n if (this.getVisibleIndexOf(panel) < 0) {\n this.visiblePanels.push(panel);\n }\n }\n\n public enable(): void {\n if (!this.panInput) {\n this.createPanInput();\n }\n }\n\n public disable(): void {\n if (this.panInput) {\n this.panInput.destroy();\n this.panInput = null;\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n }\n\n public insert(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const lastIndex = this.panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const state = this.state;\n const options = this.options;\n const parsedElements = parseElement(element);\n\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const pushedIndex = this.panelManager.insert(index, panels);\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n if (!this.currentPanel) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index });\n state.checkedIndexes.forEach((indexes, idx) => {\n const [min, max] = indexes;\n if (index < min) {\n // Push checked index\n state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n }\n });\n\n this.resize();\n\n return panels;\n }\n\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const lastIndex = panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const parsedElements = parseElement(element);\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const replacedPanels = panelManager.replace(index, panels);\n\n replacedPanels.forEach(panel => {\n const visibleIndex = this.getVisibleIndexOf(panel);\n if (visibleIndex > -1) {\n this.visiblePanels.splice(visibleIndex, 1);\n }\n });\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n const currentPanel = this.currentPanel;\n const wasEmpty = !currentPanel;\n if (wasEmpty) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n } else if (isBetween(currentPanel!.getIndex(), index, index + panels.length - 1)) {\n // Current panel is replaced\n this.currentPanel = panelManager.get(currentPanel!.getIndex());\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index + panels.length - 1 });\n\n this.resize();\n\n return panels;\n }\n\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n const state = this.state;\n // Index should not below 0\n index = Math.max(index, 0);\n\n const panelManager = this.panelManager;\n const currentIndex = this.getCurrentIndex();\n\n const removedPanels = panelManager.remove(index, deleteCount);\n if (isBetween(currentIndex, index, index + deleteCount - 1)) {\n // Current panel is removed\n // Use panel at removing index - 1 as new current panel if it exists\n const newCurrentIndex = Math.max(index - 1, panelManager.getRange().min);\n this.currentPanel = panelManager.get(newCurrentIndex);\n }\n\n // Update checked indexes in infinite mode\n if (deleteCount > 0) {\n // Check whether removing index will affect checked indexes\n // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa.\n this.updateCheckedIndexes({ min: index - 1, max: index + deleteCount });\n // Uncache visible panels to refresh panels\n this.visiblePanels = [];\n }\n\n if (panelManager.getPanelCount() <= 0) {\n this.currentPanel = undefined;\n this.nearestPanel = undefined;\n }\n\n this.resize();\n\n const scrollArea = state.scrollArea;\n if (state.position < scrollArea.prev || state.position > scrollArea.next) {\n const newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false);\n this.moveCamera(newPosition);\n this.updateAxesPosition(newPosition);\n }\n\n return removedPanels;\n }\n\n public updateAdaptiveSize(): void {\n const state = this.state;\n const options = this.options;\n const horizontal = options.horizontal;\n const currentPanel = this.getCurrentPanel();\n\n if (!currentPanel) {\n return;\n }\n\n const shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached;\n const viewportStyle = this.viewportElement.style;\n if (shouldApplyAdaptive) {\n let sizeToApply: number;\n if (options.adaptive) {\n const panelBbox = currentPanel.getBbox();\n\n sizeToApply = horizontal ? panelBbox.height : panelBbox.width;\n } else {\n // Find minimum height of panels to maximum panel size\n const maximumPanelSize = this.panelManager.originalPanels().reduce((maximum, panel) => {\n const panelBbox = panel.getBbox();\n return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width);\n }, 0);\n\n sizeToApply = maximumPanelSize;\n }\n\n if (!state.isAdaptiveCached) {\n const viewportBbox = this.updateBbox();\n sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width);\n state.isAdaptiveCached = true;\n }\n\n const viewportSize = `${sizeToApply}px`;\n if (horizontal) {\n viewportStyle.height = viewportSize;\n state.cachedBbox!.height = sizeToApply;\n } else {\n viewportStyle.width = viewportSize;\n state.cachedBbox!.width = sizeToApply;\n }\n }\n }\n\n // Update camera position after resizing\n public updateCameraPosition(): void {\n const state = this.state;\n const currentPanel = this.getCurrentPanel();\n const cameraPosition = this.getCameraPosition();\n const currentState = this.stateMachine.getState();\n const isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL);\n const relativeHangerPosition = this.getRelativeHangerPosition();\n const halfGap = this.options.gap / 2;\n\n if (currentState.holding || currentState.playing) {\n this.updateVisiblePanels();\n return;\n }\n\n let newPosition: number;\n if (isFreeScroll) {\n const positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next);\n const nearestPanel = this.getNearestPanel();\n\n // Preserve camera position if it is bound to scroll area limit\n newPosition = positionBounded || !nearestPanel\n ? cameraPosition\n : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition;\n } else {\n newPosition = currentPanel\n ? currentPanel.getAnchorPosition() - relativeHangerPosition\n : cameraPosition;\n }\n\n if (this.canSetBoundMode()) {\n newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next);\n }\n\n // Pause & resume axes to prevent axes's \"change\" event triggered\n // This should be done before moveCamera, as moveCamera can trigger needPanel\n this.updateAxesPosition(newPosition);\n\n this.moveCamera(newPosition);\n }\n\n public updateBbox(): BoundingBox {\n const state = this.state;\n const options = this.options;\n const viewportElement = this.viewportElement;\n\n if (!state.cachedBbox) {\n state.cachedBbox = getBbox(viewportElement, options.useOffset);\n }\n\n return state.cachedBbox!;\n }\n\n public updatePlugins(): void {\n // update for resize\n this.plugins.forEach(plugin => {\n plugin.update && plugin.update(this.flicking);\n });\n }\n\n public destroy(option: Partial): void {\n const state = this.state;\n const wrapper = this.flicking.getElement();\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const originalPanels = this.panelManager.originalPanels();\n\n this.removePlugins(this.plugins);\n if (!option.preserveUI) {\n restoreStyle(viewportElement, state.originalViewportStyle);\n restoreStyle(cameraElement, state.originalCameraStyle);\n\n if (!state.isCameraGiven && !this.options.renderExternal) {\n const topmostElement = state.isViewportGiven\n ? viewportElement\n : wrapper;\n const deletingElement = state.isViewportGiven\n ? cameraElement\n : viewportElement;\n\n originalPanels.forEach(panel => {\n topmostElement.appendChild(panel.getElement());\n });\n\n topmostElement.removeChild(deletingElement);\n }\n }\n\n this.axes.destroy();\n this.panInput?.destroy();\n\n originalPanels.forEach(panel => { panel.destroy(option); });\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public restore(status: FlickingStatus): void {\n const panels = status.panels;\n const defaultIndex = this.options.defaultIndex;\n const cameraElement = this.cameraElement;\n const panelManager = this.panelManager;\n\n // Restore index\n cameraElement.innerHTML = panels.map(panel => panel.html).join(\"\");\n\n // Create panels first\n this.refreshPanels();\n const createdPanels = panelManager.originalPanels();\n\n // ...then order it by its index\n const orderedPanels: Panel[] = [];\n panels.forEach((panel, idx) => {\n const createdPanel = createdPanels[idx];\n createdPanel.setIndex(panel.index);\n orderedPanels[panel.index] = createdPanel;\n });\n panelManager.replacePanels(orderedPanels, []);\n panelManager.setCloneCount(0); // No clones at this point\n\n const panelCount = panelManager.getPanelCount();\n if (panelCount > 0) {\n this.currentPanel = panelManager.get(status.index)\n || panelManager.get(defaultIndex)\n || panelManager.firstPanel();\n } else {\n this.currentPanel = undefined;\n }\n this.visiblePanels = orderedPanels.filter(panel => Boolean(panel));\n\n this.resize();\n\n this.axes.setTo({ flick: status.position }, 0);\n this.moveCamera(status.position);\n }\n\n public calcVisiblePanels(): Panel[] {\n const allPanels = this.panelManager.allPanels();\n if (this.options.renderOnlyVisible) {\n const cameraPos = this.getCameraPosition();\n const viewportSize = this.getSize();\n const basePanel = this.nearestPanel!;\n\n const getNextPanel = (panel: Panel) => {\n const nextPanel = panel.nextSibling;\n\n if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) {\n return nextPanel;\n } else {\n return null;\n }\n };\n\n const getPrevPanel = (panel: Panel) => {\n const prevPanel = panel.prevSibling;\n\n if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) {\n return prevPanel;\n } else {\n return null;\n }\n };\n\n const isOutOfBoundNext = (panel: Panel) => panel.getPosition() >= cameraPos + viewportSize;\n const isOutOfBoundPrev = (panel: Panel) => panel.getPosition() + panel.getSize() <= cameraPos;\n\n const getVisiblePanels = (\n panel: Panel,\n getNext: (panel: Panel) => Panel | null,\n isOutOfViewport: (panel: Panel) => boolean,\n ): Panel[] => {\n const visiblePanels: Panel[] = [];\n\n let lastPanel = panel;\n while (true) {\n const nextPanel = getNext(lastPanel);\n if (!nextPanel || isOutOfViewport(nextPanel)) {\n break;\n }\n visiblePanels.push(nextPanel);\n lastPanel = nextPanel;\n }\n return visiblePanels;\n };\n\n const panelCount = this.panelManager.getPanelCount();\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n const nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext);\n const prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev);\n\n return [basePanel, ...nextPanels, ...prevPanels].sort((panel1, panel2) => getAbsIndex(panel1) - getAbsIndex(panel2));\n } else {\n return allPanels.filter(panel => {\n const outsetProgress = panel.getOutsetProgress();\n\n return outsetProgress > -1 && outsetProgress < 1;\n });\n }\n }\n\n public getCurrentPanel(): Panel | undefined {\n return this.currentPanel;\n }\n\n public getCurrentIndex(): number {\n const currentPanel = this.currentPanel;\n\n return currentPanel\n ? currentPanel.getIndex()\n : -1;\n }\n\n public getNearestPanel(): Panel | undefined {\n return this.nearestPanel;\n }\n\n // Get progress from nearest panel\n public getCurrentProgress(): number {\n const currentState = this.stateMachine.getState();\n let nearestPanel = currentState.playing || currentState.holding\n ? this.nearestPanel\n : this.currentPanel;\n\n const panelManager = this.panelManager;\n if (!nearestPanel) {\n // There're no panels\n return NaN;\n }\n const { prev: prevRange, next: nextRange } = this.getScrollArea();\n const cameraPosition = this.getCameraPosition();\n const isOutOfBound = this.isOutOfBound();\n let prevPanel = nearestPanel.prevSibling;\n let nextPanel = nearestPanel.nextSibling;\n let hangerPosition = this.getHangerPosition();\n let nearestAnchorPos = nearestPanel.getAnchorPosition();\n\n if (\n isOutOfBound\n && prevPanel\n && nextPanel\n && cameraPosition < nextRange\n // On the basis of anchor, prevPanel is nearestPanel.\n && (hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition)\n ) {\n nearestPanel = prevPanel;\n nextPanel = nearestPanel.nextSibling;\n prevPanel = nearestPanel.prevSibling;\n nearestAnchorPos = nearestPanel.getAnchorPosition();\n }\n const nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount();\n const nearestSize = nearestPanel.getSize();\n\n if (isOutOfBound) {\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n if (nearestAnchorPos > nextRange + relativeHangerPosition) {\n // next bounce area: hangerPosition - relativeHangerPosition - nextRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange;\n } else if (nearestAnchorPos < prevRange + relativeHangerPosition) {\n // prev bounce area: hangerPosition - relativeHangerPosition - prevRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange;\n }\n }\n const hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos;\n const gap = this.options.gap;\n\n let basePosition = nearestAnchorPos;\n let targetPosition = nearestAnchorPos;\n if (hangerIsNextToNearestPanel) {\n targetPosition = nextPanel\n ? nextPanel.getAnchorPosition()\n : nearestAnchorPos + nearestSize + gap;\n } else {\n basePosition = prevPanel\n ? prevPanel.getAnchorPosition()\n : nearestAnchorPos - nearestSize - gap;\n }\n\n const progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition);\n const startIndex = hangerIsNextToNearestPanel\n ? nearestIndex\n : prevPanel\n ? prevPanel.getIndex()\n : nearestIndex - 1;\n\n return startIndex + progressBetween;\n }\n\n // Update axes flick position without triggering event\n public updateAxesPosition(position: number) {\n const axes = this.axes;\n axes.off();\n axes.setTo({\n flick: position,\n }, 0);\n axes.on(this.axesHandlers);\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getScrollArea(): { prev: number, next: number } {\n return this.state.scrollArea;\n }\n\n public isOutOfBound(): boolean {\n const state = this.state;\n const options = this.options;\n const scrollArea = state.scrollArea;\n\n return !options.circular\n && options.bound\n && (state.position <= scrollArea.prev || state.position >= scrollArea.next);\n }\n\n public canSetBoundMode(): boolean {\n const options = this.options;\n\n return options.bound && !options.circular;\n }\n\n public getViewportElement(): HTMLElement {\n return this.viewportElement;\n }\n\n public getCameraElement(): HTMLElement {\n return this.cameraElement;\n }\n\n public getScrollAreaSize(): number {\n const scrollArea = this.state.scrollArea;\n\n return scrollArea.next - scrollArea.prev;\n }\n\n public getRelativeHangerPosition(): number {\n return this.state.relativeHangerPosition;\n }\n\n public getHangerPosition(): number {\n return this.state.position + this.state.relativeHangerPosition;\n }\n\n public getCameraPosition(): number {\n return this.state.position;\n }\n\n public getPositionOffset(): number {\n return this.state.positionOffset;\n }\n\n public getCheckedIndexes(): Array<[number, number]> {\n return this.state.checkedIndexes;\n }\n\n public getVisiblePanels(): Panel[] {\n return this.visiblePanels;\n }\n\n public setCurrentPanel(panel: Panel): void {\n this.currentPanel = panel;\n }\n\n public setLastIndex(index: number): void {\n const currentPanel = this.currentPanel;\n const panelManager = this.panelManager;\n\n panelManager.setLastIndex(index);\n if (currentPanel && currentPanel.getIndex() > index) {\n this.currentPanel = panelManager.lastPanel();\n }\n\n this.resize();\n }\n\n public setVisiblePanels(panels: Panel[]): void {\n this.visiblePanels = panels;\n }\n\n public connectAxesHandler(handlers: { [key: string]: (event: { [key: string]: any; }) => any }): void {\n const axes = this.axes;\n\n this.axesHandlers = handlers;\n axes.on(handlers);\n }\n\n public addPlugins(plugins: Plugin | Plugin[]) {\n const newPlugins = ([] as Plugin[]).concat(plugins);\n\n newPlugins.forEach(plugin => {\n plugin.init(this.flicking);\n });\n\n this.plugins = this.plugins.concat(newPlugins);\n return this;\n }\n\n public removePlugins(plugins: Plugin | Plugin[]) {\n const currentPlugins = this.plugins;\n const removedPlugins = ([] as Plugin[]).concat(plugins);\n\n removedPlugins.forEach(plugin => {\n const index = currentPlugins.indexOf(plugin);\n\n if (index > -1) {\n currentPlugins.splice(index, 1);\n }\n\n plugin.destroy(this.flicking);\n });\n return this;\n }\n\n public updateCheckedIndexes(changedRange: { min: number, max: number }): void {\n const state = this.state;\n\n let removed = 0;\n state.checkedIndexes.concat().forEach((indexes, idx) => {\n const [min, max] = indexes;\n // Can fill part of indexes in range\n if (changedRange.min <= max && changedRange.max >= min) {\n // Remove checked index from list\n state.checkedIndexes.splice(idx - removed, 1);\n removed++;\n }\n });\n }\n\n public appendUncachedPanelElements(panels: Panel[]): void {\n const options = this.options;\n const fragment = document.createDocumentFragment();\n\n if (options.isEqualSize) {\n const prevVisiblePanels = this.visiblePanels;\n const equalSizeClasses = options.isEqualSize as string[]; // for readability\n const cached: { [className: string]: boolean } = {};\n\n this.visiblePanels = [];\n\n Object.keys(this.panelBboxes).forEach(className => {\n cached[className] = true;\n });\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass && !cached[overlappedClass]) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n cached[overlappedClass] = true;\n } else if (!overlappedClass) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n }\n });\n prevVisiblePanels.forEach(panel => {\n this.addVisiblePanel(panel);\n });\n } else {\n if (!options.renderExternal) {\n panels.forEach(panel => fragment.appendChild(panel.getElement()));\n }\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n if (!options.renderExternal) {\n this.cameraElement.appendChild(fragment);\n }\n }\n\n private updateClonePanels() {\n const panelManager = this.panelManager;\n\n // Clone panels in circular mode\n if (this.options.circular && panelManager.getPanelCount() > 0) {\n this.clonePanels();\n this.updateClonedPanelPositions();\n }\n panelManager.chainAllPanels();\n }\n\n private getVisibleIndexOf(panel: Panel): number {\n return findIndex(this.visiblePanels, visiblePanel => visiblePanel === panel);\n }\n\n private build(): void {\n this.setElements();\n this.applyCSSValue();\n this.setMoveType();\n this.setAxesInstance();\n this.refreshPanels();\n this.setDefaultPanel();\n this.resize();\n this.moveToDefaultPanel();\n }\n\n private setElements(): void {\n const state = this.state;\n const options = this.options;\n const wrapper = this.flicking.getElement();\n const classPrefix = options.classPrefix;\n\n const viewportCandidate = wrapper.children[0] as HTMLElement;\n const hasViewportElement = viewportCandidate && hasClass(viewportCandidate, `${classPrefix}-viewport`);\n\n const viewportElement = hasViewportElement\n ? viewportCandidate\n : document.createElement(\"div\");\n\n const cameraCandidate = hasViewportElement\n ? viewportElement.children[0] as HTMLElement\n : wrapper.children[0] as HTMLElement;\n const hasCameraElement = cameraCandidate && hasClass(cameraCandidate, `${classPrefix}-camera`);\n\n const cameraElement = hasCameraElement\n ? cameraCandidate\n : document.createElement(\"div\");\n\n if (!hasCameraElement) {\n cameraElement.className = `${classPrefix}-camera`;\n\n const panelElements = hasViewportElement\n ? viewportElement.children\n : wrapper.children;\n\n // Make all panels to be a child of camera element\n // wrapper <- viewport <- camera <- panels[1...n]\n toArray(panelElements).forEach(child => {\n cameraElement.appendChild(child);\n });\n } else {\n state.originalCameraStyle = {\n className: cameraElement.getAttribute(\"class\"),\n style: cameraElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasViewportElement) {\n viewportElement.className = `${classPrefix}-viewport`;\n\n // Add viewport element to wrapper\n wrapper.appendChild(viewportElement);\n } else {\n state.originalViewportStyle = {\n className: viewportElement.getAttribute(\"class\"),\n style: viewportElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasCameraElement || !hasViewportElement) {\n viewportElement.appendChild(cameraElement);\n }\n\n this.viewportElement = viewportElement;\n this.cameraElement = cameraElement;\n state.isViewportGiven = hasViewportElement;\n state.isCameraGiven = hasCameraElement;\n }\n\n private applyCSSValue(): void {\n const options = this.options;\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const viewportStyle = this.viewportElement.style;\n\n // Set default css values for each element\n applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS);\n applyCSS(cameraElement, DEFAULT_CAMERA_CSS);\n\n viewportElement.style.zIndex = `${options.zIndex}`;\n if (options.horizontal) {\n viewportStyle.minHeight = \"100%\";\n viewportStyle.width = \"100%\";\n } else {\n viewportStyle.minWidth = \"100%\";\n viewportStyle.height = \"100%\";\n }\n if (options.overflow) {\n viewportStyle.overflow = \"visible\";\n }\n\n this.panelManager = new PanelManager(this.cameraElement, options);\n }\n\n private setMoveType(): void {\n const moveType = this.options.moveType as MoveTypeObjectOption;\n\n switch (moveType.type) {\n case MOVE_TYPE.SNAP:\n this.moveType = new Snap(moveType.count);\n break;\n case MOVE_TYPE.FREE_SCROLL:\n this.moveType = new FreeScroll();\n break;\n default:\n throw new Error(\"moveType is not correct!\");\n }\n }\n\n private setAxesInstance(): void {\n const state = this.state;\n const options = this.options;\n\n const scrollArea = state.scrollArea;\n\n this.axes = new Axes({\n flick: {\n range: [scrollArea.prev, scrollArea.next],\n circular: options.circular,\n bounce: [0, 0], // will be updated in resize()\n },\n }, {\n easing: options.panelEffect,\n deceleration: options.deceleration,\n interruptable: true,\n });\n\n this.createPanInput();\n }\n\n private refreshPanels(): void {\n const panelManager = this.panelManager;\n // Panel elements were attached to camera element by Flicking class\n const panelElements = this.cameraElement.children;\n\n // Initialize panels\n const panels = toArray(panelElements).map(\n (el: HTMLElement, idx: number) => new Panel(el, idx, this),\n );\n\n panelManager.replacePanels(panels, []);\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n private setDefaultPanel(): void {\n const options = this.options;\n const panelManager = this.panelManager;\n const indexRange = this.panelManager.getRange();\n const index = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n\n this.currentPanel = panelManager.get(index);\n }\n\n private clonePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n\n const gap = options.gap;\n const viewportSize = state.size;\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n // There're no panels exist\n if (!firstPanel) {\n return;\n }\n\n // For each panels, clone itself while last panel's position + size is below viewport size\n const panels = panelManager.originalPanels();\n const reversedPanels = panels.concat().reverse();\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap;\n const relativeAnchorPosition = firstPanel.getRelativeAnchorPosition();\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n const areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize;\n let sizeSum = 0;\n let panelAtLeftBoundary!: Panel;\n for (const panel of reversedPanels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaPrev) {\n panelAtLeftBoundary = panel;\n break;\n }\n }\n\n const areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize;\n sizeSum = 0;\n let panelAtRightBoundary!: Panel;\n for (const panel of panels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaNext) {\n panelAtRightBoundary = panel;\n break;\n }\n }\n\n // Need one more set of clones on prev area of original panel 0\n const needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0\n && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex();\n\n // Visible count of panel 0 on first screen\n const panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize)\n + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize)\n - 1; // duplication\n\n const cloneCount = panel0OnFirstscreen\n + (needCloneOnPrev ? 1 : 0);\n const prevCloneCount = panelManager.getCloneCount();\n\n panelManager.setCloneCount(cloneCount);\n if (options.renderExternal) {\n return;\n }\n\n if (cloneCount > prevCloneCount) {\n // should clone more\n for (let cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) {\n const clones = panels.map(origPanel => origPanel.clone(cloneIndex));\n const fragment = document.createDocumentFragment();\n clones.forEach(panel => fragment.appendChild(panel.getElement()));\n\n this.cameraElement.appendChild(fragment);\n this.visiblePanels.push(...clones.filter(clone => Boolean(clone)));\n panelManager.insertClones(cloneIndex, 0, clones);\n }\n } else if (cloneCount < prevCloneCount) {\n // should remove some\n panelManager.removeClonesAfter(cloneCount);\n }\n }\n\n private moveToDefaultPanel(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const indexRange = this.panelManager.getRange();\n\n const defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n const defaultPanel = panelManager.get(defaultIndex);\n\n let defaultPosition = 0;\n if (defaultPanel) {\n defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition;\n defaultPosition = this.canSetBoundMode()\n ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next)\n : defaultPosition;\n }\n\n this.moveCamera(defaultPosition);\n this.axes.setTo({ flick: defaultPosition }, 0);\n }\n\n private updateSize(): void {\n const state = this.state;\n const options = this.options;\n const panels = this.panelManager.originalPanels()\n .filter(panel => Boolean(panel));\n const bbox = this.updateBbox();\n\n const prevSize = state.size;\n // Update size & hanger position\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size);\n state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size);\n }\n\n if (panels.length <= 0) {\n return;\n }\n\n this.resizePanels(panels);\n }\n\n private updateOriginalPanelPositions(): void {\n const gap = this.options.gap;\n const panelManager = this.panelManager;\n\n const firstPanel = panelManager.firstPanel();\n const panels = panelManager.originalPanels();\n\n if (!firstPanel) {\n return;\n }\n\n const currentPanel = this.currentPanel!;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n const scrollArea = this.state.scrollArea;\n\n // Update panel position && fit to wrapper\n let nextPanelPos = firstPanel.getPosition();\n let maintainingPanel: Panel = firstPanel;\n if (nearestPanel) {\n // We should maintain nearestPanel's position\n const looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next);\n\n maintainingPanel = looped\n ? currentPanel\n : nearestPanel;\n } else if (firstPanel.getIndex() > 0) {\n maintainingPanel = currentPanel;\n }\n\n const panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length);\n const accumulatedSize = panelsBeforeMaintainPanel.reduce((total, panel) => {\n return total + panel.getSize() + gap;\n }, 0);\n\n nextPanelPos = maintainingPanel.getPosition() - accumulatedSize;\n\n panels.forEach(panel => {\n const newPosition = nextPanelPos;\n const panelSize = panel.getSize();\n\n panel.setPosition(newPosition);\n nextPanelPos += panelSize + gap;\n });\n\n if (!this.options.renderOnlyVisible) {\n panels.forEach(panel => panel.setPositionCSS());\n }\n }\n\n private updateClonedPanelPositions(): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const clonedPanels = panelManager.clonedPanels()\n .reduce((allClones, clones) => [...allClones, ...clones], [])\n .filter(panel => Boolean(panel));\n\n const scrollArea = state.scrollArea;\n\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n if (!firstPanel) {\n return;\n }\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Locate all cloned panels linearly first\n for (const panel of clonedPanels) {\n const origPanel = panel.getOriginalPanel();\n const cloneIndex = panel.getCloneIndex();\n const cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1);\n const clonedPanelPos = cloneBasePos + origPanel.getPosition();\n\n panel.setPosition(clonedPanelPos);\n }\n\n let lastReplacePosition = firstPanel.getPosition();\n // reverse() pollutes original array, so copy it with concat()\n for (const panel of clonedPanels.concat().reverse()) {\n const panelSize = panel.getSize();\n const replacePosition = lastReplacePosition - panelSize - options.gap;\n\n if (replacePosition + panelSize <= scrollArea.prev) {\n // Replace is not meaningful, as it won't be seen in current scroll area\n break;\n }\n\n panel.setPosition(replacePosition);\n lastReplacePosition = replacePosition;\n }\n\n if (!this.options.renderOnlyVisible) {\n clonedPanels.forEach(panel => {\n panel.setPositionCSS();\n });\n }\n }\n\n private updateVisiblePanelPositions(): void {\n if (this.options.renderOnlyVisible) {\n this.visiblePanels.forEach(panel => {\n panel.setPositionCSS(this.state.positionOffset);\n });\n }\n }\n\n private updateScrollArea(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const axes = this.axes;\n\n // Set viewport scrollable area\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel() as Panel;\n const relativeHangerPosition = state.relativeHangerPosition;\n\n if (!firstPanel) {\n state.scrollArea = {\n prev: 0,\n next: 0,\n };\n } else if (this.canSetBoundMode()) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition();\n\n if (sumOriginalPanelSize >= state.size) {\n state.scrollArea = {\n prev: firstPanel.getPosition(),\n next: lastPanel.getPosition() + lastPanel.getSize() - state.size,\n };\n } else {\n // Find anchor position of set of the combined panels\n const relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize);\n const anchorPos = firstPanel.getPosition() + clamp(\n relAnchorPosOfCombined,\n sumOriginalPanelSize - (state.size - relativeHangerPosition),\n relativeHangerPosition,\n );\n\n state.scrollArea = {\n prev: anchorPos - relativeHangerPosition,\n next: anchorPos - relativeHangerPosition,\n };\n }\n } else if (options.circular) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Maximum scroll extends to first clone sequence's first panel\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition,\n };\n } else {\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: lastPanel.getAnchorPosition() - relativeHangerPosition,\n };\n }\n\n const viewportSize = state.size;\n const bounce = options.bounce;\n\n let parsedBounce: number[];\n if (isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce as number));\n } else {\n const parsedVal = parseArithmeticExpression(bounce as number | string, viewportSize, DEFAULT_OPTIONS.bounce as number);\n parsedBounce = [parsedVal, parsedVal];\n }\n\n // Update axes range and bounce\n const flick = axes.axis.flick;\n flick.range = [state.scrollArea.prev, state.scrollArea.next];\n flick.bounce = parsedBounce;\n }\n\n private checkNeedPanel(axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentPanel = this.currentPanel;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n\n if (!options.infinite) {\n return;\n }\n\n const gap = options.gap;\n const infiniteThreshold = state.infiniteThreshold;\n const maxLastIndex = panelManager.getLastIndex();\n\n if (maxLastIndex < 0) {\n return;\n }\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: null,\n direction: null,\n indexRange: {\n min: 0,\n max: maxLastIndex,\n length: maxLastIndex + 1,\n },\n });\n return;\n }\n\n const originalNearestPosition = nearestPanel.getPosition();\n\n // Check next direction\n let checkingPanel: Panel | null = !currentState.holding && !currentState.playing\n ? currentPanel\n : nearestPanel;\n\n while (checkingPanel) {\n const currentIndex = checkingPanel.getIndex();\n const nextSibling = checkingPanel.nextSibling;\n const lastPanel = panelManager.lastPanel()!;\n const atLastPanel = currentIndex === lastPanel.getIndex();\n const nextIndex = !atLastPanel && nextSibling\n ? nextSibling.getIndex()\n : maxLastIndex + 1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition);\n const cameraNext = state.position + state.size;\n\n // There're empty panels between\n const emptyPanelExistsBetween = (nextIndex - currentIndex > 1);\n // Expected prev panel's left position is smaller than camera position\n const overThreshold = panelRight + gap - infiniteThreshold <= cameraNext;\n\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: currentIndex + 1,\n max: nextIndex - 1,\n length: nextIndex - currentIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at max panel index\n if (options.circular && currentIndex === maxLastIndex && overThreshold) {\n const firstPanel = panelManager.firstPanel();\n const firstIndex = firstPanel\n ? firstPanel.getIndex()\n : -1;\n\n if (firstIndex > 0) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: 0,\n max: firstIndex - 1,\n length: firstIndex,\n },\n });\n }\n }\n\n // Check whether panels are changed\n const lastPanelAfterNeed = panelManager.lastPanel()!;\n const atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex();\n\n if (atLastPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.nextSibling;\n }\n\n // Check prev direction\n checkingPanel = nearestPanel;\n while (checkingPanel) {\n const cameraPrev = state.position;\n const checkingIndex = checkingPanel.getIndex();\n const prevSibling = checkingPanel.prevSibling;\n const firstPanel = panelManager.firstPanel()!;\n const atFirstPanel = checkingIndex === firstPanel.getIndex();\n const prevIndex = !atFirstPanel && prevSibling\n ? prevSibling.getIndex()\n : -1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition);\n\n // There're empty panels between\n const emptyPanelExistsBetween = checkingIndex - prevIndex > 1;\n // Expected prev panel's right position is smaller than camera position\n const overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev;\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: prevIndex + 1,\n max: checkingIndex - 1,\n length: checkingIndex - prevIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at panel 0\n if (options.circular && checkingIndex === 0 && overThreshold) {\n const lastPanel = panelManager.lastPanel();\n\n if (lastPanel && lastPanel.getIndex() < maxLastIndex) {\n const lastIndex = lastPanel.getIndex();\n\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: lastIndex + 1,\n max: maxLastIndex,\n length: maxLastIndex - lastIndex,\n },\n });\n }\n }\n\n // Check whether panels were changed\n const firstPanelAfterNeed = panelManager.firstPanel();\n const atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex();\n\n // Looped in circular mode\n if (atFirstPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.prevSibling;\n }\n }\n\n private triggerNeedPanel(params: {\n axesEvent: any;\n siblingPanel: Panel | null,\n direction: FlickingEvent[\"direction\"];\n indexRange: NeedPanelEvent[\"range\"];\n }): void {\n const { axesEvent, siblingPanel, direction, indexRange } = params;\n const options = this.options;\n const checkedIndexes = this.state.checkedIndexes;\n const alreadyTriggered = checkedIndexes.some(([min, max]) => min === indexRange.min || max === indexRange.max);\n const hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL);\n\n if (alreadyTriggered || !hasHandler) {\n return;\n }\n\n // Should done before triggering event, as we can directly add panels by event callback\n checkedIndexes.push([indexRange.min, indexRange.max]);\n\n const index = siblingPanel\n ? siblingPanel.getIndex()\n : 0;\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n\n this.triggerEvent(\n EVENTS.NEED_PANEL,\n axesEvent,\n isTrusted,\n {\n index,\n panel: siblingPanel,\n direction,\n range: indexRange,\n fill: (element: ElementLike | ElementLike[]) => {\n const panelManager = this.panelManager;\n if (!siblingPanel) {\n return this.insert(panelManager.getRange().max + 1, element);\n }\n\n const parsedElements = parseElement(element);\n // Slice elements to fit size equal to empty spaces\n const elements = direction === DIRECTION.NEXT\n ? parsedElements.slice(0, indexRange.length)\n : parsedElements.slice(-indexRange.length);\n\n if (direction === DIRECTION.NEXT) {\n if (options.circular && index === panelManager.getLastIndex()) {\n // needPanel event is triggered on last index, insert at index 0\n return this.insert(0, elements);\n } else {\n return siblingPanel.insertAfter(elements);\n }\n } else if (direction === DIRECTION.PREV) {\n if (options.circular && index === 0) {\n // needPanel event is triggered on first index(0), insert at the last index\n return this.insert(indexRange.max - elements.length + 1, elements);\n } else {\n return siblingPanel.insertBefore(elements);\n }\n } else {\n // direction is null when there're no panels exist\n return this.insert(0, elements);\n }\n },\n } as Partial,\n );\n }\n\n private updateVisiblePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentState = this.stateMachine.getState();\n const cameraElement = this.cameraElement;\n const { renderExternal, renderOnlyVisible } = options;\n if (!renderOnlyVisible) {\n return;\n }\n\n if (!this.nearestPanel) {\n this.visiblePanels = [];\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n return;\n }\n\n const prevVisiblePanels = this.visiblePanels;\n const newVisiblePanels = this.calcVisiblePanels();\n\n const { addedPanels, removedPanels } = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels);\n\n if (addedPanels.length <= 0 && removedPanels.length <= 0) {\n // Visible panels not changed\n return;\n }\n\n if (currentState.holding) {\n newVisiblePanels.push(...removedPanels);\n } else {\n const firstVisiblePanelPos = newVisiblePanels[0].getPosition();\n state.positionOffset = firstVisiblePanelPos;\n }\n\n newVisiblePanels.forEach(panel => {\n panel.setPositionCSS(state.positionOffset);\n });\n\n if (!renderExternal) {\n if (!currentState.holding) {\n removedPanels.forEach(panel => {\n const panelElement = panel.getElement();\n panelElement.parentNode && cameraElement.removeChild(panelElement);\n });\n }\n\n const fragment = document.createDocumentFragment();\n addedPanels.forEach(panel => {\n fragment.appendChild(panel.getElement());\n });\n\n cameraElement.appendChild(fragment);\n }\n\n const firstVisiblePanel = newVisiblePanels[0];\n const lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1];\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount();\n\n const newVisibleRange = {\n min: getAbsIndex(firstVisiblePanel),\n max: getAbsIndex(lastVisiblePanel),\n };\n this.visiblePanels = newVisiblePanels;\n this.flicking.trigger(EVENTS.VISIBLE_CHANGE, {\n type: EVENTS.VISIBLE_CHANGE,\n range: newVisibleRange,\n });\n }\n\n private checkVisiblePanelChange(prevVisiblePanels: Panel[], newVisiblePanels: Panel[]) {\n const prevRefCount = prevVisiblePanels.map(() => 0);\n const newRefCount = newVisiblePanels.map(() => 0);\n\n prevVisiblePanels.forEach((prevPanel, prevIndex) => {\n newVisiblePanels.forEach((newPanel, newIndex) => {\n if (prevPanel === newPanel) {\n prevRefCount[prevIndex]++;\n newRefCount[newIndex]++;\n }\n });\n });\n\n const removedPanels = prevRefCount.reduce((removed: Panel[], count, index) => {\n return count === 0\n ? [...removed, prevVisiblePanels[index]]\n : removed;\n }, []);\n const addedPanels = newRefCount.reduce((added: Panel[], count, index) => {\n return count === 0\n ? [...added, newVisiblePanels[index]]\n : added;\n }, []);\n\n return { removedPanels, addedPanels };\n }\n\n private resizePanels(panels: Panel[]): void {\n const options = this.options;\n const panelBboxes = this.panelBboxes;\n\n if (options.isEqualSize === true) {\n if (!panelBboxes.default) {\n const defaultPanel = panels[0];\n panelBboxes.default = defaultPanel.getBbox();\n }\n\n const defaultBbox = panelBboxes.default;\n\n panels.forEach(panel => {\n panel.resize(defaultBbox);\n });\n return;\n } else if (options.isEqualSize) {\n const equalSizeClasses = options.isEqualSize;\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass) {\n panel.resize(panelBboxes[overlappedClass]);\n panelBboxes[overlappedClass] = panel.getBbox();\n } else {\n panel.resize();\n }\n });\n return;\n }\n panels.forEach(panel => {\n panel.resize();\n });\n }\n\n private createPanInput() {\n const options = this.options;\n\n this.panInput = new PanInput(this.viewportElement, {\n inputType: options.inputType,\n thresholdAngle: options.thresholdAngle,\n iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold,\n scale: options.horizontal ? [-1, 0] : [0, -1],\n });\n\n this.axes.connect(options.horizontal ? [\"flick\", \"\"] : [\"\", \"flick\"], this.panInput);\n }\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Component from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport Viewport from \"./components/Viewport\";\nimport Panel from \"./components/Panel\";\n\nimport { merge, getProgress, parseElement, isString, counter, findIndex } from \"./utils\";\nimport { DEFAULT_OPTIONS, EVENTS, DIRECTION, AXES_EVENTS, STATE_TYPE, DEFAULT_MOVE_TYPE_OPTIONS } from \"./consts\";\nimport {\n FlickingOptions,\n FlickingEvent,\n Direction,\n EventType,\n FlickingPanel,\n TriggerCallback,\n FlickingContext,\n FlickingStatus,\n Plugin,\n ElementLike,\n DestroyOption,\n BeforeSyncResult,\n SyncResult,\n ChangeEvent,\n SelectEvent,\n NeedPanelEvent,\n VisibleChangeEvent,\n ContentErrorEvent,\n MoveTypeStringOption,\n ValueOf,\n} from \"./types\";\n// import { sendEvent } from \"./ga/ga\";\nimport { DiffResult } from \"@egjs/list-differ\";\n\n/**\n * @memberof eg\n * @extends eg.Component\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"4.X+\"}\n * @requires {@link https://github.com/naver/egjs-component|eg.Component}\n * @requires {@link https://github.com/naver/egjs-axes|eg.Axes}\n * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/}\n */\nclass Flicking extends Component<{\n holdStart: FlickingEvent;\n holdEnd: FlickingEvent;\n moveStart: FlickingEvent;\n move: FlickingEvent;\n moveEnd: FlickingEvent;\n change: ChangeEvent;\n restore: FlickingEvent;\n select: SelectEvent;\n needPanel: NeedPanelEvent;\n visibleChange: VisibleChangeEvent;\n contentError: ContentErrorEvent;\n}> {\n /**\n * Version info string\n * @ko 버전정보 문자열\n * @example\n * eg.Flicking.VERSION; // ex) 3.0.0\n * @memberof eg.Flicking\n */\n public static VERSION: string = \"#__VERSION__#\";\n /**\n * Direction constant - \"PREV\" or \"NEXT\"\n * @ko 방향 상수 - \"PREV\" 또는 \"NEXT\"\n * @type {object}\n * @property {\"PREV\"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
\n * @property {\"NEXT\"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
\n * @example\n * eg.Flicking.DIRECTION.PREV; // \"PREV\"\n * eg.Flicking.DIRECTION.NEXT; // \"NEXT\"\n */\n public static DIRECTION: Direction = DIRECTION;\n\n /**\n * Event type object with event name strings.\n * @ko 이벤트 이름 문자열들을 담은 객체\n * @type {object}\n * @property {\"holdStart\"} HOLD_START - holdStart eventholdStart 이벤트\n * @property {\"holdEnd\"} HOLD_END - holdEnd eventholdEnd 이벤트\n * @property {\"moveStart\"} MOVE_START - moveStart eventmoveStart 이벤트\n * @property {\"move\"} MOVE - move eventmove 이벤트\n * @property {\"moveEnd\"} MOVE_END - moveEnd eventmoveEnd 이벤트\n * @property {\"change\"} CHANGE - change eventchange 이벤트\n * @property {\"restore\"} RESTORE - restore eventrestore 이벤트\n * @property {\"select\"} SELECT - select eventselect 이벤트\n * @property {\"needPanel\"} NEED_PANEL - needPanel eventneedPanel 이벤트\n * @example\n * eg.Flicking.EVENTS.MOVE_START; // \"MOVE_START\"\n */\n public static EVENTS: EventType = EVENTS;\n\n public options: FlickingOptions;\n\n private wrapper: HTMLElement;\n private viewport: Viewport;\n private contentsReadyChecker: ImReady | null = null;\n\n private eventContext: FlickingContext;\n private isPanelChangedAtBeforeSync: boolean = false;\n\n /**\n * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체\n * @param {string} [options.classPrefix=\"eg-flick\"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사.\n * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향)\n * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다.\n * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다.\n * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리.\n * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
\n * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다.\n * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다.\n * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수.\n * @param {string[]} [options.inputType=[\"touch,\"mouse\"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고})\n * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
\n * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, \"10px\", \"20%\")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, \"10px\", \"20%\")
\n * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부.\n * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부.\n * @param {number|\"\"} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값.\n * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다.\n * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다.\n * @param {string} [options.hanger=\"50%\"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {string} [options.anchor=\"50%\"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px)\n * @param {eg.Flicking.MoveTypeOption} [options.moveType=\"snap\"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll)\n * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
\n * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다.\n * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
\n * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.\n * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다.\n * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
\n * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다.\n */\n constructor(\n element: string | HTMLElement,\n options: Partial = {},\n ) {\n super();\n\n // Set flicking wrapper user provided\n let wrapper: HTMLElement | null;\n if (isString(element)) {\n wrapper = document.querySelector(element);\n if (!wrapper) {\n throw new Error(\"Base element doesn't exist.\");\n }\n } else if (element.nodeName && element.nodeType === 1) {\n wrapper = element;\n } else {\n throw new Error(\"Element should be provided in string or HTMLElement.\");\n }\n\n this.wrapper = wrapper;\n // Override default options\n this.options = merge({}, DEFAULT_OPTIONS, options) as FlickingOptions;\n // Override moveType option\n const currentOptions = this.options;\n const moveType = currentOptions.moveType as MoveTypeStringOption;\n\n if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) {\n currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType as keyof typeof DEFAULT_MOVE_TYPE_OPTIONS];\n }\n\n // Make viewport instance with panel container element\n this.viewport = new Viewport(this, this.options, this.triggerEvent);\n this.listenInput();\n this.listenResize();\n\n // if (this.options.collectStatistics) {\n // sendEvent(\n // \"usage\",\n // \"options\",\n // options,\n // );\n // }\n }\n\n /**\n * Move to the previous panel if it exists.\n * @ko 이전 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public prev(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const prevPanel = currentPanel.prev();\n if (prevPanel) {\n prevPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the next panel if it exists.\n * @ko 다음 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public next(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const nextPanel = currentPanel.next();\n if (nextPanel) {\n nextPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the panel of given index.\n * @ko 주어진 인덱스에 해당하는 패널로 이동한다.\n * @param index The index number of the panel to move.이동할 패널의 인덱스 번호.\n * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public moveTo(index: number, duration?: number): this {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n const state = viewport.stateMachine.getState();\n\n if (!panel || state.type !== STATE_TYPE.IDLE) {\n return this;\n }\n\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = viewport.getHangerPosition();\n\n let targetPanel = panel;\n if (this.options.circular) {\n const scrollAreaSize = viewport.getScrollAreaSize();\n // Check all three possible locations, find the nearest position among them.\n const possiblePositions = [\n anchorPosition - scrollAreaSize,\n anchorPosition,\n anchorPosition + scrollAreaSize,\n ];\n const nearestPosition = possiblePositions.reduce((nearest, current) => {\n return (Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition))\n ? current\n : nearest;\n }, Infinity) - panel.getRelativeAnchorPosition();\n\n const identicals = panel.getIdenticalPanels();\n const offset = nearestPosition - anchorPosition;\n if (offset > 0) {\n // First cloned panel is nearest\n targetPanel = identicals[1];\n } else if (offset < 0) {\n // Last cloned panel is nearest\n targetPanel = identicals[identicals.length - 1];\n }\n\n targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true);\n targetPanel.setPosition(nearestPosition);\n }\n const currentIndex = this.getIndex();\n\n if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) {\n return this;\n }\n\n const eventType = panel.getIndex() === viewport.getCurrentIndex()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(\n targetPanel,\n viewport.findEstimatedPosition(targetPanel),\n eventType,\n null,\n duration,\n );\n return this;\n }\n\n /**\n * Return index of the current panel. `-1` if no panel exists.\n * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다.\n * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n */\n public getIndex(): number {\n return this.viewport.getCurrentIndex();\n }\n\n /**\n * Return the wrapper element user provided in constructor.\n * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다.\n * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트.\n */\n public getElement(): HTMLElement {\n return this.wrapper;\n }\n\n /**\n * Return the viewport element's size.\n * @ko 뷰포트 엘리먼트의 크기를 반환한다.\n * @return Width if horizontal: true, height if horizontal: false\n */\n public getSize(): number {\n return this.viewport.getSize();\n }\n\n /**\n * Return current panel. `null` if no panel exists.\n * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다.\n * @return Current panel.현재 패널.\n */\n public getCurrentPanel(): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.getCurrentPanel();\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return the panel of given index. `null` if it doesn't exists.\n * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다.\n * @return Panel of given index.주어진 인덱스에 해당하는 패널.\n */\n public getPanel(index: number): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return all panels.\n * @ko 모든 패널들을 반환한다.\n * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부.\n * @return All panels.모든 패널들.\n */\n public getAllPanels(includeClone?: boolean): FlickingPanel[] {\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const panels = includeClone\n ? panelManager.allPanels()\n : panelManager.originalPanels();\n\n return panels\n .filter(panel => !!panel);\n }\n\n /**\n * Return the panels currently shown in viewport area.\n * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다.\n * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들\n */\n public getVisiblePanels(): FlickingPanel[] {\n return this.viewport.calcVisiblePanels();\n }\n\n /**\n * Return length of original panels.\n * @ko 원본 패널의 개수를 반환한다.\n * @return Length of original panels.원본 패널의 개수\n */\n public getPanelCount(): number {\n return this.viewport.panelManager.getPanelCount();\n }\n\n /**\n * Return how many groups of clones are created.\n * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다.\n * @return Length of cloned panel groups.클론된 패널 그룹의 개수\n */\n public getCloneCount(): number {\n return this.viewport.panelManager.getCloneCount();\n }\n\n /**\n * Get maximum panel index for `infinite` mode.\n * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스.\n */\n public getLastIndex(): number {\n return this.viewport.panelManager.getLastIndex();\n }\n\n /**\n * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it.\n * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다.\n * @param - Maximum panel index.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public setLastIndex(index: number): this {\n this.viewport.setLastIndex(index);\n\n return this;\n }\n\n /**\n * Return panel movement animation.\n * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다.\n * @return Is animating or not.애니메이션 진행 여부.\n */\n public isPlaying(): boolean {\n return this.viewport.stateMachine.getState().playing;\n }\n\n /**\n * Unblock input devices.\n * @ko 막았던 입력 장치로부터의 입력을 푼다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public enableInput(): this {\n this.viewport.enable();\n\n return this;\n }\n\n /**\n * Block input devices.\n * @ko 입력 장치로부터의 입력을 막는다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public disableInput(): this {\n this.viewport.disable();\n\n return this;\n }\n\n /**\n * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}.\n * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다.\n * @return An object with current status value information.현재 상태값 정보를 가진 객체.\n */\n public getStatus(): FlickingStatus {\n const viewport = this.viewport;\n\n const panels = viewport.panelManager.originalPanels()\n .filter(panel => !!panel)\n .map(panel => {\n return {\n html: panel.getElement().outerHTML,\n index: panel.getIndex(),\n };\n });\n\n return {\n index: viewport.getCurrentIndex(),\n panels,\n position: viewport.getCameraPosition(),\n };\n }\n\n /**\n * Restore to the state of the `status`.\n * @ko `status`의 상태로 복원한다.\n * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다.\n */\n public setStatus(status: FlickingStatus): void {\n this.viewport.restore(status);\n }\n\n /**\n * Add plugins that can have different effects on Flicking.\n * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다.\n * @param - The plugin(s) to add.추가할 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public addPlugins(plugins: Plugin | Plugin[]) {\n this.viewport.addPlugins(plugins);\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @ko 플리킹으로부터 플러그인들을 제거한다.\n * @param - The plugin(s) to remove.제거 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public removePlugins(plugins: Plugin | Plugin[]) {\n this.viewport.removePlugins(plugins);\n return this;\n }\n\n /**\n * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n * @example\n * const flick = new eg.Flicking(\"#flick\");\n * flick.destroy();\n * console.log(flick.moveTo); // null\n */\n public destroy(option: Partial = {}): void {\n this.off();\n\n if (this.options.autoResize) {\n window.removeEventListener(\"resize\", this.resize);\n }\n\n this.viewport.destroy(option);\n this.contentsReadyChecker?.destroy();\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n /**\n * Update panels to current state.\n * @ko 패널들을 현재 상태에 맞춰 갱신한다.\n * @method\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public resize = (): this => {\n const viewport = this.viewport;\n const options = this.options;\n const wrapper = this.getElement();\n\n const allPanels = viewport.panelManager.allPanels();\n if (!options.isConstantSize) {\n allPanels.forEach(panel => panel.unCacheBbox());\n }\n\n const shouldResetElements = options.renderOnlyVisible\n && !options.isConstantSize\n && options.isEqualSize !== true;\n\n // Temporarily set parent's height to prevent scroll (#333)\n const parent = wrapper.parentElement!;\n const origStyle = parent.style.height;\n parent.style.height = `${parent.offsetHeight}px`;\n\n viewport.unCacheBbox();\n // This should be done before adding panels, to lower performance issue\n viewport.updateBbox();\n\n if (shouldResetElements) {\n viewport.appendUncachedPanelElements(allPanels as Panel[]);\n }\n\n viewport.resize();\n parent.style.height = origStyle;\n\n return this;\n }\n\n /**\n * Add new panels at the beginning of panels.\n * @ko 제일 앞에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.replace(3, document.createElement(\"div\")); // Add new panel at index 3\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 2\n * flicking.prepend([\"\\Panel\\\", document.createElement(\"div\")]); // Prepended at index 0, 1\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 0, pushing every panels behind it.\n */\n public prepend(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n\n const insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0);\n const prependedPanels = viewport.insert(insertingIndex, parsedElements);\n\n this.checkContentsReady(prependedPanels);\n\n return prependedPanels;\n }\n\n /**\n * Add new panels at the end of panels.\n * @ko 제일 끝에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\")); // Appended at index 0\n * flicking.append(\"\\Panel\\\"); // Appended at index 1\n * flicking.append([\"\\Panel\\\", document.createElement(\"div\")]); // Appended at index 2, 3\n * // Even this is possible\n * flicking.append(\"\\Panel 1\\\\Panel 2\\\"); // Appended at index 4, 5\n */\n public append(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element);\n\n this.checkContentsReady(appendedPanels);\n\n return appendedPanels;\n }\n\n /**\n * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index.\n * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다.\n * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n *\n * // This will add new panel at index 3,\n * // Index 0, 1, 2 is empty at this moment.\n * // [empty, empty, empty, PANEL]\n * flicking.replace(3, document.createElement(\"div\"));\n *\n * // As index 2 was empty, this will also add new panel at index 2.\n * // [empty, empty, PANEL, PANEL]\n * flicking.replace(2, \"\\Panel\\\");\n *\n * // Index 3 was not empty, so it will replace previous one.\n * // It will also add new panels at index 4 and 5.\n * // before - [empty, empty, PANEL, PANEL]\n * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL]\n * flicking.replace(3, [\"\\Panel\\\", \"\\Panel\\\", \"\\Panel\\\"])\n */\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const replacedPanels = this.viewport.replace(index, element);\n\n this.checkContentsReady(replacedPanels);\n\n return replacedPanels;\n }\n\n /**\n * Remove panel at target index. This will decrease index of panels behind it.\n * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다.\n * @param index - Index of panel to remove.제거할 패널의 인덱스\n * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수.\n * @return Array of removed panels제거된 패널들의 배열\n */\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n return this.viewport.remove(index, deleteCount);\n }\n\n /**\n * Get indexes to render. Should be used with `renderOnlyVisible` option.\n * `beforeSync` should be called before this method for a correct result.\n * @private\n * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다.\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @return Array of indexes to render.렌더링할 인덱스의 배열\n */\n public getRenderingIndexes(diffResult: DiffResult): number[] {\n const viewport = this.viewport;\n const visiblePanels = viewport.getVisiblePanels();\n const maintained = diffResult.maintained.reduce((values: {[key: number]: number}, [before, after]) => {\n values[after] = before;\n return values;\n }, {});\n\n const panelCount = diffResult.list.length;\n const added = diffResult.added;\n const getPanelAbsIndex = (panel: Panel) => {\n return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n };\n\n const visibleIndexes = visiblePanels.map(panel => getPanelAbsIndex(panel))\n .filter(val => maintained[val % panelCount] != null);\n\n const renderingPanels = [...visibleIndexes, ...added];\n const allPanels = viewport.panelManager.allPanels();\n\n viewport.setVisiblePanels(renderingPanels.map(index => allPanels[index]));\n\n return renderingPanels;\n }\n\n /**\n * Synchronize info of panels instance with info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다.\n * @private\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 \n */\n public beforeSync(diffInfo: BeforeSyncResult) {\n const { maintained, added, changed, removed } = diffInfo;\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const isCircular = this.options.circular;\n const cloneCount = panelManager.getCloneCount();\n const prevClonedPanels = panelManager.clonedPanels();\n\n // Update visible panels\n const newVisiblePanels = viewport.getVisiblePanels()\n .filter(panel => findIndex(removed, index => {\n return index === panel.getIndex();\n }) < 0);\n viewport.setVisiblePanels(newVisiblePanels);\n\n // Did not changed at all\n if (\n added.length <= 0\n && removed.length <= 0\n && changed.length <= 0\n && cloneCount === prevClonedPanels.length\n ) {\n return this;\n }\n const prevOriginalPanels = panelManager.originalPanels();\n const newPanels: Panel[] = [];\n const newClones: Panel[][] = counter(cloneCount).map(() => []);\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newPanels[afterIdx] = prevOriginalPanels[beforeIdx];\n newPanels[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n newPanels[addIndex] = new Panel(null, addIndex, this.viewport);\n });\n\n if (isCircular) {\n counter(cloneCount).forEach(groupIndex => {\n const prevCloneGroup = prevClonedPanels[groupIndex];\n const newCloneGroup = newClones[groupIndex];\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newCloneGroup[afterIdx] = prevCloneGroup\n ? prevCloneGroup[beforeIdx]\n : newPanels[afterIdx].clone(groupIndex, false);\n\n newCloneGroup[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n const newPanel = newPanels[addIndex];\n\n newCloneGroup[addIndex] = newPanel.clone(groupIndex, false);\n });\n });\n }\n\n added.forEach(index => { viewport.updateCheckedIndexes({ min: index, max: index }); });\n removed.forEach(index => { viewport.updateCheckedIndexes({ min: index - 1, max: index + 1 }); });\n\n const checkedIndexes = viewport.getCheckedIndexes();\n checkedIndexes.forEach(([min, max], idx) => {\n // Push checked indexes backward\n const pushedIndex = added.filter(index => index < min && panelManager.has(index)).length\n - removed.filter(index => index < min).length;\n checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n });\n\n // Only effective only when there are least one panel which have changed its index\n if (changed.length > 0) {\n // Removed checked index by changed ones after pushing\n maintained.forEach(([, next]) => { viewport.updateCheckedIndexes({ min: next, max: next }); });\n }\n panelManager.replacePanels(newPanels, newClones);\n this.isPanelChangedAtBeforeSync = true;\n }\n\n /**\n * Synchronize info of panels with DOM info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다.\n * @private\n * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트.\n */\n public sync(diffInfo: SyncResult): this {\n const { list, maintained, added, changed, removed } = diffInfo;\n\n // Did not changed at all\n if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) {\n return this;\n }\n const viewport = this.viewport;\n const { renderOnlyVisible, circular } = this.options;\n const panelManager = viewport.panelManager;\n\n if (!renderOnlyVisible) {\n const indexRange = panelManager.getRange();\n let beforeDiffInfo: BeforeSyncResult = diffInfo;\n\n if (circular) {\n const prevOriginalPanelCount = indexRange.max;\n const originalPanelCount = (list.length / (panelManager.getCloneCount() + 1)) >> 0;\n const originalAdded = added.filter(index => index < originalPanelCount);\n const originalRemoved = removed.filter(index => index <= prevOriginalPanelCount);\n const originalMaintained = maintained.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n const originalChanged = changed.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n\n beforeDiffInfo = {\n added: originalAdded,\n maintained: originalMaintained,\n removed: originalRemoved,\n changed: originalChanged,\n };\n }\n this.beforeSync(beforeDiffInfo);\n }\n\n const visiblePanels = renderOnlyVisible\n ? viewport.getVisiblePanels()\n : this.getAllPanels(true);\n\n added.forEach(addedIndex => {\n const addedElement = list[addedIndex];\n const beforePanel = visiblePanels[addedIndex] as Panel;\n\n beforePanel.setElement(addedElement);\n // As it can be 0\n beforePanel.unCacheBbox();\n });\n if (this.isPanelChangedAtBeforeSync) {\n // Reset visible panels\n viewport.setVisiblePanels([]);\n this.isPanelChangedAtBeforeSync = false;\n }\n viewport.resize();\n\n return this;\n }\n\n private listenInput(): void {\n const flicking = this;\n const viewport = flicking.viewport;\n const stateMachine = viewport.stateMachine;\n\n // Set event context\n flicking.eventContext = {\n flicking,\n viewport: flicking.viewport,\n transitTo: stateMachine.transitTo,\n triggerEvent: flicking.triggerEvent,\n moveCamera: flicking.moveCamera,\n stopCamera: viewport.stopCamera,\n };\n\n const handlers = {};\n for (const key in AXES_EVENTS) {\n const eventType = AXES_EVENTS[key];\n\n handlers[eventType] = (e: any) => stateMachine.fire(eventType, e, flicking.eventContext);\n }\n\n // Connect Axes instance with PanInput\n flicking.viewport.connectAxesHandler(handlers);\n }\n\n private listenResize(): void {\n const options = this.options;\n\n if (options.autoResize) {\n window.addEventListener(\"resize\", this.resize);\n }\n\n if (options.resizeOnContentsReady) {\n const contentsReadyChecker = new ImReady();\n\n contentsReadyChecker.on(\"preReady\", () => {\n this.resize();\n });\n contentsReadyChecker.on(\"readyElement\", e => {\n if (e.hasLoading && e.isPreReadyOver) {\n this.resize();\n }\n });\n contentsReadyChecker.on(\"error\", e => {\n this.trigger(EVENTS.CONTENT_ERROR, {\n type: EVENTS.CONTENT_ERROR,\n element: e.element,\n });\n });\n contentsReadyChecker.check([this.wrapper]);\n\n this.contentsReadyChecker = contentsReadyChecker;\n }\n }\n\n private triggerEvent = (\n eventName: ValueOf>, // visibleChange event has no common event definition from other events\n axesEvent: any,\n isTrusted: boolean,\n params: Partial = {},\n ): TriggerCallback => {\n const viewport = this.viewport;\n\n let canceled: boolean = true;\n\n // Ignore events before viewport is initialized\n if (viewport) {\n const state = viewport.stateMachine.getState();\n const { prev, next } = viewport.getScrollArea();\n const pos = viewport.getCameraPosition();\n let progress = getProgress(pos, [prev, prev, next]);\n\n if (this.options.circular) {\n progress %= 1;\n }\n canceled = !super.trigger(eventName, merge({\n type: eventName,\n index: this.getIndex(),\n panel: this.getCurrentPanel(),\n direction: state.direction,\n holding: state.holding,\n progress,\n axesEvent,\n isTrusted,\n }, params) as FlickingEvent);\n }\n\n return {\n onSuccess(callback: () => void): TriggerCallback {\n if (!canceled) {\n callback();\n }\n return this;\n },\n onStopped(callback: () => void): TriggerCallback {\n if (canceled) {\n callback();\n }\n return this;\n },\n } as TriggerCallback;\n }\n\n // Return result of \"move\" event triggered\n private moveCamera = (axesEvent: any): TriggerCallback => {\n const viewport = this.viewport;\n const state = viewport.stateMachine.getState();\n const options = this.options;\n\n const pos = axesEvent.pos.flick;\n const previousPosition = viewport.getCameraPosition();\n\n if (axesEvent.isTrusted && state.holding) {\n const inputOffset = options.horizontal\n ? axesEvent.inputEvent.offsetX\n : axesEvent.inputEvent.offsetY;\n\n const isNextDirection = inputOffset < 0;\n\n let cameraChange = pos - previousPosition;\n const looped = isNextDirection === (pos < previousPosition);\n if (options.circular && looped) {\n // Reached at max/min range of axes\n const scrollAreaSize = viewport.getScrollAreaSize();\n cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange));\n }\n\n const currentDirection = cameraChange === 0\n ? state.direction\n : cameraChange > 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n state.direction = currentDirection;\n }\n state.delta += axesEvent.delta.flick;\n\n viewport.moveCamera(pos, axesEvent);\n return this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted)\n .onStopped(() => {\n // Undo camera movement\n viewport.moveCamera(previousPosition, axesEvent);\n });\n }\n\n private checkContentsReady(panels: FlickingPanel[]) {\n this.contentsReadyChecker?.check(panels.map(panel => panel.getElement()));\n }\n}\n\nexport default Flicking;\n","import Flicking from \"./Flicking\";\nimport { withFlickingMethods } from \"./utils\";\nimport { DEFAULT_OPTIONS, MOVE_TYPE } from \"./consts\";\n\n(Flicking as any).withFlickingMethods = withFlickingMethods;\n(Flicking as any).DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n(Flicking as any).MOVE_TYPE = MOVE_TYPE;\nexport default Flicking;\n"],"names":["MOVE_TYPE","SNAP","FREE_SCROLL","DEFAULT_MOVE_TYPE_OPTIONS","snap","type","count","freeScroll","isBrowser","document","DEFAULT_OPTIONS","classPrefix","deceleration","horizontal","circular","infinite","infiniteThreshold","lastIndex","Infinity","threshold","duration","panelEffect","x","Math","pow","defaultIndex","inputType","thresholdAngle","bounce","autoResize","adaptive","zIndex","bound","overflow","hanger","anchor","gap","moveType","useOffset","isEqualSize","isConstantSize","renderOnlyVisible","renderExternal","resizeOnContentsReady","iOSEdgeSwipeThreshold","collectStatistics","DEFAULT_VIEWPORT_CSS","position","DEFAULT_CAMERA_CSS","width","height","willChange","DEFAULT_PANEL_CSS","EVENTS","HOLD_START","HOLD_END","MOVE_START","MOVE","MOVE_END","CHANGE","RESTORE","SELECT","NEED_PANEL","VISIBLE_CHANGE","CONTENT_ERROR","AXES_EVENTS","HOLD","RELEASE","ANIMATION_END","FINISH","STATE_TYPE","DIRECTION","PREV","NEXT","FLICKING_METHODS","prev","next","moveTo","getIndex","getAllPanels","getCurrentPanel","getElement","getSize","getPanel","getPanelCount","getStatus","getVisiblePanels","enableInput","disableInput","destroy","resize","setStatus","isPlaying","checkTranslateSupport","transforms","webkitTransform","msTransform","MozTransform","OTransform","transform","name","has3d","supportedStyle","documentElement","style","transformName","prefixedTransform","Error","el","createElement","insertBefore","styleVal","window","getComputedStyle","getPropertyValue","parentElement","removeChild","transformInfo","length","TRANSFORM","merge","target","_i","srcs","forEach","source","Object","keys","key","value","parseElement","element","Array","isArray","elements","isString","tempDiv","innerHTML","push","toArray","children","firstChild","hasClass","className","classList","contains","split","indexOf","applyCSS","cssObj","property","clamp","val","min","max","isBetween","iterable","slice","call","parseArithmeticExpression","cssValue","base","defaultVal","defaultValue","cssRegex","idx","calculatedValue","matchResult","exec","sign","unit","parsedValue","parseFloat","getProgress","pos","range","center","findIndex","callback","i","counter","counterArray","circulate","indexed","size","restoreStyle","originalStyle","setAttribute","removeAttribute","getBbox","clientRect","y","offsetWidth","offsetHeight","getBoundingClientRect","left","top","index","viewport","prevSibling","nextSibling","clonedPanels","state","relativeAnchorPosition","isClone","isVirtual","cloneIndex","cachedBbox","setElement","givenBbox","this","options","bbox","prevSize","panel","cloneState","panelCount","panelManager","scrollAreaSize","getScrollAreaSize","floor","getPosition","getCurrentProgress","outsetRange","getRelativeHangerPosition","getRelativeAnchorPosition","getCameraPosition","panelSize","relativePanelPosition","rightRelativePanelPosition","visibleSize","eventType","currentPanel","getHangerPosition","getAnchorPosition","findEstimatedPosition","updateFunction","shouldResize","identicalPanels","getIdenticalPanels","eachPanel","unCacheBbox","addVisiblePanel","currentIndex","currentPosition","prevPanelIndex","prevPanelPosition","prevPanelSize","hasEmptyPanelBetween","notYetMinPanel","newPosition","prevPanel","clone","getCloneIndex","setPosition","getLastIndex","nextPanelIndex","nextPanelPosition","notYetMaxPanel","nextPanel","parsedElements","firstPanel","targetIndex","insert","remove","option","preserveUI","wasVisible","cameraElement","Boolean","parentNode","getCameraElement","appendChild","classes","classes_1","original","getClonedPanels","offset","elementStyle","currentElementStyle","styleToApply","cloneElement","cloneNode","clonedPanel","Panel","clonedState","removeClonedPanelsAfter","start","removingPanels","splice","removeElement","currentElement","getAttribute","add","replace","panels","clones","cloneCount","reduce","allClones","newPanels","newClones","filter","possibleLastPanel","lastPanel","shouldRender","isCircular","findFirstPanelFrom","siblingElement","insertNewPanels","panelsAfterIndex","emptyPanelCount","removedPanels","newLastIndex","panelCount_1","pushedIndex","concat","reverse","setIndex","updateIndex","addNewClones","cloneSet","replacedPanels","wasNonEmptyCount","deleteCount","deletedPanels","nonEmptyIndexFromLast","allPanels","allPanelsCount","insertTarget_1","newClones_1","allPanels_1","_a","originalPanels","getCloneCount","lastPanelClones","nextSiblingClones","cloneNextSibling","lastPanelSibling","cloneSiblingElement","nextElementSibling","map","_this","this_1","insertClones","insertingIndex","fragment_1","createDocumentFragment","prevState","delta","direction","targetPanel","lastPosition","nextState","e","context","__extends","flicking","triggerEvent","transitTo","moveCamera","onSuccess","onStopped","onChange","State","inputEvent","offsetX","offsetY","flick","setTo","releaseEvent","srcEvent","touch","clickedElement","clickedPanel","cameraPosition","clickedPanelPosition","changedTouches","elementFromPoint","clientX","clientY","findPanelOf","stopCamera","absDelta","abs","velocity","velocityX","velocityY","inputDelta","deltaX","deltaY","isNextDirection","swipeDistance","swipeAngle","atan","PI","belowAngleThreshold","overThreshold","moveTypeContext","axesEvent","interruptDestInfo","findPanelWhenInterrupted","destPos","nearestPanel","getNearestPanel","stop","destInfo","findTargetPanel","findRestorePanel","originalTargetPosition","newCloneIndex","newTargetPosition","newTargetPanel","scrollArea","getScrollArea","loopCount","setCurrentPanel","isTrusted","updateAdaptiveSize","updateCameraPosition","updateAxesPosition","IdleState","nextStateType","currentState","HoldingState","DraggingState","AnimatingState","DisabledState","onExit","onEnter","onHold","onRelease","onAnimationEnd","onFinish","_super","ctx","snapCount","eventDelta","minimumDistanceToChange","calcBrinkOfChange","nearestIsCurrent","shouldMoveWhenBounceIs0","canSetBoundMode","shouldMoveToAdjacent","isOutOfBound","findSnappedPanel","findAdjacentPanel","halfGap","estimatedHangerPos","panelToMove","cycleIndex","passedPanelCount","originalPanel","getOriginalPanel","panelPosition","siblingPanel","panelIndex","siblingIndex","originalPosition","defaultDuration","getCurrentIndex","get","hangerPosition","firstClonedPanel","basePanel","basePosition","adjacentPanel","targetRelativeAnchorPosition","estimatedPosition","findRestorePanelInCircularMode","lapped","findNearestPanelAt","stateMachine","getState","currentPanelPosition","lastHangerPosition","Snap","panelMaintainRatio","relativeHangerPosition","positionOffset","translate","checkedIndexes","isAdaptiveCached","isViewportGiven","isCameraGiven","originalViewportStyle","originalCameraStyle","StateMachine","visiblePanels","panelBboxes","build","eventResult","axes","findNearestPanel","originalNearestPosition","checkNeedPanel","updateVisiblePanels","posOffset","moveCoord","coord","round","join","viewportElement","updateSize","updateOriginalPanelPositions","updateScrollArea","updateClonePanels","updateVisiblePanelPositions","updatePlugins","minimumDistance","prevPosition","nextPosition","distance","nearest","shortestDistance","identical","anchorPosition","getVisibleIndexOf","panInput","createPanInput","newCenterPanel","newPanelPosition","resizePanels","updateCheckedIndexes","indexes","visibleIndex","newCurrentIndex","getRange","undefined","shouldApplyAdaptive","viewportStyle","panelBbox","sizeToApply","viewportBbox","viewportSize","maximum","updateBbox","positionBounded","isFreeScroll","is","holding","playing","plugins","plugin","update","topmostElement_1","deletingElement","wrapper","removePlugins","status","html","refreshPanels","createdPanels","orderedPanels","createdPanel","replacePanels","setCloneCount","cameraPos_1","viewportSize_1","getNext","isOutOfViewport","getAbsIndex_1","__spreadArrays","sort","panel1","panel2","outsetProgress","getOutsetProgress","NaN","prevRange","nextRange","nearestAnchorPos","nearestIndex","nearestSize","hangerIsNextToNearestPanel","targetPosition","progressBetween","off","on","axesHandlers","setLastIndex","handlers","newPlugins","init","currentPlugins","changedRange","removed","prevVisiblePanels","equalSizeClasses_1","cached_1","fragment","overlappedClass","getOverlappedClass","clonePanels","updateClonedPanelPositions","chainAllPanels","visiblePanel","setElements","applyCSSValue","setMoveType","setAxesInstance","setDefaultPanel","moveToDefaultPanel","viewportCandidate","hasViewportElement","cameraCandidate","hasCameraElement","child","minHeight","minWidth","PanelManager","FreeScroll","Axes","easing","interruptable","indexRange","panelAtLeftBoundary","reversedPanels","sumOriginalPanelSize","areaPrev","sizeSum","reversedPanels_1","panelAtRightBoundary","areaNext","panels_1","needCloneOnPrev","ceil","prevCloneCount","origPanel","removeClonesAfter","defaultPanel","defaultPosition","maintainingPanel","accumulatedSize","nextPanelPos","total","setPositionCSS","clonedPanels_1","clonedPanelPos","lastReplacePosition","_b","replacePosition","relAnchorPosOfCombined","anchorPos","parsedVal","parsedBounce","arr","constructor","axis","maxLastIndex","checkingPanel","firstIndex","nextIndex","currentNearestPosition","triggerNeedPanel","lastPanelAfterNeed","cameraPrev","checkingIndex","prevIndex","firstPanelAfterNeed","params","alreadyTriggered","some","hasHandler","hasOn","fill","insertAfter","firstVisiblePanelPos","firstVisiblePanel","lastVisiblePanel","getAbsIndex","newVisibleRange","newVisiblePanels","calcVisiblePanels","checkVisiblePanelChange","addedPanels","panelElement","trigger","prevRefCount","newRefCount","newPanel","newIndex","added","equalSizeClasses_2","defaultBbox_1","default","PanInput","scale","connect","shouldResetElements","parent","origStyle","appendUncachedPanelElements","eventName","progress","canceled","inputOffset","looped","cameraChange","currentDirection","previousPosition","querySelector","nodeName","nodeType","currentOptions","Viewport","listenInput","listenResize","focus","nearestPosition","identicals","current","includeClone","enable","disable","outerHTML","restore","addPlugins","removeEventListener","contentsReadyChecker","prependedPanels","checkContentsReady","appendedPanels","diffResult","maintained","values","before","list","renderingPanels","setVisiblePanels","diffInfo","changed","prevClonedPanels","prevOriginalPanels","beforeIdx","afterIdx","addIndex","groupIndex","prevCloneGroup","newCloneGroup","getCheckedIndexes","has","isPanelChangedAtBeforeSync","prevOriginalPanelCount_1","originalPanelCount_1","originalAdded","originalRemoved","beforeDiffInfo","beforeSync","addedIndex","addedElement","beforePanel","eventContext","fire","connectAxesHandler","addEventListener","ImReady","hasLoading","isPreReadyOver","check","Flicking","Component","withFlickingMethods","prototype","flickingName","args","result"],"mappings":";;;;;;;;81BAOO,IAAMA,EAGT,CACFC,KAAM,OACNC,YAAa,cAGFC,EAGT,CACFC,KAAM,CACJC,KAAM,OACNC,MAAO,GAETC,WAAY,CACVF,KAAM,eAGGG,EAAgC,oBAAbC,SAQnBC,EAA6C,CACxDC,YAAa,WACbC,aAAc,MACdC,YAAY,EACZC,UAAU,EACVC,UAAU,EACVC,kBAAmB,EACnBC,UAAWC,EAAAA,EACXC,UAAW,GACXC,SAAU,IACVC,YAAa,SAAAC,UAAK,EAAIC,KAAKC,IAAI,EAAIF,EAAG,IACtCG,aAAc,EACdC,UAAW,CAAC,QAAS,SACrBC,eAAgB,GAChBC,OAAQ,GACRC,YAAY,EACZC,UAAU,EACVC,OAAQ,IACRC,OAAO,EACPC,UAAU,EACVC,OAAQ,MACRC,OAAQ,MACRC,IAAK,EACLC,SAAUlC,EAA0BC,KACpCkC,WAAW,EACXC,aAAa,EACbC,gBAAgB,EAChBC,mBAAmB,EACnBC,gBAAgB,EAChBC,uBAAuB,EACvBC,sBAAuB,GACvBC,mBAAmB,GAGRC,EAAuB,CAClCC,SAAU,WACVhB,OAAQrB,EAAgBqB,OACxBE,SAAU,UAGCe,EAAqB,CAChCC,MAAO,OACPC,OAAQ,OACRC,WAAY,aAGDC,EAAoB,CAC/BL,SAAU,YAGCM,EAAoB,CAC/BC,WAAY,YACZC,SAAU,UACVC,WAAY,YACZC,KAAM,OACNC,SAAU,UACVC,OAAQ,SACRC,QAAS,UACTC,OAAQ,SACRC,WAAY,YACZC,eAAgB,gBAChBC,cAAe,gBAGJC,EAA6B,CACxCC,KAAM,OACNP,OAAQ,SACRQ,QAAS,UACTC,cAAe,eACfC,OAAQ,UAGGC,EACL,EADKA,EAEF,EAFEA,EAGD,EAHCA,EAIA,EAJAA,EAKD,EAGCC,EAAuB,CAClCC,KAAM,OACNC,KAAM,QAEKC,EAAyD,CACpEC,MAAM,EACNC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,cAAc,EACdC,iBAAiB,EACjBC,YAAY,EACZC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,WAAW,EACXC,kBAAkB,EAClBC,aAAa,EACbC,cAAc,EACdC,SAAS,EACTC,QAAQ,EACRC,WAAW,EACXC,WAAW,GAKFC,EAAwB,eAC3BC,EAAa,CACjBC,gBAAiB,oBACjBC,YAAa,gBACbC,aAAc,iBACdC,WAAY,eACZC,UAAW,iBAGR3F,QACI,CACL4F,KAAMN,EAAWK,UACjBE,OAAO,OAGLC,EAAiB7F,SAAS8F,gBAAgBC,MAC5CC,EAAgB,OACf,IAAMC,KAAqBZ,EAC1BY,KAAqBJ,IACvBG,EAAgBC,OAIfD,QACG,IAAIE,MAAM,mDAGZC,EAAKnG,SAASoG,cAAc,OAElCpG,SAAS8F,gBAAgBO,aAAaF,EAAI,MAE1CA,EAAGJ,MAAMC,GAAiB,iCACpBM,EAAWC,OAAOC,iBAAiBL,GAAIM,iBAAiBpB,EAAWW,IAEzEG,EAAGO,cAAeC,YAAYR,OAExBS,EAAgB,CACpBjB,KAAMK,EACNJ,MAAyB,EAAlBU,EAASO,QAA2B,SAAbP,UAGhClB,EAAwB,kBAAMwB,GAEvBA,GAGIE,EAAY1B,aCnLT2B,EAAMC,oBAAgBC,mBAAAA,IAAAC,2BACpCA,EAAKC,QAAQ,SAAAC,GACXC,OAAOC,KAAKF,GAAQD,QAAQ,SAAAI,OACpBC,EAAQJ,EAAOG,GACrBP,EAAOO,GAAOC,MAIXR,WAGOS,EAAaC,GACtBC,MAAMC,QAAQF,KACjBA,EAAU,CAACA,QAGPG,EAA0B,UAChCH,EAAQP,QAAQ,SAAAhB,MACV2B,EAAS3B,GAAK,KACV4B,EAAU/H,SAASoG,cAAc,WACvC2B,EAAQC,UAAY7B,EAEpB0B,EAASI,WAATJ,EAAiBK,EAAQH,EAAQI,WAC1BJ,EAAQK,YACbL,EAAQpB,YAAYoB,EAAQK,iBAG9BP,EAASI,KAAK9B,KAIX0B,WAGOC,EAASN,SACC,iBAAVA,WAqBAa,EAASX,EAAsBY,UACzCZ,EAAQa,UACHb,EAAQa,UAAUC,SAASF,GAEyB,GAAnDZ,EAAQY,UAAUG,MAAM,KAAKC,QAAQJ,YAIjCK,EAASjB,EAAsBkB,GAC7CvB,OAAOC,KAAKsB,GAAQzB,QAAQ,SAAA0B,GAC1BnB,EAAQ3B,MAAM8C,GAAYD,EAAOC,cAIrBC,EAAMC,EAAaC,EAAaC,UACvCnI,KAAKmI,IAAInI,KAAKkI,IAAID,EAAKE,GAAMD,YAItBE,EAAUH,EAAaC,EAAaC,UACpCD,GAAPD,GAAcA,GAAOE,WAQdf,EAAWiB,SAClB,GAAGC,MAAMC,KAAKF,YAOPG,EAA0BC,EAA2BC,EAAcC,OAE3EC,EAA6B,MAAdD,EAAqBA,EAAaD,EAAO,EACxDG,EAAW,4CAEO,iBAAbJ,SACFT,EAAMS,EAAU,EAAGC,WAGxBI,EAAM,EACNC,EAAkB,EAClBC,EAAcH,EAASI,KAAKR,GACV,MAAfO,GAAqB,KACtBE,EAAOF,EAAY,GACjBtC,EAAQsC,EAAY,GACpBG,EAAOH,EAAY,GAErBI,EAAcC,WAAW3C,MAEzBoC,GAAO,IACTI,EAAOA,GAAQ,MAIZA,SACIN,EAGI,MAATO,IACFC,EAAeA,EAAc,IAAOV,GAGtCK,GAA4B,MAATG,EACfE,GACCA,IAGHN,EACFE,EAAcH,EAASI,KAAKR,UAIlB,IAARK,EACKF,EAIFZ,EAAMe,EAAiB,EAAGL,YAGnBY,EAAYC,EAAaC,OAGhCtB,EAAoBsB,KAAfC,EAAeD,KAAPrB,EAAOqB,YAEjBC,EAANF,GAAiBpB,EAAMsB,GAEjBF,EAAME,IAAWtB,EAAMsB,GACtBF,EAAME,GAAWA,EAASvB,GAE3BqB,EAAME,IAAWA,EAASvB,GACzBqB,IAAQE,GAAUtB,EAAMD,GACzBqB,EAAMrB,IAAQC,EAAMD,GAEvB,WAGOwB,EAAarB,EAAesB,OACrC,IAAIC,EAAI,EAAGA,EAAIvB,EAAStC,OAAQ6D,GAAK,EAAG,KACrChD,EAAUyB,EAASuB,MACrBhD,GAAW+C,EAAS/C,UACfgD,SAIH,WAIMC,EAAQ1B,WAChB2B,EAAyB,GACtBF,EAAI,EAAGA,EAAIzB,EAAKyB,GAAK,EAC5BE,EAAaF,GAAKA,SAEbE,WAUOC,EAAUrD,EAAewB,EAAaC,EAAa6B,OAC3DC,EAAOD,EACT7B,EAAMD,EAAM,EACZC,EAAMD,SACNxB,EAAQwB,EAIVxB,EAAQyB,GAHO6B,GACV9B,EAAMxB,EAAQ,GAAKuD,GACnB/B,EAAMxB,GAASuD,GAEH9B,EAARzB,IAITA,EAAQwB,GAHO8B,GACVtD,EAAQyB,EAAM,GAAK8B,GACnBvD,EAAQyB,GAAO8B,IAIfvD,WAGOwD,EAAatD,EAAsBuD,GACjDA,EAAc3C,UACVZ,EAAQwD,aAAa,QAASD,EAAc3C,WAC5CZ,EAAQyD,gBAAgB,SAC5BF,EAAclF,MACV2B,EAAQwD,aAAa,QAASD,EAAclF,OAC5C2B,EAAQyD,gBAAgB,kBAoCdC,EAAQ1D,EAAsB7F,OAUpCwJ,SARJxJ,EACK,CACLhB,EAAG,EACHyK,EAAG,EACH9I,MAAOkF,EAAQ6D,YACf9I,OAAQiF,EAAQ8D,cAIX,CACL3K,GAFIwK,EAAa3D,EAAQ+D,yBAEXC,KACdJ,EAAGD,EAAWM,IACdnJ,MAAO6I,EAAW7I,MAClBC,OAAQ4I,EAAW5I,QCrQzB,4BAuBIiF,EACAkE,EACAC,QAEKA,SAAWA,OACXC,YAAc,UACdC,YAAc,UACdC,aAAe,QAEfC,MAAQ,CACXL,MAAOA,EACPtJ,SAAU,EACV4J,uBAAwB,EACxBnB,KAAM,EACNoB,SAAS,EACTC,WAAW,EACXC,YAAa,EACbpB,cAAe,CACb3C,UAAW,GACXvC,MAAO,IAETuG,WAAY,WAETC,WAAW7E,qCAGlB,SAAc8E,OACNP,EAAQQ,KAAKR,MACbS,EAAUD,KAAKZ,SAASa,QACxBC,EAAOH,GAETC,KAAKrB,eACJa,MAAMK,WAAaK,MAClBC,EAAWX,EAAMlB,KAEvBkB,EAAMlB,KAAO2B,EAAQtM,WACjBuM,EAAKnK,MACLmK,EAAKlK,OAELmK,IAAaX,EAAMlB,OACrBkB,EAAMC,uBAAyB5C,EAA0BoD,EAAQhL,OAAQuK,EAAMlB,OAG5EkB,EAAME,cACJH,aAAa7E,QAAQ,SAAA0F,OAClBC,EAAaD,EAAMZ,MAEzBa,EAAW/B,KAAOkB,EAAMlB,KACxB+B,EAAWR,WAAaL,EAAMK,WAC9BQ,EAAWZ,uBAAyBD,EAAMC,wCAKhD,gBACOD,MAAMK,WAAa,oBAG1B,eACQT,EAAWY,KAAKZ,SAChBa,EAAUb,EAASa,QACnBK,EAAalB,EAASmB,aAAarI,gBACnCsI,EAAiBpB,EAASqB,2BAETR,EAAQrM,SAAWS,KAAKqM,MAAMV,KAAKW,cAAgBH,GAAkBF,EAAa,GAAKN,KAAKpI,WAClFwH,EAASwB,0CAK5C,eACQxB,EAAWY,KAAKZ,SAChByB,EAAc,EACjBb,KAAKhI,UACNoH,EAAS0B,4BAA8Bd,KAAKe,4BAC5C3B,EAASpH,kBAGY2F,EADOqC,KAAKW,cAAgBvB,EAAS4B,oBACFH,sBAK5D,eACQzB,EAAWY,KAAKZ,SAChB6B,EAAYjB,KAAKhI,UACjBkJ,EAAwBlB,KAAKW,cAAgBvB,EAAS4B,oBACtDG,EAA6BD,EAAwBD,EAErDG,EAAc/M,KAAKkI,IAAI6C,EAASpH,UAAWmJ,GAA8B9M,KAAKmI,IAAI0E,EAAuB,UAC3E,GAAfE,EACjBA,EAAcH,EACd,WAKN,SAAa/M,OAULmN,EATAjC,EAAWY,KAAKZ,SAChBkC,EAAelC,EAAStH,kBACPsH,EAASmC,sBACTvB,KAAKwB,qBACcF,IAKpCD,EADkBC,EAAaX,gBACCX,KAAKW,cACvC,GACAxK,EAAOM,OAEX2I,EAASzH,OAAOqI,KAAMZ,EAASqC,sBAAsBzB,MAAOqB,EAAW,KAAMnN,cAG/E,SAAcwN,EAA+DC,gBAA/DD,qBAA+DC,UACrEC,EAAkB5B,KAAK6B,qBAEzBH,GACFE,EAAgBlH,QAAQ,SAAAoH,GACtBJ,EAAeI,EAAU/J,gBAIzB4J,IACFC,EAAgBlH,QAAQ,SAAAoH,GACtBA,EAAUC,qBAEP3C,SAAS4C,gBAAgBhC,WACzBZ,SAAS5G,kBAIlB,eAEQyH,EADWD,KAAKZ,SACGa,QACnBZ,EAAcW,KAAKX,gBAEpBA,SACI,SAGH4C,EAAejC,KAAKpI,WACpBsK,EAAkBlC,KAAKW,cACvBwB,EAAiB9C,EAAYzH,WAC7BwK,EAAoB/C,EAAYsB,cAChC0B,EAAgBhD,EAAYrH,UAE5BsK,EAAuD,EAAhCL,EAAeE,EACtCI,EAAiBtC,EAAQpM,UACX,EAAfoO,GACiBA,EAAjBE,KAEDG,GAAwBC,SAEnB,SAGHC,EAAcN,EAAkBG,EAAgBpC,EAAQ/K,IAE1DuN,EAAYpD,SACZ+C,IAAsBI,IACxBC,EAAYpD,EAAYqD,MAAMrD,EAAYsD,iBAAiB,IACjDC,YAAYJ,GAGjBC,UAGT,eACQrD,EAAWY,KAAKZ,SAChBa,EAAUb,EAASa,QACnBX,EAAcU,KAAKV,YACnBvL,EAAYqL,EAASmB,aAAasC,mBAEnCvD,SACI,SAGH2C,EAAejC,KAAKpI,WACpBsK,EAAkBlC,KAAKW,cACvBmC,EAAiBxD,EAAY1H,WAC7BmL,EAAoBzD,EAAYqB,cAEhC2B,EAAuD,EAAhCQ,EAAiBb,EACxCe,EAAiB/C,EAAQpM,UAC1BoO,EAAelO,GACf+O,EAAiBb,KAElBK,GAAwBU,SACnB,SAGHR,EAAcN,EAAkBlC,KAAKhI,UAAYiI,EAAQ/K,IAE3D+N,EAAY3D,SACZyD,IAAsBP,IACxBS,EAAY3D,EAAYoD,MAAMpD,EAAYqD,iBAAiB,IACjDC,YAAYJ,GAGjBS,kBAGT,SAAoBhI,OACZmE,EAAWY,KAAKZ,SAChB8D,EAAiBlI,EAAaC,GAC9BkI,EAAa/D,EAASmB,aAAa4C,aACnC9D,EAAcW,KAAKX,YAInB+D,EAAc/D,GAAe8D,EAAWvL,aAAeoI,KAAKpI,WAC9DvD,KAAKmI,IAAI6C,EAAYzH,WAAa,EAAGoI,KAAKpI,WAAasL,EAAe9I,QACtE/F,KAAKmI,IAAIwD,KAAKpI,WAAasL,EAAe9I,OAAQ,UAE/CgF,EAASiE,OAAOD,EAAaF,kBAGtC,SAAmBjI,UACV+E,KAAKZ,SAASiE,OAAOrD,KAAKpI,WAAa,EAAGqD,aAGnD,uBACOmE,SAASkE,OAAOtD,KAAKpI,YAEnBoI,gBAGT,SAAeuD,OAEL/E,MAMH,IAAMpK,KAPNmP,EAAOC,aACJhF,EAAgBwB,KAAKR,MAAMhB,cAEjCD,EAAayB,KAAK/E,QAASuD,IAIbwB,UACA5L,GAAK,mBAIvB,kBACS4L,KAAK/E,6BAGd,kBACS+E,KAAKR,MAAM3J,SAAWmK,KAAKR,MAAMC,oDAG1C,kBACSO,KAAKR,MAAMC,mCAGpB,kBACSO,KAAKR,MAAML,qBAGpB,kBACSa,KAAKR,MAAM3J,oBAGpB,kBACSmK,KAAKR,MAAMlB,gBAGpB,eAcUmF,EACAC,EAdFlE,EAAQQ,KAAKR,MACbJ,EAAWY,KAAKZ,SAChBnE,EAAU+E,KAAK/E,QACfgF,EAAUb,EAASa,eAEpBhF,EAOOuE,EAAMK,aACV4D,EAAaE,QAAQ1I,EAAQ2I,YAC7BF,EAAgBtE,EAASyE,mBAC1BJ,IACHC,EAAcI,YAAY7I,GAC1BmE,EAAS4C,gBAAgBhC,OAE3BR,EAAMK,WAAalB,EAAQ1D,EAASgF,EAAQ7K,YAEvCqO,GAAcrE,EAASa,QAAQzK,gBAClCkO,EAAcxJ,YAAYe,IAhB5BuE,EAAMK,WAAa,CACjBzL,EAAG,EACHyK,EAAG,EACH9I,MAAO,EACPC,OAAQ,GAeLwJ,EAAMK,sBAGf,kBACSG,KAAKR,MAAME,8BAGpB,SAA0BqE,WAClB9I,EAAU+E,KAAK/E,YAEG+I,IAAAxJ,WAAAA,IAAS,KAAtBqB,UACLD,EAASX,EAASY,UACbA,oBAKb,kBACSmE,KAAKR,MAAMI,8BAGpB,kBACgBI,KAAKR,MAENE,QACTM,KAAKiE,SAAUC,kBACflE,KAAKT,mCAGX,kBACgBS,KAAKR,MAENE,QACTM,KAAKiE,SAAUpC,wBACd7B,MAASA,KAAKT,kCAGrB,kBACSS,KAAKR,MAAME,QACdM,KAAKiE,SACLjE,iBAGN,SAAgBb,GACAa,KAAKR,MAEbL,MAAQA,OACTI,aAAa7E,QAAQ,SAAA0F,UAASA,EAAMZ,MAAML,MAAQA,mBAGzD,SAAmBvB,eACZ4B,MAAM3J,SAAW+H,EAEfoC,uBAGT,SAAsBmE,OAId3E,EACA5B,EACAqC,EACAmE,EACAC,EAGAC,eAXcH,KACfnE,KAAK/E,UAIJ2C,GADA4B,EAAQQ,KAAKR,OACD3J,SACZoK,EAAUD,KAAKZ,SAASa,QACxBmE,EAAepE,KAAK/E,QAAQ3B,MAC5B+K,EAAsBpE,EAAQtM,WAChCyQ,EAAanF,KACbmF,EAAalF,IACXoF,EAAkB1G,EAAMuG,OAEzB3E,EAAMG,WAAa0E,IAAwBC,IAC9CrE,EAAQtM,WACJyQ,EAAanF,KAAOqF,EACpBF,EAAalF,IAAMoF,aAI3B,SAAa1E,EAAoBD,EAA4B1E,gBAA5B0E,UACzBH,EAAQQ,KAAKR,MACbJ,EAAWY,KAAKZ,SAClBmF,EAAetJ,GAEdsJ,GAAgBvE,KAAK/E,UACxBsJ,EAAe5E,EAAYK,KAAK/E,QAAU+E,KAAK/E,QAAQuJ,WAAU,QAE7DC,EAAc,IAAIC,EAAMH,EAAc/E,EAAML,MAAOC,GACnDuF,EAAcF,EAAYjF,aAEhCiF,EAAYR,SAAWzE,EAAME,QACzBM,KAAKiE,SACLjE,KACJ2E,EAAYjF,SAAU,EACtBiF,EAAYhF,UAAYA,EACxBgF,EAAY/E,WAAaA,EAEzB+E,EAAYrG,KAAOkB,EAAMlB,KACzBqG,EAAYlF,uBAAyBD,EAAMC,uBAC3CkF,EAAYnG,cAAgBgB,EAAMhB,cAClCmG,EAAY9E,WAAaL,EAAMK,WAE1BF,GAGH8E,EAAYpF,YAAcW,KAAKX,YAC/BoF,EAAYnF,YAAcU,KAAKV,kBAH1BC,aAAa/D,KAAKiJ,GAMlBA,mBAGT,eAEUxJ,EADH+E,KAAKZ,SAASa,QAAQzK,iBACnByF,EAAU+E,KAAK/E,SACb2I,YAAc3I,EAAQ2I,WAAW1J,YAAYe,GAIlD+E,KAAKR,MAAME,cACTkF,wBAAwB,8BAIjC,SAA+BC,OACvB5E,EAAUD,KAAKZ,SAASa,QACxB6E,EAAiB9E,KAAKT,aAAawF,OAAOF,GAE3C5E,EAAQzK,gBACXsP,EAAepK,QAAQ,SAAA0F,GACrBA,EAAM4E,gCAKZ,SAAkB/J,OAIVgK,EAEEhF,EASEzB,EDhaWvD,EAAsBY,GCkZtCZ,GAIDA,KADEgK,EAAiBjF,KAAK/E,WAEpBgF,EAAUD,KAAKZ,SAASa,QAE1BgF,EACEhF,EAAQtM,WACVsH,EAAQ3B,MAAM2F,KAAOgG,EAAe3L,MAAM2F,KAE1ChE,EAAQ3B,MAAM4F,IAAM+F,EAAe3L,MAAM4F,MAGrCV,EAAgBwB,KAAKR,MAAMhB,eAEnB3C,UAAYZ,EAAQiK,aAAa,SAC/C1G,EAAclF,MAAQ2B,EAAQiK,aAAa,eAGxCjK,QAAUA,EAEXgF,EAAQxM,cDxaOwH,ECyaRA,EDza8BY,ECyalBoE,EAAQxM,qBDxa/BwH,EAAQa,UACVb,EAAQa,UAAUqJ,IAAItJ,GAEjBD,EAASX,EAASY,KACrBZ,EAAQY,WAAgBZ,EAAQY,cAAaA,GAAauJ,QAAQ,UAAW,OCwa7ElJ,EAAS8D,KAAK/E,QAAS/E,kCC5czBwN,EACAzD,QAEKyD,cAAgBA,OAChB2B,OAAS,QACTC,OAAS,QACTzH,MAAQ,CACXtB,KAAM,EACNC,KAAM,QAEHpC,OAAS,OACTmL,WAAa,OACbtF,QAAUA,OACVlM,UAAYkM,EAAQlM,gDAG3B,kBACSiM,KAAKqF,OAAOrF,KAAKnC,MAAMtB,kBAGhC,kBACSyD,KAAKqF,OAAOrF,KAAKnC,MAAMrB,kBAGhC,oBAEOwD,KAAKqF,OACLrF,KAAKsF,OAAOE,OAAO,SAACC,EAAWH,YAAeG,EAAcH,IAAS,uBAI5E,kBACStF,KAAKqF,uBAGd,kBACSrF,KAAKsF,wBAGd,SAAqBI,EAAoBC,QAClCN,OAASK,OACTJ,OAASK,OAET9H,MAAQ,CACXtB,IAAKwB,EAAU2H,EAAW,SAAAtF,UAASuD,QAAQvD,KAC3C5D,IAAKkJ,EAAUtL,OAAS,QAErBA,OAASsL,EAAUE,OAAO,SAAAxF,UAASuD,QAAQvD,KAAQhG,cAG1D,SAAW+E,WACAa,KAAKqF,OAAOlG,UAGvB,SAAWA,UACFa,KAAKqF,OAAOlG,oBAGrB,kBACSa,KAAK5F,uBAGd,kBACS4F,KAAKjM,sBAGd,kBACSiM,KAAKnC,uBAGd,kBACSmC,KAAKuF,2BAGd,SAAoBxR,QACbA,UAAYA,MAUX8J,EAEEiH,EAIAe,EAdF1C,EAAanD,KAAKmD,aAClB2C,EAAY9F,KAAK8F,YAElB3C,GAAe2C,IAKdjI,EAAQmC,KAAKnC,MACfiI,EAAUlO,WAAa7D,IACnB+Q,EAAiB9E,KAAKqF,OAAON,OAAOhR,EAAY,QACjDqG,QAAU0K,EAAe1K,QAGxByL,EADoBf,EAAec,OAAO,SAAAxF,WAAWA,IAAO,GACtBf,aAE1CxB,EAAMrB,IAAMqJ,EAAkBjO,YAE9BiG,EAAMtB,KAAO,EACbsB,EAAMrB,KAAO,GAGXwD,KAAK+F,gBACPjB,EAAepK,QAAQ,SAAA0F,UAASA,EAAM4E,qCAK5C,SAAqBO,QACdA,WAAaA,YAKpB,SAAcpG,EAAeuG,OACrBL,EAASrF,KAAKqF,OACdxH,EAAQmC,KAAKnC,MACbmI,EAAahG,KAAKC,QAAQrM,SAC1BG,EAAYiM,KAAKjM,UAGjBuL,EAAcU,KAAKiG,mBAAmB9G,GAItCgE,EAAanD,KAAKmD,aAClB+C,EAAiB5G,EACnBA,EAAYvH,aACZiO,GAAc7C,EACZA,EAAWe,kBAAkB,GAAGnM,aAChC,UAGDoO,gBAAgBT,EAAWQ,OASxBE,EAEFC,EAYIC,EAKAC,EAyBFjB,EACAkB,EApDJC,EAAcf,EAAUtL,cAExB+E,EAAQtB,EAAMrB,IAChBkJ,EAAUhL,QAAQ,SAAC0F,EAAO+D,GACxBkB,EAAOlG,EAAQgF,GAAU/D,MAKvBiG,EAAkBtI,EAFhBqI,EAAmBf,EAAO1I,MAAMwC,EAAOA,EAAQuG,EAAUtL,QAEb,SAAAgG,UAAWA,KACvC,IAEpBiG,EAAkBD,EAAiBhM,QAErCqM,EAAcf,EAAUtL,OAASiM,EAGjChB,EAAON,aAAPM,KAAclG,EAAOkH,GAAoBX,IAGrCL,EAAOjL,OAASrG,EAAY,IACxBuS,EAAgBjB,EAAON,OAAOhR,EAAY,GAC7C6R,OAAO,SAAAxF,UAASuD,QAAQvD,UACtBhG,QAAUkM,EAAclM,OAGvBmM,EAAexS,EAAYgK,EAAUiC,KAAKqF,OAAOqB,SAASC,UAAW,SAAAvG,UAAWA,SAGjFiF,OAAON,OAAsB,EAAfwB,QACd1I,MAAMrB,IAAM+J,EAEbvG,KAAK+F,gBACPO,EAAc5L,QAAQ,SAAA0F,UAASA,EAAM4E,oBAMzB,EAAdyB,GACFpB,EAAO1I,MAAMwC,EAAQuG,EAAUtL,QAAQM,QAAQ,SAAA0F,GAC7CA,EAAMwG,SAASxG,EAAMxI,WAAa6O,UAKjCrM,QAAUsL,EAAUtL,YACpByM,YAAY1H,GAEb6G,SACGc,aAAa3H,EAAOuG,EAAWA,EAAUtL,OAASqM,EAAanH,GAC9DgG,EAAStF,KAAKsF,OACdkB,EAAaxG,KAAKqF,OAAOjL,OAC3BkL,EAAO,IAAMA,EAAO,GAAGlL,OAASrG,EAAY,GAC9CuR,EAAO5K,QAAQ,SAAAqM,GACbA,EAAShC,OAAOyB,MAKfC,aAGT,SAAetH,EAAeuG,OACtBL,EAASrF,KAAKqF,OACdxH,EAAQmC,KAAKnC,MAEbmI,EADUhG,KAAKC,QACMrM,SAGrB0L,EAAcU,KAAKiG,mBAAmB9G,EAAQuG,EAAUtL,QAIxD+I,EAAanD,KAAKmD,aAClB+C,EAAiB5G,EACnBA,EAAYvH,aACZiO,GAAc7C,EACZA,EAAWe,kBAAkB,GAAGnM,aAChC,UAGDoO,gBAAgBT,EAAWQ,GAE5B/G,EAAQtB,EAAMrB,MAEf6I,EAAOlG,GAAiB,UAGrB6H,EAAiB3B,EAAON,aAAPM,KAAclG,EAAOuG,EAAUtL,QAAWsL,IAC3DuB,EAAmBD,EAAepB,OAAO,SAAAxF,UAASuD,QAAQvD,KAAQhG,mBAInEA,QAAUsL,EAAUtL,OAAS6M,OAC7BJ,YAAY1H,GAEb6G,QACGc,aAAa3H,EAAOuG,EAAWA,EAAUtL,OAAQkF,GAGpDU,KAAK+F,gBACPiB,EAAetM,QAAQ,SAAA0F,UAASA,GAASA,EAAM4E,kBAG1CgC,YAGT,SAAc7H,EAAe+H,gBAAAA,SACrBlB,EAAahG,KAAKC,QAAQrM,SAC1ByR,EAASrF,KAAKqF,OACdC,EAAStF,KAAKsF,OAEpB4B,EAAc7S,KAAKmI,IAAI0K,EAAa,OAE9BC,EAAgB9B,EACnBN,OAAO5F,EAAO+H,GACdtB,OAAO,SAAAxF,WAAWA,IAEjBJ,KAAK+F,gBACPoB,EAAczM,QAAQ,SAAA0F,UAASA,EAAM4E,kBAGnCgB,GACFV,EAAO5K,QAAQ,SAAAqM,GACbA,EAAShC,OAAO5F,EAAO+H,KAK3B7B,EACG1I,MAAMwC,GACNzE,QAAQ,SAAA0F,GACPA,EAAMwG,SAASxG,EAAMxI,WAAasP,SAO9BE,EAHJrT,EAAYsR,EAAOjL,OAAS,SAC3BiL,EAAOtR,KAEJqT,EAAwBrJ,EADPsH,EAAOqB,SAASC,UACiB,SAAAvG,UAAWA,IACnErM,EAAYqT,EAAwB,GAC/B,EACDrT,EAAYqT,EAGhB/B,EAAON,OAAOhR,EAAY,GACtBiS,GACFV,EAAO5K,QAAQ,SAAAqM,GACbA,EAAShC,OAAOhR,EAAY,WAM7B8J,MAAQ,CACXtB,IAAKwB,EAAUsH,EAAQ,SAAAjF,UAAWA,IAClC5D,IAAKzI,QAEFqG,QAAU+M,EAAc/M,OAEzB4F,KAAK5F,QAAU,SAEZkL,OAAS,QACTC,WAAa,GAGb4B,oBAGT,eAgBQhE,EACA2C,EAhBAuB,EAAYrH,KAAKqH,YAAYzB,OAAO,SAAAxF,WAAWA,IAC/CkH,EAAiBD,EAAUjN,OAE7BkN,GAAkB,IAItBD,EAAU1K,MAAM,EAAG0K,EAAUjN,OAAS,GAAGM,QAAQ,SAAC0F,EAAOjD,OACjDsF,EAAY4E,EAAUlK,GACtB8F,EAAYoE,EAAUlK,EAAM,GAElCiD,EAAMf,YAAcoD,EACpBrC,EAAMd,YAAc2D,IAGhBE,EAAakE,EAAU,GACvBvB,EAAYuB,EAAUC,EAAiB,GAE7CnE,EAAW9D,YAAc,KACzB8D,EAAW7D,YAAc+H,EAAU,GACnCvB,EAAUzG,YAAcgI,EAAUC,EAAiB,GACnDxB,EAAUxG,YAAc,KAEpBU,KAAKC,QAAQrM,YACfuP,EAAW9D,YAAcyG,GACfxG,YAAc6D,oBAI5B,SAAoBvD,EAAoBT,EAAeI,EAAuB2H,gBAAAA,SAYpEK,EAPAC,EAJFlC,EAAStF,KAAKsF,OACdvR,EAAYiM,KAAKjM,UAElBuR,EAAO1F,IAQJ2H,EAAejC,EAAO1F,GAExBT,GAASoI,EAAanN,OACxBmF,EAAa7E,QAAQ,SAAC0F,EAAO+D,GAC3BoD,EAAapI,EAAQgF,GAAU/D,KAGjCmH,EAAaxC,aAAbwC,KAAoBpI,EAAO+H,GAAgB3H,IAEvCA,EAAanF,OAASrG,EAAY,GACpCwL,EAAawF,OAAOhR,EAAY,MAjB9ByT,EAAqB,GAC3BjI,EAAa7E,QAAQ,SAAC0F,EAAO+D,GAC3BqD,EAAUrI,EAAQgF,GAAU/D,IAG9BkF,EAAO1F,GAAc4H,wBAmBzB,SAAyB5H,GACRI,KAAKqF,OAEb3K,QAAQ,SAAA0F,GACbA,EAAMwE,wBAAwBhF,UAE3B0F,OAAOP,OAAOnF,kBAGrB,SAAmB3E,eAEGwM,EADFzH,KAAKqH,YACH7M,WAAAA,IAAW,KAApB4F,UACJA,KAGgBA,EAAMrI,aACVgE,SAASd,UACjBmF,yBAKb,SAA0BjB,OACJ,QAAAuI,EAAA1H,KAAKqF,OAAO1I,MAAMwC,GAAlB3E,WAAAA,IAA0B,KAAnC4F,UACLA,GAASA,EAAMxI,YAAcuH,GAASiB,EAAMrI,aAAa6L,kBACpDxD,mBAKb,SAAqBjB,EAAewI,EAAyBT,EAAqB5H,kBAC1EoE,EAAgB1D,KAAK0D,cACrB6B,EAAavF,KAAK4H,gBAClB9B,EAAY9F,KAAK8F,YACjB+B,EAA2B/B,EAC7BA,EAAU5B,kBACV,GACE4D,EAA6BxI,EAC/BA,EAAY4E,kBACZ,cAEqBwD,EAAAxJ,EAAQqH,GAAR/K,WAAAA,eAAdoF,OACHmI,EAAmBD,EAAkBlI,GACrCoI,EAAmBH,EAAgBjI,GAEnCqI,EAAsBF,EACxBA,EAAiBhQ,aACjBiQ,EACEA,EAAiBjQ,aAAamQ,mBAC9B,KAEAvC,EAAYgC,EAAeQ,IAAI,SAAA/H,OAC7BsC,EAAQtC,EAAMsC,MAAM9C,UAEtBwI,EAAKrC,gBACPrC,EAAc9J,aAAa8I,EAAM3K,aAAckQ,GAG1CvF,IAGT2F,EAAKC,aAAa1I,EAAYT,EAAOwG,EAAWuB,0BAIpD,SAAoBqB,OACZlD,EAASrF,KAAKqF,OACdxH,EAAQmC,KAAKnC,MAEb0I,EAAelB,EAAOjL,OAAS,EACjCmM,EAAe1I,EAAMrB,MACvBqB,EAAMrB,IAAM+J,IAEVgC,EAAiB1K,EAAMtB,KAAOsB,EAAMtB,IAAM,KAC5CsB,EAAMtB,IAAMgM,sBAIhB,SAAwB7C,EAAoBQ,OAElCsC,EADJxI,KAAK+F,iBACDyC,EAAWjV,SAASkV,yBAC1B/C,EAAUhL,QAAQ,SAAA0F,UAASoI,EAAS1E,YAAY1D,EAAMrI,qBACjD2L,cAAc9J,aAAa4O,EAAUtC,oBAI9C,eACQjG,EAAUD,KAAKC,eAEbA,EAAQzK,iBAAmByK,EAAQ1K,6DCjdtB,iBACuB,sBACX,uBACL,qCAK9B,SAAemT,QACRC,MAAQD,EAAUC,WAClBC,UAAYF,EAAUE,eACtBC,YAAcH,EAAUG,iBACxBC,aAAeJ,EAAUI,uBAGhC,SAAcC,cAId,SAAcC,EAAQC,gBAItB,SAAgBD,EAAQC,iBAIxB,SAAiBD,EAAQC,sBAIzB,SAAsBD,EAAQC,gBAI9B,SAAgBD,EAAQC,0FClCRb,OAAOhR,EACPgR,WAAU,EACVA,WAAU,IAHJc,0CAKtB,gBACON,UAAY,UACZC,YAAc,UACdF,MAAQ,OACRG,aAAe,YAGtB,SAAcE,EAAQtB,OAAEyB,aAAU/J,aAAUgK,iBAAcC,iBAEpDF,EAASjR,iBAAmB,SAC1BkH,EAASa,QAAQpM,UACnBuL,EAASkK,WAAWlK,EAAS4B,oBAAqBgI,QAEpDK,EAAUjS,QAIP0R,aAAe1J,EAAS4B,oBAC7BoI,EAAajT,EAAOC,WAAY4S,GAAG,GAChCO,UAAU,WACTF,EAAUjS,KAEXoS,UAAU,WACTH,EAAUjS,iBAKhB,SAAgB4R,EAAQC,OACdG,EAA4BH,eAAdI,EAAcJ,YAEpCG,EAAajT,EAAOG,WAAY0S,GAAG,GAChCO,UAAU,WAETF,EAAUjS,GACPqS,SAAST,EAAGC,KAEhBO,UAAU,WACTH,EAAUjS,SA3CMsS,mFCCNtB,OAAOhR,EACPgR,WAAU,EACVA,WAAU,EAElBA,eAAoB,OALHc,2CAOzB,SAAgBF,EAAQC,OACdE,EAAsCF,WAA5BG,EAA4BH,eAAdI,EAAcJ,YAExC9E,EAASgF,EAASlJ,QAAQtM,WAC5BqV,EAAEW,WAAWC,QACbZ,EAAEW,WAAWE,aACZjB,UAAYzE,EAAS,EACtB9M,EAAUE,KACVF,EAAUC,KAEd8R,EAAajT,EAAOG,WAAY0S,GAAG,GAChCO,UAAU,WAETF,EAAUjS,GACPqS,SAAST,EAAGC,KAEhBO,UAAU,WACTH,EAAUjS,kBAIhB,SAAiB4R,EAAQC,OACf7J,EAAsC6J,WAA5BG,EAA4BH,eAAdI,EAAcJ,eAE9CG,EAAajT,EAAOE,SAAU2S,GAAG,GAEX,IAAlBA,EAAEL,MAAMmB,aAOVd,EAAEe,MAAM,CAAED,MAAO1K,EAAS4B,qBAAuB,QACjDqI,EAAUjS,QAMP4S,aAAehB,cAGtB,SAAgBA,EAAQtB,OAchBuC,EAKEC,EACNC,EAIIC,EACAC,EAGEC,EA5BgBlL,aAAUgK,kBAGlCC,eAAUjS,GAEL4I,KAAKgK,eAeRG,EAHoB,cAHhBF,EAHejK,KAAKgK,aAGIL,WAAWM,UAG5B9W,MAEL+W,EADaD,EACMM,eAAe,GACvBhX,SAASiX,iBAAiBN,EAAMO,QAASP,EAAMQ,UAE/CT,EAAS1P,OAEtB6P,EAAehL,EAASmB,aAAaoK,YAAYR,GACjDE,EAAiBjL,EAAS4B,oBAE5BoJ,IACIE,EAAuBF,EAAazJ,cAQ1CyI,EAAajT,EAAOQ,OAAQ,MAAM,EAAM,CACtCiS,UARuCyB,EAAvBC,EACdjT,EAAUE,KACV+S,EAAuBD,EACrBhT,EAAUC,KACV,KAKJ6H,MAAOiL,EAAaxS,WACpBwI,MAAOgK,UAzFYV,mFCCTtB,OAAOhR,EACPgR,WAAU,EACVA,WAAU,IAHAc,2CAK1B,SAAgBF,EAAQtB,OAAE4B,eAAYD,cAC/BL,EAAEL,MAAMmB,OAIbR,EAAWN,GACRQ,UAAU,WACTH,EAAUjS,kBAIhB,SAAiB4R,EAAQC,OACfE,EAA4DF,WAAlD7J,EAAkD6J,WAAxCG,EAAwCH,eAA1BI,EAA0BJ,YAAf2B,EAAe3B,aAE9DN,EAAQ3I,KAAK2I,MACbkC,EAAWxW,KAAKyW,IAAInC,GACpB1I,EAAUkJ,EAASlJ,QACnBtM,EAAasM,EAAQtM,WACrBwB,EAAWiK,EAASjK,SACpBwU,EAAaX,EAAEW,WAEfoB,EAAWpX,EACbgW,EAAWqB,UACXrB,EAAWsB,UACTC,EAAavX,EACfgW,EAAWwB,OACXxB,EAAWyB,OACTC,EAAuC,EAArBhX,KAAKyW,IAAIC,GAC7BA,EAAW,EACA,EAAXF,EACU,EAARlC,EACAuC,EAAa,EAEbI,EAAgBlM,EAASa,QAAQnL,MACnCT,KAAKmI,IAAIqO,EAAUxW,KAAKyW,IAAII,IAC5BL,EACEU,EAAa5B,EAAWwB,OAC1B9W,KAAKyW,IAAI,IAAMzW,KAAKmX,KAAK7B,EAAWyB,OAASzB,EAAWwB,QAAU9W,KAAKoX,IACvE,GACEC,EAAsB/X,EACxB4X,GAActL,EAAQxL,eACtB8W,EAAatL,EAAQxL,eACnBkX,EAAgBL,GAAiBrL,EAAQhM,WAC1CyX,EAECE,EAAkB,CACtBxM,WACAyM,UAAW7C,EACXxJ,MAAOQ,KACPsL,gBACAD,mBAKFjC,EAAajT,EAAOE,SAAU2S,GAAG,OAE3BH,EAAc7I,KAAK6I,gBACpB8C,GAAiB9C,EAAa,KAE3BiD,EAAoB3W,EAAS4W,yBAAyBH,UAE5DxM,EAASzH,OACPmU,EAAkB1L,MAClB0L,EAAkBE,QAClBF,EAAkBzK,UAClB2H,EACA8C,EAAkB5X,eAEpBmV,EAAUjS,OAINkK,EAAelC,EAAStH,kBACxBmU,EAAe7M,EAAS8M,sBAEzB5K,IAAiB2K,SAEpBjD,EAAEmD,YACF9C,EAAUjS,OAINgV,EAAWT,EACbxW,EAASkX,gBAAgBT,GACzBzW,EAASmX,iBAAiBV,GAE9BxM,EAASzH,OACPyU,EAAShM,MACTgM,EAASJ,QACTI,EAAS/K,UACT2H,EACAoD,EAASlY,UACTqV,UAAU,WACVF,EAAUjS,KACToS,UAAU,WACXH,EAAUjS,GACVwT,EAAW5B,SAtGWU,mFCEVtB,OAAOhR,EACPgR,WAAU,EACVA,WAAU,IAHCc,yCAK3B,SAAcF,EAAQtB,OAQZnC,EACAgH,EAGAC,EACAC,EACAC,EAdctN,aAAUgK,iBAAcC,cACxCpJ,EAAUb,EAASa,QACnB0M,EAAavN,EAASwN,gBACtBpM,EAAiBpB,EAASqB,oBAC1BoM,EAAYxY,KAAKqM,OAAOV,KAAK8I,aAAe9I,KAAK2I,MAAQgE,EAAWlV,MAAQ+I,GAE5EqI,EAAc7I,KAAK6I,YACrB5I,EAAQrM,UAA0B,IAAdiZ,GAAmBhE,IACnCtD,EAAanG,EAASmB,aAAaqH,gBACnC2E,EAAyB1D,EAAYlI,cAGrC6L,EAAgBpO,EAAUyK,EAAYlG,gBAAkBkK,GAAY,EAAGtH,EAAa,GAAG,GACvFkH,EAAoBF,EAAyBM,EAAYrM,GACzDkM,EAAiB7D,EAAYhH,qBAAqB2K,EAAgB,GAAG9J,MAAM8J,GAAe,IAGjF5J,YAAY6J,QACtB5D,YAAc6D,QAIhB/D,MAAQ,OACRG,aAAe1J,EAAS4B,oBAG7B5B,EAAS0N,gBAAgB1N,EAAS8M,mBAClC9C,EAAajT,EAAOC,WAAY4S,GAAG,GAChCO,UAAU,WACTF,EAAUjS,KAEXoS,UAAU,WACTH,EAAUjS,iBAIhB,SAAgB4R,EAAQtB,OAAE4B,eAAYD,cAC/BL,EAAEL,MAAMmB,OAIbR,EAAWN,GACRQ,UAAU,WACTH,EAAUjS,iBAIhB,SAAgB4R,EAAQtB,OAAEyB,aAAU/J,aAAUgK,iBAAcC,cACpD0D,EAAY/D,GAAKA,EAAE+D,UAEzB3N,EAASa,QAAQnL,MACbsK,EAAS0N,gBAAgB9M,KAAK6I,aAC9BzJ,EAAS0N,gBAAgB1N,EAAS8M,mBAElC/C,EAASlJ,QAAQrL,UACnBwK,EAAS4N,qBAGX3D,EAAUjS,GACVgI,EAAS6N,uBACT7D,EAAajT,EAAOK,SAAUwS,EAAG+D,EAAW,CAC1CnE,UAAW5I,KAAK4I,gBAlEOc,mFCAXtB,OAAOhR,EACPgR,WAAU,EACVA,WAAU,IAHAc,iDAK1B,SAAsBF,EAAQtB,IAC5B2B,eAAUjS,eAGZ,SAAgB4R,EAAQtB,OAAEtI,aAAUiK,cAElCL,EAAEmD,OAGF/M,EAAS8N,mBAAmB9N,EAAS4B,qBACrCqI,EAAUjS,gBAGZ,SAAiB4R,EAAQtB,OAAE2B,cAEH,IAAlBL,EAAEL,MAAMmB,OACVT,EAAUjS,OArBYsS,mDCMH,IAAIyD,iBA2BR,SAACC,OACZC,EAAejF,EAAK5I,SAEtB6N,EAAala,OAASia,EAAe,KACnCrE,gBAEIqE,QACDhW,EACH2R,EAAY,IAAIoE,aAEb/V,EACH2R,EAAY,IAAIuE,aAEblW,EACH2R,EAAY,IAAIwE,aAEbnW,EACH2R,EAAY,IAAIyE,aAEbpW,EACH2R,EAAY,IAAI0E,EAIpBJ,EAAaK,OAAO3E,GACpBA,EAAW4E,QAAQN,GAEnBjF,EAAK5I,MAAQuJ,SAERX,EAAK5I,uCAtDd,SAAY6B,EAAmC2H,EAAQC,OAC/CoE,EAAerN,KAAKR,aAClB6B,QACDtK,EAAYC,KACfqW,EAAaO,OAAO5E,EAAGC,cAEpBlS,EAAYN,OACf4W,EAAa5D,SAAST,EAAGC,cAEtBlS,EAAYE,QACfoW,EAAaQ,UAAU7E,EAAGC,cAEvBlS,EAAYG,cACfmW,EAAaS,eAAe9E,EAAGC,cAE5BlS,EAAYI,OACfkW,EAAaU,SAAS/E,EAAGC,gBAK/B,kBACSjJ,KAAKR,qCCzBFpM,SACV4a,0BAJiB5F,OAAetV,EAAUC,KAK1CqV,EAAKhV,MAAQA,IANE8V,kDASjB,SAAuB+E,OACb7O,EAAuC6O,WAA7BpC,EAA6BoC,YAAlB3C,EAAkB2C,gBACzCC,EAAYlO,KAAK5M,MACjB+a,EAAa9Z,KAAKyW,IAAIe,EAAUlD,MAAMmB,OACtCxI,EAAelC,EAAStH,kBACxBmU,EAAe7M,EAAS8M,kBACxBkC,EAA0BpO,KAAKqO,kBAAkBJ,GACjDK,EAAmBrC,EAAarU,aAAe0J,EAAa1J,WAG5D2W,EAA0BnP,EAASoP,mBAAqBF,EACxDG,GAAwBrP,EAASsP,iBACjCpD,GAAiB8C,GAA2BG,UAElC,EAAZL,GAA8BE,EAAbD,EACZnO,KAAK2O,iBAAiBV,GACpBQ,EACFzO,KAAK4O,kBAAkBX,GAEvB,CACL7N,MAAO6L,EACP/X,SAAUkL,EAASa,QAAQ/L,SAC3B8X,QAAS5M,EAASqC,sBAAsBwK,GAIxC5K,UAAYiK,GAAiB8C,GACvBhP,EAASsP,gBAAkBJ,EAC7BnY,EAAOO,QACPP,EAAOM,4BAKjB,SAA2BwX,WACjBpC,EAAgDoC,YAArC7O,EAAqC6O,WAA3BzO,EAA2ByO,QAApB5C,EAAoB4C,kBAElDE,EAAa9Z,KAAKyW,IAAIe,EAAUlD,MAAMmB,OACtCsE,EAA0BpO,KAAKqO,kBAAkBJ,GACjDC,EAAYlO,KAAK5M,MACjB6M,EAAUb,EAASa,QACnBO,EAAiBpB,EAASqB,oBAC1BoO,EAAU5O,EAAQ/K,IAAM,EACxB4Z,EAAqBjD,EAAUG,QAAQlC,MAAQ1K,EAAS0B,4BAE1DiO,EAAc3P,EAAS8M,kBACvB8C,EAAaD,EAAYpM,gBAAkB,EAC3CsM,EAAmB,EAEhBA,EAAmBf,GAAW,KAE7BgB,EAAgBH,EAAYI,mBAC5BC,EAAgBF,EAAcvO,cAAgBqO,EAAaxO,EAC3DS,EAAYiO,EAAclX,aAO7BqT,GAAuCyD,EALhBM,EAAgBnO,EAAY4N,IAM/CxD,GALmB+D,EAAgBP,EAKIC,YAKxCO,EAAehE,EACjB0D,EAAYzP,YACZyP,EAAY1P,gBACXgQ,YAICC,EAAaP,EAAYnX,WACzB2X,EAAeF,EAAazX,YAC7ByT,GAAmBkE,GAAgBD,IACjCjE,GAAmCiE,GAAhBC,KAExBP,EAAa3D,EACT2D,EAAa,EACbA,EAAa,GAEnBD,EAAcM,EACdJ,GAAoB,MAGhBO,EAAmBT,EAAYI,mBAAmBxO,cAErC,IAAfqO,IACFD,EAAcA,EAAYrM,MAAMqM,EAAYpM,iBAAiB,IACjDC,YAAY4M,EAAmBR,EAAaxO,OAGpDiP,EAAkBrQ,EAASa,QAAQ/L,SACnCA,EAAWmI,EAAMwP,EAAU3X,SAAUub,EAAiBA,EAAkBR,SAEvE,CACL7O,MAAO2O,EACP/C,QAAS5M,EAASqC,sBAAsBsN,GACxC7a,WACAmN,UAAWhN,KAAKmI,IAAI2R,EAAY3O,EAAMmJ,OAASyF,EAC3CjY,EAAOM,OACPN,EAAOO,8BAIf,SAA0BuX,OAChB7O,EAA8B6O,WAApB5C,EAAoB4C,kBAEhChO,EAAUb,EAASa,QACnBgC,EAAe7C,EAASsQ,kBACxBpO,EAAelC,EAASmB,aAAaoP,IAAI1N,GACzC2N,EAAiBxQ,EAASmC,oBAC1BoL,EAAavN,EAASwN,gBAEtBiD,EAAmBvO,EAAaO,qBAAqB,GAMrDiO,EALS7P,EAAQrM,UACjBS,KAAKyW,IAAIxJ,EAAaE,oBAAsBoO,GAC5Cvb,KAAKyW,IAAI+E,EAAiBrO,oBAAsBoO,GAIlDC,EACAvO,EACEyO,EAAeD,EAAUnP,cAEzBqP,EAAgB3E,EAClByE,EAAUxQ,YACVwQ,EAAUzQ,YAERgC,EAAY2O,EACd7Z,EAAOM,OACPN,EAAOO,QACLqY,EAAciB,GAEhBF,EACEG,EAA+BlB,EAAYhO,4BAO3CmP,GALyBjQ,EAAQrM,SACnCyX,EACE0E,EAAeD,EAAU9X,UAAYiY,EAA+BhQ,EAAQ/K,IAC5E6a,GAAgBhB,EAAY/W,UAAYiY,GAAgChQ,EAAQ/K,IAClF6Z,EAAYvN,qBACmCpC,EAAS0B,kCAKrD,CACLV,MAAO2O,EACP/C,QANc5M,EAASoP,kBACrBnS,EAAM6T,EAAmBvD,EAAWlV,KAAMkV,EAAWjV,MACrDwY,EAKFhc,SAAU+L,EAAQ/L,SAClBmN,wEC7JJ,SAAUlO,UACDA,IAAS6M,KAAK7M,yBAGvB,SAAwB8a,OAChB7O,EAAW6O,EAAI7O,SACfa,EAAUb,EAASa,QAEnBG,EAAQH,EAAQrM,SAClBoM,KAAKmQ,+BAA+BlC,GACpC7O,EAAStH,wBAEN,CACLsI,QACA4L,QAAS5M,EAASqC,sBAAsBrB,GACxClM,SAAU+L,EAAQ/L,SAClBmN,UAAWlL,EAAOO,qCAItB,SAAgCuX,OACtBzO,EAAoByO,QAAb7O,EAAa6O,WACtBpF,EAAcrJ,EAAMqJ,kBAEnB,CACLzI,MAAOyI,EACPmD,QAAS5M,EAASqC,sBAAsBoH,GACxC3U,SAAUkL,EAASa,QAAQ/L,SAC3BmN,UAAW,yBAKf,SAA4B4M,OAClB7O,EAA8B6O,WAApB5C,EAAoB4C,kBAEhChO,EAAUb,EAASa,QACnBqB,EAAelC,EAAStH,kBACxB+W,EAAU5O,EAAQ/K,IAAM,EAExBuK,EAAyB6B,EAAaP,4BAQxCqN,EAA0B/C,EAC1B/J,EAAatJ,UAAYyH,EAAyBoP,EAClDpP,EAAyBoP,SAE7BT,EAA0B/Z,KAAKmI,IAAI4R,EAAyBnO,EAAQhM,6CAKtE,SAAuCga,OAC/B7O,EAAW6O,EAAI7O,SACf8P,EAAgB9P,EAAStH,kBAAmBqX,mBAC5CS,EAAiBxQ,EAASmC,oBAE1BsO,EAAmBX,EAAcrN,qBAAqB,GACtDuO,EAAS/b,KAAKyW,IAAIoE,EAAc1N,oBAAsBoO,GACxDvb,KAAKyW,IAAI+E,EAAiBrO,oBAAsBoO,UAE3C3B,EAAI5C,iBAAmB+E,EAC5BP,EACAX,0CCnEJlB,YAAMha,EAAAA,gBAJWoU,OAAetV,EAAUE,cADrBkW,kDAQvB,SAAuB+E,OACbpC,EAA+BoC,YAApBzO,EAAoByO,QAAb7O,EAAa6O,WACjCjC,EAAUH,EAAUG,QAAQlC,MAC5BsE,EAA0BpO,KAAKqO,kBAAkBJ,GACjDtB,EAAavN,EAASwN,gBACtBtL,EAAelC,EAAStH,kBACxBmI,EAAUb,EAASa,WAGbmO,EADE/Z,KAAKyW,IAAIe,EAAUlD,MAAMmB,MAAQtK,EAAMmJ,OAChB,KAC7ByD,EAAW4B,YAAMW,2BAAiBV,UAExC7B,EAASlY,SAAW2X,EAAU3X,SAC9BkY,EAASJ,QAAUA,EACnBI,EAAS/K,UAAapB,EAAQrM,UAAYwY,EAAShM,QAAUkB,EAEzDnL,EAAOM,OADP,GAGG2V,MAKP8D,EAAoB7T,EAHhB6T,EAAoBjQ,EAAQrM,SAC5BwK,EAAU4N,EAASW,EAAWlV,KAAMkV,EAAWjV,MAAM,GACrDsU,EACyCW,EAAWlV,KAAMkV,EAAWjV,aACzEwY,GAAqB9Q,EAAS0B,4BAIvB,CACLV,MAHqBhB,EAASiR,mBAAmBH,GAIjDlE,UACA9X,SAAU2X,EAAU3X,SACpBmN,UAAW,wBAKjB,SAAwB4M,UACfjO,KAAKqM,gBAAgB4B,+BAG9B,SAAgCA,OACtB7O,EAAa6O,iBAEd,CACL7N,MAAOhB,EAAS8M,kBAChBF,QAAS5M,EAAS4B,oBAClB9M,SAAU,EACVmN,UAAW,yBAIf,SAA4B4M,OAClB7O,EAA8B6O,WAApB5C,EAAoB4C,kBAEhChO,EAAUb,EAASa,QACnBqB,EAAelC,EAAStH,kBACxB+W,EAAU5O,EAAQ/K,IAAM,EAExB4T,EAAe1J,EAASkR,aAAaC,WAAWzH,aAChD0H,EAAuBlP,EAAaX,cAKpC8P,EAAqB3H,EAAe1J,EAAS0B,4BAE7CN,EAAiBpB,EAASqB,oBAC5B2N,EAA0B/C,EAC1BmF,EAAuBlP,EAAatJ,UAAYyY,EAAqB5B,EACrE4B,EAAqBD,EAAuB3B,EAChDT,EAA0B/Z,KAAKyW,IAAIsD,EAA0B5N,UAEtDnM,KAAKkI,IAAI6R,EAAyB5N,EAAiB4N,OAjFrCsC,2BCsDrBvH,EACAlJ,EACAmJ,2BA7B0B,mBAgMR,SAACyC,GACfA,GAAaA,EAAU9B,OACzB8B,EAAU9B,MAAM,CAAED,MAAO1B,EAAK5I,MAAM3J,UAAY,GAGlDuS,EAAKkI,aAAajH,UAAUjS,SAtKvB+R,SAAWA,OACXC,aAAeA,OAEf5J,MAAQ,CACXlB,KAAM,EACNzI,SAAU,EACV8a,mBAAoB,EACpBC,uBAAwB,EACxBC,eAAgB,EAChBlE,WAAY,CACVlV,KAAM,EACNC,KAAM,GAERoZ,UAAWzW,EACXvG,kBAAmB,EACnBid,eAAgB,GAChBC,kBAAkB,EAClBC,iBAAiB,EACjBC,eAAe,EACfC,sBAAuB,CACrBtV,UAAW,KACXvC,MAAO,MAET8X,oBAAqB,CACnBvV,UAAW,KACXvC,MAAO,MAETuG,WAAY,WAETI,QAAUA,OACVqQ,aAAe,IAAIe,OACnBC,cAAgB,QAChBC,YAAc,QAEdC,0CAGP,SACEpR,EACA4L,EACA3K,EACAwK,EACA3X,2BAAAA,EAAmB8L,KAAKC,QAAQ/L,cAE1BsL,EAAQQ,KAAKR,MACb6N,EAAerN,KAAKsQ,aAAaC,WACjCrO,EAAkB1C,EAAM3J,SAExBkX,IAAYlB,GACdA,EAAUkB,UAERnE,EAAYoD,IAAY9J,EAC1B,KACUA,EAAV8J,EACE3U,EAAUE,KACVF,EAAUC,KAIdma,EADEpQ,IAAclL,EAAOM,OACTuJ,KAAKoJ,aAAajT,EAAOM,OAAQoV,EAAWkB,EAAW,CACnE5N,MAAOiB,EAAMxI,WACbwI,QACAwI,cAEOvH,IAAclL,EAAOO,QAChBsJ,KAAKoJ,aAAajT,EAAOO,QAASmV,EAAWkB,GAE7C,CACZxD,UAAA,SAAUvL,UACRA,IACOgC,MAETwJ,UAAA,kBACSxJ,cAKbyR,EAAYlI,UAAU,WACpB8D,EAAa1E,MAAQ,EACrB0E,EAAavE,aAAeV,EAAKpH,oBACjCqM,EAAaxE,YAAczI,EAC3BiN,EAAazE,UAAYoD,IAAY9J,EACjC,KACUA,EAAV8J,EACE3U,EAAUE,KACVF,EAAUC,KAEZ0U,IAAY9J,IAEdkG,EAAK6D,aAAe7L,EACpBgI,EAAK9G,aAAelB,GAGlByL,GAAaA,EAAU9B,MAEzB8B,EAAU9B,MAAM,CAAED,MAAOkC,GAAW9X,GAEpCkU,EAAKsJ,KAAK3H,MAAM,CAAED,MAAOkC,GAAW9X,KAIjCud,gBAGT,SAAkB7T,EAAaiO,OACvBrM,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfhH,EAAYuG,EAAMsR,UAAU5X,KAC5ByT,EAAanN,EAAMmN,WAGrB1M,EAAQrM,WAAa6I,EAAUmB,EAAK+O,EAAWlV,KAAMkV,EAAWjV,QAClEkG,EAAMQ,EAAUR,EAAK+O,EAAWlV,KAAMkV,EAAWjV,MAAM,IAEzD8H,EAAM3J,SAAW+H,OACZqO,aAAejM,KAAK2R,uBASjB/B,EACAR,EACAnO,EACA4N,EAXF5C,EAAejM,KAAKiM,aACpB2F,EAA0B3F,EAC5BA,EAAatL,cACb,EAIAsL,GACI2D,EAAiB5P,KAAKuB,oBACtB6N,EAAgBnD,EAAatL,cAC7BM,EAAYgL,EAAajU,UACzB6W,EAAU5O,EAAQ/K,IAAM,EAG9BsK,EAAMmR,oBAAsBf,EAAiBR,EAAgBP,IAAY5N,EAAY,EAAI4N,IAEzFrP,EAAMmR,mBAAqB,OAGxBkB,eAAehG,GAOpBjO,IAJgCqO,EAC5BA,EAAatL,cACb,GAE8BiR,EAClCpS,EAAM3J,SAAW+H,OAEZkU,0BAGCC,EAAY9R,EAAQ1K,kBACtBiK,EAAMqR,eACN,EAGEmB,GAFa/R,EAAQtM,WACvB,GAAGiK,EAAMmU,GAAY,GAAK,CAAC,IAAKnU,EAAMmU,KACb5J,IAAI,SAAA8J,UAAY5d,KAAK6d,MAAMD,UAAYE,KAAK,WAEpEzO,cAAcpK,MAAML,GAAauG,EAAMsR,UAAU3X,MAClD,eAAe6Y,WACf,aAAaA,qBAWnB,eACQxS,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QAErBT,EAAMK,WAAa,UACdyR,cAAgB,OAEfc,EAAkBpS,KAAKoS,gBACxBnS,EAAQtM,WAIXye,EAAgB9Y,MAAMtD,OAAS,GAF/Boc,EAAgB9Y,MAAMvD,MAAQ,GAIhCyJ,EAAMwR,kBAAmB,OACpBO,YAAc,aAGrB,gBACOc,kBACAC,oCACAtF,0BACAuF,wBACAC,yBACAC,mCACAxF,4BACAyF,oCAIP,eACQlT,EAAQQ,KAAKR,MACbe,EAAeP,KAAKO,aACpBqP,EAAiB5P,KAAKuB,2BAExBvB,KAAK0O,eACUlP,EAAM3J,UAEJ2J,EAAMmN,WAAWlV,KAChC8I,EAAa4C,aACb5C,EAAauF,YAGZ9F,KAAKqQ,mBAAmBT,yBAGjC,SAA0B/Z,WAKpBoW,EADA0G,EAAkB3e,EAAAA,MAGFyT,EANCzH,KAAKO,aAEK8G,YAIX7M,WAAAA,IAAW,KAApB4F,UACJA,OAGCwS,EAAexS,EAAMO,cACrBkS,EAAeD,EAAexS,EAAMpI,UAGpC8a,EAAWrW,EAAU5G,EAAU+c,EAAcC,GAC/C,EACAxe,KAAKkI,IACLlI,KAAKyW,IAAI8H,EAAe/c,GACxBxB,KAAKyW,IAAI+H,EAAehd,OAGb8c,EAAXG,QAEG,GAAIA,IAAaH,GACQte,KAAKyW,IAAIjV,EAAWoW,EAAczK,qBACzCnN,KAAKyW,IAAIjV,EAAWuK,EAAMoB,2BAOnDmR,EAAkBG,EAClB7G,EAAe7L,UAGV6L,+BAGT,SAAiC7L,OAC3B2S,EAAU3S,EACV4S,EAAmBhf,EAAAA,EACjB4b,EAAiB5P,KAAKuB,2BAETnB,EAAMyB,qBACdnH,QAAQ,SAAAuY,OACXC,EAAiBD,EAAUzR,oBAC3BsR,EAAWze,KAAKyW,IAAIoI,EAAiBtD,GAEvCkD,EAAWE,IACbD,EAAUE,EACVD,EAAmBF,KAIhBC,iCAIT,SAAmC3S,OAC3BZ,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfiT,EAAiB9S,EAAMoB,oBACvBoO,EAAiB5P,KAAKuB,oBACtBuR,EAAWze,KAAKyW,IAAI8E,EAAiBsD,GACrC1S,EAAiBhB,EAAMmN,WAAWjV,KAAO8H,EAAMmN,WAAWlV,QAE3DwI,EAAQrM,gBAOJkf,GAAYtS,EAAiBsS,EAChCI,EAAiB1T,EAAMoR,uBACNhB,EAAjBsD,EAEEA,EAAiB1T,EAAMoR,uBAAyBpQ,EAEhD0S,EAAiB1T,EAAMoR,uBAAyBpQ,MAZhD3K,EAAWqd,EAAiB1T,EAAMoR,8BACjC5Q,KAAKwO,kBACRnS,EAAMxG,EAAU2J,EAAMmN,WAAWlV,KAAM+H,EAAMmN,WAAWjV,MACxD7B,2BAaR,SAA6BuK,OACrBuM,EAAa3M,KAAK4M,gBAEpBsD,EAAoB9P,EAAMoB,oBAAsBxB,KAAKc,mCACzDoP,EAAoBlQ,KAAKwO,kBACrBnS,EAAM6T,EAAmBvD,EAAWlV,KAAMkV,EAAWjV,MACrDwY,qBAKN,SAAuB9P,GACjBJ,KAAKmT,kBAAkB/S,GAAS,QAC7BkR,cAAc9V,KAAK4E,aAI5B,WACOJ,KAAKoT,eACHC,4BAIT,WACMrT,KAAKoT,gBACFA,SAAS7a,eACT6a,SAAW,UAEX9C,aAAajH,UAAUjS,cAIhC,SAAc+H,EAAelE,cACrBlH,EAAYiM,KAAKO,aAAasC,kBAGhC1D,EAAQ,GAAapL,EAARoL,QACR,OAGHK,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QAGfoF,EAFiBrK,EAAaC,GAGjCkN,IAAI,SAACzO,EAAIyD,UAAQ,IAAIuH,EAAMhL,EAAIyF,EAAQhC,EAAKiL,KAC5CzL,MAAM,EAAG5I,EAAYoL,EAAQ,MAE5BkG,EAAOjL,QAAU,QACZ,OAYDkZ,EACAC,EAVF9M,EAAczG,KAAKO,aAAa8C,OAAOlE,EAAOkG,eAG/CmO,aAAanO,GAEbrF,KAAKsB,oBACHA,aAAe+D,EAAO,QACtB4G,aAAe5G,EAAO,GAErBiO,EAAiBjO,EAAO,GACxBkO,EAAmBvT,KAAKyB,sBAAsB6R,GACpD9T,EAAM3J,SAAW0d,OACZrG,mBAAmBqG,GACxB/T,EAAMmR,oBAAsB2C,EAAevS,4BAA8Bd,EAAQ/K,IAAM,IAAMoe,EAAetb,UAAYiI,EAAQ/K,WAI7Hue,qBAAqB,CAAElX,IAAK4C,EAAO3C,IAAK2C,IAC7CK,EAAMuR,eAAerW,QAAQ,SAACgZ,EAASvW,OAC9BZ,EAAYmX,KAAPlX,EAAOkX,KACfvU,EAAQ5C,GAEViD,EAAMuR,eAAehM,OAAO5H,EAAK,EAAG,CAACZ,EAAMkK,EAAajK,EAAMiK,WAI7DjO,SAEE6M,aAGT,SAAelG,EAAelE,cACtBuE,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aACpBxM,EAAYwM,EAAasC,kBAG3B1D,EAAQ,GAAapL,EAARoL,QACR,OAIHkG,EADiBrK,EAAaC,GAEjCkN,IAAI,SAACzO,EAAIyD,UAAQ,IAAIuH,EAAMhL,EAAIyF,EAAQhC,EAAKiL,KAC5CzL,MAAM,EAAG5I,EAAYoL,EAAQ,MAE5BkG,EAAOjL,QAAU,QACZ,GAGcmG,EAAa6E,QAAQjG,EAAOkG,GAEpC3K,QAAQ,SAAA0F,OACfuT,EAAevL,EAAK+K,kBAAkB/S,IACxB,EAAhBuT,GACFvL,EAAKkJ,cAAcvM,OAAO4O,EAAc,UAKvCH,aAAanO,OAQViO,EACAC,EAPFjS,EAAetB,KAAKsB,oBACRA,QAEXA,aAAe+D,EAAO,QACtB4G,aAAe5G,EAAO,GAErBiO,EAAiBjO,EAAO,GACxBkO,EAAmBvT,KAAKyB,sBAAsB6R,GACpD9T,EAAM3J,SAAW0d,OACZrG,mBAAmBqG,GACxB/T,EAAMmR,oBAAsB2C,EAAevS,4BAA8Bd,EAAQ/K,IAAM,IAAMoe,EAAetb,UAAYiI,EAAQ/K,MACvHuH,EAAU6E,EAAc1J,WAAYuH,EAAOA,EAAQkG,EAAOjL,OAAS,UAEvEkH,aAAef,EAAaoP,IAAIrO,EAAc1J,kBAIhD6b,qBAAqB,CAAElX,IAAK4C,EAAO3C,IAAK2C,EAAQkG,EAAOjL,OAAS,SAEhE5B,SAEE6M,YAGT,SAAclG,EAAe+H,gBAAAA,SACrB1H,EAAQQ,KAAKR,MAEnBL,EAAQ9K,KAAKmI,IAAI2C,EAAO,OAShByU,EAPFrT,EAAeP,KAAKO,aACpB0B,EAAejC,KAAK0P,kBAEpBpJ,EAAgB/F,EAAa+C,OAAOnE,EAAO+H,GAC7CzK,EAAUwF,EAAc9C,EAAOA,EAAQ+H,EAAc,KAGjD0M,EAAkBvf,KAAKmI,IAAI2C,EAAQ,EAAGoB,EAAasT,WAAWtX,UAC/D+E,aAAef,EAAaoP,IAAIiE,IAIrB,EAAd1M,SAGGuM,qBAAqB,CAAElX,IAAK4C,EAAQ,EAAG3C,IAAK2C,EAAQ+H,SAEpDoK,cAAgB,IAGnB/Q,EAAarI,iBAAmB,SAC7BoJ,kBAAewS,OACf7H,kBAAe6H,QAGjBtb,aAIGgK,EAFFmK,EAAanN,EAAMmN,kBACrBnN,EAAM3J,SAAW8W,EAAWlV,MAAQ+H,EAAM3J,SAAW8W,EAAWjV,QAC5D8K,EAAcpE,EAAUoB,EAAM3J,SAAU8W,EAAWlV,KAAMkV,EAAWjV,MAAM,QAC3E4R,WAAW9G,QACX0K,mBAAmB1K,IAGnB8D,wBAGT,eAUQyN,EACAC,EAIIC,EAENC,EAYMC,EAKFC,EAjCF5U,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACftM,EAAasM,EAAQtM,WACrB2N,EAAetB,KAAKlI,kBAErBwJ,IAICyS,EAAsB9T,EAAQrL,WAAa4K,EAAMwR,iBACjDgD,EAAgBhU,KAAKoS,gBAAgB9Y,MACvCya,IACEG,SAIFA,EAHEjU,EAAQrL,UACJqf,EAAY3S,EAAa3C,UAEjBhL,EAAasgB,EAAUje,OAASie,EAAUle,OAG/BiK,KAAKO,aAAaoH,iBAAiBnC,OAAO,SAAC6O,EAASjU,OACrE6T,EAAY7T,EAAMzB,iBACjBtK,KAAKmI,IAAI6X,EAAS1gB,EAAasgB,EAAUje,OAASie,EAAUle,QAClE,GAKAyJ,EAAMwR,mBACHmD,EAAenU,KAAKsU,aAC1BJ,EAAc7f,KAAKmI,IAAI0X,EAAavgB,EAAawgB,EAAane,OAASme,EAAape,OACpFyJ,EAAMwR,kBAAmB,GAGrBoD,EAAkBF,OACpBvgB,GACFqgB,EAAche,OAASoe,EACvB5U,EAAMK,WAAY7J,OAASke,IAE3BF,EAAcje,MAAQqe,EACtB5U,EAAMK,WAAY9J,MAAQme,6BAMhC,eAgBUK,EACAtI,EAGNzJ,EAnBIhD,EAAQQ,KAAKR,MACb8B,EAAetB,KAAKlI,kBACpBuS,EAAiBrK,KAAKgB,oBACtBqM,EAAerN,KAAKsQ,aAAaC,WACjCiE,EAAexU,KAAK7K,SAASsf,GAAG3hB,EAAUE,aAC1C4d,EAAyB5Q,KAAKc,4BAC9B+N,EAAU7O,KAAKC,QAAQ/K,IAAM,EAE/BmY,EAAaqH,SAAWrH,EAAasH,aAClC7C,uBAULtP,EALEgS,GACID,EAAkBvU,KAAKwO,oBAAsBnE,IAAmB7K,EAAMmN,WAAWlV,MAAQ4S,IAAmB7K,EAAMmN,WAAWjV,MAC7HuU,EAAejM,KAAKkM,kBAGZqI,IAAoBtI,EAC9B5B,EACA4B,EAAatL,cAAgBkO,GAAW5C,EAAajU,UAAY,EAAI6W,GAAWrP,EAAMmR,mBAAqBC,GAEjGtP,EACVA,EAAaE,oBAAsBoP,EACnCvG,EAGFrK,KAAKwO,oBACPhM,EAAcnG,EAAMmG,EAAahD,EAAMmN,WAAWlV,KAAM+H,EAAMmN,WAAWjV,YAKtEwV,mBAAmB1K,QAEnB8G,WAAW9G,kBAGlB,eACQhD,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfmS,EAAkBpS,KAAKoS,uBAExB5S,EAAMK,aACTL,EAAMK,WAAalB,EAAQyT,EAAiBnS,EAAQ7K,YAG/CoK,EAAMK,4BAGf,2BAEO+U,QAAQla,QAAQ,SAAAma,GACnBA,EAAOC,QAAUD,EAAOC,OAAO1M,EAAKe,uBAIxC,SAAe5F,SAaHwR,EAGAC,EAfJxV,EAAQQ,KAAKR,MACbyV,EAAUjV,KAAKmJ,SAASpR,aACxBqa,EAAkBpS,KAAKoS,gBACvB1O,EAAgB1D,KAAK0D,cACrBiE,EAAiB3H,KAAKO,aAAaoH,qBA6BpC,IAAMvT,UA3BN8gB,cAAclV,KAAK4U,SACnBrR,EAAOC,aACVjF,EAAa6T,EAAiB5S,EAAM2R,uBACpC5S,EAAamF,EAAelE,EAAM4R,qBAE7B5R,EAAM0R,eAAkBlR,KAAKC,QAAQzK,iBAClCuf,EAAiBvV,EAAMyR,gBACzBmB,EACA6C,EACED,EAAkBxV,EAAMyR,gBAC1BvN,EACA0O,EAEJzK,EAAejN,QAAQ,SAAA0F,GACrB2U,EAAejR,YAAY1D,EAAMrI,gBAGnCgd,EAAe7a,YAAY8a,UAI1BtD,KAAKnZ,oBACVyH,KAAKoT,yBAAU7a,UAEfoP,EAAejN,QAAQ,SAAA0F,GAAWA,EAAM7H,QAAQgL,KAGhCvD,UACA5L,GAAK,gBAIvB,SAAe+gB,OACP9P,EAAS8P,EAAO9P,OAChB9Q,EAAeyL,KAAKC,QAAQ1L,aAC5BmP,EAAgB1D,KAAK0D,cACrBnD,EAAeP,KAAKO,aAG1BmD,EAAcnI,UAAY8J,EAAO8C,IAAI,SAAA/H,UAASA,EAAMgV,OAAMjD,KAAK,SAG1DkD,oBACCC,EAAgB/U,EAAaoH,iBAG7B4N,EAAyB,GAC/BlQ,EAAO3K,QAAQ,SAAC0F,EAAOjD,OACfqY,EAAeF,EAAcnY,GACnCqY,EAAa5O,SAASxG,EAAMjB,OAC5BoW,EAAcnV,EAAMjB,OAASqW,IAE/BjV,EAAakV,cAAcF,EAAe,IAC1ChV,EAAamV,cAAc,OAErBpV,EAAaC,EAAarI,qBAEzBoJ,aADU,EAAbhB,EACkBC,EAAaoP,IAAIwF,EAAOhW,QACvCoB,EAAaoP,IAAIpb,IACjBgM,EAAa4C,kBAEE2Q,OAEjBxC,cAAgBiE,EAAc3P,OAAO,SAAAxF,UAASuD,QAAQvD,UAEtD5H,cAEAkZ,KAAK3H,MAAM,CAAED,MAAOqL,EAAOtf,UAAY,QACvCyT,WAAW6L,EAAOtf,+BAGzB,eACQwR,EAAYrH,KAAKO,aAAa8G,eAChCrH,KAAKC,QAAQ1K,kBAAmB,KAC5BogB,EAAY3V,KAAKgB,oBACjB4U,EAAe5V,KAAKhI,UACpB8X,EAAY9P,KAAKiM,aAyBjB7T,EAAmB,SACvBgI,EACAyV,EACAC,WAEMxE,EAAyB,GAE3BxL,EAAY1F,IACH,KACL6C,EAAY4S,EAAQ/P,OACrB7C,GAAa6S,EAAgB7S,SAGlCqO,EAAc9V,KAAKyH,GACnB6C,EAAY7C,SAEPqO,GAGH9K,EAAaxG,KAAKO,aAAarI,gBAC/B6d,EAAc,SAAC3V,UAAiBA,EAAMxI,YAAcwI,EAAMuC,gBAAkB,GAAK6D,UAIhFwP,GAAClG,GAHW1X,EAAiB0X,EA5Cf,SAAC1P,OACd6C,EAAY7C,EAAMd,mBAEpB2D,GAAaA,EAAUtC,eAAiBP,EAAMO,cACzCsC,EAEA,MAcc,SAAC7C,UAAiBA,EAAMO,eAAiBgV,EAAYC,IAyB3Dxd,EAAiB0X,EAnCf,SAAC1P,OACdqC,EAAYrC,EAAMf,mBAEpBoD,GAAaA,EAAU9B,eAAiBP,EAAMO,cACzC8B,EAEA,MAKc,SAACrC,UAAiBA,EAAMO,cAAgBP,EAAMpI,WAAa2d,KA0BnCM,KAAK,SAACC,EAAQC,UAAWJ,EAAYG,GAAUH,EAAYI,YAErG9O,EAAUzB,OAAO,SAAAxF,OAChBgW,EAAiBhW,EAAMiW,2BAEJ,EAAlBD,GAAuBA,EAAiB,uBAKrD,kBACSpW,KAAKsB,gCAGd,eACQA,EAAetB,KAAKsB,oBAEnBA,EACHA,EAAa1J,YACZ,qBAGP,kBACSoI,KAAKiM,mCAId,eACQoB,EAAerN,KAAKsQ,aAAaC,WACnCtE,EAAeoB,EAAasH,SAAWtH,EAAaqH,QACpD1U,KAAKiM,aACLjM,KAAKsB,aAEHf,EAAeP,KAAKO,iBACrB0L,SAEIqK,QAEH5O,EAAuC1H,KAAK4M,gBAApC2J,SAAiBC,SACzBnM,EAAiBrK,KAAKgB,oBACtB0N,EAAe1O,KAAK0O,eACtBjM,EAAYwJ,EAAa5M,YACzB4D,EAAYgJ,EAAa3M,YACzBsQ,EAAiB5P,KAAKuB,oBACtBkV,EAAmBxK,EAAazK,oBAGlCkN,GACGjM,GACAQ,GACAoH,EAAiBmM,GAEhB5G,EAAiBnN,EAAUjB,oBAAsBiV,EAAmB7G,IAGxE3M,GADAgJ,EAAexJ,GACUnD,YACzBmD,EAAYwJ,EAAa5M,YACzBoX,EAAmBxK,EAAazK,yBAM1BoP,EAJF8F,EAAezK,EAAarU,YAAcqU,EAAatJ,gBAAkB,GAAKpC,EAAarI,gBAC3Fye,EAAc1K,EAAajU,UAE7B0W,IAGqB8H,GAFjB5F,EAAyB5Q,KAAKc,6BAEhC2V,EAEF7G,EAAiB6G,EAAmB7G,EAAiBgB,EAAyB4F,EACrEC,EAAmBF,EAAY3F,IAExChB,EAAiB6G,EAAmB7G,EAAiBgB,EAAyB2F,QAG5EK,EAA+CH,GAAlB7G,EAC7B1a,EAAM8K,KAAKC,QAAQ/K,IAErB6a,EAAe0G,EACfI,EAAiBJ,EACjBG,EACFC,EAAiB5T,EACbA,EAAUzB,oBACViV,EAAmBE,EAAczhB,EAErC6a,EAAetN,EACXA,EAAUjB,oBACViV,EAAmBE,EAAczhB,MAGjC4hB,GAAmBlH,EAAiBG,IAAiB8G,EAAiB9G,UACzD6G,EACfF,EACAjU,EACEA,EAAU7K,WACV8e,EAAe,GAEDI,wBAItB,SAA0BjhB,OAClB6b,EAAO1R,KAAK0R,KAClBA,EAAKqF,MACLrF,EAAK3H,MAAM,CACTD,MAAOjU,GACN,GACH6b,EAAKsF,GAAGhX,KAAKiX,yBAGf,kBACSjX,KAAKR,MAAMlB,sBAGpB,kBACS0B,KAAKR,MAAMmN,2BAGpB,eACQnN,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACf0M,EAAanN,EAAMmN,kBAEjB1M,EAAQrM,UACXqM,EAAQnL,QACP0K,EAAM3J,UAAY8W,EAAWlV,MAAQ+H,EAAM3J,UAAY8W,EAAWjV,yBAG1E,eACQuI,EAAUD,KAAKC,eAEdA,EAAQnL,QAAUmL,EAAQrM,+BAGnC,kBACSoM,KAAKoS,oCAGd,kBACSpS,KAAK0D,mCAGd,eACQiJ,EAAa3M,KAAKR,MAAMmN,kBAEvBA,EAAWjV,KAAOiV,EAAWlV,kCAGtC,kBACSuI,KAAKR,MAAMoR,4CAGpB,kBACS5Q,KAAKR,MAAM3J,SAAWmK,KAAKR,MAAMoR,4CAG1C,kBACS5Q,KAAKR,MAAM3J,8BAGpB,kBACSmK,KAAKR,MAAMqR,oCAGpB,kBACS7Q,KAAKR,MAAMuR,mCAGpB,kBACS/Q,KAAKsR,iCAGd,SAAuBlR,QAChBkB,aAAelB,kBAGtB,SAAoBjB,OACZmC,EAAetB,KAAKsB,aACpBf,EAAeP,KAAKO,aAE1BA,EAAa2W,aAAa/X,GACtBmC,GAAgBA,EAAa1J,WAAauH,SACvCmC,aAAef,EAAauF,kBAG9BtN,6BAGP,SAAwB6M,QACjBiM,cAAgBjM,wBAGvB,SAA0B8R,OAClBzF,EAAO1R,KAAK0R,UAEbuF,aAAeE,EACpBzF,EAAKsF,GAAGG,iBAGV,SAAkBvC,cACVwC,EAAc,GAAgB1Q,OAAOkO,UAE3CwC,EAAW1c,QAAQ,SAAAma,GACjBA,EAAOwC,KAAKjP,EAAKe,iBAGdyL,QAAU5U,KAAK4U,QAAQlO,OAAO0Q,GAC5BpX,sBAGT,SAAqB4U,cACb0C,EAAiBtX,KAAK4U,cACJ,GAAgBlO,OAAOkO,GAEhCla,QAAQ,SAAAma,OACf1V,EAAQmY,EAAerb,QAAQ4Y,IAExB,EAAT1V,GACFmY,EAAevS,OAAO5F,EAAO,GAG/B0V,EAAOtc,QAAQ6P,EAAKe,YAEfnJ,6BAGT,SAA4BuX,OACpB/X,EAAQQ,KAAKR,MAEfgY,EAAU,EACdhY,EAAMuR,eAAerK,SAAShM,QAAQ,SAACgZ,EAASvW,OACvCZ,EAAYmX,KAAPlX,EAAOkX,KAEf6D,EAAahb,KAAOC,GAAO+a,EAAa/a,KAAOD,IAEjDiD,EAAMuR,eAAehM,OAAO5H,EAAMqa,EAAS,GAC3CA,sCAKN,SAAmCnS,OAKzBoS,EACAC,EACAC,SANF1X,EAAUD,KAAKC,QACf2X,EAAWrkB,SAASkV,yBAEtBxI,EAAQ5K,aACJoiB,EAAoBzX,KAAKsR,cACzBoG,EAAmBzX,EAAQ5K,YAC3BsiB,EAA2C,QAE5CrG,cAAgB,GAErB1W,OAAOC,KAAKmF,KAAKuR,aAAa7W,QAAQ,SAAAmB,GACpC8b,EAAO9b,IAAa,IAGtBwJ,EAAO3K,QAAQ,SAAA0F,OACPyX,EAAkBzX,EAAM0X,mBAAmBJ,GAC7CG,IAAoBF,EAAOE,IACxB5X,EAAQzK,gBACXoiB,EAAS9T,YAAY1D,EAAMrI,cAE7BqQ,EAAKkJ,cAAc9V,KAAK4E,GACxBuX,EAAOE,IAAmB,GAChBA,IACL5X,EAAQzK,gBACXoiB,EAAS9T,YAAY1D,EAAMrI,cAE7BqQ,EAAKkJ,cAAc9V,KAAK4E,MAG5BqX,EAAkB/c,QAAQ,SAAA0F,GACxBgI,EAAKpG,gBAAgB5B,OAGlBH,EAAQzK,gBACX6P,EAAO3K,QAAQ,SAAA0F,UAASwX,EAAS9T,YAAY1D,EAAMrI,qBAEhDuZ,cAAgBjM,EAAOO,OAAO,SAAAxF,UAASuD,QAAQvD,MAGjDH,EAAQzK,qBACNkO,cAAcI,YAAY8T,wBAInC,eACQrX,EAAeP,KAAKO,aAGtBP,KAAKC,QAAQrM,UAA2C,EAA/B2M,EAAarI,uBACnC6f,mBACAC,8BAEPzX,EAAa0X,sCAGf,SAA0B7X,UACjBrC,EAAUiC,KAAKsR,cAAe,SAAA4G,UAAgBA,IAAiB9X,aAGxE,gBACO+X,mBACAC,qBACAC,mBACAC,uBACAjD,qBACAkD,uBACA/f,cACAggB,oCAGP,eACQhZ,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfgV,EAAUjV,KAAKmJ,SAASpR,aACxBtE,EAAcwM,EAAQxM,YAEtBglB,EAAoBxD,EAAQvZ,SAAS,GACrCgd,EAAqBD,GAAqB7c,EAAS6c,EAAsBhlB,eAEzE2e,EAAkBsG,EACpBD,EACAllB,SAASoG,cAAc,OAErBgf,EAAkBD,EACpBtG,EAAgB1W,SAAS,GACzBuZ,EAAQvZ,SAAS,GACfkd,EAAmBD,GAAmB/c,EAAS+c,EAAoBllB,aAEnEiQ,EAAgBkV,EAClBD,EACAplB,SAASoG,cAAc,OAEtBif,EAaHpZ,EAAM4R,oBAAsB,CAC1BvV,UAAW6H,EAAcwB,aAAa,SACtC5L,MAAOoK,EAAcwB,aAAa,WAdpCxB,EAAc7H,UAAepI,YAQ7BgI,EANsBid,EAClBtG,EAAgB1W,SAChBuZ,EAAQvZ,UAIWhB,QAAQ,SAAAme,GAC7BnV,EAAcI,YAAY+U,MASzBH,EAMHlZ,EAAM2R,sBAAwB,CAC5BtV,UAAWuW,EAAgBlN,aAAa,SACxC5L,MAAO8Y,EAAgBlN,aAAa,WAPtCkN,EAAgBvW,UAAepI,cAG/BwhB,EAAQnR,YAAYsO,IAQjBwG,GAAqBF,GACxBtG,EAAgBtO,YAAYJ,QAGzB0O,gBAAkBA,OAClB1O,cAAgBA,EACrBlE,EAAMyR,gBAAkByH,EACxBlZ,EAAM0R,cAAgB0H,mBAGxB,eACQ3Y,EAAUD,KAAKC,QACfmS,EAAkBpS,KAAKoS,gBACvB1O,EAAgB1D,KAAK0D,cACrBsQ,EAAgBhU,KAAKoS,gBAAgB9Y,MAG3C4C,EAASkW,EAAiBxc,GAC1BsG,EAASwH,EAAe5N,GAExBsc,EAAgB9Y,MAAMzE,OAAS,GAAGoL,EAAQpL,OACtCoL,EAAQtM,YACVqgB,EAAc8E,UAAY,OAC1B9E,EAAcje,MAAQ,SAEtBie,EAAc+E,SAAW,OACzB/E,EAAche,OAAS,QAErBiK,EAAQlL,WACVif,EAAcjf,SAAW,gBAGtBwL,aAAe,IAAIyY,EAAahZ,KAAK0D,cAAezD,kBAG3D,eACQ9K,EAAW6K,KAAKC,QAAQ9K,gBAEtBA,EAAShC,WACVL,EAAUC,UACRoC,SAAW,IAAIub,EAAKvb,EAAS/B,kBAE/BN,EAAUE,iBACRmC,SAAW,IAAI8jB,sBAGd,IAAIxf,MAAM,gDAItB,eACQ+F,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QAEf0M,EAAanN,EAAMmN,gBAEpB+E,KAAO,IAAIwH,EAAK,CACnBpP,MAAO,CACLjM,MAAO,CAAC8O,EAAWlV,KAAMkV,EAAWjV,MACpC9D,SAAUqM,EAAQrM,SAClBc,OAAQ,CAAC,EAAG,KAEb,CACDykB,OAAQlZ,EAAQ9L,YAChBT,aAAcuM,EAAQvM,aACtB0lB,eAAe,SAGZ/F,kCAGP,sBACQ9S,EAAeP,KAAKO,aAKpB8E,EAAS5J,EAHOuE,KAAK0D,cAAchI,UAGHyM,IACpC,SAACzO,EAAiByD,UAAgB,IAAIuH,EAAMhL,EAAIyD,EAAKiL,KAGvD7H,EAAakV,cAAcpQ,EAAQ,SAC9BiM,cAAgBjM,EAAOO,OAAO,SAAAxF,UAASuD,QAAQvD,wBAGtD,eACQH,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aACpB8Y,EAAarZ,KAAKO,aAAasT,WAC/B1U,EAAQ9C,EAAM4D,EAAQ1L,aAAc8kB,EAAW9c,IAAK8c,EAAW7c,UAEhE8E,aAAef,EAAaoP,IAAIxQ,kBAGvC,eACQK,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aAEpBrL,EAAM+K,EAAQ/K,IACdkf,EAAe5U,EAAMlB,KACrB6E,EAAa5C,EAAa4C,aAC1B2C,EAAYvF,EAAauF,eAG1B3C,WAcDmW,EATEjU,EAAS9E,EAAaoH,iBACtB4R,EAAiBlU,EAAOqB,SAASC,UAEjC6S,EAAuB1T,EAAUnF,cAAgBmF,EAAU9N,UAAYmL,EAAWxC,cAAgBzL,EAClGuK,EAAyB0D,EAAWpC,4BACpC6P,EAAyB5Q,KAAKc,4BAE9B2Y,GAAY7I,EAAyBnR,GAA0B+Z,EACjEE,EAAU,MAEMC,IAAAnf,WAAAA,IAAgB,KAAzB4F,SAKMqZ,IADfC,GAAWtZ,EAAMpI,UAAY9C,GACJ,CACvBokB,EAAsBlZ,iBAOtBwZ,EACOxZ,EAHLyZ,GAAYzF,EAAexD,EAAyBnR,GAA0B+Z,EACpFE,EAAU,MAEUI,IAAApS,WAAAA,IAAQ,KAAjBtH,SAKMyZ,IADfH,GAAWtZ,EAAMpI,UAAY9C,GACJ,CACvB0kB,EAAuBxZ,aAMrB2Z,EAAqD,IAAnCT,EAAoB1hB,YACvC0hB,EAAoB1hB,YAAcgiB,EAAqBhiB,WAOtD2N,EAJsBlR,KAAK2lB,MAAMpJ,EAAyBzN,EAAWnL,UAAYyH,GAA0B+Z,GAC7GnlB,KAAK2lB,MAAM5F,EAAexD,EAAyBnR,GAA0B+Z,GAC7E,GAGCO,EAAkB,EAAI,GACrBE,EAAiB1Z,EAAaqH,mBAEpCrH,EAAamV,cAAcnQ,IACvBtF,EAAQzK,kBAIKykB,EAAb1U,iBAEO3F,EAAaqa,EAAgBra,EAAa2F,EAAY3F,cAAtDA,SACD0F,EAASD,EAAO8C,IAAI,SAAA+R,UAAaA,EAAUxX,MAAM9C,KACjDgY,EAAWrkB,SAASkV,yBAC1BnD,EAAO5K,QAAQ,SAAA0F,UAASwX,EAAS9T,YAAY1D,EAAMrI,gBAEnDsQ,EAAK3E,cAAcI,YAAY8T,IAC/BlQ,EAAAW,EAAKiJ,eAAc9V,aAAQ8J,EAAOM,OAAO,SAAAlD,UAASiB,QAAQjB,MAC1DnC,EAAa+H,aAAa1I,EAAY,EAAG0F,IAPlC1F,QASA2F,EAAa0U,GAEtB1Z,EAAa4Z,kBAAkB5U,0BAInC,eACQ/F,EAAQQ,KAAKR,MACbe,EAAeP,KAAKO,aACpBN,EAAUD,KAAKC,QACfoZ,EAAarZ,KAAKO,aAAasT,WAE/Btf,EAAe8H,EAAM4D,EAAQ1L,aAAc8kB,EAAW9c,IAAK8c,EAAW7c,KACtE4d,EAAe7Z,EAAaoP,IAAIpb,GAElC8lB,EAAkB,EAClBD,IACFC,EAAkBD,EAAa5Y,oBAAsBhC,EAAMoR,uBAC3DyJ,EAAkBra,KAAKwO,kBACnBnS,EAAMge,EAAiB7a,EAAMmN,WAAWlV,KAAM+H,EAAMmN,WAAWjV,MAC/D2iB,QAGD/Q,WAAW+Q,QACX3I,KAAK3H,MAAM,CAAED,MAAOuQ,GAAmB,iBAG9C,eACQ7a,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfoF,EAASrF,KAAKO,aAAaoH,iBAC9B/B,OAAO,SAAAxF,UAASuD,QAAQvD,KACrBF,EAAOF,KAAKsU,aAEZnU,EAAWX,EAAMlB,KAEvBkB,EAAMlB,KAAO2B,EAAQtM,WACjBuM,EAAKnK,MACLmK,EAAKlK,OAELmK,IAAaX,EAAMlB,OACrBkB,EAAMoR,uBAAyB/T,EAA0BoD,EAAQjL,OAAQwK,EAAMlB,MAC/EkB,EAAM1L,kBAAoB+I,EAA0BoD,EAAQnM,kBAAmB0L,EAAMlB,OAGnF+G,EAAOjL,QAAU,QAIhBoZ,aAAanO,mCAGpB,eAWQ/D,EACA2K,EACAoB,EACAV,EASJ2N,EAQIC,EAINC,EAlCMtlB,EAAM8K,KAAKC,QAAQ/K,IACnBqL,EAAeP,KAAKO,aAEpB4C,EAAa5C,EAAa4C,aAC1BkC,EAAS9E,EAAaoH,iBAEvBxE,IAIC7B,EAAetB,KAAKsB,aACpB2K,EAAejM,KAAKiM,aACpBoB,EAAerN,KAAKsQ,aAAaC,WACjC5D,EAAa3M,KAAKR,MAAMmN,WAG1B6N,EAAerX,EAAWxC,cAC1B2Z,EAA0BnX,EAC1B8I,EAIFqO,GAFgB7d,EAAU4Q,EAAavE,aAAeuE,EAAa1E,MAAOgE,EAAWlV,KAAMkV,EAAWjV,MAGlG4J,EACA2K,EAC6B,EAAxB9I,EAAWvL,aACpB0iB,EAAmBhZ,GAIfiZ,EAD4BlV,EAAO1I,MAAM,EAAG2d,EAAiB1iB,YAAc0iB,EAAiB3X,gBAAkB,GAAK0C,EAAOjL,QAC9EoL,OAAO,SAACiV,EAAOra,UACxDqa,EAAQra,EAAMpI,UAAY9C,GAChC,GAEHslB,EAAeF,EAAiB3Z,cAAgB4Z,EAEhDlV,EAAO3K,QAAQ,SAAA0F,OACPoC,EAAcgY,EACdvZ,EAAYb,EAAMpI,UAExBoI,EAAMwC,YAAYJ,GAClBgY,GAAgBvZ,EAAY/L,IAGzB8K,KAAKC,QAAQ1K,mBAChB8P,EAAO3K,QAAQ,SAAA0F,UAASA,EAAMsa,kDAIlC,eACQlb,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aACpBhB,EAAegB,EAAahB,eAC/BiG,OAAO,SAACC,EAAWH,YAAeG,EAAcH,IAAS,IACzDM,OAAO,SAAAxF,UAASuD,QAAQvD,KAErBuM,EAAanN,EAAMmN,WAEnBxJ,EAAa5C,EAAa4C,aAC1B2C,EAAYvF,EAAauF,eAE1B3C,WAICqW,EAAuB1T,EAAUnF,cAAgBmF,EAAU9N,UAAYmL,EAAWxC,cAAgBV,EAAQ/K,QAG5FylB,IAAAngB,WAAAA,IAAc,KAC1B0f,GADG9Z,QACe+O,mBAGlByL,EADepB,GADFpZ,EAAMuC,gBACiC,GACpBuX,EAAUvZ,cAEhDP,EAAMwC,YAAYgY,WAGhBC,EAAsB1X,EAAWxC,kBAEjBma,EAAAvb,EAAamH,SAASC,UAAtBe,WAAAA,IAAiC,KAA1CtH,EACHa,GADGb,QACepI,UAClB+iB,EAAkBF,EAAsB5Z,EAAYhB,EAAQ/K,OAE9D6lB,EAAkB9Z,GAAa0L,EAAWlV,WAK9C2I,EAAMwC,YAAYmY,GAClBF,EAAsBE,EAGnB/a,KAAKC,QAAQ1K,mBAChBgK,EAAa7E,QAAQ,SAAA0F,GACnBA,EAAMsa,mDAKZ,sBACM1a,KAAKC,QAAQ1K,wBACV+b,cAAc5W,QAAQ,SAAA0F,GACzBA,EAAMsa,eAAetS,EAAK5I,MAAMqR,sCAKtC,eA0BYmK,EACAC,EAYFzB,EAtCFha,EAAQQ,KAAKR,MACbe,EAAeP,KAAKO,aACpBN,EAAUD,KAAKC,QACfyR,EAAO1R,KAAK0R,KAGZvO,EAAa5C,EAAa4C,aAC1B2C,EAAYvF,EAAauF,YACzB8K,EAAyBpR,EAAMoR,uBAEhCzN,EAKMnD,KAAKwO,mBACRgL,EAAuB1T,EAAUnF,cAAgBmF,EAAU9N,UAAYmL,EAAWxC,gBAE5DnB,EAAMlB,KAChCkB,EAAMmN,WAAa,CACjBlV,KAAM0L,EAAWxC,cACjBjJ,KAAMoO,EAAUnF,cAAgBmF,EAAU9N,UAAYwH,EAAMlB,OAIxD0c,EAAyBne,EAA0BoD,EAAQhL,OAAQukB,GACnEyB,EAAY9X,EAAWxC,cAAgBtE,EAC3C2e,EACAxB,GAAwBha,EAAMlB,KAAOsS,GACrCA,GAGFpR,EAAMmN,WAAa,CACjBlV,KAAMwjB,EAAYrK,EAClBlZ,KAAMujB,EAAYrK,IAGb3Q,EAAQrM,UACX4lB,EAAuB1T,EAAUnF,cAAgBmF,EAAU9N,UAAYmL,EAAWxC,cAAgBV,EAAQ/K,IAGhHsK,EAAMmN,WAAa,CACjBlV,KAAM0L,EAAW3B,oBAAsBoP,EACvClZ,KAAM8hB,EAAuBrW,EAAW3B,oBAAsBoP,IAGhEpR,EAAMmN,WAAa,CACjBlV,KAAM0L,EAAW3B,oBAAsBoP,EACvClZ,KAAMoO,EAAUtE,oBAAsBoP,GArCxCpR,EAAMmN,WAAa,CACjBlV,KAAM,EACNC,KAAM,OA8CFwjB,EACNC,Ebx6CkBC,Eag6CdhH,EAAe5U,EAAMlB,KACrB5J,EAASuL,EAAQvL,OAIrBymB,Gbr6CkBC,Eao6CR1mB,Ibn6CA0mB,EAAIC,cAAgBngB,Mao6CdxG,EAAoByT,IAAI,SAAA7L,UAAOO,EAA0BP,EAAK8X,EAAc5gB,EAAgBkB,UAG7F,CADTwmB,EAAYre,EAA0BnI,EAA2B0f,EAAc5gB,EAAgBkB,QAC1EwmB,OAIvBpR,EAAQ4H,EAAK4J,KAAKxR,MACxBA,EAAMjM,MAAQ,CAAC2B,EAAMmN,WAAWlV,KAAM+H,EAAMmN,WAAWjV,MACvDoS,EAAMpV,OAASymB,oBAGjB,SAAuBtP,OACfrM,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aACpBe,EAAetB,KAAKsB,aACpB2K,EAAejM,KAAKiM,aACpBoB,EAAerN,KAAKsQ,aAAaC,cAElCtQ,EAAQpM,cAIPqB,EAAM+K,EAAQ/K,IACdpB,EAAoB0L,EAAM1L,kBAC1BynB,EAAehb,EAAasC,oBAE9B0Y,EAAe,MAIdja,GAAiB2K,WAehB2F,EAA0B3F,EAAatL,cAGzC6a,EAA+BnO,EAAaqH,SAAYrH,EAAasH,QAErE1I,EADA3K,EAGGka,GAAe,KAiCZC,EAhCFxZ,EAAeuZ,EAAc5jB,WAC7B0H,EAAckc,EAAclc,YAG5Boc,IADczZ,KADd6D,EAAYvF,EAAauF,aACgBlO,aACb0H,EAC9BA,EAAY1H,WACZ2jB,EAAe,EACbI,EAAyB1P,EAAatL,cAOtCgL,EANa6P,EAAc7a,cAAgB6a,EAAcxjB,WAAa2jB,EAAyB/J,GAMlE1c,EAAMpB,GALtB0L,EAAM3J,SAAW2J,EAAMlB,KAGkB,EAA3Bod,EAAYzZ,GAId0J,QACxBiQ,iBAAiB,CACpB/P,YACAwD,aAAcmM,EACd5S,UAAWvR,EAAUE,KACrB8hB,WAAY,CACV9c,IAAK0F,EAAe,EACpBzF,IAAKkf,EAAY,EACjBthB,OAAQshB,EAAYzZ,EAAe,KAMrChC,EAAQrM,UAAYqO,IAAiBsZ,GAAgB5P,IAMtC,GAJX8P,GADAtY,EAAa5C,EAAa4C,cAE5BA,EAAWvL,YACV,SAGEgkB,iBAAiB,CACpB/P,YACAwD,aAAcmM,EACd5S,UAAWvR,EAAUE,KACrB8hB,WAAY,CACV9c,IAAK,EACLC,IAAKif,EAAa,EAClBrhB,OAAQqhB,UAOVI,EAAqBtb,EAAauF,eACX+V,GAAsB5Z,IAAiB4Z,EAAmBjkB,aAE1D+T,QAI7B6P,EAAgBA,EAAclc,gBAIhCkc,EAAgBvP,EACTuP,GAAe,KAIdrY,EA2BE2C,EAGE/R,EAjCJ+nB,EAAatc,EAAM3J,SACnBkmB,EAAgBP,EAAc5jB,WAC9ByH,EAAcmc,EAAcnc,YAG5B2c,IADeD,KADf5Y,EAAa5C,EAAa4C,cACkBvL,aACfyH,EAC/BA,EAAYzH,YACX,EACC+jB,EAAyB1P,EAAatL,cAMtCgL,EAAuDmQ,GAL3CN,EAAc7a,eAAiBgb,EAAyB/J,GAKxC1c,EAAMpB,EAFoB,EAA5BioB,EAAgBC,GAGjBrQ,QACxBiQ,iBAAiB,CACpB/P,YACAwD,aAAcmM,EACd5S,UAAWvR,EAAUC,KACrB+hB,WAAY,CACV9c,IAAKyf,EAAY,EACjBxf,IAAKuf,EAAgB,EACrB3hB,OAAQ2hB,EAAgBC,EAAY,KAMtC/b,EAAQrM,UAA8B,IAAlBmoB,GAAuBpQ,IACvC7F,EAAYvF,EAAauF,cAEdA,EAAUlO,WAAa2jB,IAChCxnB,EAAY+R,EAAUlO,gBAEvBgkB,iBAAiB,CACpB/P,YACAwD,aAAcmM,EACd5S,UAAWvR,EAAUC,KACrB+hB,WAAY,CACV9c,IAAKxI,EAAY,EACjByI,IAAK+e,EACLnhB,OAAQmhB,EAAexnB,UAOzBkoB,EAAsB1b,EAAa4C,gBACX8Y,GAAuBF,IAAkBE,EAAoBrkB,aAG7D+T,QAI9B6P,EAAgBA,EAAcnc,uBA9IzBuc,iBAAiB,CACpB/P,YACAwD,aAAc,KACdzG,UAAW,KACXyQ,WAAY,CACV9c,IAAK,EACLC,IAAK+e,EACLnhB,OAAQmhB,EAAe,0BA2I/B,SAAyBW,OAmBjB/c,EAGA4N,SAhBElB,EAAmDqQ,YAAxC7M,EAAwC6M,eAA1BtT,EAA0BsT,YAAf7C,EAAe6C,aACrDjc,EAAUD,KAAKC,QACf8Q,EAAiB/Q,KAAKR,MAAMuR,eAC5BoL,EAAmBpL,EAAeqL,KAAK,SAAC1U,OAACnL,OAAKC,cAASD,IAAQ8c,EAAW9c,KAAOC,IAAQ6c,EAAW7c,MACpG6f,EAAarc,KAAKmJ,SAASmT,MAAMnmB,EAAOS,aAE1CulB,GAAqBE,IAKzBtL,EAAevV,KAAK,CAAC6d,EAAW9c,IAAK8c,EAAW7c,MAE1C2C,EAAQkQ,EACVA,EAAazX,WACb,EACEmV,IAAYlB,GACdA,EAAUkB,eAGT3D,aACHjT,EAAOS,WACPiV,EACAkB,EACA,CACE5N,QACAiB,MAAOiP,EACPzG,YACA/K,MAAOwb,EACPkD,KAAM,SAACthB,OACCsF,EAAe6H,EAAK7H,iBACrB8O,SACIjH,EAAK/E,OAAO9C,EAAasT,WAAWrX,IAAM,EAAGvB,OAGhDiI,EAAiBlI,EAAaC,GAE9BG,EAAWwN,IAAcvR,EAAUE,KACrC2L,EAAevG,MAAM,EAAG0c,EAAWjf,QACnC8I,EAAevG,OAAO0c,EAAWjf,eAEjCwO,IAAcvR,EAAUE,KACtB0I,EAAQrM,UAAYuL,IAAUoB,EAAasC,eAEtCuF,EAAK/E,OAAO,EAAGjI,GAEfiU,EAAamN,YAAYphB,GAEzBwN,IAAcvR,EAAUC,KAC7B2I,EAAQrM,UAAsB,IAAVuL,EAEfiJ,EAAK/E,OAAOgW,EAAW7c,IAAMpB,EAAShB,OAAS,EAAGgB,GAElDiU,EAAazV,aAAawB,GAI5BgN,EAAK/E,OAAO,EAAGjI,8BAOhC,eACQoE,EAAQQ,KAAKR,MACbS,EAAUD,KAAKC,QACfM,EAAeP,KAAKO,aACpB8M,EAAerN,KAAKsQ,aAAaC,WACjC7M,EAAgB1D,KAAK0D,cACnBlO,EAAsCyK,oBAAAA,uBAKzCD,KAAKiM,kBAqBFwQ,EAgBAjU,EAQFkU,EACAC,EACAC,EAEAC,EAzCApF,EAAoBzX,KAAKsR,cACzBwL,EAAmB9c,KAAK+c,oBAExBrV,EAAiC1H,KAAKgd,wBAAwBvF,EAAmBqF,GAA/EG,gBAAa3W,kBAEjB2W,EAAY7iB,QAAU,GAAKkM,EAAclM,QAAU,IAKnDiT,EAAaqH,QACfoI,EAAiBthB,WAAjBshB,EAAyBxW,IAEnBmW,EAAuBK,EAAiB,GAAGnc,cACjDnB,EAAMqR,eAAiB4L,GAGzBK,EAAiBpiB,QAAQ,SAAA0F,GACvBA,EAAMsa,eAAelb,EAAMqR,kBAGxBrb,IACE6X,EAAaqH,SAChBpO,EAAc5L,QAAQ,SAAA0F,OACd8c,EAAe9c,EAAMrI,aAC3BmlB,EAAatZ,YAAcF,EAAcxJ,YAAYgjB,KAInD1U,EAAWjV,SAASkV,yBAC1BwU,EAAYviB,QAAQ,SAAA0F,GAClBoI,EAAS1E,YAAY1D,EAAMrI,gBAG7B2L,EAAcI,YAAY0E,IAGtBkU,EAAoBI,EAAiB,GACrCH,EAAmBG,EAAiBA,EAAiB1iB,OAAS,GAG9DyiB,EAAkB,CACtBtgB,KAHIqgB,EAAc,SAACxc,UAAiBA,EAAMxI,YAAcwI,EAAMuC,gBAAkB,GAAKpC,EAAarI,kBAGjFwkB,GACjBlgB,IAAKogB,EAAYD,SAEdrL,cAAgBwL,OAChB3T,SAASgU,QAAQhnB,EAAOU,eAAgB,CAC3C1D,KAAMgD,EAAOU,eACbgH,MAAOgf,mBAvDFvL,cAAgB,GACd5N,EAAc/H,YACnB+H,EAAcxJ,YAAYwJ,EAAc/H,uCAyD9C,SAAgC8b,EAA4BqF,OACpDM,EAAe3F,EAAkBtP,IAAI,kBAAM,IAC3CkV,EAAcP,EAAiB3U,IAAI,kBAAM,WAE/CsP,EAAkB/c,QAAQ,SAAC+H,EAAWuZ,GACpCc,EAAiBpiB,QAAQ,SAAC4iB,EAAUC,GAC9B9a,IAAc6a,IAChBF,EAAapB,KACbqB,EAAYE,UAgBX,CAAEjX,cAXa8W,EAAa5X,OAAO,SAACgS,EAAkBpkB,EAAO+L,UACjD,IAAV/L,IACCokB,GAASC,EAAkBtY,KAC/BqY,GACH,IAOqByF,YANJI,EAAY7X,OAAO,SAACgY,EAAgBpqB,EAAO+L,UAC5C,IAAV/L,IACCoqB,GAAOV,EAAiB3d,KAC5Bqe,GACH,qBAKL,SAAqBnY,OAiBXoY,EAXErD,EAIFsD,EATFzd,EAAUD,KAAKC,QACfsR,EAAcvR,KAAKuR,aAEG,IAAxBtR,EAAQ5K,YAYD4K,EAAQ5K,aACXooB,EAAmBxd,EAAQ5K,YAEjCgQ,EAAO3K,QAAQ,SAAA0F,OACPyX,EAAkBzX,EAAM0X,mBAAmB2F,GAC7C5F,GACFzX,EAAM5H,OAAO+Y,EAAYsG,IACzBtG,EAAYsG,GAAmBzX,EAAMzB,WAErCyB,EAAM5H,YAKZ6M,EAAO3K,QAAQ,SAAA0F,GACbA,EAAM5H,YA1BD+Y,EAAYoM,UACTvD,EAAe/U,EAAO,GAC5BkM,EAAYoM,QAAUvD,EAAazb,WAG/B+e,EAAcnM,EAAYoM,QAEhCtY,EAAO3K,QAAQ,SAAA0F,GACbA,EAAM5H,OAAOklB,wBAsBnB,eACQzd,EAAUD,KAAKC,aAEhBmT,SAAW,IAAIwK,WAAS5d,KAAKoS,gBAAiB,CACjD5d,UAAWyL,EAAQzL,UACnBC,eAAgBwL,EAAQxL,eACxBiB,sBAAuBuK,EAAQvK,sBAC/BmoB,MAAO5d,EAAQtM,WAAa,EAAE,EAAG,GAAK,CAAC,GAAI,UAGxC+d,KAAKoM,QAAQ7d,EAAQtM,WAAa,CAAC,QAAS,IAAM,CAAC,GAAI,SAAUqM,KAAKoT,yCCnwD3EnY,EACAgF,gBAAAA,UAKIgV,IAHJjH,sBA3CM5F,uBAAuC,KAGvCA,8BAAsC,EAuavCA,SAAS,eACRhJ,EAAWgJ,EAAKhJ,SAChBa,EAAUmI,EAAKnI,QACfgV,EAAU7M,EAAKrQ,aAEfsP,EAAYjI,EAASmB,aAAa8G,YACnCpH,EAAQ3K,gBACX+R,EAAU3M,QAAQ,SAAA0F,UAASA,EAAM2B,oBAG7Bgc,EAAsB9d,EAAQ1K,oBAC9B0K,EAAQ3K,iBACe,IAAxB2K,EAAQ5K,YAGP2oB,EAAS/I,EAAQhb,cACjBgkB,EAAYD,EAAO1kB,MAAMtD,cAC/BgoB,EAAO1kB,MAAMtD,OAAYgoB,EAAOjf,kBAEhCK,EAAS2C,cAET3C,EAASkV,aAELyJ,GACF3e,EAAS8e,4BAA4B7W,GAGvCjI,EAAS5G,SACTwlB,EAAO1kB,MAAMtD,OAASioB,EAEf7V,GA0UDA,eAAe,SACrB+V,EACAtS,EACAkB,EACAmP,gBAAAA,UAQQ1c,EACAkI,EAAEjQ,EAAMC,EAEV0mB,EATAhf,EAAWgJ,EAAKhJ,SAElBif,GAAoB,SAGpBjf,IACII,EAAQJ,EAASkR,aAAaC,WAC5B9Y,GAAFiQ,EAAiBtI,EAASwN,sBAAlBlV,SAEV0mB,EAAWzgB,EADHyB,EAAS4B,oBACW,CAACvJ,EAAMA,EAAMC,IAEzC0Q,EAAKnI,QAAQrM,WACfwqB,GAAY,GAEdC,GAAYrQ,YAAMmP,eAAQgB,EAAW7jB,EAAM,CACzCnH,KAAMgrB,EACNhf,MAAOiJ,EAAKxQ,WACZwI,MAAOgI,EAAKtQ,kBACZ8Q,UAAWpJ,EAAMoJ,UACjB8L,QAASlV,EAAMkV,QACf0J,WACAvS,YACAkB,aACCmP,KAGE,CACL3S,UAAA,SAAUvL,UACHqgB,GACHrgB,IAEKgC,MAETwJ,UAAA,SAAUxL,UACJqgB,GACFrgB,IAEKgC,QAMLoI,aAAa,SAACyD,OASZyS,EAOAC,EAIJC,EAGIC,EAtBFrf,EAAWgJ,EAAKhJ,SAChBI,EAAQJ,EAASkR,aAAaC,WAC9BtQ,EAAUmI,EAAKnI,QAEfrC,EAAMiO,EAAUjO,IAAIkM,MACpB4U,EAAmBtf,EAAS4B,2BAE9B6K,EAAUkB,WAAavN,EAAMkV,UACzB4J,EAAcre,EAAQtM,WACxBkY,EAAUlC,WAAWC,QACrBiC,EAAUlC,WAAWE,QAIrB2U,EAAe5gB,EAAM8gB,EACnBH,EAHkBD,EAAc,GAGF1gB,EAAM8gB,EACtCze,EAAQrM,UAAY2qB,IAGtBC,GAA+B,EAAfA,GAAoB,EAAI,IADjBpf,EAASqB,oBAC+BpM,KAAKyW,IAAI0T,KAGpEC,EAAoC,IAAjBD,EACrBhf,EAAMoJ,UACS,EAAf4V,EACEnnB,EAAUE,KACVF,EAAUC,KAEhBkI,EAAMoJ,UAAY6V,GAEpBjf,EAAMmJ,OAASkD,EAAUlD,MAAMmB,MAE/B1K,EAASkK,WAAW1L,EAAKiO,GAClBzD,EAAKgB,aAAajT,EAAOI,KAAMsV,EAAWA,EAAUkB,WACxDvD,UAAU,WAETpK,EAASkK,WAAWoV,EAAkB7S,MAzzBtCxQ,EAASJ,SACXga,EAAU1hB,SAASorB,cAAc1jB,UAEzB,IAAIxB,MAAM,mCAEb,CAAA,IAAIwB,EAAQ2jB,UAAiC,IAArB3jB,EAAQ4jB,eAG/B,IAAIplB,MAAM,wDAFhBwb,EAAUha,EAKZmN,EAAK6M,QAAUA,EAEf7M,EAAKnI,QAAU3F,EAAM,GAAI9G,EAAiByM,OAEpC6e,EAAiB1W,EAAKnI,QACtB9K,EAAW2pB,EAAe3pB,gBAE5BA,KAAYlC,IACd6rB,EAAe3pB,SAAWlC,EAA0BkC,IAItDiT,EAAKhJ,SAAW,IAAI2f,EAAS3W,EAAMA,EAAKnI,QAASmI,EAAKgB,cACtDhB,EAAK4W,cACL5W,EAAK6W,iBA/Hc/V,uCAgJrB,SAAYhV,OAKFuO,EAJFnB,EAAetB,KAAKlI,kBACpBuV,EAAerN,KAAKZ,SAASkR,aAAaC,kBAE5CjP,GAAgB+L,EAAala,OAASiE,IAClCqL,EAAYnB,EAAa7J,SAE7BgL,EAAUyc,MAAMhrB,GAIb8L,aAST,SAAY9L,OAKF+O,EAJF3B,EAAetB,KAAKlI,kBACpBuV,EAAerN,KAAKZ,SAASkR,aAAaC,kBAE5CjP,GAAgB+L,EAAala,OAASiE,IAClC6L,EAAY3B,EAAa5J,SAE7BuL,EAAUic,MAAMhrB,GAIb8L,eAUT,SAAcb,EAAejL,OACrBkL,EAAWY,KAAKZ,SAChBgB,EAAQhB,EAASmB,aAAaoP,IAAIxQ,GAClCK,EAAQJ,EAASkR,aAAaC,eAE/BnQ,GAASZ,EAAMrM,OAASiE,SACpB4I,SAQDQ,EAOA2e,EAMAC,EACAjb,EAnBF+O,EAAiB9S,EAAMoB,oBACvBoO,EAAiBxQ,EAASmC,oBAE5BsH,EAAczI,EACdJ,KAAKC,QAAQrM,WAQTurB,EALoB,CACxBjM,GAHI1S,EAAiBpB,EAASqB,qBAI9ByS,EACAA,EAAiB1S,GAEuBgF,OAAO,SAACuN,EAASsM,UACjDhrB,KAAKyW,IAAIuU,EAAUzP,GAAkBvb,KAAKyW,IAAIiI,EAAUnD,GAC5DyP,EACAtM,GACH/e,EAAAA,GAAYoM,EAAMW,4BAEfqe,EAAahf,EAAMyB,qBAEZ,GADPsC,EAASgb,EAAkBjM,GAG/BrK,EAAcuW,EAAW,GAChBjb,EAAS,IAElB0E,EAAcuW,EAAWA,EAAWhlB,OAAS,KAG/CyO,EAAcA,EAAYnG,MAAMmG,EAAYlG,iBAAiB,IACjDC,YAAYuc,QAEpBld,EAAejC,KAAKpI,cAEtBgY,IAAmB/G,EAAYrH,qBAAuBS,IAAiB9C,SAClEa,SAGHqB,EAAYjB,EAAMxI,aAAewH,EAASsQ,kBAC5C,GACAvZ,EAAOM,cAEX2I,EAASzH,OACPkR,EACAzJ,EAASqC,sBAAsBoH,GAC/BxH,EACA,KACAnN,GAEK8L,iBAQT,kBACSA,KAAKZ,SAASsQ,gCAQvB,kBACS1P,KAAKiV,mBAQd,kBACSjV,KAAKZ,SAASpH,6BAQvB,eAEQoI,EADWJ,KAAKZ,SACCtH,yBAChBsI,GAEH,iBAQN,SAAgBjB,OAERiB,EADWJ,KAAKZ,SACCmB,aAAaoP,IAAIxQ,UACjCiB,GAEH,qBASN,SAAoBkf,OAEZ/e,EADWP,KAAKZ,SACQmB,oBACf+e,EACX/e,EAAa8G,YACb9G,EAAaoH,kBAGd/B,OAAO,SAAAxF,WAAWA,wBAQvB,kBACSJ,KAAKZ,SAAS2d,qCAQvB,kBACS/c,KAAKZ,SAASmB,aAAarI,iCAQpC,kBACS8H,KAAKZ,SAASmB,aAAaqH,gCASpC,kBACS5H,KAAKZ,SAASmB,aAAasC,+BAUpC,SAAoB1D,eACbC,SAAS8X,aAAa/X,GAEpBa,kBAQT,kBACSA,KAAKZ,SAASkR,aAAaC,WAAWoE,uBAQ/C,uBACOvV,SAASmgB,SAEPvf,qBAQT,uBACOZ,SAASogB,UAEPxf,kBAQT,eACQZ,EAAWY,KAAKZ,SAEhBiG,EAASjG,EAASmB,aAAaoH,iBAClC/B,OAAO,SAAAxF,WAAWA,IAClB+H,IAAI,SAAA/H,SACI,CACLgV,KAAMhV,EAAMrI,aAAa0nB,UACzBtgB,MAAOiB,EAAMxI,oBAIZ,CACLuH,MAAOC,EAASsQ,kBAChBrK,SACAxP,SAAUuJ,EAAS4B,kCASvB,SAAiBmU,QACV/V,SAASsgB,QAAQvK,iBASxB,SAAkBP,eACXxV,SAASugB,WAAW/K,GAClB5U,sBAST,SAAqB4U,eACdxV,SAAS8V,cAAcN,GACrB5U,gBAWT,SAAeuD,aAWR,IAAMnP,kBAXEmP,WACRwT,MAED/W,KAAKC,QAAQtL,YACfmF,OAAO8lB,oBAAoB,SAAU5f,KAAKxH,aAGvC4G,SAAS7G,QAAQgL,aACtBvD,KAAK6f,qCAAsBtnB,UAGXyH,UACA5L,GAAK,gBAwDvB,SAAe6G,OACPmE,EAAWY,KAAKZ,SAChB8D,EAAiBlI,EAAaC,GAE9BsN,EAAiBlU,KAAKmI,IAAI4C,EAASmB,aAAasT,WAAWtX,IAAM2G,EAAe9I,OAAQ,GACxF0lB,EAAkB1gB,EAASiE,OAAOkF,EAAgBrF,eAEnD6c,mBAAmBD,GAEjBA,YAiBT,SAAc7kB,OACNmE,EAAWY,KAAKZ,SAChB4gB,EAAiB5gB,EAASiE,OAAOjE,EAASmB,aAAasT,WAAWrX,IAAM,EAAGvB,eAE5E8kB,mBAAmBC,GAEjBA,aA4BT,SAAe7gB,EAAelE,OACtB+L,EAAiBhH,KAAKZ,SAASgG,QAAQjG,EAAOlE,eAE/C8kB,mBAAmB/Y,GAEjBA,YAUT,SAAc7H,EAAe+H,uBAAAA,KACpBlH,KAAKZ,SAASkE,OAAOnE,EAAO+H,0BAWrC,SAA2B+Y,OACnB7gB,EAAWY,KAAKZ,SAChBkS,EAAgBlS,EAAShH,mBACzB8nB,EAAaD,EAAWC,WAAW1a,OAAO,SAAC2a,EAAiCzY,OAAC0Y,cACjFD,QAAgBC,EACTD,GACN,IAEG7f,EAAa2f,EAAWI,KAAKjmB,OAC7BojB,EAAQyC,EAAWzC,MAQnB8C,IAHiBhP,EAAcnJ,IAAI,SAAA/H,UAJfA,EAIyCA,GAHpDxI,YAAcwI,EAAMuC,gBAAkB,GAAKrC,EADjC,IAACF,IAKvBwF,OAAO,SAAAtJ,UAAuC,MAAhC4jB,EAAW5jB,EAAMgE,KAEakd,GACzCnW,EAAYjI,EAASmB,aAAa8G,mBAExCjI,EAASmhB,iBAAiBD,EAAgBnY,IAAI,SAAAhJ,UAASkI,EAAUlI,MAE1DmhB,gBAUT,SAAkBE,cACRN,EAAwCM,aAA5BhD,EAA4BgD,QAArBC,EAAqBD,UAAZhJ,EAAYgJ,UAC1CphB,EAAWY,KAAKZ,SAChBmB,EAAenB,EAASmB,aACxByF,EAAahG,KAAKC,QAAQrM,SAC1B2R,EAAahF,EAAaqH,gBAC1B8Y,EAAmBngB,EAAahB,eAGhCud,EAAmB1d,EAAShH,mBAC/BwN,OAAO,SAAAxF,UAASrC,EAAUyZ,EAAS,SAAArY,UAC3BA,IAAUiB,EAAMxI,aACpB,OACPwH,EAASmhB,iBAAiBzD,GAIxBU,EAAMpjB,QAAU,GACbod,EAAQpd,QAAU,GAClBqmB,EAAQrmB,QAAU,GAClBmL,IAAemb,EAAiBtmB,cAE5B4F,SAEH2gB,EAAqBpgB,EAAaoH,iBAClCjC,EAAqB,GACrBC,EAAuBzH,EAAQqH,GAAY4C,IAAI,iBAAM,KAE3D+X,EAAWxlB,QAAQ,SAACgN,OAACkZ,OAAWC,OAC9Bnb,EAAUmb,GAAYF,EAAmBC,GACzClb,EAAUmb,GAAUja,SAASia,KAG/BrD,EAAM9iB,QAAQ,SAAAomB,GACZpb,EAAUob,GAAY,IAAIpc,EAAM,KAAMoc,EAAU1Y,EAAKhJ,YAGnD4G,GACF9H,EAAQqH,GAAY7K,QAAQ,SAAAqmB,OACpBC,EAAiBN,EAAiBK,GAClCE,EAAgBtb,EAAUob,GAEhCb,EAAWxlB,QAAQ,SAACgN,OAACkZ,OAAWC,OAC9BI,EAAcJ,GAAYG,EACtBA,EAAeJ,GACflb,EAAUmb,GAAUne,MAAMqe,GAAY,GAE1CE,EAAcJ,GAAUja,SAASia,KAGnCrD,EAAM9iB,QAAQ,SAAAomB,OACNxD,EAAW5X,EAAUob,GAE3BG,EAAcH,GAAYxD,EAAS5a,MAAMqe,GAAY,OAK3DvD,EAAM9iB,QAAQ,SAAAyE,GAAWC,EAASqU,qBAAqB,CAAElX,IAAK4C,EAAO3C,IAAK2C,MAC1EqY,EAAQ9c,QAAQ,SAAAyE,GAAWC,EAASqU,qBAAqB,CAAElX,IAAK4C,EAAQ,EAAG3C,IAAK2C,EAAQ,UAElF4R,EAAiB3R,EAAS8hB,oBAChCnQ,EAAerW,QAAQ,SAACgN,EAAYvK,OAAXZ,OAAKC,OAEtBiK,EAAc+W,EAAM5X,OAAO,SAAAzG,UAASA,EAAQ5C,GAAOgE,EAAa4gB,IAAIhiB,KAAQ/E,OAC9Eod,EAAQ5R,OAAO,SAAAzG,UAASA,EAAQ5C,IAAKnC,OACzC2W,EAAehM,OAAO5H,EAAK,EAAG,CAACZ,EAAMkK,EAAajK,EAAMiK,MAIrC,EAAjBga,EAAQrmB,QAEV8lB,EAAWxlB,QAAQ,SAACgN,OAAGhQ,OAAY0H,EAASqU,qBAAqB,CAAElX,IAAK7E,EAAM8E,IAAK9E,MAErF6I,EAAakV,cAAc/P,EAAWC,QACjCyb,4BAA6B,UASpC,SAAYZ,OACFH,EAA8CG,OAAxCN,EAAwCM,aAA5BhD,EAA4BgD,QAArBC,EAAqBD,UAAZhJ,EAAYgJ,aAGlDhD,EAAMpjB,QAAU,GAAKod,EAAQpd,QAAU,GAAKqmB,EAAQrmB,QAAU,SACzD4F,SAODqZ,EAIEgI,EACAC,EACAC,EACAC,EAINC,EAhBEriB,EAAWY,KAAKZ,SAChBsI,EAAkC1H,KAAKC,QAArC1K,sBAAmB3B,aACrB2M,EAAenB,EAASmB,aAEzBhL,IACG8jB,EAAa9Y,EAAasT,WAC5B4N,EAAmCjB,EAEnC5sB,IACIytB,EAAyBhI,EAAW7c,IACpC8kB,EAAsBjB,EAAKjmB,QAAUmG,EAAaqH,gBAAkB,IAAO,EAC3E2Z,EAAgB/D,EAAM5X,OAAO,SAAAzG,UAASA,EAAQmiB,IAC9CE,EAAkBhK,EAAQ5R,OAAO,SAAAzG,UAASA,GAASkiB,IAIzDI,EAAiB,CACfjE,MAAO+D,EACPrB,WALyBA,EAAWta,OAAO,SAAC8B,gBAA6B2Z,IAMzE7J,QAASgK,EACTf,QANsBA,EAAQ7a,OAAO,SAAC8B,gBAA6B2Z,WASlEK,WAAWD,QAGZnQ,EAAgB/b,EAClB6J,EAAShH,mBACT4H,KAAKnI,cAAa,UAEtB2lB,EAAM9iB,QAAQ,SAAAinB,OACNC,EAAevB,EAAKsB,GACpBE,EAAcvQ,EAAcqQ,GAElCE,EAAY/hB,WAAW8hB,GAEvBC,EAAY9f,gBAEV/B,KAAKohB,6BAEPhiB,EAASmhB,iBAAiB,SACrBa,4BAA6B,GAEpChiB,EAAS5G,SAEFwH,oBAGT,eACQmJ,EAAWnJ,KACXZ,EAAW+J,EAAS/J,SACpBkR,EAAelR,EAASkR,aAG9BnH,EAAS2Y,aAAe,CACtB3Y,WACA/J,SAAU+J,EAAS/J,SACnBiK,UAAWiH,EAAajH,UACxBD,aAAcD,EAASC,aACvBE,WAAYH,EAASG,WACrBsB,WAAYxL,EAASwL,gBAGjBuM,EAAW,OACZ,IAAMrc,KAAO/D,YAAP+D,OACHuG,EAAYtK,EAAY+D,GAE9Bqc,EAAS9V,GAAa,SAAC2H,UAAWsH,EAAayR,KAAK1gB,EAAW2H,EAAGG,EAAS2Y,gBAHlEhnB,GAOXqO,EAAS/J,SAAS4iB,mBAAmB7K,mBAGvC,eAQU0I,SAPF5f,EAAUD,KAAKC,QAEjBA,EAAQtL,YACVmF,OAAOmoB,iBAAiB,SAAUjiB,KAAKxH,QAGrCyH,EAAQxK,yBACJoqB,EAAuB,IAAIqC,GAEZlL,GAAG,WAAY,WAClC5O,EAAK5P,WAEPqnB,EAAqB7I,GAAG,eAAgB,SAAAhO,GAClCA,EAAEmZ,YAAcnZ,EAAEoZ,gBACpBha,EAAK5P,WAGTqnB,EAAqB7I,GAAG,QAAS,SAAAhO,GAC/BZ,EAAK+U,QAAQhnB,EAAOW,cAAe,CACjC3D,KAAMgD,EAAOW,cACbmE,QAAS+N,EAAE/N,YAGf4kB,EAAqBwC,MAAM,CAACriB,KAAKiV,eAE5B4K,qBAAuBA,yBA8FhC,SAA2Bxa,mBACzBrF,KAAK6f,qCAAsBwC,MAAMhd,EAAO8C,IAAI,SAAA/H,UAASA,EAAMrI,iBAh5B/CuqB,UAAkB,QAWlBA,YAAuBjrB,EAkBvBirB,SAAoBnsB,KAjDbosB,UCzCtBD,EAAiBE,6Bf0OkBC,EAAgBC,GAClD9nB,OAAOC,KAAKrD,GAAkBkD,QAAQ,SAACxB,GACjCupB,EAAUvpB,KAGdupB,EAAUvpB,GAAQ,8BAASsB,mBAAAA,IAAAmoB,sBACnBC,GAASlb,EAAA1H,KAAK0iB,IAAcxpB,WAASypB,UAGvCC,IAAW5iB,KAAK0iB,GACX1iB,KAEA4iB,OerPdN,EAAiB9uB,gBAAkBA,EACnC8uB,EAAiBxvB,UAAYA"} \ No newline at end of file diff --git a/dist/flicking.pkgd.js b/dist/flicking.pkgd.js new file mode 100644 index 0000000000..7533cb27d9 --- /dev/null +++ b/dist/flicking.pkgd.js @@ -0,0 +1,11350 @@ +/* +Copyright (c) 2015-present NAVER Corp. +name: @egjs/flicking +license: MIT +author: NAVER Corp. +repository: https://github.com/naver/egjs-flicking +version: 3.7.2 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.eg = global.eg || {}, global.eg.Flicking = factory())); +}(this, (function () { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; + } + + /* + Copyright (c) NAVER Corp. + name: @egjs/component + license: MIT + author: NAVER Corp. + repository: https://github.com/naver/egjs-component + version: 2.2.2 + */ + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, + m = s && o[s], + i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { + value: o && o[i++], + done: !o + }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + + /* + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + function isUndefined(value) { + return typeof value === "undefined"; + } + /** + * A class used to manage events in a component + * @ko 컴포넌트의 이벤트을 관리할 수 있게 하는 클래스 + * @alias eg.Component + */ + + + var Component = + /*#__PURE__*/ + function () { + /** + * @support {"ie": "7+", "ch" : "latest", "ff" : "latest", "sf" : "latest", "edge" : "latest", "ios" : "7+", "an" : "2.1+ (except 3.x)"} + */ + function Component() { + /** + * @deprecated + * @private + */ + this.options = {}; + this._eventHandler = {}; + } + /** + * Triggers a custom event. + * @ko 커스텀 이벤트를 발생시킨다 + * @param {string} eventName The name of the custom event to be triggered 발생할 커스텀 이벤트의 이름 + * @param {object} customEvent Event data to be sent when triggering a custom event 커스텀 이벤트가 발생할 때 전달할 데이터 + * @param {any[]} restParam Additional parameters when triggering a custom event 커스텀 이벤트가 발생할 때 필요시 추가적으로 전달할 데이터 + * @return Indicates whether the event has occurred. If the stop() method is called by a custom event handler, it will return false and prevent the event from occurring. Ref 이벤트 발생 여부. 커스텀 이벤트 핸들러에서 stop() 메서드를 호출하면 'false'를 반환하고 이벤트 발생을 중단한다. 참고 + * @example + * ``` + * class Some extends eg.Component { + * some(){ + * if(this.trigger("beforeHi")){ // When event call to stop return false. + * this.trigger("hi");// fire hi event. + * } + * } + * } + * + * const some = new Some(); + * some.on("beforeHi", (e) => { + * if(condition){ + * e.stop(); // When event call to stop, `hi` event not call. + * } + * }); + * some.on("hi", (e) => { + * // `currentTarget` is component instance. + * console.log(some === e.currentTarget); // true + * }); + * // If you want to more know event design. You can see article. + * // https://github.com/naver/egjs-component/wiki/How-to-make-Component-event-design%3F + * ``` + */ + + + var __proto = Component.prototype; + + __proto.trigger = function (eventName) { + var _this = this; + + var params = []; + + for (var _i = 1; _i < arguments.length; _i++) { + params[_i - 1] = arguments[_i]; + } + + var handlerList = this._eventHandler[eventName] || []; + var hasHandlerList = handlerList.length > 0; + + if (!hasHandlerList) { + return true; + } + + var customEvent = params[0] || {}; + var restParams = params.slice(1); // If detach method call in handler in first time then handler list calls. + + handlerList = handlerList.concat(); + var isCanceled = false; // This should be done like this to pass previous tests + + customEvent.eventType = eventName; + + customEvent.stop = function () { + isCanceled = true; + }; + + customEvent.currentTarget = this; + var arg = [customEvent]; + + if (restParams.length >= 1) { + arg = arg.concat(restParams); + } + + handlerList.forEach(function (handler) { + handler.apply(_this, arg); + }); + return !isCanceled; + }; + /** + * Executed event just one time. + * @ko 이벤트가 한번만 실행된다. + * @param {string} eventName The name of the event to be attached 등록할 이벤트의 이름 + * @param {function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수 + * @return An instance of a component itself컴포넌트 자신의 인스턴스 + * @example + * ``` + * class Some extends eg.Component { + * hi() { + * alert("hi"); + * } + * thing() { + * this.once("hi", this.hi); + * } + * + * var some = new Some(); + * some.thing(); + * some.trigger("hi"); + * // fire alert("hi"); + * some.trigger("hi"); + * // Nothing happens + * ``` + */ + + + __proto.once = function (eventName, handlerToAttach) { + var _this = this; + + if (typeof eventName === "object" && isUndefined(handlerToAttach)) { + var eventHash = eventName; + + for (var key in eventHash) { + this.once(key, eventHash[key]); + } + + return this; + } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { + var listener_1 = function () { + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + handlerToAttach.apply(_this, args); + + _this.off(eventName, listener_1); + }; + + this.on(eventName, listener_1); + } + + return this; + }; + /** + * Checks whether an event has been attached to a component. + * @ko 컴포넌트에 이벤트가 등록됐는지 확인한다. + * @param {string} eventName The name of the event to be attached 등록 여부를 확인할 이벤트의 이름 + * @return {boolean} Indicates whether the event is attached. 이벤트 등록 여부 + * @example + * ``` + * class Some extends eg.Component { + * some() { + * this.hasOn("hi");// check hi event. + * } + * } + * ``` + */ + + + __proto.hasOn = function (eventName) { + return !!this._eventHandler[eventName]; + }; + /** + * Attaches an event to a component. + * @ko 컴포넌트에 이벤트를 등록한다. + * @param {string} eventName The name of the event to be attached 등록할 이벤트의 이름 + * @param {function} handlerToAttach The handler function of the event to be attached 등록할 이벤트의 핸들러 함수 + * @return An instance of a component itself컴포넌트 자신의 인스턴스 + * @example + * ``` + * class Some extends eg.Component { + * hi() { + * console.log("hi"); + * } + * some() { + * this.on("hi",this.hi); //attach event + * } + * } + * ``` + */ + + + __proto.on = function (eventName, handlerToAttach) { + if (typeof eventName === "object" && isUndefined(handlerToAttach)) { + var eventHash = eventName; + + for (var name in eventHash) { + this.on(name, eventHash[name]); + } + + return this; + } else if (typeof eventName === "string" && typeof handlerToAttach === "function") { + var handlerList = this._eventHandler[eventName]; + + if (isUndefined(handlerList)) { + this._eventHandler[eventName] = []; + handlerList = this._eventHandler[eventName]; + } + + handlerList.push(handlerToAttach); + } + + return this; + }; + /** + * Detaches an event from the component. + * @ko 컴포넌트에 등록된 이벤트를 해제한다 + * @param {string} eventName The name of the event to be detached 해제할 이벤트의 이름 + * @param {function} handlerToDetach The handler function of the event to be detached 해제할 이벤트의 핸들러 함수 + * @return An instance of a component itself 컴포넌트 자신의 인스턴스 + * @example + * ``` + * class Some extends eg.Component { + * hi() { + * console.log("hi"); + * } + * some() { + * this.off("hi",this.hi); //detach event + * } + * } + * ``` + */ + + + __proto.off = function (eventName, handlerToDetach) { + var e_1, _a; // Detach all event handlers. + + + if (isUndefined(eventName)) { + this._eventHandler = {}; + return this; + } // Detach all handlers for eventname or detach event handlers by object. + + + if (isUndefined(handlerToDetach)) { + if (typeof eventName === "string") { + delete this._eventHandler[eventName]; + return this; + } else { + var eventHash = eventName; + + for (var name in eventHash) { + this.off(name, eventHash[name]); + } + + return this; + } + } // Detach single event handler + + + var handlerList = this._eventHandler[eventName]; + + if (handlerList) { + var idx = 0; + + try { + for (var handlerList_1 = __values(handlerList), handlerList_1_1 = handlerList_1.next(); !handlerList_1_1.done; handlerList_1_1 = handlerList_1.next()) { + var handlerFunction = handlerList_1_1.value; + + if (handlerFunction === handlerToDetach) { + handlerList.splice(idx, 1); + break; + } + + idx++; + } + } catch (e_1_1) { + e_1 = { + error: e_1_1 + }; + } finally { + try { + if (handlerList_1_1 && !handlerList_1_1.done && (_a = handlerList_1.return)) _a.call(handlerList_1); + } finally { + if (e_1) throw e_1.error; + } + } + } + + return this; + }; + /** + * Version info string + * @ko 버전정보 문자열 + * @name VERSION + * @static + * @example + * eg.Component.VERSION; // ex) 2.0.0 + * @memberof eg.Component + */ + + + Component.VERSION = "2.2.2"; + return Component; + }(); + + /* + Copyright (c) 2020-present NAVER Corp. + name: @egjs/imready + license: MIT + author: NAVER Corp. + repository: https://github.com/naver/egjs-imready + version: 1.1.2 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics$1 = function (d, b) { + extendStatics$1 = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + + return extendStatics$1(d, b); + }; + + function __extends$1(d, b) { + extendStatics$1(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign.apply(this, arguments); + }; + function __spreadArrays$1() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + + return r; + } + + /* + egjs-imready + Copyright (c) 2020-present NAVER Corp. + MIT license + */ + var isWindow = typeof window !== "undefined"; + var ua = isWindow ? window.navigator.userAgent : ""; + var SUPPORT_COMPUTEDSTYLE = isWindow ? !!("getComputedStyle" in window) : false; + var IS_IE = /MSIE|Trident|Windows Phone|Edge/.test(ua); + var SUPPORT_ADDEVENTLISTENER = isWindow ? !!("addEventListener" in document) : false; + var WIDTH = "width"; + var HEIGHT = "height"; + + function getAttribute(el, name) { + return el.getAttribute(name) || ""; + } + function toArray(arr) { + return [].slice.call(arr); + } + function hasSizeAttribute(target, prefix) { + if (prefix === void 0) { + prefix = "data-"; + } + + return !!target.getAttribute(prefix + "width"); + } + function hasLoadingAttribute(target) { + return "loading" in target && target.getAttribute("loading") === "lazy"; + } + function hasSkipAttribute(target, prefix) { + if (prefix === void 0) { + prefix = "data-"; + } + + return !!target.getAttribute(prefix + "skip"); + } + function addEvent(element, type, handler) { + if (SUPPORT_ADDEVENTLISTENER) { + element.addEventListener(type, handler, false); + } else if (element.attachEvent) { + element.attachEvent("on" + type, handler); + } else { + element["on" + type] = handler; + } + } + function removeEvent(element, type, handler) { + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else if (element.detachEvent) { + element.detachEvent("on" + type, handler); + } else { + element["on" + type] = null; + } + } + function innerWidth(el) { + return getSize(el, "Width"); + } + function innerHeight(el) { + return getSize(el, "Height"); + } + function getStyles(el) { + return (SUPPORT_COMPUTEDSTYLE ? window.getComputedStyle(el) : el.currentStyle) || {}; + } + + function getSize(el, name) { + var size = el["client" + name] || el["offset" + name]; + return parseFloat(size || getStyles(el)[name.toLowerCase()]) || 0; + } + + function getContentElements(element, tags, prefix) { + var skipElements = toArray(element.querySelectorAll(__spreadArrays$1(["[" + prefix + "skip] [" + prefix + "width]"], tags.map(function (tag) { + return ["[" + prefix + "skip] " + tag, tag + "[" + prefix + "skip]", "[" + prefix + "width] " + tag].join(", "); + })).join(", "))); + return toArray(element.querySelectorAll("[" + prefix + "width], " + tags.join(", "))).filter(function (el) { + return skipElements.indexOf(el) === -1; + }); + } + + /* + egjs-imready + Copyright (c) 2020-present NAVER Corp. + MIT license + */ + var elements = []; + function addAutoSizer(element, prefix) { + !elements.length && addEvent(window, "resize", resizeAllAutoSizers); + element.__PREFIX__ = prefix; + elements.push(element); + resize(element); + } + function removeAutoSizer(element, prefix) { + var index = elements.indexOf(element); + + if (index < 0) { + return; + } + + var fixed = getAttribute(element, prefix + "fixed"); + delete element.__PREFIX__; + element.style[fixed === HEIGHT ? WIDTH : HEIGHT] = ""; + elements.splice(index, 1); + !elements.length && removeEvent(window, "resize", resizeAllAutoSizers); + } + + function resize(element, prefix) { + if (prefix === void 0) { + prefix = "data-"; + } + + var elementPrefix = element.__PREFIX__ || prefix; + var dataWidth = parseInt(getAttribute(element, "" + elementPrefix + WIDTH), 10) || 0; + var dataHeight = parseInt(getAttribute(element, "" + elementPrefix + HEIGHT), 10) || 0; + var fixed = getAttribute(element, elementPrefix + "fixed"); + + if (fixed === HEIGHT) { + var size = innerHeight(element) || dataHeight; + element.style[WIDTH] = dataWidth / dataHeight * size + "px"; + } else { + var size = innerWidth(element) || dataWidth; + element.style[HEIGHT] = dataHeight / dataWidth * size + "px"; + } + } + + function resizeAllAutoSizers() { + elements.forEach(function (element) { + resize(element); + }); + } + + var Loader = + /*#__PURE__*/ + function (_super) { + __extends$1(Loader, _super); + + function Loader(element, options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.isReady = false; + _this.isPreReady = false; + _this.hasDataSize = false; + _this.hasLoading = false; + _this.isSkip = false; + + _this.onCheck = function (e) { + _this.clear(); + + if (e && e.type === "error") { + _this.onError(_this.element); + } // I'm pre-ready and ready! + + + var withPreReady = !_this.hasDataSize && !_this.hasLoading; + + _this.onReady(withPreReady); + }; + + _this.options = __assign({ + prefix: "data-" + }, options); + _this.element = element; + _this.hasDataSize = hasSizeAttribute(element, _this.options.prefix); + _this.hasLoading = hasLoadingAttribute(element); + _this.isSkip = hasSkipAttribute(_this.element); + return _this; + } + + var __proto = Loader.prototype; + + __proto.check = function () { + if (this.isSkip || !this.checkElement()) { + // I'm Ready + this.onAlreadyReady(true); + return false; + } + + if (this.hasDataSize) { + addAutoSizer(this.element, this.options.prefix); + } + + if (this.hasDataSize || this.hasLoading) { + // I'm Pre Ready + this.onAlreadyPreReady(); + } // Wati Pre Ready, Ready + + + return true; + }; + + __proto.addEvents = function () { + var _this = this; + + var element = this.element; + this.constructor.EVENTS.forEach(function (name) { + addEvent(element, name, _this.onCheck); + }); + }; + + __proto.clear = function () { + var _this = this; + + var element = this.element; + this.constructor.EVENTS.forEach(function (name) { + removeEvent(element, name, _this.onCheck); + }); + this.removeAutoSizer(); + }; + + __proto.destroy = function () { + this.clear(); + this.off(); + }; + + __proto.removeAutoSizer = function () { + if (this.hasDataSize) { + // I'm already ready. + var prefix = this.options.prefix; + removeAutoSizer(this.element, prefix); + } + }; + + __proto.onError = function (target) { + this.trigger("error", { + element: this.element, + target: target + }); + }; + + __proto.onPreReady = function () { + if (this.isPreReady) { + return; + } + + this.isPreReady = true; + this.trigger("preReady", { + element: this.element, + hasLoading: this.hasLoading, + isSkip: this.isSkip + }); + }; + + __proto.onReady = function (withPreReady) { + if (this.isReady) { + return; + } + + if (withPreReady) { + this.isPreReady = true; + } + + this.removeAutoSizer(); + this.isReady = true; + this.trigger("ready", { + element: this.element, + withPreReady: withPreReady, + hasLoading: this.hasLoading, + isSkip: this.isSkip + }); + }; + + __proto.onAlreadyError = function (target) { + var _this = this; + + setTimeout(function () { + _this.onError(target); + }); + }; + + __proto.onAlreadyPreReady = function () { + var _this = this; + + setTimeout(function () { + _this.onPreReady(); + }); + }; + + __proto.onAlreadyReady = function (withPreReady) { + var _this = this; + + setTimeout(function () { + _this.onReady(withPreReady); + }); + }; + + Loader.EVENTS = []; + return Loader; + }(Component); + + var ElementLoader = + /*#__PURE__*/ + function (_super) { + __extends$1(ElementLoader, _super); + + function ElementLoader() { + return _super !== null && _super.apply(this, arguments) || this; + } + + var __proto = ElementLoader.prototype; + + __proto.setHasLoading = function (hasLoading) { + this.hasLoading = hasLoading; + }; + + __proto.check = function () { + if (this.isSkip) { + // I'm Ready + this.onAlreadyReady(true); + return false; + } + + if (this.hasDataSize) { + addAutoSizer(this.element, this.options.prefix); + this.onAlreadyPreReady(); + } else { + // has not data size + this.trigger("requestChildren"); + } + + return true; + }; + + __proto.checkElement = function () { + return true; + }; + + __proto.destroy = function () { + this.clear(); + this.trigger("requestDestroy"); + this.off(); + }; + + __proto.onAlreadyPreReady = function () { + // has data size + _super.prototype.onAlreadyPreReady.call(this); + + this.trigger("reqeustReadyChildren"); + }; + + ElementLoader.EVENTS = []; + return ElementLoader; + }(Loader); + + /** + * @alias eg.ImReady + * @extends eg.Component + */ + + var ImReadyManager = + /*#__PURE__*/ + function (_super) { + __extends$1(ImReadyManager, _super); + /** + * @param - ImReady's options + */ + + + function ImReadyManager(options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.readyCount = 0; + _this.preReadyCount = 0; + _this.totalCount = 0; + _this.totalErrorCount = 0; + _this.isPreReadyOver = true; + _this.elementInfos = []; + _this.options = __assign({ + loaders: {}, + prefix: "data-" + }, options); + return _this; + } + /** + * Checks whether elements are in the ready state. + * @ko 엘리먼트가 준비 상태인지 체크한다. + * @elements - Elements to check ready status. 준비 상태를 체크할 엘리먼트들. + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check(document.querySelectorAll("img")).on({ + * preReadyElement: e => { + * // 1, 3 + * // 2, 3 + * // 3, 3 + * console.log(e.preReadyCount, e.totalCount), + * }, + * }); + * ``` + */ + + + var __proto = ImReadyManager.prototype; + + __proto.check = function (elements) { + var _this = this; + + var prefix = this.options.prefix; + this.clear(); + this.elementInfos = toArray(elements).map(function (element, index) { + var loader = _this.getLoader(element, { + prefix: prefix + }); + + loader.check(); + loader.on("error", function (e) { + _this.onError(index, e.target); + }).on("preReady", function (e) { + var info = _this.elementInfos[index]; + info.hasLoading = e.hasLoading; + info.isSkip = e.isSkip; + + var isPreReady = _this.checkPreReady(index); + + _this.onPreReadyElement(index); + + isPreReady && _this.onPreReady(); + }).on("ready", function (_a) { + var withPreReady = _a.withPreReady, + hasLoading = _a.hasLoading, + isSkip = _a.isSkip; + var info = _this.elementInfos[index]; + info.hasLoading = hasLoading; + info.isSkip = isSkip; + + var isPreReady = withPreReady && _this.checkPreReady(index); + + var isReady = _this.checkReady(index); // Pre-ready and ready occur simultaneously + + + withPreReady && _this.onPreReadyElement(index); + + _this.onReadyElement(index); + + isPreReady && _this.onPreReady(); + isReady && _this.onReady(); + }); + return { + loader: loader, + element: element, + hasLoading: false, + hasError: false, + isPreReady: false, + isReady: false, + isSkip: false + }; + }); + var length = this.elementInfos.length; + this.totalCount = length; + + if (!length) { + setTimeout(function () { + _this.onPreReady(); + + _this.onReady(); + }); + } + + return this; + }; + /** + * Gets the total count of elements to be checked. + * @ko 체크하는 element의 총 개수를 가져온다. + */ + + + __proto.getTotalCount = function () { + return this.totalCount; + }; + /** + * Whether the elements are all pre-ready. (all sizes are known) + * @ko 엘리먼트들이 모두 사전 준비가 됐는지 (사이즈를 전부 알 수 있는지) 여부. + */ + + + __proto.isPreReady = function () { + return this.elementInfos.every(function (info) { + return info.isPreReady; + }); + }; + /** + * Whether the elements are all ready. + * @ko 엘리먼트들이 모두 준비가 됐는지 여부. + */ + + + __proto.isReady = function () { + return this.elementInfos.every(function (info) { + return info.isReady; + }); + }; + /** + * Whether an error has occurred in the elements in the current state. + * @ko 현재 상태에서 엘리먼트들이 에러가 발생했는지 여부. + */ + + + __proto.hasError = function () { + return this.totalErrorCount > 0; + }; + /** + * Clears events of elements being checked. + * @ko 체크 중인 엘리먼트들의 이벤트를 해제 한다. + */ + + + __proto.clear = function () { + this.isPreReadyOver = false; + this.totalCount = 0; + this.preReadyCount = 0; + this.readyCount = 0; + this.totalErrorCount = 0; + this.elementInfos.forEach(function (info) { + if (!info.isReady && info.loader) { + info.loader.destroy(); + } + }); + this.elementInfos = []; + }; + /** + * Destory all events. + * @ko 모든 이벤트를 해제 한다. + */ + + + __proto.destroy = function () { + this.clear(); + this.off(); + }; + + __proto.getLoader = function (element, options) { + var _this = this; + + var tagName = element.tagName.toLowerCase(); + var loaders = this.options.loaders; + var tags = Object.keys(loaders); + + if (loaders[tagName]) { + return new loaders[tagName](element, options); + } + + var loader = new ElementLoader(element, options); + var children = toArray(element.querySelectorAll(tags.join(", "))); + loader.setHasLoading(children.some(function (el) { + return hasLoadingAttribute(el); + })); + var withPreReady = false; + var childrenImReady = this.clone().on("error", function (e) { + loader.onError(e.target); + }).on("ready", function () { + loader.onReady(withPreReady); + }); + loader.on("requestChildren", function () { + // has not data size + var contentElements = getContentElements(element, tags, _this.options.prefix); + childrenImReady.check(contentElements).on("preReady", function (e) { + withPreReady = e.isReady; + + if (!withPreReady) { + loader.onPreReady(); + } + }); + }).on("reqeustReadyChildren", function () { + // has data size + // loader call preReady + // check only video, image elements + childrenImReady.check(children); + }).on("requestDestroy", function () { + childrenImReady.destroy(); + }); + return loader; + }; + + __proto.clone = function () { + return new ImReadyManager(__assign({}, this.options)); + }; + + __proto.checkPreReady = function (index) { + this.elementInfos[index].isPreReady = true; + ++this.preReadyCount; + + if (this.preReadyCount < this.totalCount) { + return false; + } + + return true; + }; + + __proto.checkReady = function (index) { + this.elementInfos[index].isReady = true; + ++this.readyCount; + + if (this.readyCount < this.totalCount) { + return false; + } + + return true; + }; + + __proto.onError = function (index, target) { + var info = this.elementInfos[index]; + info.hasError = true; + /** + * An event occurs if the image, video fails to load. + * @ko 이미지, 비디오가 로딩에 실패하면 이벤트가 발생한다. + * @event eg.ImReady#error + * @param {eg.ImReady.OnError} e - The object of data to be sent to an event 이벤트에 전달되는 데이터 객체 + * @param {HTMLElement} [e.element] - The element with error images.오류난 이미지가 있는 엘리먼트 + * @param {number} [e.index] - The item's index with error images. 오류난 이미지가 있는 엘리먼트의 인덱스 + * @param {HTMLElement} [e.target] - Error image target in element 엘리먼트의 오류난 이미지 타겟 + * @param {number} [e.errorCount] - The number of elements with errors 에러가 있는 엘리먼트들의 개수 + * @param {number} [e.totalErrorCount] - The total number of targets with errors 에러가 있는 타겟들의 총 개수 + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check([document.querySelector("div")]).on({ + * error: e => { + * //
...
, 0, + * console.log(e.element, e.index, e.target), + * }, + * }); + * ``` + */ + + this.trigger("error", { + element: info.element, + index: index, + target: target, + errorCount: this.getErrorCount(), + totalErrorCount: ++this.totalErrorCount + }); + }; + + __proto.onPreReadyElement = function (index) { + var info = this.elementInfos[index]; + /** + * An event occurs when the element is pre-ready (when the loading attribute is applied or the size is known) + * @ko 해당 엘리먼트가 사전 준비되었을 때(loading 속성이 적용되었거나 사이즈를 알 수 있을 때) 이벤트가 발생한다. + * @event eg.ImReady#preReadyElement + * @param {eg.ImReady.OnPreReadyElement} e - The object of data to be sent to an event 이벤트에 전달되는 데이터 객체 + * @param {HTMLElement} [e.element] - The pre-ready element.사전 준비된 엘리먼트 + * @param {number} [e.index] - The index of the pre-ready element. 사전 준비된 엘리먼트의 인덱스 + * @param {number} [e.preReadyCount] - Number of elements pre-ready 사전 준비된 엘리먼트들의 개수 + * @param {number} [e.readyCount] - Number of elements ready 준비된 엘리먼트들의 개수 + * @param {number} [e.totalCount] - Total number of elements 엘리먼트들의 총 개수 + * @param {boolean} [e.isPreReady] - Whether all elements are pre-ready 모든 엘리먼트가 사전 준비가 끝났는지 여부 + * @param {boolean} [e.isReady] - Whether all elements are ready 모든 엘리먼트가 준비가 끝났는지 여부 + * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied loading 속성이 적용되었는지 여부 + * @param {boolean} [e.isSkip] - Whether the check is omitted due to skip attribute skip 속성으로 인하여 체크가 생략됐는지 여부 + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check(document.querySelectorAll("img")).on({ + * preReadyElement: e => { + * // 1, 3 + * // 2, 3 + * // 3, 3 + * console.log(e.preReadyCount, e.totalCount), + * }, + * }); + * ``` + */ + + this.trigger("preReadyElement", { + element: info.element, + index: index, + preReadyCount: this.preReadyCount, + readyCount: this.readyCount, + totalCount: this.totalCount, + isPreReady: this.isPreReady(), + isReady: this.isReady(), + hasLoading: info.hasLoading, + isSkip: info.isSkip + }); + }; + + __proto.onPreReady = function () { + this.isPreReadyOver = true; + /** + * An event occurs when all element are pre-ready (When all elements have the loading attribute applied or the size is known) + * @ko 모든 엘리먼트들이 사전 준비된 경우 (모든 엘리먼트들이 loading 속성이 적용되었거나 사이즈를 알 수 있는 경우) 이벤트가 발생한다. + * @event eg.ImReady#preReady + * @param {eg.ImReady.OnPreReady} e - The object of data to be sent to an event 이벤트에 전달되는 데이터 객체 + * @param {number} [e.readyCount] - Number of elements ready 준비된 엘리먼트들의 개수 + * @param {number} [e.totalCount] - Total number of elements 엘리먼트들의 총 개수 + * @param {boolean} [e.isReady] - Whether all elements are ready 모든 엘리먼트가 준비가 끝났는지 여부 + * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied loading 속성이 적용되었는지 여부 + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check(document.querySelectorAll("img")).on({ + * preReady: e => { + * // 0, 3 + * console.log(e.readyCount, e.totalCount), + * }, + * }); + * ``` + */ + + this.trigger("preReady", { + readyCount: this.readyCount, + totalCount: this.totalCount, + isReady: this.isReady(), + hasLoading: this.hasLoading() + }); + }; + + __proto.onReadyElement = function (index) { + var info = this.elementInfos[index]; + /** + * An event occurs when the element is ready + * @ko 해당 엘리먼트가 준비가 되었을 때 이벤트가 발생한다. + * @event eg.ImReady#readyElement + * @param {eg.ImReady.OnReadyElement} e - The object of data to be sent to an event 이벤트에 전달되는 데이터 객체 + * @param {HTMLElement} [e.element] - The ready element.준비된 엘리먼트 + * @param {number} [e.index] - The index of the ready element. 준비된 엘리먼트의 인덱스 + * @param {boolean} [e.hasError] - Whether there is an error in the element 해당 엘리먼트에 에러가 있는지 여부 + * @param {number} [e.errorCount] - The number of elements with errors 에러가 있는 엘리먼트들의 개수 + * @param {number} [e.totalErrorCount] - The total number of targets with errors 에러가 있는 타겟들의 총 개수 + * @param {number} [e.preReadyCount] - Number of elements pre-ready 사전 준비된 엘리먼트들의 개수 + * @param {number} [e.readyCount] - Number of elements ready 준비된 엘리먼트들의 개수 + * @param {number} [e.totalCount] - Total number of elements 엘리먼트들의 총 개수 + * @param {boolean} [e.isPreReady] - Whether all elements are pre-ready 모든 엘리먼트가 사전 준비가 끝났는지 여부 + * @param {boolean} [e.isReady] - Whether all elements are ready 모든 엘리먼트가 준비가 끝났는지 여부 + * @param {boolean} [e.hasLoading] - Whether the loading attribute has been applied loading 속성이 적용되었는지 여부 + * @param {boolean} [e.isPreReadyOver] - Whether pre-ready is over 사전 준비가 끝났는지 여부 + * @param {boolean} [e.isSkip] - Whether the check is omitted due to skip attribute skip 속성으로 인하여 체크가 생략됐는지 여부 + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check(document.querySelectorAll("img")).on({ + * readyElement: e => { + * // 1, 0, false, 3 + * // 2, 1, false, 3 + * // 3, 2, true, 3 + * console.log(e.readyCount, e.index, e.hasError, e.totalCount), + * }, + * }); + * ``` + */ + + this.trigger("readyElement", { + index: index, + element: info.element, + hasError: info.hasError, + errorCount: this.getErrorCount(), + totalErrorCount: this.totalErrorCount, + preReadyCount: this.preReadyCount, + readyCount: this.readyCount, + totalCount: this.totalCount, + isPreReady: this.isPreReady(), + isReady: this.isReady(), + hasLoading: info.hasLoading, + isPreReadyOver: this.isPreReadyOver, + isSkip: info.isSkip + }); + }; + + __proto.onReady = function () { + /** + * An event occurs when all element are ready + * @ko 모든 엘리먼트들이 준비된 경우 이벤트가 발생한다. + * @event eg.ImReady#ready + * @param {eg.ImReady.OnReady} e - The object of data to be sent to an event 이벤트에 전달되는 데이터 객체 + * @param {number} [e.errorCount] - The number of elements with errors 에러가 있는 엘리먼트들의 개수 + * @param {number} [e.totalErrorCount] - The total number of targets with errors 에러가 있는 타겟들의 총 개수 + * @param {number} [e.totalCount] - Total number of elements 엘리먼트들의 총 개수 + * @example + * ```html + *
+ * + * + * + *
+ * ``` + * ## Javascript + * ```js + * import ImReady from "@egjs/imready"; + * + * const im = new ImReady(); // umd: eg.ImReady + * im.check(document.querySelectorAll("img")).on({ + * preReady: e => { + * // 0, 3 + * console.log(e.readyCount, e.totalCount), + * }, + * ready: e => { + * // 1, 3 + * console.log(e.errorCount, e.totalCount), + * }, + * }); + * ``` + */ + this.trigger("ready", { + errorCount: this.getErrorCount(), + totalErrorCount: this.totalErrorCount, + totalCount: this.totalCount + }); + }; + + __proto.getErrorCount = function () { + return this.elementInfos.filter(function (info) { + return info.hasError; + }).length; + }; + + __proto.hasLoading = function () { + return this.elementInfos.some(function (info) { + return info.hasLoading; + }); + }; + + return ImReadyManager; + }(Component); + + var ImageLoader = + /*#__PURE__*/ + function (_super) { + __extends$1(ImageLoader, _super); + + function ImageLoader() { + return _super !== null && _super.apply(this, arguments) || this; + } + + var __proto = ImageLoader.prototype; + + __proto.checkElement = function () { + var element = this.element; + var src = element.getAttribute("src"); + + if (element.complete && src) { + if (!element.naturalWidth) { + this.onAlreadyError(element); + } + + return false; + } + + this.addEvents(); + IS_IE && element.setAttribute("src", src); + return true; + }; + + ImageLoader.EVENTS = ["load", "error"]; + return ImageLoader; + }(Loader); + + var VideoLoader = + /*#__PURE__*/ + function (_super) { + __extends$1(VideoLoader, _super); + + function VideoLoader() { + return _super !== null && _super.apply(this, arguments) || this; + } + + var __proto = VideoLoader.prototype; + + __proto.checkElement = function () { + var element = this.element; // HAVE_NOTHING: 0, no information whether or not the audio/video is ready + // HAVE_METADATA: 1, HAVE_METADATA - metadata for the audio/video is ready + // HAVE_CURRENT_DATA: 2, data for the current playback position is available, but not enough data to play next frame/millisecond + // HAVE_FUTURE_DATA: 3, data for the current and at least the next frame is available + // HAVE_ENOUGH_DATA: 4, enough data available to start playing + + if (element.readyState >= 1) { + return false; + } + + if (element.error) { + this.onAlreadyError(element); + return false; + } + + this.addEvents(); + return true; + }; + + VideoLoader.EVENTS = ["loadedmetadata", "error"]; + return VideoLoader; + }(Loader); + + var ImReady = + /*#__PURE__*/ + function (_super) { + __extends$1(ImReady, _super); + + function ImReady(options) { + if (options === void 0) { + options = {}; + } + + return _super.call(this, __assign({ + loaders: { + img: ImageLoader, + video: VideoLoader + } + }, options)) || this; + } + + return ImReady; + }(ImReadyManager); + + /*! Hammer.JS - v2.0.17-rc - 2019-12-16 + * http://naver.github.io/egjs + * + * Forked By Naver egjs + * Copyright (c) hammerjs + * Licensed under the MIT license */ + function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + /** + * @private + * extend object. + * means that properties in dest will be overwritten by the ones in src. + * @param {Object} target + * @param {...Object} objects_to_assign + * @returns {Object} target + */ + var assign; + + if (typeof Object.assign !== 'function') { + assign = function assign(target) { + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + + var output = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + + return output; + }; + } else { + assign = Object.assign; + } + + var assign$1 = assign; + + var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; + var TEST_ELEMENT = typeof document === "undefined" ? { + style: {} + } : document.createElement('div'); + var TYPE_FUNCTION = 'function'; + var round = Math.round, + abs = Math.abs; + var now = Date.now; + + /** + * @private + * get the prefixed property + * @param {Object} obj + * @param {String} property + * @returns {String|Undefined} prefixed + */ + + function prefixed(obj, property) { + var prefix; + var prop; + var camelProp = property[0].toUpperCase() + property.slice(1); + var i = 0; + + while (i < VENDOR_PREFIXES.length) { + prefix = VENDOR_PREFIXES[i]; + prop = prefix ? prefix + camelProp : property; + + if (prop in obj) { + return prop; + } + + i++; + } + + return undefined; + } + + /* eslint-disable no-new-func, no-nested-ternary */ + var win; + + if (typeof window === "undefined") { + // window is undefined in node.js + win = {}; + } else { + win = window; + } + + var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); + var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; + function getTouchActionProps() { + if (!NATIVE_TOUCH_ACTION) { + return false; + } + + var touchMap = {}; + var cssSupports = win.CSS && win.CSS.supports; + ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) { + // If css.supports is not supported but there is native touch-action assume it supports + // all values. This is the case for IE 10 and 11. + return touchMap[val] = cssSupports ? win.CSS.supports('touch-action', val) : true; + }); + return touchMap; + } + + var TOUCH_ACTION_COMPUTE = 'compute'; + var TOUCH_ACTION_AUTO = 'auto'; + var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented + + var TOUCH_ACTION_NONE = 'none'; + var TOUCH_ACTION_PAN_X = 'pan-x'; + var TOUCH_ACTION_PAN_Y = 'pan-y'; + var TOUCH_ACTION_MAP = getTouchActionProps(); + + var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; + var SUPPORT_TOUCH = 'ontouchstart' in win; + var SUPPORT_POINTER_EVENTS = prefixed(win, 'PointerEvent') !== undefined; + var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); + var INPUT_TYPE_TOUCH = 'touch'; + var INPUT_TYPE_PEN = 'pen'; + var INPUT_TYPE_MOUSE = 'mouse'; + var INPUT_TYPE_KINECT = 'kinect'; + var COMPUTE_INTERVAL = 25; + var INPUT_START = 1; + var INPUT_MOVE = 2; + var INPUT_END = 4; + var INPUT_CANCEL = 8; + var DIRECTION_NONE = 1; + var DIRECTION_LEFT = 2; + var DIRECTION_RIGHT = 4; + var DIRECTION_UP = 8; + var DIRECTION_DOWN = 16; + var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; + var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; + var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; + var PROPS_XY = ['x', 'y']; + var PROPS_CLIENT_XY = ['clientX', 'clientY']; + + /** + * @private + * walk objects and arrays + * @param {Object} obj + * @param {Function} iterator + * @param {Object} context + */ + function each(obj, iterator, context) { + var i; + + if (!obj) { + return; + } + + if (obj.forEach) { + obj.forEach(iterator, context); + } else if (obj.length !== undefined) { + i = 0; + + while (i < obj.length) { + iterator.call(context, obj[i], i, obj); + i++; + } + } else { + for (i in obj) { + obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); + } + } + } + + /** + * @private + * let a boolean value also be a function that must return a boolean + * this first item in args will be used as the context + * @param {Boolean|Function} val + * @param {Array} [args] + * @returns {Boolean} + */ + + function boolOrFn(val, args) { + if (typeof val === TYPE_FUNCTION) { + return val.apply(args ? args[0] || undefined : undefined, args); + } + + return val; + } + + /** + * @private + * small indexOf wrapper + * @param {String} str + * @param {String} find + * @returns {Boolean} found + */ + function inStr(str, find) { + return str.indexOf(find) > -1; + } + + /** + * @private + * when the touchActions are collected they are not a valid value, so we need to clean things up. * + * @param {String} actions + * @returns {*} + */ + + function cleanTouchActions(actions) { + // none + if (inStr(actions, TOUCH_ACTION_NONE)) { + return TOUCH_ACTION_NONE; + } + + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers + // for different directions, e.g. horizontal pan but vertical swipe?) + // we need none (as otherwise with pan-x pan-y combined none of these + // recognizers will work, since the browser would handle all panning + + if (hasPanX && hasPanY) { + return TOUCH_ACTION_NONE; + } // pan-x OR pan-y + + + if (hasPanX || hasPanY) { + return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; + } // manipulation + + + if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { + return TOUCH_ACTION_MANIPULATION; + } + + return TOUCH_ACTION_AUTO; + } + + /** + * @private + * Touch Action + * sets the touchAction property or uses the js alternative + * @param {Manager} manager + * @param {String} value + * @constructor + */ + + var TouchAction = + /*#__PURE__*/ + function () { + function TouchAction(manager, value) { + this.manager = manager; + this.set(value); + } + /** + * @private + * set the touchAction value on the element or enable the polyfill + * @param {String} value + */ + + + var _proto = TouchAction.prototype; + + _proto.set = function set(value) { + // find out the touch-action by the event handlers + if (value === TOUCH_ACTION_COMPUTE) { + value = this.compute(); + } + + if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) { + this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; + } + + this.actions = value.toLowerCase().trim(); + }; + /** + * @private + * just re-set the touchAction value + */ + + + _proto.update = function update() { + this.set(this.manager.options.touchAction); + }; + /** + * @private + * compute the value for the touchAction property based on the recognizer's settings + * @returns {String} value + */ + + + _proto.compute = function compute() { + var actions = []; + each(this.manager.recognizers, function (recognizer) { + if (boolOrFn(recognizer.options.enable, [recognizer])) { + actions = actions.concat(recognizer.getTouchAction()); + } + }); + return cleanTouchActions(actions.join(' ')); + }; + /** + * @private + * this method is called on each input cycle and provides the preventing of the browser behavior + * @param {Object} input + */ + + + _proto.preventDefaults = function preventDefaults(input) { + var srcEvent = input.srcEvent; + var direction = input.offsetDirection; // if the touch action did prevented once this session + + if (this.manager.session.prevented) { + srcEvent.preventDefault(); + return; + } + + var actions = this.actions; + var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE]; + var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y]; + var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X]; + + if (hasNone) { + // do not prevent defaults if this is a tap gesture + var isTapPointer = input.pointers.length === 1; + var isTapMovement = input.distance < 2; + var isTapTouchTime = input.deltaTime < 250; + + if (isTapPointer && isTapMovement && isTapTouchTime) { + return; + } + } + + if (hasPanX && hasPanY) { + // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent + return; + } + + if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) { + return this.preventSrc(srcEvent); + } + }; + /** + * @private + * call preventDefault to prevent the browser's default behavior (scrolling in most cases) + * @param {Object} srcEvent + */ + + + _proto.preventSrc = function preventSrc(srcEvent) { + this.manager.session.prevented = true; + srcEvent.preventDefault(); + }; + + return TouchAction; + }(); + + /** + * @private + * find if a node is in the given parent + * @method hasParent + * @param {HTMLElement} node + * @param {HTMLElement} parent + * @return {Boolean} found + */ + function hasParent(node, parent) { + while (node) { + if (node === parent) { + return true; + } + + node = node.parentNode; + } + + return false; + } + + /** + * @private + * get the center of all the pointers + * @param {Array} pointers + * @return {Object} center contains `x` and `y` properties + */ + + function getCenter(pointers) { + var pointersLength = pointers.length; // no need to loop when only one touch + + if (pointersLength === 1) { + return { + x: round(pointers[0].clientX), + y: round(pointers[0].clientY) + }; + } + + var x = 0; + var y = 0; + var i = 0; + + while (i < pointersLength) { + x += pointers[i].clientX; + y += pointers[i].clientY; + i++; + } + + return { + x: round(x / pointersLength), + y: round(y / pointersLength) + }; + } + + /** + * @private + * create a simple clone from the input used for storage of firstInput and firstMultiple + * @param {Object} input + * @returns {Object} clonedInputData + */ + + function simpleCloneInputData(input) { + // make a simple copy of the pointers because we will get a reference if we don't + // we only need clientXY for the calculations + var pointers = []; + var i = 0; + + while (i < input.pointers.length) { + pointers[i] = { + clientX: round(input.pointers[i].clientX), + clientY: round(input.pointers[i].clientY) + }; + i++; + } + + return { + timeStamp: now(), + pointers: pointers, + center: getCenter(pointers), + deltaX: input.deltaX, + deltaY: input.deltaY + }; + } + + /** + * @private + * calculate the absolute distance between two points + * @param {Object} p1 {x, y} + * @param {Object} p2 {x, y} + * @param {Array} [props] containing x and y keys + * @return {Number} distance + */ + + function getDistance(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + + var x = p2[props[0]] - p1[props[0]]; + var y = p2[props[1]] - p1[props[1]]; + return Math.sqrt(x * x + y * y); + } + + /** + * @private + * calculate the angle between two coordinates + * @param {Object} p1 + * @param {Object} p2 + * @param {Array} [props] containing x and y keys + * @return {Number} angle + */ + + function getAngle(p1, p2, props) { + if (!props) { + props = PROPS_XY; + } + + var x = p2[props[0]] - p1[props[0]]; + var y = p2[props[1]] - p1[props[1]]; + return Math.atan2(y, x) * 180 / Math.PI; + } + + /** + * @private + * get the direction between two points + * @param {Number} x + * @param {Number} y + * @return {Number} direction + */ + + function getDirection(x, y) { + if (x === y) { + return DIRECTION_NONE; + } + + if (abs(x) >= abs(y)) { + return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + + return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; + } + + function computeDeltaXY(session, input) { + var center = input.center; // let { offsetDelta:offset = {}, prevDelta = {}, prevInput = {} } = session; + // jscs throwing error on defalut destructured values and without defaults tests fail + + var offset = session.offsetDelta || {}; + var prevDelta = session.prevDelta || {}; + var prevInput = session.prevInput || {}; + + if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { + prevDelta = session.prevDelta = { + x: prevInput.deltaX || 0, + y: prevInput.deltaY || 0 + }; + offset = session.offsetDelta = { + x: center.x, + y: center.y + }; + } + + input.deltaX = prevDelta.x + (center.x - offset.x); + input.deltaY = prevDelta.y + (center.y - offset.y); + } + + /** + * @private + * calculate the velocity between two points. unit is in px per ms. + * @param {Number} deltaTime + * @param {Number} x + * @param {Number} y + * @return {Object} velocity `x` and `y` + */ + function getVelocity(deltaTime, x, y) { + return { + x: x / deltaTime || 0, + y: y / deltaTime || 0 + }; + } + + /** + * @private + * calculate the scale factor between two pointersets + * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} scale + */ + + function getScale(start, end) { + return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); + } + + /** + * @private + * calculate the rotation degrees between two pointersets + * @param {Array} start array of pointers + * @param {Array} end array of pointers + * @return {Number} rotation + */ + + function getRotation(start, end) { + return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); + } + + /** + * @private + * velocity is calculated every x ms + * @param {Object} session + * @param {Object} input + */ + + function computeIntervalInputData(session, input) { + var last = session.lastInterval || input; + var deltaTime = input.timeStamp - last.timeStamp; + var velocity; + var velocityX; + var velocityY; + var direction; + + if (input.eventType !== INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { + var deltaX = input.deltaX - last.deltaX; + var deltaY = input.deltaY - last.deltaY; + var v = getVelocity(deltaTime, deltaX, deltaY); + velocityX = v.x; + velocityY = v.y; + velocity = abs(v.x) > abs(v.y) ? v.x : v.y; + direction = getDirection(deltaX, deltaY); + session.lastInterval = input; + } else { + // use latest velocity info if it doesn't overtake a minimum period + velocity = last.velocity; + velocityX = last.velocityX; + velocityY = last.velocityY; + direction = last.direction; + } + + input.velocity = velocity; + input.velocityX = velocityX; + input.velocityY = velocityY; + input.direction = direction; + } + + /** + * @private + * extend the data with some usable properties like scale, rotate, velocity etc + * @param {Object} manager + * @param {Object} input + */ + + function computeInputData(manager, input) { + var session = manager.session; + var pointers = input.pointers; + var pointersLength = pointers.length; // store the first input to calculate the distance and direction + + if (!session.firstInput) { + session.firstInput = simpleCloneInputData(input); + } // to compute scale and rotation we need to store the multiple touches + + + if (pointersLength > 1 && !session.firstMultiple) { + session.firstMultiple = simpleCloneInputData(input); + } else if (pointersLength === 1) { + session.firstMultiple = false; + } + + var firstInput = session.firstInput, + firstMultiple = session.firstMultiple; + var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; + var center = input.center = getCenter(pointers); + input.timeStamp = now(); + input.deltaTime = input.timeStamp - firstInput.timeStamp; + input.angle = getAngle(offsetCenter, center); + input.distance = getDistance(offsetCenter, center); + computeDeltaXY(session, input); + input.offsetDirection = getDirection(input.deltaX, input.deltaY); + var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); + input.overallVelocityX = overallVelocity.x; + input.overallVelocityY = overallVelocity.y; + input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y; + input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; + input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; + input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers; + computeIntervalInputData(session, input); // find the correct target + + var target = manager.element; + var srcEvent = input.srcEvent; + var srcEventTarget; + + if (srcEvent.composedPath) { + srcEventTarget = srcEvent.composedPath()[0]; + } else if (srcEvent.path) { + srcEventTarget = srcEvent.path[0]; + } else { + srcEventTarget = srcEvent.target; + } + + if (hasParent(srcEventTarget, target)) { + target = srcEventTarget; + } + + input.target = target; + } + + /** + * @private + * handle input events + * @param {Manager} manager + * @param {String} eventType + * @param {Object} input + */ + + function inputHandler(manager, eventType, input) { + var pointersLen = input.pointers.length; + var changedPointersLen = input.changedPointers.length; + var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0; + var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0; + input.isFirst = !!isFirst; + input.isFinal = !!isFinal; + + if (isFirst) { + manager.session = {}; + } // source event is the normalized value of the domEvents + // like 'touchstart, mouseup, pointerdown' + + + input.eventType = eventType; // compute scale, rotation etc + + computeInputData(manager, input); // emit secret event + + manager.emit('hammer.input', input); + manager.recognize(input); + manager.session.prevInput = input; + } + + /** + * @private + * split string on whitespace + * @param {String} str + * @returns {Array} words + */ + function splitStr(str) { + return str.trim().split(/\s+/g); + } + + /** + * @private + * addEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ + + function addEventListeners(target, types, handler) { + each(splitStr(types), function (type) { + target.addEventListener(type, handler, false); + }); + } + + /** + * @private + * removeEventListener with multiple events at once + * @param {EventTarget} target + * @param {String} types + * @param {Function} handler + */ + + function removeEventListeners(target, types, handler) { + each(splitStr(types), function (type) { + target.removeEventListener(type, handler, false); + }); + } + + /** + * @private + * get the window object of an element + * @param {HTMLElement} element + * @returns {DocumentView|Window} + */ + function getWindowForElement(element) { + var doc = element.ownerDocument || element; + return doc.defaultView || doc.parentWindow || window; + } + + /** + * @private + * create new input type manager + * @param {Manager} manager + * @param {Function} callback + * @returns {Input} + * @constructor + */ + + var Input = + /*#__PURE__*/ + function () { + function Input(manager, callback) { + var self = this; + this.manager = manager; + this.callback = callback; + this.element = manager.element; + this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager, + // so when disabled the input events are completely bypassed. + + this.domHandler = function (ev) { + if (boolOrFn(manager.options.enable, [manager])) { + self.handler(ev); + } + }; + + this.init(); + } + /** + * @private + * should handle the inputEvent data and trigger the callback + * @virtual + */ + + + var _proto = Input.prototype; + + _proto.handler = function handler() {}; + /** + * @private + * bind the events + */ + + + _proto.init = function init() { + this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + }; + /** + * @private + * unbind the events + */ + + + _proto.destroy = function destroy() { + this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); + this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); + this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); + }; + + return Input; + }(); + + /** + * @private + * find if a array contains the object using indexOf or a simple polyFill + * @param {Array} src + * @param {String} find + * @param {String} [findByKey] + * @return {Boolean|Number} false when not found, or the index + */ + function inArray(src, find, findByKey) { + if (src.indexOf && !findByKey) { + return src.indexOf(find); + } else { + var i = 0; + + while (i < src.length) { + if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) { + // do not use === here, test fails + return i; + } + + i++; + } + + return -1; + } + } + + var POINTER_INPUT_MAP = { + pointerdown: INPUT_START, + pointermove: INPUT_MOVE, + pointerup: INPUT_END, + pointercancel: INPUT_CANCEL, + pointerout: INPUT_CANCEL + }; // in IE10 the pointer types is defined as an enum + + var IE10_POINTER_TYPE_ENUM = { + 2: INPUT_TYPE_TOUCH, + 3: INPUT_TYPE_PEN, + 4: INPUT_TYPE_MOUSE, + 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 + + }; + var POINTER_ELEMENT_EVENTS = 'pointerdown'; + var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive + + if (win.MSPointerEvent && !win.PointerEvent) { + POINTER_ELEMENT_EVENTS = 'MSPointerDown'; + POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; + } + /** + * @private + * Pointer events input + * @constructor + * @extends Input + */ + + + var PointerEventInput = + /*#__PURE__*/ + function (_Input) { + _inheritsLoose(PointerEventInput, _Input); + + function PointerEventInput() { + var _this; + + var proto = PointerEventInput.prototype; + proto.evEl = POINTER_ELEMENT_EVENTS; + proto.evWin = POINTER_WINDOW_EVENTS; + _this = _Input.apply(this, arguments) || this; + _this.store = _this.manager.session.pointerEvents = []; + return _this; + } + /** + * @private + * handle mouse events + * @param {Object} ev + */ + + + var _proto = PointerEventInput.prototype; + + _proto.handler = function handler(ev) { + var store = this.store; + var removePointer = false; + var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); + var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; + var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; + var isTouch = pointerType === INPUT_TYPE_TOUCH; // get index of the event in the store + + var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down + + if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { + if (storeIndex < 0) { + store.push(ev); + storeIndex = store.length - 1; + } + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + removePointer = true; + } // it not found, so the pointer hasn't been down (so it's probably a hover) + + + if (storeIndex < 0) { + return; + } // update the event in the store + + + store[storeIndex] = ev; + this.callback(this.manager, eventType, { + pointers: store, + changedPointers: [ev], + pointerType: pointerType, + srcEvent: ev + }); + + if (removePointer) { + // remove from the store + store.splice(storeIndex, 1); + } + }; + + return PointerEventInput; + }(Input); + + /** + * @private + * convert array-like objects to real arrays + * @param {Object} obj + * @returns {Array} + */ + function toArray$1(obj) { + return Array.prototype.slice.call(obj, 0); + } + + /** + * @private + * unique array with objects based on a key (like 'id') or just by the array's value + * @param {Array} src [{id:1},{id:2},{id:1}] + * @param {String} [key] + * @param {Boolean} [sort=False] + * @returns {Array} [{id:1},{id:2}] + */ + + function uniqueArray(src, key, sort) { + var results = []; + var values = []; + var i = 0; + + while (i < src.length) { + var val = key ? src[i][key] : src[i]; + + if (inArray(values, val) < 0) { + results.push(src[i]); + } + + values[i] = val; + i++; + } + + if (sort) { + if (!key) { + results = results.sort(); + } else { + results = results.sort(function (a, b) { + return a[key] > b[key]; + }); + } + } + + return results; + } + + var TOUCH_INPUT_MAP = { + touchstart: INPUT_START, + touchmove: INPUT_MOVE, + touchend: INPUT_END, + touchcancel: INPUT_CANCEL + }; + var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; + /** + * @private + * Multi-user touch events input + * @constructor + * @extends Input + */ + + var TouchInput = + /*#__PURE__*/ + function (_Input) { + _inheritsLoose(TouchInput, _Input); + + function TouchInput() { + var _this; + + TouchInput.prototype.evTarget = TOUCH_TARGET_EVENTS; + _this = _Input.apply(this, arguments) || this; + _this.targetIds = {}; // this.evTarget = TOUCH_TARGET_EVENTS; + + return _this; + } + + var _proto = TouchInput.prototype; + + _proto.handler = function handler(ev) { + var type = TOUCH_INPUT_MAP[ev.type]; + var touches = getTouches.call(this, ev, type); + + if (!touches) { + return; + } + + this.callback(this.manager, type, { + pointers: touches[0], + changedPointers: touches[1], + pointerType: INPUT_TYPE_TOUCH, + srcEvent: ev + }); + }; + + return TouchInput; + }(Input); + + function getTouches(ev, type) { + var allTouches = toArray$1(ev.touches); + var targetIds = this.targetIds; // when there is only one touch, the process can be simplified + + if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { + targetIds[allTouches[0].identifier] = true; + return [allTouches, allTouches]; + } + + var i; + var targetTouches; + var changedTouches = toArray$1(ev.changedTouches); + var changedTargetTouches = []; + var target = this.target; // get target touches from touches + + targetTouches = allTouches.filter(function (touch) { + return hasParent(touch.target, target); + }); // collect touches + + if (type === INPUT_START) { + i = 0; + + while (i < targetTouches.length) { + targetIds[targetTouches[i].identifier] = true; + i++; + } + } // filter changed touches to only contain touches that exist in the collected target ids + + + i = 0; + + while (i < changedTouches.length) { + if (targetIds[changedTouches[i].identifier]) { + changedTargetTouches.push(changedTouches[i]); + } // cleanup removed touches + + + if (type & (INPUT_END | INPUT_CANCEL)) { + delete targetIds[changedTouches[i].identifier]; + } + + i++; + } + + if (!changedTargetTouches.length) { + return; + } + + return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' + uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches]; + } + + var MOUSE_INPUT_MAP = { + mousedown: INPUT_START, + mousemove: INPUT_MOVE, + mouseup: INPUT_END + }; + var MOUSE_ELEMENT_EVENTS = 'mousedown'; + var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; + /** + * @private + * Mouse events input + * @constructor + * @extends Input + */ + + var MouseInput = + /*#__PURE__*/ + function (_Input) { + _inheritsLoose(MouseInput, _Input); + + function MouseInput() { + var _this; + + var proto = MouseInput.prototype; + proto.evEl = MOUSE_ELEMENT_EVENTS; + proto.evWin = MOUSE_WINDOW_EVENTS; + _this = _Input.apply(this, arguments) || this; + _this.pressed = false; // mousedown state + + return _this; + } + /** + * @private + * handle mouse events + * @param {Object} ev + */ + + + var _proto = MouseInput.prototype; + + _proto.handler = function handler(ev) { + var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down + + if (eventType & INPUT_START && ev.button === 0) { + this.pressed = true; + } + + if (eventType & INPUT_MOVE && ev.which !== 1) { + eventType = INPUT_END; + } // mouse must be down + + + if (!this.pressed) { + return; + } + + if (eventType & INPUT_END) { + this.pressed = false; + } + + this.callback(this.manager, eventType, { + pointers: [ev], + changedPointers: [ev], + pointerType: INPUT_TYPE_MOUSE, + srcEvent: ev + }); + }; + + return MouseInput; + }(Input); + + /** + * @private + * Combined touch and mouse input + * + * Touch has a higher priority then mouse, and while touching no mouse events are allowed. + * This because touch devices also emit mouse events while doing a touch. + * + * @constructor + * @extends Input + */ + + var DEDUP_TIMEOUT = 2500; + var DEDUP_DISTANCE = 25; + + function setLastTouch(eventData) { + var _eventData$changedPoi = eventData.changedPointers, + touch = _eventData$changedPoi[0]; + + if (touch.identifier === this.primaryTouch) { + var lastTouch = { + x: touch.clientX, + y: touch.clientY + }; + var lts = this.lastTouches; + this.lastTouches.push(lastTouch); + + var removeLastTouch = function removeLastTouch() { + var i = lts.indexOf(lastTouch); + + if (i > -1) { + lts.splice(i, 1); + } + }; + + setTimeout(removeLastTouch, DEDUP_TIMEOUT); + } + } + + function recordTouches(eventType, eventData) { + if (eventType & INPUT_START) { + this.primaryTouch = eventData.changedPointers[0].identifier; + setLastTouch.call(this, eventData); + } else if (eventType & (INPUT_END | INPUT_CANCEL)) { + setLastTouch.call(this, eventData); + } + } + + function isSyntheticEvent(eventData) { + var x = eventData.srcEvent.clientX; + var y = eventData.srcEvent.clientY; + + for (var i = 0; i < this.lastTouches.length; i++) { + var t = this.lastTouches[i]; + var dx = Math.abs(x - t.x); + var dy = Math.abs(y - t.y); + + if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) { + return true; + } + } + + return false; + } + + var TouchMouseInput = + /*#__PURE__*/ + function () { + var TouchMouseInput = + /*#__PURE__*/ + function (_Input) { + _inheritsLoose(TouchMouseInput, _Input); + + function TouchMouseInput(_manager, callback) { + var _this; + + _this = _Input.call(this, _manager, callback) || this; + + _this.handler = function (manager, inputEvent, inputData) { + var isTouch = inputData.pointerType === INPUT_TYPE_TOUCH; + var isMouse = inputData.pointerType === INPUT_TYPE_MOUSE; + + if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) { + return; + } // when we're in a touch event, record touches to de-dupe synthetic mouse event + + + if (isTouch) { + recordTouches.call(_assertThisInitialized(_assertThisInitialized(_this)), inputEvent, inputData); + } else if (isMouse && isSyntheticEvent.call(_assertThisInitialized(_assertThisInitialized(_this)), inputData)) { + return; + } + + _this.callback(manager, inputEvent, inputData); + }; + + _this.touch = new TouchInput(_this.manager, _this.handler); + _this.mouse = new MouseInput(_this.manager, _this.handler); + _this.primaryTouch = null; + _this.lastTouches = []; + return _this; + } + /** + * @private + * handle mouse and touch events + * @param {Hammer} manager + * @param {String} inputEvent + * @param {Object} inputData + */ + + + var _proto = TouchMouseInput.prototype; + + /** + * @private + * remove the event listeners + */ + _proto.destroy = function destroy() { + this.touch.destroy(); + this.mouse.destroy(); + }; + + return TouchMouseInput; + }(Input); + + return TouchMouseInput; + }(); + + /** + * @private + * create new input type manager + * called by the Manager constructor + * @param {Hammer} manager + * @returns {Input} + */ + + function createInputInstance(manager) { + var Type; // let inputClass = manager.options.inputClass; + + var inputClass = manager.options.inputClass; + + if (inputClass) { + Type = inputClass; + } else if (SUPPORT_POINTER_EVENTS) { + Type = PointerEventInput; + } else if (SUPPORT_ONLY_TOUCH) { + Type = TouchInput; + } else if (!SUPPORT_TOUCH) { + Type = MouseInput; + } else { + Type = TouchMouseInput; + } + + return new Type(manager, inputHandler); + } + + /** + * @private + * if the argument is an array, we want to execute the fn on each entry + * if it aint an array we don't want to do a thing. + * this is used by all the methods that accept a single and array argument. + * @param {*|Array} arg + * @param {String} fn + * @param {Object} [context] + * @returns {Boolean} + */ + + function invokeArrayArg(arg, fn, context) { + if (Array.isArray(arg)) { + each(arg, context[fn], context); + return true; + } + + return false; + } + + var STATE_POSSIBLE = 1; + var STATE_BEGAN = 2; + var STATE_CHANGED = 4; + var STATE_ENDED = 8; + var STATE_RECOGNIZED = STATE_ENDED; + var STATE_CANCELLED = 16; + var STATE_FAILED = 32; + + /** + * @private + * get a unique id + * @returns {number} uniqueId + */ + var _uniqueId = 1; + function uniqueId() { + return _uniqueId++; + } + + /** + * @private + * get a recognizer by name if it is bound to a manager + * @param {Recognizer|String} otherRecognizer + * @param {Recognizer} recognizer + * @returns {Recognizer} + */ + function getRecognizerByNameIfManager(otherRecognizer, recognizer) { + var manager = recognizer.manager; + + if (manager) { + return manager.get(otherRecognizer); + } + + return otherRecognizer; + } + + /** + * @private + * get a usable string, used as event postfix + * @param {constant} state + * @returns {String} state + */ + + function stateStr(state) { + if (state & STATE_CANCELLED) { + return 'cancel'; + } else if (state & STATE_ENDED) { + return 'end'; + } else if (state & STATE_CHANGED) { + return 'move'; + } else if (state & STATE_BEGAN) { + return 'start'; + } + + return ''; + } + + /** + * @private + * Recognizer flow explained; * + * All recognizers have the initial state of POSSIBLE when a input session starts. + * The definition of a input session is from the first input until the last input, with all it's movement in it. * + * Example session for mouse-input: mousedown -> mousemove -> mouseup + * + * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed + * which determines with state it should be. + * + * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to + * POSSIBLE to give it another change on the next cycle. + * + * Possible + * | + * +-----+---------------+ + * | | + * +-----+-----+ | + * | | | + * Failed Cancelled | + * +-------+------+ + * | | + * Recognized Began + * | + * Changed + * | + * Ended/Recognized + */ + + /** + * @private + * Recognizer + * Every recognizer needs to extend from this class. + * @constructor + * @param {Object} options + */ + + var Recognizer = + /*#__PURE__*/ + function () { + function Recognizer(options) { + if (options === void 0) { + options = {}; + } + + this.options = _extends({ + enable: true + }, options); + this.id = uniqueId(); + this.manager = null; // default is enable true + + this.state = STATE_POSSIBLE; + this.simultaneous = {}; + this.requireFail = []; + } + /** + * @private + * set options + * @param {Object} options + * @return {Recognizer} + */ + + + var _proto = Recognizer.prototype; + + _proto.set = function set(options) { + assign$1(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state + + this.manager && this.manager.touchAction.update(); + return this; + }; + /** + * @private + * recognize simultaneous with an other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + + + _proto.recognizeWith = function recognizeWith(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { + return this; + } + + var simultaneous = this.simultaneous; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + + if (!simultaneous[otherRecognizer.id]) { + simultaneous[otherRecognizer.id] = otherRecognizer; + otherRecognizer.recognizeWith(this); + } + + return this; + }; + /** + * @private + * drop the simultaneous link. it doesnt remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + + + _proto.dropRecognizeWith = function dropRecognizeWith(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + delete this.simultaneous[otherRecognizer.id]; + return this; + }; + /** + * @private + * recognizer can only run when an other is failing + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + + + _proto.requireFailure = function requireFailure(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { + return this; + } + + var requireFail = this.requireFail; + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + + if (inArray(requireFail, otherRecognizer) === -1) { + requireFail.push(otherRecognizer); + otherRecognizer.requireFailure(this); + } + + return this; + }; + /** + * @private + * drop the requireFailure link. it does not remove the link on the other recognizer. + * @param {Recognizer} otherRecognizer + * @returns {Recognizer} this + */ + + + _proto.dropRequireFailure = function dropRequireFailure(otherRecognizer) { + if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { + return this; + } + + otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); + var index = inArray(this.requireFail, otherRecognizer); + + if (index > -1) { + this.requireFail.splice(index, 1); + } + + return this; + }; + /** + * @private + * has require failures boolean + * @returns {boolean} + */ + + + _proto.hasRequireFailures = function hasRequireFailures() { + return this.requireFail.length > 0; + }; + /** + * @private + * if the recognizer can recognize simultaneous with an other recognizer + * @param {Recognizer} otherRecognizer + * @returns {Boolean} + */ + + + _proto.canRecognizeWith = function canRecognizeWith(otherRecognizer) { + return !!this.simultaneous[otherRecognizer.id]; + }; + /** + * @private + * You should use `tryEmit` instead of `emit` directly to check + * that all the needed recognizers has failed before emitting. + * @param {Object} input + */ + + + _proto.emit = function emit(input) { + var self = this; + var state = this.state; + + function emit(event) { + self.manager.emit(event, input); + } // 'panstart' and 'panmove' + + + if (state < STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + + emit(self.options.event); // simple 'eventName' events + + if (input.additionalEvent) { + // additional event(panleft, panright, pinchin, pinchout...) + emit(input.additionalEvent); + } // panend and pancancel + + + if (state >= STATE_ENDED) { + emit(self.options.event + stateStr(state)); + } + }; + /** + * @private + * Check that all the require failure recognizers has failed, + * if true, it emits a gesture event, + * otherwise, setup the state to FAILED. + * @param {Object} input + */ + + + _proto.tryEmit = function tryEmit(input) { + if (this.canEmit()) { + return this.emit(input); + } // it's failing anyway + + + this.state = STATE_FAILED; + }; + /** + * @private + * can we emit? + * @returns {boolean} + */ + + + _proto.canEmit = function canEmit() { + var i = 0; + + while (i < this.requireFail.length) { + if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { + return false; + } + + i++; + } + + return true; + }; + /** + * @private + * update the recognizer + * @param {Object} inputData + */ + + + _proto.recognize = function recognize(inputData) { + // make a new copy of the inputData + // so we can change the inputData without messing up the other recognizers + var inputDataClone = assign$1({}, inputData); // is is enabled and allow recognizing? + + if (!boolOrFn(this.options.enable, [this, inputDataClone])) { + this.reset(); + this.state = STATE_FAILED; + return; + } // reset when we've reached the end + + + if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { + this.state = STATE_POSSIBLE; + } + + this.state = this.process(inputDataClone); // the recognizer has recognized a gesture + // so trigger an event + + if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { + this.tryEmit(inputDataClone); + } + }; + /** + * @private + * return the state of the recognizer + * the actual recognizing happens in this method + * @virtual + * @param {Object} inputData + * @returns {constant} STATE + */ + + /* jshint ignore:start */ + + + _proto.process = function process(inputData) {}; + /* jshint ignore:end */ + + /** + * @private + * return the preferred touch-action + * @virtual + * @returns {Array} + */ + + + _proto.getTouchAction = function getTouchAction() {}; + /** + * @private + * called when the gesture isn't allowed to recognize + * like when another is being recognized or it is disabled + * @virtual + */ + + + _proto.reset = function reset() {}; + + return Recognizer; + }(); + + /** + * @private + * This recognizer is just used as a base for the simple attribute recognizers. + * @constructor + * @extends Recognizer + */ + + var AttrRecognizer = + /*#__PURE__*/ + function (_Recognizer) { + _inheritsLoose(AttrRecognizer, _Recognizer); + + function AttrRecognizer(options) { + if (options === void 0) { + options = {}; + } + + return _Recognizer.call(this, _extends({ + pointers: 1 + }, options)) || this; + } + /** + * @private + * Used to check if it the recognizer receives valid input, like input.distance > 10. + * @memberof AttrRecognizer + * @param {Object} input + * @returns {Boolean} recognized + */ + + + var _proto = AttrRecognizer.prototype; + + _proto.attrTest = function attrTest(input) { + var optionPointers = this.options.pointers; + return optionPointers === 0 || input.pointers.length === optionPointers; + }; + /** + * @private + * Process the input and return the state for the recognizer + * @memberof AttrRecognizer + * @param {Object} input + * @returns {*} State + */ + + + _proto.process = function process(input) { + var state = this.state; + var eventType = input.eventType; + var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); + var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED + + if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { + return state | STATE_CANCELLED; + } else if (isRecognized || isValid) { + if (eventType & INPUT_END) { + return state | STATE_ENDED; + } else if (!(state & STATE_BEGAN)) { + return STATE_BEGAN; + } + + return state | STATE_CHANGED; + } + + return STATE_FAILED; + }; + + return AttrRecognizer; + }(Recognizer); + + /** + * @private + * direction cons to string + * @param {constant} direction + * @returns {String} + */ + + function directionStr(direction) { + if (direction === DIRECTION_DOWN) { + return 'down'; + } else if (direction === DIRECTION_UP) { + return 'up'; + } else if (direction === DIRECTION_LEFT) { + return 'left'; + } else if (direction === DIRECTION_RIGHT) { + return 'right'; + } + + return ''; + } + + /** + * @private + * Pan + * Recognized when the pointer is down and moved in the allowed direction. + * @constructor + * @extends AttrRecognizer + */ + + var PanRecognizer = + /*#__PURE__*/ + function (_AttrRecognizer) { + _inheritsLoose(PanRecognizer, _AttrRecognizer); + + function PanRecognizer(options) { + var _this; + + if (options === void 0) { + options = {}; + } + + _this = _AttrRecognizer.call(this, _extends({ + event: 'pan', + threshold: 10, + pointers: 1, + direction: DIRECTION_ALL + }, options)) || this; + _this.pX = null; + _this.pY = null; + return _this; + } + + var _proto = PanRecognizer.prototype; + + _proto.getTouchAction = function getTouchAction() { + var direction = this.options.direction; + var actions = []; + + if (direction & DIRECTION_HORIZONTAL) { + actions.push(TOUCH_ACTION_PAN_Y); + } + + if (direction & DIRECTION_VERTICAL) { + actions.push(TOUCH_ACTION_PAN_X); + } + + return actions; + }; + + _proto.directionTest = function directionTest(input) { + var options = this.options; + var hasMoved = true; + var distance = input.distance; + var direction = input.direction; + var x = input.deltaX; + var y = input.deltaY; // lock to axis? + + if (!(direction & options.direction)) { + if (options.direction & DIRECTION_HORIZONTAL) { + direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; + hasMoved = x !== this.pX; + distance = Math.abs(input.deltaX); + } else { + direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN; + hasMoved = y !== this.pY; + distance = Math.abs(input.deltaY); + } + } + + input.direction = direction; + return hasMoved && distance > options.threshold && direction & options.direction; + }; + + _proto.attrTest = function attrTest(input) { + return AttrRecognizer.prototype.attrTest.call(this, input) && ( // replace with a super call + this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input)); + }; + + _proto.emit = function emit(input) { + this.pX = input.deltaX; + this.pY = input.deltaY; + var direction = directionStr(input.direction); + + if (direction) { + input.additionalEvent = this.options.event + direction; + } + + _AttrRecognizer.prototype.emit.call(this, input); + }; + + return PanRecognizer; + }(AttrRecognizer); + + var defaults = { + /** + * @private + * set if DOM events are being triggered. + * But this is slower and unused by simple implementations, so disabled by default. + * @type {Boolean} + * @default false + */ + domEvents: false, + + /** + * @private + * The value for the touchAction property/fallback. + * When set to `compute` it will magically set the correct value based on the added recognizers. + * @type {String} + * @default compute + */ + touchAction: TOUCH_ACTION_COMPUTE, + + /** + * @private + * @type {Boolean} + * @default true + */ + enable: true, + + /** + * @private + * EXPERIMENTAL FEATURE -- can be removed/changed + * Change the parent input target element. + * If Null, then it is being set the to main element. + * @type {Null|EventTarget} + * @default null + */ + inputTarget: null, + + /** + * @private + * force an input class + * @type {Null|Function} + * @default null + */ + inputClass: null, + + /** + * @private + * Some CSS properties can be used to improve the working of Hammer. + * Add them to this method and they will be set when creating a new Manager. + * @namespace + */ + cssProps: { + /** + * @private + * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userSelect: "none", + + /** + * @private + * Disable the Windows Phone grippers when pressing an element. + * @type {String} + * @default 'none' + */ + touchSelect: "none", + + /** + * @private + * Disables the default callout shown when you touch and hold a touch target. + * On iOS, when you touch and hold a touch target such as a link, Safari displays + * a callout containing information about the link. This property allows you to disable that callout. + * @type {String} + * @default 'none' + */ + touchCallout: "none", + + /** + * @private + * Specifies whether zooming is enabled. Used by IE10> + * @type {String} + * @default 'none' + */ + contentZooming: "none", + + /** + * @private + * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. + * @type {String} + * @default 'none' + */ + userDrag: "none", + + /** + * @private + * Overrides the highlight color shown when the user taps a link or a JavaScript + * clickable element in iOS. This property obeys the alpha value, if specified. + * @type {String} + * @default 'rgba(0,0,0,0)' + */ + tapHighlightColor: "rgba(0,0,0,0)" + } + }; + + var STOP = 1; + var FORCED_STOP = 2; + /** + * @private + * add/remove the css properties as defined in manager.options.cssProps + * @param {Manager} manager + * @param {Boolean} add + */ + + function toggleCssProps(manager, add) { + var element = manager.element; + + if (!element.style) { + return; + } + + var prop; + each(manager.options.cssProps, function (value, name) { + prop = prefixed(element.style, name); + + if (add) { + manager.oldCssProps[prop] = element.style[prop]; + element.style[prop] = value; + } else { + element.style[prop] = manager.oldCssProps[prop] || ""; + } + }); + + if (!add) { + manager.oldCssProps = {}; + } + } + /** + * @private + * trigger dom event + * @param {String} event + * @param {Object} data + */ + + + function triggerDomEvent(event, data) { + var gestureEvent = document.createEvent("Event"); + gestureEvent.initEvent(event, true, true); + gestureEvent.gesture = data; + data.target.dispatchEvent(gestureEvent); + } + /** + * @private + * Manager + * @param {HTMLElement} element + * @param {Object} [options] + * @constructor + */ + + + var Manager = + /*#__PURE__*/ + function () { + function Manager(element, options) { + var _this = this; + + this.options = assign$1({}, defaults, options || {}); + this.options.inputTarget = this.options.inputTarget || element; + this.handlers = {}; + this.session = {}; + this.recognizers = []; + this.oldCssProps = {}; + this.element = element; + this.input = createInputInstance(this); + this.touchAction = new TouchAction(this, this.options.touchAction); + toggleCssProps(this, true); + each(this.options.recognizers, function (item) { + var recognizer = _this.add(new item[0](item[1])); + + item[2] && recognizer.recognizeWith(item[2]); + item[3] && recognizer.requireFailure(item[3]); + }, this); + } + /** + * @private + * set options + * @param {Object} options + * @returns {Manager} + */ + + + var _proto = Manager.prototype; + + _proto.set = function set(options) { + assign$1(this.options, options); // Options that need a little more setup + + if (options.touchAction) { + this.touchAction.update(); + } + + if (options.inputTarget) { + // Clean up existing event listeners and reinitialize + this.input.destroy(); + this.input.target = options.inputTarget; + this.input.init(); + } + + return this; + }; + /** + * @private + * stop recognizing for this session. + * This session will be discarded, when a new [input]start event is fired. + * When forced, the recognizer cycle is stopped immediately. + * @param {Boolean} [force] + */ + + + _proto.stop = function stop(force) { + this.session.stopped = force ? FORCED_STOP : STOP; + }; + /** + * @private + * run the recognizers! + * called by the inputHandler function on every movement of the pointers (touches) + * it walks through all the recognizers and tries to detect the gesture that is being made + * @param {Object} inputData + */ + + + _proto.recognize = function recognize(inputData) { + var session = this.session; + + if (session.stopped) { + return; + } // run the touch-action polyfill + + + this.touchAction.preventDefaults(inputData); + var recognizer; + var recognizers = this.recognizers; // this holds the recognizer that is being recognized. + // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED + // if no recognizer is detecting a thing, it is set to `null` + + var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized + // or when we're in a new session + + if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) { + session.curRecognizer = null; + curRecognizer = null; + } + + var i = 0; + + while (i < recognizers.length) { + recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one. + // 1. allow if the session is NOT forced stopped (see the .stop() method) + // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one + // that is being recognized. + // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. + // this can be setup with the `recognizeWith()` method on the recognizer. + + if (session.stopped !== FORCED_STOP && ( // 1 + !curRecognizer || recognizer === curRecognizer || // 2 + recognizer.canRecognizeWith(curRecognizer))) { + // 3 + recognizer.recognize(inputData); + } else { + recognizer.reset(); + } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the + // current active recognizer. but only if we don't already have an active recognizer + + + if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { + session.curRecognizer = recognizer; + curRecognizer = recognizer; + } + + i++; + } + }; + /** + * @private + * get a recognizer by its event name. + * @param {Recognizer|String} recognizer + * @returns {Recognizer|Null} + */ + + + _proto.get = function get(recognizer) { + if (recognizer instanceof Recognizer) { + return recognizer; + } + + var recognizers = this.recognizers; + + for (var i = 0; i < recognizers.length; i++) { + if (recognizers[i].options.event === recognizer) { + return recognizers[i]; + } + } + + return null; + }; + /** + * @private add a recognizer to the manager + * existing recognizers with the same event name will be removed + * @param {Recognizer} recognizer + * @returns {Recognizer|Manager} + */ + + + _proto.add = function add(recognizer) { + if (invokeArrayArg(recognizer, "add", this)) { + return this; + } // remove existing + + + var existing = this.get(recognizer.options.event); + + if (existing) { + this.remove(existing); + } + + this.recognizers.push(recognizer); + recognizer.manager = this; + this.touchAction.update(); + return recognizer; + }; + /** + * @private + * remove a recognizer by name or instance + * @param {Recognizer|String} recognizer + * @returns {Manager} + */ + + + _proto.remove = function remove(recognizer) { + if (invokeArrayArg(recognizer, "remove", this)) { + return this; + } + + var targetRecognizer = this.get(recognizer); // let's make sure this recognizer exists + + if (recognizer) { + var recognizers = this.recognizers; + var index = inArray(recognizers, targetRecognizer); + + if (index !== -1) { + recognizers.splice(index, 1); + this.touchAction.update(); + } + } + + return this; + }; + /** + * @private + * bind event + * @param {String} events + * @param {Function} handler + * @returns {EventEmitter} this + */ + + + _proto.on = function on(events, handler) { + if (events === undefined || handler === undefined) { + return this; + } + + var handlers = this.handlers; + each(splitStr(events), function (event) { + handlers[event] = handlers[event] || []; + handlers[event].push(handler); + }); + return this; + }; + /** + * @private unbind event, leave emit blank to remove all handlers + * @param {String} events + * @param {Function} [handler] + * @returns {EventEmitter} this + */ + + + _proto.off = function off(events, handler) { + if (events === undefined) { + return this; + } + + var handlers = this.handlers; + each(splitStr(events), function (event) { + if (!handler) { + delete handlers[event]; + } else { + handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); + } + }); + return this; + }; + /** + * @private emit event to the listeners + * @param {String} event + * @param {Object} data + */ + + + _proto.emit = function emit(event, data) { + // we also want to trigger dom events + if (this.options.domEvents) { + triggerDomEvent(event, data); + } // no handlers, so skip it all + + + var handlers = this.handlers[event] && this.handlers[event].slice(); + + if (!handlers || !handlers.length) { + return; + } + + data.type = event; + + data.preventDefault = function () { + data.srcEvent.preventDefault(); + }; + + var i = 0; + + while (i < handlers.length) { + handlers[i](data); + i++; + } + }; + /** + * @private + * destroy the manager and unbinds all events + * it doesn't unbind dom events, that is the user own responsibility + */ + + + _proto.destroy = function destroy() { + this.element && toggleCssProps(this, false); + this.handlers = {}; + this.session = {}; + this.input.destroy(); + this.element = null; + }; + + return Manager; + }(); + + /* + Copyright (c) 2015 NAVER Corp. + name: @egjs/agent + license: MIT + author: NAVER Corp. + repository: git+https://github.com/naver/agent.git + version: 2.2.1 + */ + function some(arr, callback) { + var length = arr.length; + + for (var i = 0; i < length; ++i) { + if (callback(arr[i], i)) { + return true; + } + } + + return false; + } + function find(arr, callback) { + var length = arr.length; + + for (var i = 0; i < length; ++i) { + if (callback(arr[i], i)) { + return arr[i]; + } + } + + return null; + } + function getUserAgent(agent) { + var userAgent = agent; + + if (typeof userAgent === "undefined") { + if (typeof navigator === "undefined" || !navigator) { + return ""; + } + + userAgent = navigator.userAgent || ""; + } + + return userAgent.toLowerCase(); + } + function execRegExp(pattern, text) { + try { + return new RegExp(pattern, "g").exec(text); + } catch (e) { + return null; + } + } + function hasUserAgentData() { + if (typeof navigator === "undefined" || !navigator || !navigator.userAgentData) { + return false; + } + + var userAgentData = navigator.userAgentData; + var brands = userAgentData.brands || userAgentData.uaList; + return !!(brands && brands.length); + } + function findVersion(versionTest, userAgent) { + var result = execRegExp("(" + versionTest + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent); + return result ? result[3] : ""; + } + function convertVersion(text) { + return text.replace(/_/g, "."); + } + function findPreset(presets, userAgent) { + var userPreset = null; + var version = "-1"; + some(presets, function (preset) { + var result = execRegExp("(" + preset.test + ")((?:\\/|\\s|:)([0-9|\\.|_]+))?", userAgent); + + if (!result || preset.brand) { + return false; + } + + userPreset = preset; + version = result[3] || "-1"; + + if (preset.versionAlias) { + version = preset.versionAlias; + } else if (preset.versionTest) { + version = findVersion(preset.versionTest.toLowerCase(), userAgent) || version; + } + + version = convertVersion(version); + return true; + }); + return { + preset: userPreset, + version: version + }; + } + function findBrand(brands, preset) { + return find(brands, function (_a) { + var brand = _a.brand; + return execRegExp("" + preset.test, brand.toLowerCase()); + }); + } + + var BROWSER_PRESETS = [{ + test: "phantomjs", + id: "phantomjs" + }, { + test: "whale", + id: "whale" + }, { + test: "edgios|edge|edg", + id: "edge" + }, { + test: "msie|trident|windows phone", + id: "ie", + versionTest: "iemobile|msie|rv" + }, { + test: "miuibrowser", + id: "miui browser" + }, { + test: "samsungbrowser", + id: "samsung internet" + }, { + test: "samsung", + id: "samsung internet", + versionTest: "version" + }, { + test: "chrome|crios", + id: "chrome" + }, { + test: "firefox|fxios", + id: "firefox" + }, { + test: "android", + id: "android browser", + versionTest: "version" + }, { + test: "safari|iphone|ipad|ipod", + id: "safari", + versionTest: "version" + }]; // chromium's engine(blink) is based on applewebkit 537.36. + + var CHROMIUM_PRESETS = [{ + test: "(?=.*applewebkit/(53[0-7]|5[0-2]|[0-4]))(?=.*\\schrome)", + id: "chrome" + }, { + test: "chromium", + id: "chrome" + }, { + test: "whale", + id: "chrome", + brand: true + }]; + var WEBKIT_PRESETS = [{ + test: "applewebkit", + id: "webkit" + }]; + var WEBVIEW_PRESETS = [{ + test: "(?=(iphone|ipad))(?!(.*version))", + id: "webview" + }, { + test: "(?=(android|iphone|ipad))(?=.*(naver|daum|; wv))", + id: "webview" + }, { + // test webview + test: "webview", + id: "webview" + }]; + var OS_PRESETS = [{ + test: "windows phone", + id: "windows phone" + }, { + test: "windows 2000", + id: "window", + versionAlias: "5.0" + }, { + test: "windows nt", + id: "window" + }, { + test: "iphone|ipad|ipod", + id: "ios", + versionTest: "iphone os|cpu os" + }, { + test: "mac os x", + id: "mac" + }, { + test: "android", + id: "android" + }, { + test: "tizen", + id: "tizen" + }, { + test: "webos|web0s", + id: "webos" + }]; + + function parseUserAgentData(osData) { + var userAgentData = navigator.userAgentData; + var brands = (userAgentData.uaList || userAgentData.brands).slice(); + var isMobile = userAgentData.mobile || false; + var firstBrand = brands[0]; + var browser = { + name: firstBrand.brand, + version: firstBrand.version, + majorVersion: -1, + webkit: false, + webview: some(WEBVIEW_PRESETS, function (preset) { + return findBrand(brands, preset); + }), + chromium: some(CHROMIUM_PRESETS, function (preset) { + return findBrand(brands, preset); + }) + }; + var os = { + name: "unknown", + version: "-1", + majorVersion: -1 + }; + browser.webkit = !browser.chromium && some(WEBKIT_PRESETS, function (preset) { + return findBrand(brands, preset); + }); + + if (osData) { + var platform_1 = osData.platform.toLowerCase(); + var result = find(OS_PRESETS, function (preset) { + return new RegExp("" + preset.test, "g").exec(platform_1); + }); + os.name = result ? result.id : platform_1; + os.version = osData.platformVersion; + } + + some(BROWSER_PRESETS, function (preset) { + var result = findBrand(brands, preset); + + if (!result) { + return false; + } + + browser.name = preset.id; + browser.version = osData ? osData.uaFullVersion : result.version; + return true; + }); + + if (navigator.platform === "Linux armv8l") { + os.name = "android"; + } else if (browser.webkit) { + os.name = isMobile ? "ios" : "mac"; + } + + if (os.name === "ios" && browser.webview) { + browser.version = "-1"; + } + + os.version = convertVersion(os.version); + browser.version = convertVersion(browser.version); + os.majorVersion = parseInt(os.version, 10); + browser.majorVersion = parseInt(browser.version, 10); + return { + browser: browser, + os: os, + isMobile: isMobile, + isHints: true + }; + } + + function parseUserAgent(userAgent) { + var nextAgent = getUserAgent(userAgent); + var isMobile = !!/mobi/g.exec(nextAgent); + var browser = { + name: "unknown", + version: "-1", + majorVersion: -1, + webview: !!findPreset(WEBVIEW_PRESETS, nextAgent).preset, + chromium: !!findPreset(CHROMIUM_PRESETS, nextAgent).preset, + webkit: false + }; + var os = { + name: "unknown", + version: "-1", + majorVersion: -1 + }; + + var _a = findPreset(BROWSER_PRESETS, nextAgent), + browserPreset = _a.preset, + browserVersion = _a.version; + + var _b = findPreset(OS_PRESETS, nextAgent), + osPreset = _b.preset, + osVersion = _b.version; + + browser.webkit = !browser.chromium && !!findPreset(WEBKIT_PRESETS, nextAgent).preset; + + if (osPreset) { + os.name = osPreset.id; + os.version = osVersion; + os.majorVersion = parseInt(osVersion, 10); + } + + if (browserPreset) { + browser.name = browserPreset.id; + browser.version = browserVersion; + + if (browser.webview && os.name === "ios" && browser.name !== "safari") { + browser.webview = false; + } + } + + browser.majorVersion = parseInt(browser.version, 10); + return { + browser: browser, + os: os, + isMobile: isMobile, + isHints: false + }; + } + /** + * Extracts browser and operating system information from the user agent string. + * @ko 유저 에이전트 문자열에서 브라우저와 운영체제 정보를 추출한다. + * @function eg.agent#agent + * @param - user agent string to parse 파싱할 유저에이전트 문자열 + * @return - agent Info 에이전트 정보 + * @example + import agent from "@egjs/agent"; + // eg.agent(); + const { os, browser, isMobile } = agent(); + */ + + function agent(userAgent) { + if (typeof userAgent === "undefined" && hasUserAgentData()) { + return parseUserAgentData(); + } else { + return parseUserAgent(userAgent); + } + } + + /* + Copyright (c) 2017 NAVER Corp. + @egjs/axes project is licensed under the MIT license + + @egjs/axes JavaScript library + https://github.com/naver/egjs-axes + + @version 2.7.0 + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + /* global Reflect, Promise */ + var extendStatics$2 = function (d, b) { + extendStatics$2 = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + + return extendStatics$2(d, b); + }; + + function __extends$2(d, b) { + extendStatics$2(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign$1 = function () { + __assign$1 = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + + return t; + }; + + return __assign$1.apply(this, arguments); + }; + + function getInsidePosition(destPos, range, circular, bounce) { + var toDestPos = destPos; + var targetRange = [circular[0] ? range[0] : bounce ? range[0] - bounce[0] : range[0], circular[1] ? range[1] : bounce ? range[1] + bounce[1] : range[1]]; + toDestPos = Math.max(targetRange[0], toDestPos); + toDestPos = Math.min(targetRange[1], toDestPos); + return toDestPos; + } // determine outside + + function isOutside(pos, range) { + return pos < range[0] || pos > range[1]; + } + function getDuration(distance, deceleration) { + var duration = Math.sqrt(distance / deceleration * 2); // when duration is under 100, then value is zero + + return duration < 100 ? 0 : duration; + } + function isCircularable(destPos, range, circular) { + return circular[1] && destPos > range[1] || circular[0] && destPos < range[0]; + } + function getCirculatedPos(pos, range, circular) { + var toPos = pos; + var min = range[0]; + var max = range[1]; + var length = max - min; + + if (circular[1] && pos > max) { + // right + toPos = (toPos - max) % length + min; + } + + if (circular[0] && pos < min) { + // left + toPos = (toPos - min) % length + max; + } + + return toPos; + } + + /* eslint-disable no-new-func, no-nested-ternary */ + var win$1; + + if (typeof window === "undefined") { + // window is undefined in node.js + win$1 = { + navigator: { + userAgent: "" + } + }; + } else { + win$1 = window; + } + + function toArray$2(nodes) { + // const el = Array.prototype.slice.call(nodes); + // for IE8 + var el = []; + + for (var i = 0, len = nodes.length; i < len; i++) { + el.push(nodes[i]); + } + + return el; + } + function $(param, multi) { + if (multi === void 0) { + multi = false; + } + + var el; + + if (typeof param === "string") { + // String (HTML, Selector) + // check if string is HTML tag format + var match = param.match(/^<([a-z]+)\s*([^>]*)>/); // creating element + + if (match) { + // HTML + var dummy = document.createElement("div"); + dummy.innerHTML = param; + el = toArray$2(dummy.childNodes); + } else { + // Selector + el = toArray$2(document.querySelectorAll(param)); + } + + if (!multi) { + el = el.length >= 1 ? el[0] : undefined; + } + } else if (param === win$1) { + // window + el = param; + } else if (param.nodeName && (param.nodeType === 1 || param.nodeType === 9)) { + // HTMLElement, Document + el = param; + } else if ("jQuery" in win$1 && param instanceof jQuery || param.constructor.prototype.jquery) { + // jQuery + el = multi ? param.toArray() : param.get(0); + } else if (Array.isArray(param)) { + el = param.map(function (v) { + return $(v); + }); + + if (!multi) { + el = el.length >= 1 ? el[0] : undefined; + } + } + + return el; + } + var raf = win$1.requestAnimationFrame || win$1.webkitRequestAnimationFrame; + var caf = win$1.cancelAnimationFrame || win$1.webkitCancelAnimationFrame; + + if (raf && !caf) { + var keyInfo_1 = {}; + var oldraf_1 = raf; + + raf = function (callback) { + function wrapCallback(timestamp) { + if (keyInfo_1[key]) { + callback(timestamp); + } + } + + var key = oldraf_1(wrapCallback); + keyInfo_1[key] = true; + return key; + }; + + caf = function (key) { + delete keyInfo_1[key]; + }; + } else if (!(raf && caf)) { + raf = function (callback) { + return win$1.setTimeout(function () { + callback(win$1.performance && win$1.performance.now && win$1.performance.now() || new Date().getTime()); + }, 16); + }; + + caf = win$1.clearTimeout; + } + /** + * A polyfill for the window.requestAnimationFrame() method. + * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame + * @private + */ + + + function requestAnimationFrame(fp) { + return raf(fp); + } + /** + * A polyfill for the window.cancelAnimationFrame() method. It cancels an animation executed through a call to the requestAnimationFrame() method. + * @param {Number} key − The ID value returned through a call to the requestAnimationFrame() method. requestAnimationFrame() 메서드가 반환한 아이디 값 + * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/cancelAnimationFrame + * @private + */ + + function cancelAnimationFrame(key) { + caf(key); + } + function map(obj, callback) { + var tranformed = {}; + + for (var k in obj) { + k && (tranformed[k] = callback(obj[k], k)); + } + + return tranformed; + } + function filter(obj, callback) { + var filtered = {}; + + for (var k in obj) { + k && callback(obj[k], k) && (filtered[k] = obj[k]); + } + + return filtered; + } + function every(obj, callback) { + for (var k in obj) { + if (k && !callback(obj[k], k)) { + return false; + } + } + + return true; + } + function equal(target, base) { + return every(target, function (v, k) { + return v === base[k]; + }); + } + var roundNumFunc = {}; + function roundNumber(num, roundUnit) { + // Cache for performance + if (!roundNumFunc[roundUnit]) { + roundNumFunc[roundUnit] = getRoundFunc(roundUnit); + } + + return roundNumFunc[roundUnit](num); + } + function roundNumbers(num, roundUnit) { + if (!num || !roundUnit) { + return num; + } + + var isNumber = typeof roundUnit === "number"; + return map(num, function (value, key) { + return roundNumber(value, isNumber ? roundUnit : roundUnit[key]); + }); + } + function getDecimalPlace(val) { + if (!isFinite(val)) { + return 0; + } + + var v = val + ""; + + if (v.indexOf("e") >= 0) { + // Exponential Format + // 1e-10, 1e-12 + var p = 0; + var e = 1; + + while (Math.round(val * e) / e !== val) { + e *= 10; + p++; + } + + return p; + } // In general, following has performance benefit. + // https://jsperf.com/precision-calculation + + + return v.indexOf(".") >= 0 ? v.length - v.indexOf(".") - 1 : 0; + } + function inversePow(n) { + // replace Math.pow(10, -n) to solve floating point issue. + // eg. Math.pow(10, -4) => 0.00009999999999999999 + return 1 / Math.pow(10, n); + } + function getRoundFunc(v) { + var p = v < 1 ? Math.pow(10, getDecimalPlace(v)) : 1; + return function (n) { + if (v === 0) { + return 0; + } + + return Math.round(Math.round(n / v) * v * p) / p; + }; + } + + function minMax(value, min, max) { + return Math.max(Math.min(value, max), min); + } + + var AnimationManager = + /*#__PURE__*/ + function () { + function AnimationManager(_a) { + var options = _a.options, + itm = _a.itm, + em = _a.em, + axm = _a.axm; + this.options = options; + this.itm = itm; + this.em = em; + this.axm = axm; + this.animationEnd = this.animationEnd.bind(this); + } + + var __proto = AnimationManager.prototype; + + __proto.getDuration = function (depaPos, destPos, wishDuration) { + var _this = this; + + var duration; + + if (typeof wishDuration !== "undefined") { + duration = wishDuration; + } else { + var durations_1 = map(destPos, function (v, k) { + return getDuration(Math.abs(v - depaPos[k]), _this.options.deceleration); + }); + duration = Object.keys(durations_1).reduce(function (max, v) { + return Math.max(max, durations_1[v]); + }, -Infinity); + } + + return minMax(duration, this.options.minimumDuration, this.options.maximumDuration); + }; + + __proto.createAnimationParam = function (pos, duration, option) { + var depaPos = this.axm.get(); + var destPos = pos; + var inputEvent = option && option.event || null; + return { + depaPos: depaPos, + destPos: destPos, + duration: minMax(duration, this.options.minimumDuration, this.options.maximumDuration), + delta: this.axm.getDelta(depaPos, destPos), + inputEvent: inputEvent, + input: option && option.input || null, + isTrusted: !!inputEvent, + done: this.animationEnd + }; + }; + + __proto.grab = function (axes, option) { + if (this._animateParam && axes.length) { + var orgPos_1 = this.axm.get(axes); + var pos = this.axm.map(orgPos_1, function (v, opt) { + return getCirculatedPos(v, opt.range, opt.circular); + }); + + if (!every(pos, function (v, k) { + return orgPos_1[k] === v; + })) { + this.em.triggerChange(pos, false, orgPos_1, option, !!option); + } + + this._animateParam = null; + this._raf && cancelAnimationFrame(this._raf); + this._raf = null; + this.em.triggerAnimationEnd(!!(option && option.event)); + } + }; + + __proto.getEventInfo = function () { + if (this._animateParam && this._animateParam.input && this._animateParam.inputEvent) { + return { + input: this._animateParam.input, + event: this._animateParam.inputEvent + }; + } else { + return null; + } + }; + + __proto.restore = function (option) { + var pos = this.axm.get(); + var destPos = this.axm.map(pos, function (v, opt) { + return Math.min(opt.range[1], Math.max(opt.range[0], v)); + }); + this.animateTo(destPos, this.getDuration(pos, destPos), option); + }; + + __proto.animationEnd = function () { + var beforeParam = this.getEventInfo(); + this._animateParam = null; // for Circular + + var circularTargets = this.axm.filter(this.axm.get(), function (v, opt) { + return isCircularable(v, opt.range, opt.circular); + }); + Object.keys(circularTargets).length > 0 && this.setTo(this.axm.map(circularTargets, function (v, opt) { + return getCirculatedPos(v, opt.range, opt.circular); + })); + this.itm.setInterrupt(false); + this.em.triggerAnimationEnd(!!beforeParam); + + if (this.axm.isOutside()) { + this.restore(beforeParam); + } else { + this.finish(!!beforeParam); + } + }; + + __proto.finish = function (isTrusted) { + this._animateParam = null; + this.itm.setInterrupt(false); + this.em.triggerFinish(isTrusted); + }; + + __proto.animateLoop = function (param, complete) { + if (param.duration) { + this._animateParam = __assign$1({}, param); + var info_1 = this._animateParam; + var self_1 = this; + var destPos_1 = info_1.destPos; + var prevPos_1 = info_1.depaPos; + var prevEasingPer_1 = 0; + var directions_1 = map(prevPos_1, function (value, key) { + return value <= destPos_1[key] ? 1 : -1; + }); + var originalIntendedPos_1 = map(destPos_1, function (v) { + return v; + }); + var prevTime_1 = new Date().getTime(); + info_1.startTime = prevTime_1; + + (function loop() { + self_1._raf = null; + var currentTime = new Date().getTime(); + var ratio = (currentTime - info_1.startTime) / param.duration; + var easingPer = self_1.easing(ratio); + var toPos = self_1.axm.map(prevPos_1, function (pos, options, key) { + var nextPos = ratio >= 1 ? destPos_1[key] : pos + info_1.delta[key] * (easingPer - prevEasingPer_1); // Subtract distance from distance already moved. + // Recalculate the remaining distance. + // Fix the bouncing phenomenon by changing the range. + + var circulatedPos = getCirculatedPos(nextPos, options.range, options.circular); + + if (nextPos !== circulatedPos) { + // circular + var rangeOffset = directions_1[key] * (options.range[1] - options.range[0]); + destPos_1[key] -= rangeOffset; + prevPos_1[key] -= rangeOffset; + } + + return circulatedPos; + }); + var isCanceled = !self_1.em.triggerChange(toPos, false, prevPos_1); + prevPos_1 = toPos; + prevTime_1 = currentTime; + prevEasingPer_1 = easingPer; + + if (easingPer >= 1) { + destPos_1 = self_1.getFinalPos(destPos_1, originalIntendedPos_1); + + if (!equal(destPos_1, self_1.axm.get(Object.keys(destPos_1)))) { + self_1.em.triggerChange(destPos_1, true, prevPos_1); + } + + complete(); + return; + } else if (isCanceled) { + self_1.finish(false); + } else { + // animationEnd + self_1._raf = requestAnimationFrame(loop); + } + })(); + } else { + this.em.triggerChange(param.destPos, true); + complete(); + } + }; + /** + * Get estimated final value. + * + * If destPos is within the 'error range' of the original intended position, the initial intended position is returned. + * - eg. original intended pos: 100, destPos: 100.0000000004 ==> return 100; + * If dest Pos is outside the 'range of error' compared to the originally intended pos, it is returned rounded based on the originally intended pos. + * - eg. original intended pos: 100.123 destPos: 50.12345 => return 50.123 + * + * @param originalIntendedPos + * @param destPos + */ + + + __proto.getFinalPos = function (destPos, originalIntendedPos) { + var _this = this; // compare destPos and originalIntendedPos + + + var ERROR_LIMIT = 0.000001; + var finalPos = map(destPos, function (value, key) { + if (value >= originalIntendedPos[key] - ERROR_LIMIT && value <= originalIntendedPos[key] + ERROR_LIMIT) { + // In error range, return original intended + return originalIntendedPos[key]; + } else { + // Out of error range, return rounded pos. + var roundUnit = _this.getRoundUnit(value, key); + + var result = roundNumber(value, roundUnit); + return result; + } + }); + return finalPos; + }; + + __proto.getRoundUnit = function (val, key) { + var roundUnit = this.options.round; // manual mode + + var minRoundUnit = null; // auto mode + // auto mode + + if (!roundUnit) { + // Get minimum round unit + var options = this.axm.getAxisOptions(key); + minRoundUnit = inversePow(Math.max(getDecimalPlace(options.range[0]), getDecimalPlace(options.range[1]), getDecimalPlace(val))); + } + + return minRoundUnit || roundUnit; + }; + + __proto.getUserControll = function (param) { + var userWish = param.setTo(); + userWish.destPos = this.axm.get(userWish.destPos); + userWish.duration = minMax(userWish.duration, this.options.minimumDuration, this.options.maximumDuration); + return userWish; + }; + + __proto.animateTo = function (destPos, duration, option) { + var _this = this; + + var param = this.createAnimationParam(destPos, duration, option); + + var depaPos = __assign$1({}, param.depaPos); + + var retTrigger = this.em.triggerAnimationStart(param); // to control + + var userWish = this.getUserControll(param); // You can't stop the 'animationStart' event when 'circular' is true. + + if (!retTrigger && this.axm.every(userWish.destPos, function (v, opt) { + return isCircularable(v, opt.range, opt.circular); + })) { + console.warn("You can't stop the 'animation' event when 'circular' is true."); + } + + if (retTrigger && !equal(userWish.destPos, depaPos)) { + var inputEvent = option && option.event || null; + this.animateLoop({ + depaPos: depaPos, + destPos: userWish.destPos, + duration: userWish.duration, + delta: this.axm.getDelta(depaPos, userWish.destPos), + isTrusted: !!inputEvent, + inputEvent: inputEvent, + input: option && option.input || null + }, function () { + return _this.animationEnd(); + }); + } + }; + + __proto.easing = function (p) { + return p > 1 ? 1 : this.options.easing(p); + }; + + __proto.setTo = function (pos, duration) { + if (duration === void 0) { + duration = 0; + } + + var axes = Object.keys(pos); + this.grab(axes); + var orgPos = this.axm.get(axes); + + if (equal(pos, orgPos)) { + return this; + } + + this.itm.setInterrupt(true); + var movedPos = filter(pos, function (v, k) { + return orgPos[k] !== v; + }); + + if (!Object.keys(movedPos).length) { + return this; + } + + movedPos = this.axm.map(movedPos, function (v, opt) { + var range = opt.range, + circular = opt.circular; + + if (circular && (circular[0] || circular[1])) { + return v; + } else { + return getInsidePosition(v, range, circular); + } + }); + + if (equal(movedPos, orgPos)) { + return this; + } + + if (duration > 0) { + this.animateTo(movedPos, duration); + } else { + this.em.triggerChange(movedPos); + this.finish(false); + } + + return this; + }; + + __proto.setBy = function (pos, duration) { + if (duration === void 0) { + duration = 0; + } + + return this.setTo(map(this.axm.get(Object.keys(pos)), function (v, k) { + return v + pos[k]; + }), duration); + }; + + return AnimationManager; + }(); + + var EventManager = + /*#__PURE__*/ + function () { + function EventManager(axes) { + this.axes = axes; + } + /** + * This event is fired when a user holds an element on the screen of the device. + * @ko 사용자가 기기의 화면에 손을 대고 있을 때 발생하는 이벤트 + * @name eg.Axes#hold + * @event + * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Object.} pos coordinate 좌표 정보 + * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스 + * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체 + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("hold", function(event) { + * // event.pos + * // event.input + * // event.inputEvent + * // isTrusted + * }); + */ + + + var __proto = EventManager.prototype; + + __proto.triggerHold = function (pos, option) { + var roundPos = this.getRoundPos(pos).roundPos; + this.axes.trigger("hold", { + pos: roundPos, + input: option.input || null, + inputEvent: option.event || null, + isTrusted: true + }); + }; + /** + * Specifies the coordinates to move after the 'change' event. It works when the holding value of the change event is true. + * @ko 'change' 이벤트 이후 이동할 좌표를 지정한다. change이벤트의 holding 값이 true일 경우에 동작한다 + * @name set + * @function + * @param {Object.} pos The coordinate to move to 이동할 좌표 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("change", function(event) { + * event.holding && event.set({x: 10}); + * }); + */ + + /** Specifies the animation coordinates to move after the 'release' or 'animationStart' events. + * @ko 'release' 또는 'animationStart' 이벤트 이후 이동할 좌표를 지정한다. + * @name setTo + * @function + * @param {Object.} pos The coordinate to move to 이동할 좌표 + * @param {Number} [duration] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms) + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("animationStart", function(event) { + * event.setTo({x: 10}, 2000); + * }); + */ + + /** + * This event is fired when a user release an element on the screen of the device. + * @ko 사용자가 기기의 화면에서 손을 뗐을 때 발생하는 이벤트 + * @name eg.Axes#release + * @event + * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Object.} depaPos The coordinates when releasing an element손을 뗐을 때의 좌표 + * @property {Object.} destPos The coordinates to move to after releasing an element손을 뗀 뒤에 이동할 좌표 + * @property {Object.} delta The movement variation of coordinate 좌표의 변화량 + * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체 + * @property {Object} input The instance of inputType where the event occurred이벤트가 발생한 inputType 인스턴스 + * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다 + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("release", function(event) { + * // event.depaPos + * // event.destPos + * // event.delta + * // event.input + * // event.inputEvent + * // event.setTo + * // event.isTrusted + * + * // if you want to change the animation coordinates to move after the 'release' event. + * event.setTo({x: 10}, 2000); + * }); + */ + + + __proto.triggerRelease = function (param) { + var _a = this.getRoundPos(param.destPos, param.depaPos), + roundPos = _a.roundPos, + roundDepa = _a.roundDepa; + + param.destPos = roundPos; + param.depaPos = roundDepa; + param.setTo = this.createUserControll(param.destPos, param.duration); + this.axes.trigger("release", param); + }; + /** + * This event is fired when coordinate changes. + * @ko 좌표가 변경됐을 때 발생하는 이벤트 + * @name eg.Axes#change + * @event + * @type {object} The object of data to be sent when the event is fired 이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Object.} pos The coordinate 좌표 + * @property {Object.} delta The movement variation of coordinate 좌표의 변화량 + * @property {Boolean} holding Indicates whether a user holds an element on the screen of the device.사용자가 기기의 화면을 누르고 있는지 여부 + * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다. + * @property {Object} inputEvent The event object received from inputType. If the value is changed by animation, it returns 'null'.inputType으로 부터 받은 이벤트 객체. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다. + * @property {set} set Specifies the coordinates to move after the event. It works when the holding value is true 이벤트 이후 이동할 좌표를 지정한다. holding 값이 true일 경우에 동작한다. + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("change", function(event) { + * // event.pos + * // event.delta + * // event.input + * // event.inputEvent + * // event.holding + * // event.set + * // event.isTrusted + * + * // if you want to change the coordinates to move after the 'change' event. + * // it works when the holding value of the change event is true. + * event.holding && event.set({x: 10}); + * }); + */ + + + __proto.triggerChange = function (pos, isAccurate, depaPos, option, holding) { + if (holding === void 0) { + holding = false; + } + + var am = this.am; + var axm = am.axm; + var eventInfo = am.getEventInfo(); + + var _a = this.getRoundPos(pos, depaPos), + roundPos = _a.roundPos, + roundDepa = _a.roundDepa; + + var moveTo = axm.moveTo(roundPos, roundDepa); + var inputEvent = option && option.event || eventInfo && eventInfo.event || null; + var param = { + pos: moveTo.pos, + delta: moveTo.delta, + holding: holding, + inputEvent: inputEvent, + isTrusted: !!inputEvent, + input: option && option.input || eventInfo && eventInfo.input || null, + set: inputEvent ? this.createUserControll(moveTo.pos) : function () {} + }; + var result = this.axes.trigger("change", param); + inputEvent && axm.set(param.set()["destPos"]); + return result; + }; + /** + * This event is fired when animation starts. + * @ko 에니메이션이 시작할 때 발생한다. + * @name eg.Axes#animationStart + * @event + * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Object.} depaPos The coordinates when animation starts애니메이션이 시작 되었을 때의 좌표 + * @property {Object.} destPos The coordinates to move to. If you change this value, you can run the animation이동할 좌표. 이값을 변경하여 애니메이션을 동작시킬수 있다 + * @property {Object.} delta The movement variation of coordinate 좌표의 변화량 + * @property {Number} duration Duration of the animation (unit: ms). If you change this value, you can control the animation duration time.애니메이션 진행 시간(단위: ms). 이값을 변경하여 애니메이션의 이동시간을 조절할 수 있다. + * @property {Object} input The instance of inputType where the event occurred. If the value is changed by animation, it returns 'null'.이벤트가 발생한 inputType 인스턴스. 애니메이션에 의해 값이 변경될 경우에는 'null'을 반환한다. + * @property {Object} inputEvent The event object received from inputType inputType으로 부터 받은 이벤트 객체 + * @property {setTo} setTo Specifies the animation coordinates to move after the event 이벤트 이후 이동할 애니메이션 좌표를 지정한다 + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("release", function(event) { + * // event.depaPos + * // event.destPos + * // event.delta + * // event.input + * // event.inputEvent + * // event.setTo + * // event.isTrusted + * + * // if you want to change the animation coordinates to move after the 'animationStart' event. + * event.setTo({x: 10}, 2000); + * }); + */ + + + __proto.triggerAnimationStart = function (param) { + var _a = this.getRoundPos(param.destPos, param.depaPos), + roundPos = _a.roundPos, + roundDepa = _a.roundDepa; + + param.destPos = roundPos; + param.depaPos = roundDepa; + param.setTo = this.createUserControll(param.destPos, param.duration); + return this.axes.trigger("animationStart", param); + }; + /** + * This event is fired when animation ends. + * @ko 에니메이션이 끝났을 때 발생한다. + * @name eg.Axes#animationEnd + * @event + * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("animationEnd", function(event) { + * // event.isTrusted + * }); + */ + + + __proto.triggerAnimationEnd = function (isTrusted) { + if (isTrusted === void 0) { + isTrusted = false; + } + + this.axes.trigger("animationEnd", { + isTrusted: isTrusted + }); + }; + /** + * This event is fired when all actions have been completed. + * @ko 에니메이션이 끝났을 때 발생한다. + * @name eg.Axes#finish + * @event + * @type {object} The object of data to be sent when the event is fired이벤트가 발생할 때 전달되는 데이터 객체 + * @property {Boolean} isTrusted Returns true if an event was generated by the user action, or false if it was caused by a script or API call 사용자의 액션에 의해 이벤트가 발생하였으면 true, 스크립트나 API호출에 의해 발생하였을 경우에는 false를 반환한다. + * + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }).on("finish", function(event) { + * // event.isTrusted + * }); + */ + + + __proto.triggerFinish = function (isTrusted) { + if (isTrusted === void 0) { + isTrusted = false; + } + + this.axes.trigger("finish", { + isTrusted: isTrusted + }); + }; + + __proto.createUserControll = function (pos, duration) { + if (duration === void 0) { + duration = 0; + } // to controll + + + var userControl = { + destPos: __assign$1({}, pos), + duration: duration + }; + return function (toPos, userDuration) { + toPos && (userControl.destPos = __assign$1({}, toPos)); + userDuration !== undefined && (userControl.duration = userDuration); + return userControl; + }; + }; + + __proto.setAnimationManager = function (am) { + this.am = am; + }; + + __proto.destroy = function () { + this.axes.off(); + }; + + __proto.getRoundPos = function (pos, depaPos) { + // round value if round exist + var roundUnit = this.axes.options.round; // if (round == null) { + // return {pos, depaPos}; // undefined, undefined + // } + + return { + roundPos: roundNumbers(pos, roundUnit), + roundDepa: roundNumbers(depaPos, roundUnit) + }; + }; + + return EventManager; + }(); + + var InterruptManager = + /*#__PURE__*/ + function () { + function InterruptManager(options) { + this.options = options; + this._prevented = false; // check whether the animation event was prevented + } + + var __proto = InterruptManager.prototype; + + __proto.isInterrupting = function () { + // when interruptable is 'true', return value is always 'true'. + return this.options.interruptable || this._prevented; + }; + + __proto.isInterrupted = function () { + return !this.options.interruptable && this._prevented; + }; + + __proto.setInterrupt = function (prevented) { + !this.options.interruptable && (this._prevented = prevented); + }; + + return InterruptManager; + }(); + + var AxisManager = + /*#__PURE__*/ + function () { + function AxisManager(axis, options) { + var _this = this; + + this.axis = axis; + this.options = options; + + this._complementOptions(); + + this._pos = Object.keys(this.axis).reduce(function (acc, v) { + acc[v] = _this.axis[v].range[0]; + return acc; + }, {}); + } + /** + * set up 'css' expression + * @private + */ + + + var __proto = AxisManager.prototype; + + __proto._complementOptions = function () { + var _this = this; + + Object.keys(this.axis).forEach(function (axis) { + _this.axis[axis] = __assign$1({ + range: [0, 100], + bounce: [0, 0], + circular: [false, false] + }, _this.axis[axis]); + ["bounce", "circular"].forEach(function (v) { + var axisOption = _this.axis; + var key = axisOption[axis][v]; + + if (/string|number|boolean/.test(typeof key)) { + axisOption[axis][v] = [key, key]; + } + }); + }); + }; + + __proto.getDelta = function (depaPos, destPos) { + var fullDepaPos = this.get(depaPos); + return map(this.get(destPos), function (v, k) { + return v - fullDepaPos[k]; + }); + }; + + __proto.get = function (axes) { + var _this = this; + + if (axes && Array.isArray(axes)) { + return axes.reduce(function (acc, v) { + if (v && v in _this._pos) { + acc[v] = _this._pos[v]; + } + + return acc; + }, {}); + } else { + return __assign$1({}, this._pos, axes || {}); + } + }; + + __proto.moveTo = function (pos, depaPos) { + if (depaPos === void 0) { + depaPos = this._pos; + } + + var delta = map(this._pos, function (v, key) { + return key in pos && key in depaPos ? pos[key] - depaPos[key] : 0; + }); + this.set(this.map(pos, function (v, opt) { + return opt ? getCirculatedPos(v, opt.range, opt.circular) : 0; + })); + return { + pos: __assign$1({}, this._pos), + delta: delta + }; + }; + + __proto.set = function (pos) { + for (var k in pos) { + if (k && k in this._pos) { + this._pos[k] = pos[k]; + } + } + }; + + __proto.every = function (pos, callback) { + var axisOptions = this.axis; + return every(pos, function (value, key) { + return callback(value, axisOptions[key], key); + }); + }; + + __proto.filter = function (pos, callback) { + var axisOptions = this.axis; + return filter(pos, function (value, key) { + return callback(value, axisOptions[key], key); + }); + }; + + __proto.map = function (pos, callback) { + var axisOptions = this.axis; + return map(pos, function (value, key) { + return callback(value, axisOptions[key], key); + }); + }; + + __proto.isOutside = function (axes) { + return !this.every(axes ? this.get(axes) : this._pos, function (v, opt) { + return !isOutside(v, opt.range); + }); + }; + + __proto.getAxisOptions = function (key) { + return this.axis[key]; + }; + + return AxisManager; + }(); + + var InputObserver = + /*#__PURE__*/ + function () { + function InputObserver(_a) { + var options = _a.options, + itm = _a.itm, + em = _a.em, + axm = _a.axm, + am = _a.am; + this.isOutside = false; + this.moveDistance = null; + this.isStopped = false; + this.options = options; + this.itm = itm; + this.em = em; + this.axm = axm; + this.am = am; + } // when move pointer is held in outside + + + var __proto = InputObserver.prototype; + + __proto.atOutside = function (pos) { + var _this = this; + + if (this.isOutside) { + return this.axm.map(pos, function (v, opt) { + var tn = opt.range[0] - opt.bounce[0]; + var tx = opt.range[1] + opt.bounce[1]; + return v > tx ? tx : v < tn ? tn : v; + }); + } else { + // when start pointer is held in inside + // get a initialization slope value to prevent smooth animation. + var initSlope_1 = this.am.easing(0.00001) / 0.00001; + return this.axm.map(pos, function (v, opt) { + var min = opt.range[0]; + var max = opt.range[1]; + var out = opt.bounce; + var circular = opt.circular; + + if (circular && (circular[0] || circular[1])) { + return v; + } else if (v < min) { + // left + return min - _this.am.easing((min - v) / (out[0] * initSlope_1)) * out[0]; + } else if (v > max) { + // right + return max + _this.am.easing((v - max) / (out[1] * initSlope_1)) * out[1]; + } + + return v; + }); + } + }; + + __proto.get = function (input) { + return this.axm.get(input.axes); + }; + + __proto.hold = function (input, event) { + if (this.itm.isInterrupted() || !input.axes.length) { + return; + } + + var changeOption = { + input: input, + event: event + }; + this.isStopped = false; + this.itm.setInterrupt(true); + this.am.grab(input.axes, changeOption); + !this.moveDistance && this.em.triggerHold(this.axm.get(), changeOption); + this.isOutside = this.axm.isOutside(input.axes); + this.moveDistance = this.axm.get(input.axes); + }; + + __proto.change = function (input, event, offset) { + if (this.isStopped || !this.itm.isInterrupting() || this.axm.every(offset, function (v) { + return v === 0; + })) { + return; + } + + var depaPos = this.moveDistance || this.axm.get(input.axes); + var destPos; // for outside logic + + destPos = map(depaPos, function (v, k) { + return v + (offset[k] || 0); + }); + this.moveDistance && (this.moveDistance = destPos); // from outside to inside + + if (this.isOutside && this.axm.every(depaPos, function (v, opt) { + return !isOutside(v, opt.range); + })) { + this.isOutside = false; + } + + depaPos = this.atOutside(depaPos); + destPos = this.atOutside(destPos); + var isCanceled = !this.em.triggerChange(destPos, false, depaPos, { + input: input, + event: event + }, true); + + if (isCanceled) { + this.isStopped = true; + this.moveDistance = null; + this.am.finish(false); + } + }; + + __proto.release = function (input, event, offset, inputDuration) { + if (this.isStopped || !this.itm.isInterrupting() || !this.moveDistance) { + return; + } + + var pos = this.axm.get(input.axes); + var depaPos = this.axm.get(); + var destPos = this.axm.get(this.axm.map(offset, function (v, opt, k) { + if (opt.circular && (opt.circular[0] || opt.circular[1])) { + return pos[k] + v; + } else { + return getInsidePosition(pos[k] + v, opt.range, opt.circular, opt.bounce); + } + })); + var duration = this.am.getDuration(destPos, pos, inputDuration); + + if (duration === 0) { + destPos = __assign$1({}, depaPos); + } // prepare params + + + var param = { + depaPos: depaPos, + destPos: destPos, + duration: duration, + delta: this.axm.getDelta(depaPos, destPos), + inputEvent: event, + input: input, + isTrusted: true + }; + this.em.triggerRelease(param); + this.moveDistance = null; // to contol + + var userWish = this.am.getUserControll(param); + var isEqual = equal(userWish.destPos, depaPos); + var changeOption = { + input: input, + event: event + }; + + if (isEqual || userWish.duration === 0) { + !isEqual && this.em.triggerChange(userWish.destPos, false, depaPos, changeOption, true); + this.itm.setInterrupt(false); + + if (this.axm.isOutside()) { + this.am.restore(changeOption); + } else { + this.em.triggerFinish(true); + } + } else { + this.am.animateTo(userWish.destPos, userWish.duration, changeOption); + } + }; + + return InputObserver; + }(); + + // export const DIRECTION_NONE = 1; + var IOS_EDGE_THRESHOLD = 30; + var IS_IOS_SAFARI = "ontouchstart" in win$1 && agent(win$1.navigator.userAgent).browser.name.indexOf("safari") > -1; + var TRANSFORM = function () { + if (typeof document === "undefined") { + return ""; + } + + var bodyStyle = (document.head || document.getElementsByTagName("head")[0]).style; + var target = ["transform", "webkitTransform", "msTransform", "mozTransform"]; + + for (var i = 0, len = target.length; i < len; i++) { + if (target[i] in bodyStyle) { + return target[i]; + } + } + + return ""; + }(); + + /** + * @typedef {Object} AxisOption The Axis information. The key of the axis specifies the name to use as the logical virtual coordinate system. + * @ko 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다. + * @property {Number[]} [range] The coordinate of range 좌표 범위 + * @property {Number} [range.0=0] The coordinate of the minimum 최소 좌표 + * @property {Number} [range.1=0] The coordinate of the maximum 최대 좌표 + * @property {Number[]} [bounce] The size of bouncing area. The coordinates can exceed the coordinate area as much as the bouncing area based on user action. If the coordinates does not exceed the bouncing area when an element is dragged, the coordinates where bouncing effects are applied are retuned back into the coordinate area바운스 영역의 크기. 사용자의 동작에 따라 좌표가 좌표 영역을 넘어 바운스 영역의 크기만큼 더 이동할 수 있다. 사용자가 끌어다 놓는 동작을 했을 때 좌표가 바운스 영역에 있으면, 바운스 효과가 적용된 좌표가 다시 좌표 영역 안으로 들어온다 + * @property {Number} [bounce.0=0] The size of coordinate of the minimum area 최소 좌표 바운스 영역의 크기 + * @property {Number} [bounce.1=0] The size of coordinate of the maximum area 최대 좌표 바운스 영역의 크기 + * @property {Boolean[]} [circular] Indicates whether a circular element is available. If it is set to "true" and an element is dragged outside the coordinate area, the element will appear on the other side.순환 여부. 'true'로 설정한 방향의 좌표 영역 밖으로 엘리먼트가 이동하면 반대 방향에서 엘리먼트가 나타난다 + * @property {Boolean} [circular.0=false] Indicates whether to circulate to the coordinate of the minimum 최소 좌표 방향의 순환 여부 + * @property {Boolean} [circular.1=false] Indicates whether to circulate to the coordinate of the maximum 최대 좌표 방향의 순환 여부 + **/ + + /** + * @typedef {Object} AxesOption The option object of the eg.Axes module + * @ko eg.Axes 모듈의 옵션 객체 + * @property {Function} [easing=easing.easeOutCubic] The easing function to apply to an animation 애니메이션에 적용할 easing 함수 + * @property {Number} [maximumDuration=Infinity] Maximum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최대 좌표 이동 시간 + * @property {Number} [minimumDuration=0] Minimum duration of the animation 가속도에 의해 애니메이션이 동작할 때의 최소 좌표 이동 시간 + * @property {Number} [deceleration=0.0006] Deceleration of the animation where acceleration is manually enabled by user. A higher value indicates shorter running time. 사용자의 동작으로 가속도가 적용된 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다 + * @property {Boolean} [interruptable=true] Indicates whether an animation is interruptible.
- true: It can be paused or stopped by user action or the API.
- false: It cannot be paused or stopped by user action or the API while it is running.진행 중인 애니메이션 중지 가능 여부.
- true: 사용자의 동작이나 API로 애니메이션을 중지할 수 있다.
- false: 애니메이션이 진행 중일 때는 사용자의 동작이나 API가 적용되지 않는다
+ * @property {Number} [round = null] Rounding unit. For example, 0.1 rounds to 0.1 decimal point(6.1234 => 6.1), 5 rounds to 5 (93 => 95)
[Details](https://github.com/naver/egjs-axes/wiki/round-option)반올림 단위. 예를 들어 0.1 은 소숫점 0.1 까지 반올림(6.1234 => 6.1), 5 는 5 단위로 반올림(93 => 95).
[상세내용](https://github.com/naver/egjs-axes/wiki/round-option)
+ **/ + + /** + * @class eg.Axes + * @classdesc A module used to change the information of user action entered by various input devices such as touch screen or mouse into the logical virtual coordinates. You can easily create a UI that responds to user actions. + * @ko 터치 입력 장치나 마우스와 같은 다양한 입력 장치를 통해 전달 받은 사용자의 동작을 논리적인 가상 좌표로 변경하는 모듈이다. 사용자 동작에 반응하는 UI를 손쉽게 만들수 있다. + * @extends eg.Component + * + * @param {Object.} axis Axis information managed by eg.Axes. The key of the axis specifies the name to use as the logical virtual coordinate system. eg.Axes가 관리하는 축 정보. 축의 키는 논리적인 가상 좌표계로 사용할 이름을 지정한다. + * @param {AxesOption} [options] The option object of the eg.Axes moduleeg.Axes 모듈의 옵션 객체 + * @param {Object.} [startPos] The coordinates to be moved when creating an instance. not triggering change event.인스턴스 생성시 이동할 좌표, change 이벤트는 발생하지 않음. + * + * @support {"ie": "10+", "ch" : "latest", "ff" : "latest", "sf" : "latest", "edge" : "latest", "ios" : "7+", "an" : "2.3+ (except 3.x)"} + * @example + * + * // 1. Initialize eg.Axes + * const axes = new eg.Axes({ + * something1: { + * range: [0, 150], + * bounce: 50 + * }, + * something2: { + * range: [0, 200], + * bounce: 100 + * }, + * somethingN: { + * range: [1, 10], + * } + * }, { + * deceleration : 0.0024 + * }); + * + * // 2. attach event handler + * axes.on({ + * "hold" : function(evt) { + * }, + * "release" : function(evt) { + * }, + * "animationStart" : function(evt) { + * }, + * "animationEnd" : function(evt) { + * }, + * "change" : function(evt) { + * } + * }); + * + * // 3. Initialize inputTypes + * const panInputArea = new eg.Axes.PanInput("#area", { + * scale: [0.5, 1] + * }); + * const panInputHmove = new eg.Axes.PanInput("#hmove"); + * const panInputVmove = new eg.Axes.PanInput("#vmove"); + * const pinchInputArea = new eg.Axes.PinchInput("#area", { + * scale: 1.5 + * }); + * + * // 4. Connect eg.Axes and InputTypes + * // [PanInput] When the mouse or touchscreen is down and moved. + * // Connect the 'something2' axis to the mouse or touchscreen x position and + * // connect the 'somethingN' axis to the mouse or touchscreen y position. + * axes.connect(["something2", "somethingN"], panInputArea); // or axes.connect("something2 somethingN", panInputArea); + * + * // Connect only one 'something1' axis to the mouse or touchscreen x position. + * axes.connect(["something1"], panInputHmove); // or axes.connect("something1", panInputHmove); + * + * // Connect only one 'something2' axis to the mouse or touchscreen y position. + * axes.connect(["", "something2"], panInputVmove); // or axes.connect(" something2", panInputVmove); + * + * // [PinchInput] Connect 'something2' axis when two pointers are moving toward (zoom-in) or away from each other (zoom-out). + * axes.connect("something2", pinchInputArea); + */ + + var Axes = + /*#__PURE__*/ + function (_super) { + __extends$2(Axes, _super); + + function Axes(axis, options, startPos) { + if (axis === void 0) { + axis = {}; + } + + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.axis = axis; + _this._inputs = []; + _this.options = __assign$1({ + easing: function easeOutCubic(x) { + return 1 - Math.pow(1 - x, 3); + }, + interruptable: true, + maximumDuration: Infinity, + minimumDuration: 0, + deceleration: 0.0006, + round: null + }, options); + _this.itm = new InterruptManager(_this.options); + _this.axm = new AxisManager(_this.axis, _this.options); + _this.em = new EventManager(_this); + _this.am = new AnimationManager(_this); + _this.io = new InputObserver(_this); + + _this.em.setAnimationManager(_this.am); + + startPos && _this.em.triggerChange(startPos); + return _this; + } + /** + * Connect the axis of eg.Axes to the inputType. + * @ko eg.Axes의 축과 inputType을 연결한다 + * @method eg.Axes#connect + * @param {(String[]|String)} axes The name of the axis to associate with inputType inputType과 연결할 축의 이름 + * @param {Object} inputType The inputType instance to associate with the axis of eg.Axes eg.Axes의 축과 연결할 inputType 인스턴스 + * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * } + * }); + * + * axes.connect("x", new eg.Axes.PanInput("#area1")) + * .connect("x xOther", new eg.Axes.PanInput("#area2")) + * .connect(" xOther", new eg.Axes.PanInput("#area3")) + * .connect(["x"], new eg.Axes.PanInput("#area4")) + * .connect(["xOther", "x"], new eg.Axes.PanInput("#area5")) + * .connect(["", "xOther"], new eg.Axes.PanInput("#area6")); + */ + + + var __proto = Axes.prototype; + + __proto.connect = function (axes, inputType) { + var mapped; + + if (typeof axes === "string") { + mapped = axes.split(" "); + } else { + mapped = axes.concat(); + } // check same instance + + + if (~this._inputs.indexOf(inputType)) { + this.disconnect(inputType); + } // check same element in hammer type for share + + + if ("hammer" in inputType) { + var targets = this._inputs.filter(function (v) { + return v.hammer && v.element === inputType.element; + }); + + if (targets.length) { + inputType.hammer = targets[0].hammer; + } + } + + inputType.mapAxes(mapped); + inputType.connect(this.io); + + this._inputs.push(inputType); + + return this; + }; + /** + * Disconnect the axis of eg.Axes from the inputType. + * @ko eg.Axes의 축과 inputType의 연결을 끊는다. + * @method eg.Axes#disconnect + * @param {Object} [inputType] An inputType instance associated with the axis of eg.Axes eg.Axes의 축과 연결한 inputType 인스턴스 + * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * } + * }); + * + * const input1 = new eg.Axes.PanInput("#area1"); + * const input2 = new eg.Axes.PanInput("#area2"); + * const input3 = new eg.Axes.PanInput("#area3"); + * + * axes.connect("x", input1); + * .connect("x xOther", input2) + * .connect(["xOther", "x"], input3); + * + * axes.disconnect(input1); // disconnects input1 + * axes.disconnect(); // disconnects all of them + */ + + + __proto.disconnect = function (inputType) { + if (inputType) { + var index = this._inputs.indexOf(inputType); + + if (index >= 0) { + this._inputs[index].disconnect(); + + this._inputs.splice(index, 1); + } + } else { + this._inputs.forEach(function (v) { + return v.disconnect(); + }); + + this._inputs = []; + } + + return this; + }; + /** + * Returns the current position of the coordinates. + * @ko 좌표의 현재 위치를 반환한다 + * @method eg.Axes#get + * @param {Object} [axes] The names of the axis 축 이름들 + * @return {Object.} Axis coordinate information 축 좌표 정보 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }); + * + * axes.get(); // {"x": 0, "xOther": -100, "zoom": 50} + * axes.get(["x", "zoom"]); // {"x": 0, "zoom": 50} + */ + + + __proto.get = function (axes) { + return this.axm.get(axes); + }; + /** + * Moves an axis to specific coordinates. + * @ko 좌표를 이동한다. + * @method eg.Axes#setTo + * @param {Object.} pos The coordinate to move to 이동할 좌표 + * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms) + * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }); + * + * axes.setTo({"x": 30, "zoom": 60}); + * axes.get(); // {"x": 30, "xOther": -100, "zoom": 60} + * + * axes.setTo({"x": 100, "xOther": 60}, 1000); // animatation + * + * // after 1000 ms + * axes.get(); // {"x": 100, "xOther": 60, "zoom": 60} + */ + + + __proto.setTo = function (pos, duration) { + if (duration === void 0) { + duration = 0; + } + + this.am.setTo(pos, duration); + return this; + }; + /** + * Moves an axis from the current coordinates to specific coordinates. + * @ko 현재 좌표를 기준으로 좌표를 이동한다. + * @method eg.Axes#setBy + * @param {Object.} pos The coordinate to move to 이동할 좌표 + * @param {Number} [duration=0] Duration of the animation (unit: ms) 애니메이션 진행 시간(단위: ms) + * @return {eg.Axes} An instance of a module itself 모듈 자신의 인스턴스 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }); + * + * axes.setBy({"x": 30, "zoom": 10}); + * axes.get(); // {"x": 30, "xOther": -100, "zoom": 60} + * + * axes.setBy({"x": 70, "xOther": 60}, 1000); // animatation + * + * // after 1000 ms + * axes.get(); // {"x": 100, "xOther": -40, "zoom": 60} + */ + + + __proto.setBy = function (pos, duration) { + if (duration === void 0) { + duration = 0; + } + + this.am.setBy(pos, duration); + return this; + }; + /** + * Returns whether there is a coordinate in the bounce area of ​​the target axis. + * @ko 대상 축 중 bounce영역에 좌표가 존재하는지를 반환한다 + * @method eg.Axes#isBounceArea + * @param {Object} [axes] The names of the axis 축 이름들 + * @return {Boolen} Whether the bounce area exists. bounce 영역 존재 여부 + * @example + * const axes = new eg.Axes({ + * "x": { + * range: [0, 100] + * }, + * "xOther": { + * range: [-100, 100] + * }, + * "zoom": { + * range: [50, 30] + * } + * }); + * + * axes.isBounceArea(["x"]); + * axes.isBounceArea(["x", "zoom"]); + * axes.isBounceArea(); + */ + + + __proto.isBounceArea = function (axes) { + return this.axm.isOutside(axes); + }; + /** + * Destroys properties, and events used in a module and disconnect all connections to inputTypes. + * @ko 모듈에 사용한 속성, 이벤트를 해제한다. 모든 inputType과의 연결을 끊는다. + * @method eg.Axes#destroy + */ + + + __proto.destroy = function () { + this.disconnect(); + this.em.destroy(); + }; + /** + * Version info string + * @ko 버전정보 문자열 + * @name VERSION + * @static + * @type {String} + * @example + * eg.Axes.VERSION; // ex) 3.3.3 + * @memberof eg.Axes + */ + + + Axes.VERSION = "2.7.0"; + /** + * @name eg.Axes.TRANSFORM + * @desc Returns the transform attribute with CSS vendor prefixes. + * @ko CSS vendor prefixes를 붙인 transform 속성을 반환한다. + * + * @constant + * @type {String} + * @example + * eg.Axes.TRANSFORM; // "transform" or "webkitTransform" + */ + + Axes.TRANSFORM = TRANSFORM; + /** + * @name eg.Axes.DIRECTION_NONE + * @constant + * @type {Number} + */ + + Axes.DIRECTION_NONE = DIRECTION_NONE; + /** + * @name eg.Axes.DIRECTION_LEFT + * @constant + * @type {Number} + */ + + Axes.DIRECTION_LEFT = DIRECTION_LEFT; + /** + * @name eg.Axes.DIRECTION_RIGHT + * @constant + * @type {Number} + */ + + Axes.DIRECTION_RIGHT = DIRECTION_RIGHT; + /** + * @name eg.Axes.DIRECTION_UP + * @constant + * @type {Number} + */ + + Axes.DIRECTION_UP = DIRECTION_UP; + /** + * @name eg.Axes.DIRECTION_DOWN + * @constant + * @type {Number} + */ + + Axes.DIRECTION_DOWN = DIRECTION_DOWN; + /** + * @name eg.Axes.DIRECTION_HORIZONTAL + * @constant + * @type {Number} + */ + + Axes.DIRECTION_HORIZONTAL = DIRECTION_HORIZONTAL; + /** + * @name eg.Axes.DIRECTION_VERTICAL + * @constant + * @type {Number} + */ + + Axes.DIRECTION_VERTICAL = DIRECTION_VERTICAL; + /** + * @name eg.Axes.DIRECTION_ALL + * @constant + * @type {Number} + */ + + Axes.DIRECTION_ALL = DIRECTION_ALL; + return Axes; + }(Component); + + var SUPPORT_POINTER_EVENTS$1 = "PointerEvent" in win$1 || "MSPointerEvent" in win$1; + var SUPPORT_TOUCH$1 = ("ontouchstart" in win$1); + var UNIQUEKEY = "_EGJS_AXES_INPUTTYPE_"; + function toAxis(source, offset) { + return offset.reduce(function (acc, v, i) { + if (source[i]) { + acc[source[i]] = v; + } + + return acc; + }, {}); + } + function createHammer(element, options) { + try { + // create Hammer + return new Manager(element, __assign$1({}, options)); + } catch (e) { + return null; + } + } + function convertInputType(inputType) { + if (inputType === void 0) { + inputType = []; + } + + var hasTouch = false; + var hasMouse = false; + var hasPointer = false; + inputType.forEach(function (v) { + switch (v) { + case "mouse": + hasMouse = true; + break; + + case "touch": + hasTouch = SUPPORT_TOUCH$1; + break; + + case "pointer": + hasPointer = SUPPORT_POINTER_EVENTS$1; + // no default + } + }); + + if (hasPointer) { + return PointerEventInput; + } else if (hasTouch && hasMouse) { + return TouchMouseInput; + } else if (hasTouch) { + return TouchInput; + } else if (hasMouse) { + return MouseInput; + } + + return null; + } + + function getDirectionByAngle(angle, thresholdAngle) { + if (thresholdAngle < 0 || thresholdAngle > 90) { + return DIRECTION_NONE; + } + + var toAngle = Math.abs(angle); + return toAngle > thresholdAngle && toAngle < 180 - thresholdAngle ? DIRECTION_VERTICAL : DIRECTION_HORIZONTAL; + } + function getNextOffset(speeds, deceleration) { + var normalSpeed = Math.sqrt(speeds[0] * speeds[0] + speeds[1] * speeds[1]); + var duration = Math.abs(normalSpeed / -deceleration); + return [speeds[0] / 2 * duration, speeds[1] / 2 * duration]; + } + function useDirection(checkType, direction, userDirection) { + if (userDirection) { + return !!(direction === DIRECTION_ALL || direction & checkType && userDirection & checkType); + } else { + return !!(direction & checkType); + } + } + /** + * @typedef {Object} PanInputOption The option object of the eg.Axes.PanInput module. + * @ko eg.Axes.PanInput 모듈의 옵션 객체 + * @property {String[]} [inputType=["touch","mouse", "pointer"]] Types of input devices.
- touch: Touch screen
- mouse: Mouse 입력 장치 종류.
- touch: 터치 입력 장치
- mouse: 마우스
+ * @property {Number[]} [scale] Coordinate scale that a user can move사용자의 동작으로 이동하는 좌표의 배율 + * @property {Number} [scale.0=1] horizontal axis scale 수평축 배율 + * @property {Number} [scale.1=1] vertical axis scale 수직축 배율 + * @property {Number} [thresholdAngle=45] The threshold value that determines whether user action is horizontal or vertical (0~90) 사용자의 동작이 가로 방향인지 세로 방향인지 판단하는 기준 각도(0~90) + * @property {Number} [threshold=0] Minimal pan distance required before recognizing 사용자의 Pan 동작을 인식하기 위해산 최소한의 거리 + * @property {Number} [iOSEdgeSwipeThreshold=30] Area (px) that can go to the next page when swiping the right edge in iOS safari iOS Safari에서 오른쪽 엣지를 스와이프 하는 경우 다음 페이지로 넘어갈 수 있는 영역(px) + * @property {Object} [hammerManagerOptions={cssProps: {userSelect: "none",touchSelect: "none",touchCallout: "none",userDrag: "none"}] Options of Hammer.Manager Hammer.Manager의 옵션 + **/ + + /** + * @class eg.Axes.PanInput + * @classdesc A module that passes the amount of change to eg.Axes when the mouse or touchscreen is down and moved. use less than two axes. + * @ko 마우스나 터치 스크린을 누르고 움직일때의 변화량을 eg.Axes에 전달하는 모듈. 두개 이하의 축을 사용한다. + * + * @example + * const pan = new eg.Axes.PanInput("#area", { + * inputType: ["touch"], + * scale: [1, 1.3], + * }); + * + * // Connect the 'something2' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved. + * // Connect the 'somethingN' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved. + * axes.connect(["something2", "somethingN"], pan); // or axes.connect("something2 somethingN", pan); + * + * // Connect only one 'something1' axis to the mouse or touchscreen x position when the mouse or touchscreen is down and moved. + * axes.connect(["something1"], pan); // or axes.connect("something1", pan); + * + * // Connect only one 'something2' axis to the mouse or touchscreen y position when the mouse or touchscreen is down and moved. + * axes.connect(["", "something2"], pan); // or axes.connect(" something2", pan); + * + * @param {HTMLElement|String|jQuery} element An element to use the eg.Axes.PanInput module eg.Axes.PanInput 모듈을 사용할 엘리먼트 + * @param {PanInputOption} [options] The option object of the eg.Axes.PanInput moduleeg.Axes.PanInput 모듈의 옵션 객체 + */ + + var PanInput = + /*#__PURE__*/ + function () { + function PanInput(el, options) { + this.axes = []; + this.hammer = null; + this.element = null; + this.panRecognizer = null; + this.isRightEdge = false; + this.rightEdgeTimer = 0; + this.panFlag = false; + /** + * Hammer helps you add support for touch gestures to your page + * + * @external Hammer + * @see {@link http://hammerjs.github.io|Hammer.JS} + * @see {@link http://hammerjs.github.io/jsdoc/Hammer.html|Hammer.JS API documents} + * @see Hammer.JS applies specific CSS properties by {@link http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html|default} when creating an instance. The eg.Axes module removes all default CSS properties provided by Hammer.JS + */ + + if (typeof Manager === "undefined") { + throw new Error("The Hammerjs must be loaded before eg.Axes.PanInput.\nhttp://hammerjs.github.io/"); + } + + this.element = $(el); + this.options = __assign$1({ + inputType: ["touch", "mouse", "pointer"], + scale: [1, 1], + thresholdAngle: 45, + threshold: 0, + iOSEdgeSwipeThreshold: IOS_EDGE_THRESHOLD, + hammerManagerOptions: { + // css properties were removed due to usablility issue + // http://hammerjs.github.io/jsdoc/Hammer.defaults.cssProps.html + cssProps: { + userSelect: "none", + touchSelect: "none", + touchCallout: "none", + userDrag: "none" + } + } + }, options); + this.onHammerInput = this.onHammerInput.bind(this); + this.onPanmove = this.onPanmove.bind(this); + this.onPanend = this.onPanend.bind(this); + } + + var __proto = PanInput.prototype; + + __proto.mapAxes = function (axes) { + var useHorizontal = !!axes[0]; + var useVertical = !!axes[1]; + + if (useHorizontal && useVertical) { + this._direction = DIRECTION_ALL; + } else if (useHorizontal) { + this._direction = DIRECTION_HORIZONTAL; + } else if (useVertical) { + this._direction = DIRECTION_VERTICAL; + } else { + this._direction = DIRECTION_NONE; + } + + this.axes = axes; + }; + + __proto.connect = function (observer) { + var hammerOption = { + direction: this._direction, + threshold: this.options.threshold + }; + + if (this.hammer) { + // for sharing hammer instance. + // hammer remove previous PanRecognizer. + this.removeRecognizer(); + this.dettachEvent(); + } else { + var keyValue = this.element[UNIQUEKEY]; + + if (!keyValue) { + keyValue = String(Math.round(Math.random() * new Date().getTime())); + } + + var inputClass = convertInputType(this.options.inputType); + + if (!inputClass) { + throw new Error("Wrong inputType parameter!"); + } + + this.hammer = createHammer(this.element, __assign$1({ + inputClass: inputClass + }, this.options.hammerManagerOptions)); + this.element[UNIQUEKEY] = keyValue; + } + + this.panRecognizer = new PanRecognizer(hammerOption); + this.hammer.add(this.panRecognizer); + this.attachEvent(observer); + return this; + }; + + __proto.disconnect = function () { + this.removeRecognizer(); + + if (this.hammer) { + this.dettachEvent(); + } + + this._direction = DIRECTION_NONE; + return this; + }; + /** + * Destroys elements, properties, and events used in a module. + * @ko 모듈에 사용한 엘리먼트와 속성, 이벤트를 해제한다. + * @method eg.Axes.PanInput#destroy + */ + + + __proto.destroy = function () { + this.disconnect(); + + if (this.hammer && this.hammer.recognizers.length === 0) { + this.hammer.destroy(); + } + + delete this.element[UNIQUEKEY]; + this.element = null; + this.hammer = null; + }; + /** + * Enables input devices + * @ko 입력 장치를 사용할 수 있게 한다 + * @method eg.Axes.PanInput#enable + * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스 + */ + + + __proto.enable = function () { + this.hammer && (this.hammer.get("pan").options.enable = true); + return this; + }; + /** + * Disables input devices + * @ko 입력 장치를 사용할 수 없게 한다. + * @method eg.Axes.PanInput#disable + * @return {eg.Axes.PanInput} An instance of a module itself 모듈 자신의 인스턴스 + */ + + + __proto.disable = function () { + this.hammer && (this.hammer.get("pan").options.enable = false); + return this; + }; + /** + * Returns whether to use an input device + * @ko 입력 장치를 사용 여부를 반환한다. + * @method eg.Axes.PanInput#isEnable + * @return {Boolean} Whether to use an input device 입력장치 사용여부 + */ + + + __proto.isEnable = function () { + return !!(this.hammer && this.hammer.get("pan").options.enable); + }; + + __proto.removeRecognizer = function () { + if (this.hammer && this.panRecognizer) { + this.hammer.remove(this.panRecognizer); + this.panRecognizer = null; + } + }; + + __proto.onHammerInput = function (event) { + if (this.isEnable()) { + if (event.isFirst) { + this.panFlag = false; + + if (event.srcEvent.cancelable !== false) { + var edgeThreshold = this.options.iOSEdgeSwipeThreshold; + this.observer.hold(this, event); + this.isRightEdge = IS_IOS_SAFARI && event.center.x > window.innerWidth - edgeThreshold; + this.panFlag = true; + } + } else if (event.isFinal) { + this.onPanend(event); + } + } + }; + + __proto.onPanmove = function (event) { + var _this = this; + + if (!this.panFlag) { + return; + } + + var userDirection = getDirectionByAngle(event.angle, this.options.thresholdAngle); // not support offset properties in Hammerjs - start + + var prevInput = this.hammer.session.prevInput; + + if (prevInput && IS_IOS_SAFARI) { + var swipeLeftToRight = event.center.x < 0; + + if (swipeLeftToRight) { + // iOS swipe left => right + this.onPanend(__assign$1({}, prevInput, { + velocityX: 0, + velocityY: 0, + offsetX: 0, + offsetY: 0 + })); + return; + } else if (this.isRightEdge) { + clearTimeout(this.rightEdgeTimer); // - is right to left + + var edgeThreshold = this.options.iOSEdgeSwipeThreshold; + var swipeRightToLeft = event.deltaX < -edgeThreshold; + + if (swipeRightToLeft) { + this.isRightEdge = false; + } else { + // iOS swipe right => left + this.rightEdgeTimer = window.setTimeout(function () { + _this.onPanend(__assign$1({}, prevInput, { + velocityX: 0, + velocityY: 0, + offsetX: 0, + offsetY: 0 + })); + }, 100); + } + } + } + /* eslint-disable no-param-reassign */ + + + if (prevInput) { + event.offsetX = event.deltaX - prevInput.deltaX; + event.offsetY = event.deltaY - prevInput.deltaY; + } else { + event.offsetX = 0; + event.offsetY = 0; + } + + var offset = this.getOffset([event.offsetX, event.offsetY], [useDirection(DIRECTION_HORIZONTAL, this._direction, userDirection), useDirection(DIRECTION_VERTICAL, this._direction, userDirection)]); + var prevent = offset.some(function (v) { + return v !== 0; + }); + + if (prevent) { + var srcEvent = event.srcEvent; + + if (srcEvent.cancelable !== false) { + srcEvent.preventDefault(); + } + + srcEvent.stopPropagation(); + } + + event.preventSystemEvent = prevent; + prevent && this.observer.change(this, event, toAxis(this.axes, offset)); + }; + + __proto.onPanend = function (event) { + if (!this.panFlag) { + return; + } + + clearTimeout(this.rightEdgeTimer); + this.panFlag = false; + var offset = this.getOffset([Math.abs(event.velocityX) * (event.deltaX < 0 ? -1 : 1), Math.abs(event.velocityY) * (event.deltaY < 0 ? -1 : 1)], [useDirection(DIRECTION_HORIZONTAL, this._direction), useDirection(DIRECTION_VERTICAL, this._direction)]); + offset = getNextOffset(offset, this.observer.options.deceleration); + this.observer.release(this, event, toAxis(this.axes, offset)); + }; + + __proto.attachEvent = function (observer) { + this.observer = observer; + this.hammer.on("hammer.input", this.onHammerInput).on("panstart panmove", this.onPanmove); + }; + + __proto.dettachEvent = function () { + this.hammer.off("hammer.input", this.onHammerInput).off("panstart panmove", this.onPanmove); + this.observer = null; + }; + + __proto.getOffset = function (properties, direction) { + var offset = [0, 0]; + var scale = this.options.scale; + + if (direction[0]) { + offset[0] = properties[0] * scale[0]; + } + + if (direction[1]) { + offset[1] = properties[1] * scale[1]; + } + + return offset; + }; + + return PanInput; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + var MOVE_TYPE = { + SNAP: "snap", + FREE_SCROLL: "freeScroll" + }; + var DEFAULT_MOVE_TYPE_OPTIONS = { + snap: { + type: "snap", + count: 1 + }, + freeScroll: { + type: "freeScroll" + } + }; + var isBrowser = typeof document !== "undefined"; + /** + * Default options for creating Flicking. + * @ko 플리킹을 만들 때 사용하는 기본 옵션들 + * @private + * @memberof eg.Flicking + */ + + var DEFAULT_OPTIONS = { + classPrefix: "eg-flick", + deceleration: 0.0075, + horizontal: true, + circular: false, + infinite: false, + infiniteThreshold: 0, + lastIndex: Infinity, + threshold: 40, + duration: 100, + panelEffect: function (x) { + return 1 - Math.pow(1 - x, 3); + }, + defaultIndex: 0, + inputType: ["touch", "mouse"], + thresholdAngle: 45, + bounce: 10, + autoResize: false, + adaptive: false, + zIndex: 2000, + bound: false, + overflow: false, + hanger: "50%", + anchor: "50%", + gap: 0, + moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap, + useOffset: false, + isEqualSize: false, + isConstantSize: false, + renderOnlyVisible: false, + renderExternal: false, + resizeOnContentsReady: false, + iOSEdgeSwipeThreshold: 30, + collectStatistics: true + }; + var DEFAULT_VIEWPORT_CSS = { + position: "relative", + zIndex: DEFAULT_OPTIONS.zIndex, + overflow: "hidden" + }; + var DEFAULT_CAMERA_CSS = { + width: "100%", + height: "100%", + willChange: "transform" + }; + var DEFAULT_PANEL_CSS = { + position: "absolute" + }; + var EVENTS = { + HOLD_START: "holdStart", + HOLD_END: "holdEnd", + MOVE_START: "moveStart", + MOVE: "move", + MOVE_END: "moveEnd", + CHANGE: "change", + RESTORE: "restore", + SELECT: "select", + NEED_PANEL: "needPanel", + VISIBLE_CHANGE: "visibleChange", + CONTENT_ERROR: "contentError" + }; + var AXES_EVENTS = { + HOLD: "hold", + CHANGE: "change", + RELEASE: "release", + ANIMATION_END: "animationEnd", + FINISH: "finish" + }; + var STATE_TYPE = { + IDLE: 0, + HOLDING: 1, + DRAGGING: 2, + ANIMATING: 3, + DISABLED: 4 + }; + var DIRECTION = { + PREV: "PREV", + NEXT: "NEXT" + }; + var FLICKING_METHODS = { + prev: true, + next: true, + moveTo: true, + getIndex: true, + getAllPanels: true, + getCurrentPanel: true, + getElement: true, + getSize: true, + getPanel: true, + getPanelCount: true, + getStatus: true, + getVisiblePanels: true, + enableInput: true, + disableInput: true, + destroy: true, + resize: true, + setStatus: true, + isPlaying: true + }; // Check whether browser supports transform: translate3d + // https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support + + var checkTranslateSupport = function () { + var transforms = { + webkitTransform: "-webkit-transform", + msTransform: "-ms-transform", + MozTransform: "-moz-transform", + OTransform: "-o-transform", + transform: "transform" + }; + + if (!isBrowser) { + return { + name: transforms.transform, + has3d: true + }; + } + + var supportedStyle = document.documentElement.style; + var transformName = ""; + + for (var prefixedTransform in transforms) { + if (prefixedTransform in supportedStyle) { + transformName = prefixedTransform; + } + } + + if (!transformName) { + throw new Error("Browser doesn't support CSS3 2D Transforms."); + } + + var el = document.createElement("div"); + document.documentElement.insertBefore(el, null); + el.style[transformName] = "translate3d(1px, 1px, 1px)"; + var styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]); + el.parentElement.removeChild(el); + var transformInfo = { + name: transformName, + has3d: styleVal.length > 0 && styleVal !== "none" + }; + + checkTranslateSupport = function () { + return transformInfo; + }; + + return transformInfo; + }; + var TRANSFORM$1 = checkTranslateSupport(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + function merge(target) { + var srcs = []; + + for (var _i = 1; _i < arguments.length; _i++) { + srcs[_i - 1] = arguments[_i]; + } + + srcs.forEach(function (source) { + Object.keys(source).forEach(function (key) { + var value = source[key]; + target[key] = value; + }); + }); + return target; + } + function parseElement(element) { + if (!Array.isArray(element)) { + element = [element]; + } + + var elements = []; + element.forEach(function (el) { + if (isString(el)) { + var tempDiv = document.createElement("div"); + tempDiv.innerHTML = el; + elements.push.apply(elements, toArray$3(tempDiv.children)); + + while (tempDiv.firstChild) { + tempDiv.removeChild(tempDiv.firstChild); + } + } else { + elements.push(el); + } + }); + return elements; + } + function isString(value) { + return typeof value === "string"; + } // Get class list of element as string array + + function addClass(element, className) { + if (element.classList) { + element.classList.add(className); + } else { + if (!hasClass(element, className)) { + element.className = (element.className + " " + className).replace(/\s{2,}/g, " "); + } + } + } + function hasClass(element, className) { + if (element.classList) { + return element.classList.contains(className); + } else { + return element.className.split(" ").indexOf(className) >= 0; + } + } + function applyCSS(element, cssObj) { + Object.keys(cssObj).forEach(function (property) { + element.style[property] = cssObj[property]; + }); + } + function clamp(val, min, max) { + return Math.max(Math.min(val, max), min); + } // Min: inclusive, Max: exclusive + + function isBetween(val, min, max) { + return val >= min && val <= max; + } + function toArray$3(iterable) { + return [].slice.call(iterable); + } + function isArray(arr) { + return arr && arr.constructor === Array; + } + function parseArithmeticExpression(cssValue, base, defaultVal) { + // Set base / 2 to default value, if it's undefined + var defaultValue = defaultVal != null ? defaultVal : base / 2; + var cssRegex = /(?:(\+|\-)\s*)?(\d+(?:\.\d+)?(%|px)?)/g; + + if (typeof cssValue === "number") { + return clamp(cssValue, 0, base); + } + + var idx = 0; + var calculatedValue = 0; + var matchResult = cssRegex.exec(cssValue); + + while (matchResult != null) { + var sign = matchResult[1]; + var value = matchResult[2]; + var unit = matchResult[3]; + var parsedValue = parseFloat(value); + + if (idx <= 0) { + sign = sign || "+"; + } // Return default value for values not in good form + + + if (!sign) { + return defaultValue; + } + + if (unit === "%") { + parsedValue = parsedValue / 100 * base; + } + + calculatedValue += sign === "+" ? parsedValue : -parsedValue; // Match next occurrence + + ++idx; + matchResult = cssRegex.exec(cssValue); + } // None-matched + + + if (idx === 0) { + return defaultValue; + } // Clamp between 0 ~ base + + + return clamp(calculatedValue, 0, base); + } + function getProgress(pos, range) { + // start, anchor, end + // -1 , 0 , 1 + var min = range[0], + center = range[1], + max = range[2]; + + if (pos > center && max - center) { + // 0 ~ 1 + return (pos - center) / (max - center); + } else if (pos < center && center - min) { + // -1 ~ 0 + return (pos - center) / (center - min); + } else if (pos !== center && max - min) { + return (pos - min) / (max - min); + } + + return 0; + } + function findIndex(iterable, callback) { + for (var i = 0; i < iterable.length; i += 1) { + var element = iterable[i]; + + if (element && callback(element)) { + return i; + } + } + + return -1; + } // return [0, 1, ...., max - 1] + + function counter(max) { + var counterArray = []; + + for (var i = 0; i < max; i += 1) { + counterArray[i] = i; + } + + return counterArray; + } // Circulate number between range [min, max] + + /* + * "indexed" means min and max is not same, so if it's true "min - 1" should be max + * While if it's false, "min - 1" should be "max - 1" + * use `indexed: true` when it should be used for circulating integers like index + * or `indexed: false` when it should be used for something like positions. + */ + + function circulate(value, min, max, indexed) { + var size = indexed ? max - min + 1 : max - min; + + if (value < min) { + var offset = indexed ? (min - value - 1) % size : (min - value) % size; + value = max - offset; + } else if (value > max) { + var offset = indexed ? (value - max - 1) % size : (value - max) % size; + value = min + offset; + } + + return value; + } + function restoreStyle(element, originalStyle) { + originalStyle.className ? element.setAttribute("class", originalStyle.className) : element.removeAttribute("class"); + originalStyle.style ? element.setAttribute("style", originalStyle.style) : element.removeAttribute("style"); + } + /** + * Decorator that makes the method of flicking available in the framework. + * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터. + * @memberof eg.Flicking + * @private + * @example + * ```js + * import Flicking, { withFlickingMethods } from "@egjs/flicking"; + * + * class Flicking extends React.Component> { + * @withFlickingMethods + * private flicking: Flicking; + * } + * ``` + */ + + function withFlickingMethods(prototype, flickingName) { + Object.keys(FLICKING_METHODS).forEach(function (name) { + if (prototype[name]) { + return; + } + + prototype[name] = function () { + var _a; + + var args = []; + + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + + var result = (_a = this[flickingName])[name].apply(_a, args); // fix `this` type to return your own `flicking` instance to the instance using the decorator. + + + if (result === this[flickingName]) { + return this; + } else { + return result; + } + }; + }); + } + function getBbox(element, useOffset) { + var bbox; + + if (useOffset) { + bbox = { + x: 0, + y: 0, + width: element.offsetWidth, + height: element.offsetHeight + }; + } else { + var clientRect = element.getBoundingClientRect(); + bbox = { + x: clientRect.left, + y: clientRect.top, + width: clientRect.width, + height: clientRect.height + }; + } + + return bbox; + } + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var Panel = + /*#__PURE__*/ + function () { + function Panel(element, index, viewport) { + this.viewport = viewport; + this.prevSibling = null; + this.nextSibling = null; + this.clonedPanels = []; + this.state = { + index: index, + position: 0, + relativeAnchorPosition: 0, + size: 0, + isClone: false, + isVirtual: false, + cloneIndex: -1, + originalStyle: { + className: "", + style: "" + }, + cachedBbox: null + }; + this.setElement(element); + } + + var __proto = Panel.prototype; + + __proto.resize = function (givenBbox) { + var state = this.state; + var options = this.viewport.options; + var bbox = givenBbox ? givenBbox : this.getBbox(); + this.state.cachedBbox = bbox; + var prevSize = state.size; + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size); + } + + if (!state.isClone) { + this.clonedPanels.forEach(function (panel) { + var cloneState = panel.state; + cloneState.size = state.size; + cloneState.cachedBbox = state.cachedBbox; + cloneState.relativeAnchorPosition = state.relativeAnchorPosition; + }); + } + }; + + __proto.unCacheBbox = function () { + this.state.cachedBbox = null; + }; + + __proto.getProgress = function () { + var viewport = this.viewport; + var options = viewport.options; + var panelCount = viewport.panelManager.getPanelCount(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex(); + var progress = relativeIndex - viewport.getCurrentProgress(); + return progress; + }; + + __proto.getOutsetProgress = function () { + var viewport = this.viewport; + var outsetRange = [-this.getSize(), viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(), viewport.getSize()]; + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var outsetProgress = getProgress(relativePanelPosition, outsetRange); + return outsetProgress; + }; + + __proto.getVisibleRatio = function () { + var viewport = this.viewport; + var panelSize = this.getSize(); + var relativePanelPosition = this.getPosition() - viewport.getCameraPosition(); + var rightRelativePanelPosition = relativePanelPosition + panelSize; + var visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0); + var visibleRatio = visibleSize >= 0 ? visibleSize / panelSize : 0; + return visibleRatio; + }; + + __proto.focus = function (duration) { + var viewport = this.viewport; + var currentPanel = viewport.getCurrentPanel(); + var hangerPosition = viewport.getHangerPosition(); + var anchorPosition = this.getAnchorPosition(); + + if (hangerPosition === anchorPosition || !currentPanel) { + return; + } + + var currentPosition = currentPanel.getPosition(); + var eventType = currentPosition === this.getPosition() ? "" : EVENTS.CHANGE; + viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration); + }; + + __proto.update = function (updateFunction, shouldResize) { + if (updateFunction === void 0) { + updateFunction = null; + } + + if (shouldResize === void 0) { + shouldResize = true; + } + + var identicalPanels = this.getIdenticalPanels(); + + if (updateFunction) { + identicalPanels.forEach(function (eachPanel) { + updateFunction(eachPanel.getElement()); + }); + } + + if (shouldResize) { + identicalPanels.forEach(function (eachPanel) { + eachPanel.unCacheBbox(); + }); + this.viewport.addVisiblePanel(this); + this.viewport.resize(); + } + }; + + __proto.prev = function () { + var viewport = this.viewport; + var options = viewport.options; + var prevSibling = this.prevSibling; + + if (!prevSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var prevPanelIndex = prevSibling.getIndex(); + var prevPanelPosition = prevSibling.getPosition(); + var prevPanelSize = prevSibling.getSize(); + var hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1; + var notYetMinPanel = options.infinite && currentIndex > 0 && prevPanelIndex > currentIndex; + + if (hasEmptyPanelBetween || notYetMinPanel) { + // Empty panel exists between + return null; + } + + var newPosition = currentPosition - prevPanelSize - options.gap; + var prevPanel = prevSibling; + + if (prevPanelPosition !== newPosition) { + prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true); + prevPanel.setPosition(newPosition); + } + + return prevPanel; + }; + + __proto.next = function () { + var viewport = this.viewport; + var options = viewport.options; + var nextSibling = this.nextSibling; + var lastIndex = viewport.panelManager.getLastIndex(); + + if (!nextSibling) { + return null; + } + + var currentIndex = this.getIndex(); + var currentPosition = this.getPosition(); + var nextPanelIndex = nextSibling.getIndex(); + var nextPanelPosition = nextSibling.getPosition(); + var hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1; + var notYetMaxPanel = options.infinite && currentIndex < lastIndex && nextPanelIndex < currentIndex; + + if (hasEmptyPanelBetween || notYetMaxPanel) { + return null; + } + + var newPosition = currentPosition + this.getSize() + options.gap; + var nextPanel = nextSibling; + + if (nextPanelPosition !== newPosition) { + nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true); + nextPanel.setPosition(newPosition); + } + + return nextPanel; + }; + + __proto.insertBefore = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var firstPanel = viewport.panelManager.firstPanel(); + var prevSibling = this.prevSibling; // Finding correct inserting index + // While it should insert removing empty spaces, + // It also should have to be bigger than prevSibling' s index + + var targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex() ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length) : Math.max(this.getIndex() - parsedElements.length, 0); + return viewport.insert(targetIndex, parsedElements); + }; + + __proto.insertAfter = function (element) { + return this.viewport.insert(this.getIndex() + 1, element); + }; + + __proto.remove = function () { + this.viewport.remove(this.getIndex()); + return this; + }; + + __proto.destroy = function (option) { + if (!option.preserveUI) { + var originalStyle = this.state.originalStyle; + restoreStyle(this.element, originalStyle); + } // release resources + + + for (var x in this) { + this[x] = null; + } + }; + + __proto.getElement = function () { + return this.element; + }; + + __proto.getAnchorPosition = function () { + return this.state.position + this.state.relativeAnchorPosition; + }; + + __proto.getRelativeAnchorPosition = function () { + return this.state.relativeAnchorPosition; + }; + + __proto.getIndex = function () { + return this.state.index; + }; + + __proto.getPosition = function () { + return this.state.position; + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getBbox = function () { + var state = this.state; + var viewport = this.viewport; + var element = this.element; + var options = viewport.options; + + if (!element) { + state.cachedBbox = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } else if (!state.cachedBbox) { + var wasVisible = Boolean(element.parentNode); + var cameraElement = viewport.getCameraElement(); + + if (!wasVisible) { + cameraElement.appendChild(element); + viewport.addVisiblePanel(this); + } + + state.cachedBbox = getBbox(element, options.useOffset); + + if (!wasVisible && viewport.options.renderExternal) { + cameraElement.removeChild(element); + } + } + + return state.cachedBbox; + }; + + __proto.isClone = function () { + return this.state.isClone; + }; + + __proto.getOverlappedClass = function (classes) { + var element = this.element; + + for (var _i = 0, classes_1 = classes; _i < classes_1.length; _i++) { + var className = classes_1[_i]; + + if (hasClass(element, className)) { + return className; + } + } + }; + + __proto.getCloneIndex = function () { + return this.state.cloneIndex; + }; + + __proto.getClonedPanels = function () { + var state = this.state; + return state.isClone ? this.original.getClonedPanels() : this.clonedPanels; + }; + + __proto.getIdenticalPanels = function () { + var state = this.state; + return state.isClone ? this.original.getIdenticalPanels() : __spreadArrays([this], this.clonedPanels); + }; + + __proto.getOriginalPanel = function () { + return this.state.isClone ? this.original : this; + }; + + __proto.setIndex = function (index) { + var state = this.state; + state.index = index; + this.clonedPanels.forEach(function (panel) { + return panel.state.index = index; + }); + }; + + __proto.setPosition = function (pos) { + this.state.position = pos; + return this; + }; + + __proto.setPositionCSS = function (offset) { + if (offset === void 0) { + offset = 0; + } + + if (!this.element) { + return; + } + + var state = this.state; + var pos = state.position; + var options = this.viewport.options; + var elementStyle = this.element.style; + var currentElementStyle = options.horizontal ? elementStyle.left : elementStyle.top; + var styleToApply = pos - offset + "px"; + + if (!state.isVirtual && currentElementStyle !== styleToApply) { + options.horizontal ? elementStyle.left = styleToApply : elementStyle.top = styleToApply; + } + }; + + __proto.clone = function (cloneIndex, isVirtual, element) { + if (isVirtual === void 0) { + isVirtual = false; + } + + var state = this.state; + var viewport = this.viewport; + var cloneElement = element; + + if (!cloneElement && this.element) { + cloneElement = isVirtual ? this.element : this.element.cloneNode(true); + } + + var clonedPanel = new Panel(cloneElement, state.index, viewport); + var clonedState = clonedPanel.state; + clonedPanel.original = state.isClone ? this.original : this; + clonedState.isClone = true; + clonedState.isVirtual = isVirtual; + clonedState.cloneIndex = cloneIndex; // Inherit some state values + + clonedState.size = state.size; + clonedState.relativeAnchorPosition = state.relativeAnchorPosition; + clonedState.originalStyle = state.originalStyle; + clonedState.cachedBbox = state.cachedBbox; + + if (!isVirtual) { + this.clonedPanels.push(clonedPanel); + } else { + clonedPanel.prevSibling = this.prevSibling; + clonedPanel.nextSibling = this.nextSibling; + } + + return clonedPanel; + }; + + __proto.removeElement = function () { + if (!this.viewport.options.renderExternal) { + var element = this.element; + element.parentNode && element.parentNode.removeChild(element); + } // Do the same thing for clones + + + if (!this.state.isClone) { + this.removeClonedPanelsAfter(0); + } + }; + + __proto.removeClonedPanelsAfter = function (start) { + var options = this.viewport.options; + var removingPanels = this.clonedPanels.splice(start); + + if (!options.renderExternal) { + removingPanels.forEach(function (panel) { + panel.removeElement(); + }); + } + }; + + __proto.setElement = function (element) { + if (!element) { + return; + } + + var currentElement = this.element; + + if (element !== currentElement) { + var options = this.viewport.options; + + if (currentElement) { + if (options.horizontal) { + element.style.left = currentElement.style.left; + } else { + element.style.top = currentElement.style.top; + } + } else { + var originalStyle = this.state.originalStyle; + originalStyle.className = element.getAttribute("class"); + originalStyle.style = element.getAttribute("style"); + } + + this.element = element; + + if (options.classPrefix) { + addClass(element, options.classPrefix + "-panel"); + } // Update size info after applying panel css + + + applyCSS(this.element, DEFAULT_PANEL_CSS); + } + }; + + return Panel; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var PanelManager = + /*#__PURE__*/ + function () { + function PanelManager(cameraElement, options) { + this.cameraElement = cameraElement; + this.panels = []; + this.clones = []; + this.range = { + min: -1, + max: -1 + }; + this.length = 0; + this.cloneCount = 0; + this.options = options; + this.lastIndex = options.lastIndex; + } + + var __proto = PanelManager.prototype; + + __proto.firstPanel = function () { + return this.panels[this.range.min]; + }; + + __proto.lastPanel = function () { + return this.panels[this.range.max]; + }; + + __proto.allPanels = function () { + return __spreadArrays(this.panels, this.clones.reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, [])); + }; + + __proto.originalPanels = function () { + return this.panels; + }; + + __proto.clonedPanels = function () { + return this.clones; + }; + + __proto.replacePanels = function (newPanels, newClones) { + this.panels = newPanels; + this.clones = newClones; + this.range = { + min: findIndex(newPanels, function (panel) { + return Boolean(panel); + }), + max: newPanels.length - 1 + }; + this.length = newPanels.filter(function (panel) { + return Boolean(panel); + }).length; + }; + + __proto.has = function (index) { + return !!this.panels[index]; + }; + + __proto.get = function (index) { + return this.panels[index]; + }; + + __proto.getPanelCount = function () { + return this.length; + }; + + __proto.getLastIndex = function () { + return this.lastIndex; + }; + + __proto.getRange = function () { + return this.range; + }; + + __proto.getCloneCount = function () { + return this.cloneCount; + }; + + __proto.setLastIndex = function (lastIndex) { + this.lastIndex = lastIndex; + var firstPanel = this.firstPanel(); + var lastPanel = this.lastPanel(); + + if (!firstPanel || !lastPanel) { + return; // no meaning of updating range & length + } // Remove panels above new last index + + + var range = this.range; + + if (lastPanel.getIndex() > lastIndex) { + var removingPanels = this.panels.splice(lastIndex + 1); + this.length -= removingPanels.length; + var firstRemovedPanel = removingPanels.filter(function (panel) { + return !!panel; + })[0]; + var possibleLastPanel = firstRemovedPanel.prevSibling; + + if (possibleLastPanel) { + range.max = possibleLastPanel.getIndex(); + } else { + range.min = -1; + range.max = -1; + } + + if (this.shouldRender()) { + removingPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + }; + + __proto.setCloneCount = function (cloneCount) { + this.cloneCount = cloneCount; + }; // Insert at index + // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it + + + __proto.insert = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var isCircular = this.options.circular; + var lastIndex = this.lastIndex; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + var pushedIndex = newPanels.length; // Like when setting index 50 while visible panels are 0, 1, 2 + + if (index > range.max) { + newPanels.forEach(function (panel, offset) { + panels[index + offset] = panel; + }); + } else { + var panelsAfterIndex = panels.slice(index, index + newPanels.length); // Find empty from beginning + + var emptyPanelCount = findIndex(panelsAfterIndex, function (panel) { + return !!panel; + }); + + if (emptyPanelCount < 0) { + // All empty + emptyPanelCount = panelsAfterIndex.length; + } + + pushedIndex = newPanels.length - emptyPanelCount; // Insert removing empty panels + + panels.splice.apply(panels, __spreadArrays([index, emptyPanelCount], newPanels)); // Remove panels after last index + + if (panels.length > lastIndex + 1) { + var removedPanels = panels.splice(lastIndex + 1).filter(function (panel) { + return Boolean(panel); + }); + this.length -= removedPanels.length; // Find first + + var newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), function (panel) { + return !!panel; + }); // Can be filled with empty after newLastIndex + + this.panels.splice(newLastIndex + 1); + this.range.max = newLastIndex; + + if (this.shouldRender()) { + removedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + } + } // Update index of previous panels + + + if (pushedIndex > 0) { + panels.slice(index + newPanels.length).forEach(function (panel) { + panel.setIndex(panel.getIndex() + pushedIndex); + }); + } // Update state + + + this.length += newPanels.length; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling); + var clones = this.clones; + var panelCount_1 = this.panels.length; + + if (clones[0] && clones[0].length > lastIndex + 1) { + clones.forEach(function (cloneSet) { + cloneSet.splice(panelCount_1); + }); + } + } + + return pushedIndex; + }; + + __proto.replace = function (index, newPanels) { + var panels = this.panels; + var range = this.range; + var options = this.options; + var isCircular = options.circular; // Find first panel that index is greater than inserting index + + var nextSibling = this.findFirstPanelFrom(index + newPanels.length); // if it's null, element will be inserted at last position + // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax + + var firstPanel = this.firstPanel(); + var siblingElement = nextSibling ? nextSibling.getElement() : isCircular && firstPanel ? firstPanel.getClonedPanels()[0].getElement() : null; // Insert panels before sibling element + + this.insertNewPanels(newPanels, siblingElement); + + if (index > range.max) { + // Temporarily insert null at index to use splice() + panels[index] = null; + } + + var replacedPanels = panels.splice.apply(panels, __spreadArrays([index, newPanels.length], newPanels)); + var wasNonEmptyCount = replacedPanels.filter(function (panel) { + return Boolean(panel); + }).length; // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1] + // So length should be increased by 3(inserting panels) - 1(non-empty panels) + + this.length += newPanels.length - wasNonEmptyCount; + this.updateIndex(index); + + if (isCircular) { + this.addNewClones(index, newPanels, newPanels.length, nextSibling); + } + + if (this.shouldRender()) { + replacedPanels.forEach(function (panel) { + return panel && panel.removeElement(); + }); + } + + return replacedPanels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var isCircular = this.options.circular; + var panels = this.panels; + var clones = this.clones; // Delete count should be equal or larger than 0 + + deleteCount = Math.max(deleteCount, 0); + var deletedPanels = panels.splice(index, deleteCount).filter(function (panel) { + return !!panel; + }); + + if (this.shouldRender()) { + deletedPanels.forEach(function (panel) { + return panel.removeElement(); + }); + } + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(index, deleteCount); + }); + } // Update indexes + + + panels.slice(index).forEach(function (panel) { + panel.setIndex(panel.getIndex() - deleteCount); + }); // Check last panel is empty + + var lastIndex = panels.length - 1; + + if (!panels[lastIndex]) { + var reversedPanels = panels.concat().reverse(); + var nonEmptyIndexFromLast = findIndex(reversedPanels, function (panel) { + return !!panel; + }); + lastIndex = nonEmptyIndexFromLast < 0 ? -1 // All empty + : lastIndex - nonEmptyIndexFromLast; // Remove all empty panels from last + + panels.splice(lastIndex + 1); + + if (isCircular) { + clones.forEach(function (cloneSet) { + cloneSet.splice(lastIndex + 1); + }); + } + } // Update range & length + + + this.range = { + min: findIndex(panels, function (panel) { + return !!panel; + }), + max: lastIndex + }; + this.length -= deletedPanels.length; + + if (this.length <= 0) { + // Reset clones + this.clones = []; + this.cloneCount = 0; + } + + return deletedPanels; + }; + + __proto.chainAllPanels = function () { + var allPanels = this.allPanels().filter(function (panel) { + return !!panel; + }); + var allPanelsCount = allPanels.length; + + if (allPanelsCount <= 1) { + return; + } + + allPanels.slice(1, allPanels.length - 1).forEach(function (panel, idx) { + var prevPanel = allPanels[idx]; + var nextPanel = allPanels[idx + 2]; + panel.prevSibling = prevPanel; + panel.nextSibling = nextPanel; + }); + var firstPanel = allPanels[0]; + var lastPanel = allPanels[allPanelsCount - 1]; + firstPanel.prevSibling = null; + firstPanel.nextSibling = allPanels[1]; + lastPanel.prevSibling = allPanels[allPanelsCount - 2]; + lastPanel.nextSibling = null; + + if (this.options.circular) { + firstPanel.prevSibling = lastPanel; + lastPanel.nextSibling = firstPanel; + } + }; + + __proto.insertClones = function (cloneIndex, index, clonedPanels, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 0; + } + + var clones = this.clones; + var lastIndex = this.lastIndex; + + if (!clones[cloneIndex]) { + var newClones_1 = []; + clonedPanels.forEach(function (panel, offset) { + newClones_1[index + offset] = panel; + }); + clones[cloneIndex] = newClones_1; + } else { + var insertTarget_1 = clones[cloneIndex]; + + if (index >= insertTarget_1.length) { + clonedPanels.forEach(function (panel, offset) { + insertTarget_1[index + offset] = panel; + }); + } else { + insertTarget_1.splice.apply(insertTarget_1, __spreadArrays([index, deleteCount], clonedPanels)); // Remove panels after last index + + if (clonedPanels.length > lastIndex + 1) { + clonedPanels.splice(lastIndex + 1); + } + } + } + }; // clones are operating in set + + + __proto.removeClonesAfter = function (cloneIndex) { + var panels = this.panels; + panels.forEach(function (panel) { + panel.removeClonedPanelsAfter(cloneIndex); + }); + this.clones.splice(cloneIndex); + }; + + __proto.findPanelOf = function (element) { + var allPanels = this.allPanels(); + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var panelElement = panel.getElement(); + + if (panelElement.contains(element)) { + return panel; + } + } + }; + + __proto.findFirstPanelFrom = function (index) { + for (var _i = 0, _a = this.panels.slice(index); _i < _a.length; _i++) { + var panel = _a[_i]; + + if (panel && panel.getIndex() >= index && panel.getElement().parentNode) { + return panel; + } + } + }; + + __proto.addNewClones = function (index, originalPanels, deleteCount, nextSibling) { + var _this = this; + + var cameraElement = this.cameraElement; + var cloneCount = this.getCloneCount(); + var lastPanel = this.lastPanel(); + var lastPanelClones = lastPanel ? lastPanel.getClonedPanels() : []; + var nextSiblingClones = nextSibling ? nextSibling.getClonedPanels() : []; + + var _loop_1 = function (cloneIndex) { + var cloneNextSibling = nextSiblingClones[cloneIndex]; + var lastPanelSibling = lastPanelClones[cloneIndex]; + var cloneSiblingElement = cloneNextSibling ? cloneNextSibling.getElement() : lastPanelSibling ? lastPanelSibling.getElement().nextElementSibling : null; + var newClones = originalPanels.map(function (panel) { + var clone = panel.clone(cloneIndex); + + if (_this.shouldRender()) { + cameraElement.insertBefore(clone.getElement(), cloneSiblingElement); + } + + return clone; + }); + this_1.insertClones(cloneIndex, index, newClones, deleteCount); + }; + + var this_1 = this; + + for (var _i = 0, _a = counter(cloneCount); _i < _a.length; _i++) { + var cloneIndex = _a[_i]; + + _loop_1(cloneIndex); + } + }; + + __proto.updateIndex = function (insertingIndex) { + var panels = this.panels; + var range = this.range; + var newLastIndex = panels.length - 1; + + if (newLastIndex > range.max) { + range.max = newLastIndex; + } + + if (insertingIndex < range.min || range.min < 0) { + range.min = insertingIndex; + } + }; + + __proto.insertNewPanels = function (newPanels, siblingElement) { + if (this.shouldRender()) { + var fragment_1 = document.createDocumentFragment(); + newPanels.forEach(function (panel) { + return fragment_1.appendChild(panel.getElement()); + }); + this.cameraElement.insertBefore(fragment_1, siblingElement); + } + }; + + __proto.shouldRender = function () { + var options = this.options; + return !options.renderExternal && !options.renderOnlyVisible; + }; + + return PanelManager; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + var State = + /*#__PURE__*/ + function () { + function State() { + this.delta = 0; + this.direction = null; + this.targetPanel = null; + this.lastPosition = 0; + } + + var __proto = State.prototype; + + __proto.onEnter = function (prevState) { + this.delta = prevState.delta; + this.direction = prevState.direction; + this.targetPanel = prevState.targetPanel; + this.lastPosition = prevState.lastPosition; + }; + + __proto.onExit = function (nextState) {// DO NOTHING + }; + + __proto.onHold = function (e, context) {// DO NOTHING + }; + + __proto.onChange = function (e, context) {// DO NOTHING + }; + + __proto.onRelease = function (e, context) {// DO NOTHING + }; + + __proto.onAnimationEnd = function (e, context) {// DO NOTHING + }; + + __proto.onFinish = function (e, context) {// DO NOTHING + }; + + return State; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var IdleState = + /*#__PURE__*/ + function (_super) { + __extends(IdleState, _super); + + function IdleState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.IDLE; + _this.holding = false; + _this.playing = false; + return _this; + } + + var __proto = IdleState.prototype; + + __proto.onEnter = function () { + this.direction = null; + this.targetPanel = null; + this.delta = 0; + this.lastPosition = 0; + }; + + __proto.onHold = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Shouldn't do any action until any panels on flicking area + + if (flicking.getPanelCount() <= 0) { + if (viewport.options.infinite) { + viewport.moveCamera(viewport.getCameraPosition(), e); + } + + transitTo(STATE_TYPE.DISABLED); + return; + } + + this.lastPosition = viewport.getCameraPosition(); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.HOLDING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; // By methods call + + + __proto.onChange = function (e, context) { + var triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.MOVE_START, e, false).onSuccess(function () { + // Trigger AnimatingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.ANIMATING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + return IdleState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var HoldingState = + /*#__PURE__*/ + function (_super) { + __extends(HoldingState, _super); + + function HoldingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.HOLDING; + _this.holding = true; + _this.playing = true; + _this.releaseEvent = null; + return _this; + } + + var __proto = HoldingState.prototype; + + __proto.onChange = function (e, context) { + var flicking = context.flicking, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + var offset = flicking.options.horizontal ? e.inputEvent.offsetX : e.inputEvent.offsetY; + this.direction = offset < 0 ? DIRECTION.NEXT : DIRECTION.PREV; + triggerEvent(EVENTS.MOVE_START, e, true).onSuccess(function () { + // Trigger DraggingState's onChange, to trigger "move" event immediately + transitTo(STATE_TYPE.DRAGGING).onChange(e, context); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo; + triggerEvent(EVENTS.HOLD_END, e, true); + + if (e.delta.flick !== 0) { + // Sometimes "release" event on axes triggered before "change" event + // Especially if user flicked panel fast in really short amount of time + // if delta is not zero, that means above case happened. + // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END + // At least one move event should be included between holdStart and holdEnd + e.setTo({ + flick: viewport.getCameraPosition() + }, 0); + transitTo(STATE_TYPE.IDLE); + return; + } // Can't handle select event here, + // As "finish" axes event happens + + + this.releaseEvent = e; + }; + + __proto.onFinish = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; // Should transite to IDLE state before select event + // As user expects hold is already finished + + transitTo(STATE_TYPE.IDLE); + + if (!this.releaseEvent) { + return; + } // Handle release event here + // To prevent finish event called twice + + + var releaseEvent = this.releaseEvent; // Static click + + var srcEvent = releaseEvent.inputEvent.srcEvent; + var clickedElement; + + if (srcEvent.type === "touchend") { + var touchEvent = srcEvent; + var touch = touchEvent.changedTouches[0]; + clickedElement = document.elementFromPoint(touch.clientX, touch.clientY); + } else { + clickedElement = srcEvent.target; + } + + var clickedPanel = viewport.panelManager.findPanelOf(clickedElement); + var cameraPosition = viewport.getCameraPosition(); + + if (clickedPanel) { + var clickedPanelPosition = clickedPanel.getPosition(); + var direction = clickedPanelPosition > cameraPosition ? DIRECTION.NEXT : clickedPanelPosition < cameraPosition ? DIRECTION.PREV : null; // Don't provide axes event, to use axes instance instead + + triggerEvent(EVENTS.SELECT, null, true, { + direction: direction, + index: clickedPanel.getIndex(), + panel: clickedPanel + }); + } + }; + + return HoldingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var DraggingState = + /*#__PURE__*/ + function (_super) { + __extends(DraggingState, _super); + + function DraggingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DRAGGING; + _this.holding = true; + _this.playing = true; + return _this; + } + + var __proto = DraggingState.prototype; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onRelease = function (e, context) { + var flicking = context.flicking, + viewport = context.viewport, + triggerEvent = context.triggerEvent, + transitTo = context.transitTo, + stopCamera = context.stopCamera; + var delta = this.delta; + var absDelta = Math.abs(delta); + var options = flicking.options; + var horizontal = options.horizontal; + var moveType = viewport.moveType; + var inputEvent = e.inputEvent; + var velocity = horizontal ? inputEvent.velocityX : inputEvent.velocityY; + var inputDelta = horizontal ? inputEvent.deltaX : inputEvent.deltaY; + var isNextDirection = Math.abs(velocity) > 1 ? velocity < 0 : absDelta > 0 ? delta > 0 : inputDelta < 0; + var swipeDistance = viewport.options.bound ? Math.max(absDelta, Math.abs(inputDelta)) : absDelta; + var swipeAngle = inputEvent.deltaX ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI) : 90; + var belowAngleThreshold = horizontal ? swipeAngle <= options.thresholdAngle : swipeAngle > options.thresholdAngle; + var overThreshold = swipeDistance >= options.threshold && belowAngleThreshold; + var moveTypeContext = { + viewport: viewport, + axesEvent: e, + state: this, + swipeDistance: swipeDistance, + isNextDirection: isNextDirection + }; // Update last position to cope with Axes's animating behavior + // Axes uses start position when animation start + + triggerEvent(EVENTS.HOLD_END, e, true); + var targetPanel = this.targetPanel; + + if (!overThreshold && targetPanel) { + // Interrupted while animating + var interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext); + viewport.moveTo(interruptDestInfo.panel, interruptDestInfo.destPos, interruptDestInfo.eventType, e, interruptDestInfo.duration); + transitTo(STATE_TYPE.ANIMATING); + return; + } + + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + + if (!currentPanel || !nearestPanel) { + // There're no panels + e.stop(); + transitTo(STATE_TYPE.IDLE); + return; + } + + var destInfo = overThreshold ? moveType.findTargetPanel(moveTypeContext) : moveType.findRestorePanel(moveTypeContext); + viewport.moveTo(destInfo.panel, destInfo.destPos, destInfo.eventType, e, destInfo.duration).onSuccess(function () { + transitTo(STATE_TYPE.ANIMATING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + stopCamera(e); + }); + }; + + return DraggingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var AnimatingState = + /*#__PURE__*/ + function (_super) { + __extends(AnimatingState, _super); + + function AnimatingState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.ANIMATING; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = AnimatingState.prototype; + + __proto.onHold = function (e, _a) { + var viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var options = viewport.options; + var scrollArea = viewport.getScrollArea(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize); + var targetPanel = this.targetPanel; + + if (options.circular && loopCount !== 0 && targetPanel) { + var cloneCount = viewport.panelManager.getCloneCount(); + var originalTargetPosition = targetPanel.getPosition(); // cloneIndex is from -1 to cloneCount - 1 + + var newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true); + var newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize; + var newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true); // Set new target panel considering looped count + + newTargetPanel.setPosition(newTargetPosition); + this.targetPanel = newTargetPanel; + } // Reset last position and delta + + + this.delta = 0; + this.lastPosition = viewport.getCameraPosition(); // Update current panel as current nearest panel + + viewport.setCurrentPanel(viewport.getNearestPanel()); + triggerEvent(EVENTS.HOLD_START, e, true).onSuccess(function () { + transitTo(STATE_TYPE.DRAGGING); + }).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onChange = function (e, _a) { + var moveCamera = _a.moveCamera, + transitTo = _a.transitTo; + + if (!e.delta.flick) { + return; + } + + moveCamera(e).onStopped(function () { + transitTo(STATE_TYPE.DISABLED); + }); + }; + + __proto.onFinish = function (e, _a) { + var flicking = _a.flicking, + viewport = _a.viewport, + triggerEvent = _a.triggerEvent, + transitTo = _a.transitTo; + var isTrusted = e && e.isTrusted; + viewport.options.bound ? viewport.setCurrentPanel(this.targetPanel) : viewport.setCurrentPanel(viewport.getNearestPanel()); + + if (flicking.options.adaptive) { + viewport.updateAdaptiveSize(); + } + + transitTo(STATE_TYPE.IDLE); + viewport.updateCameraPosition(); + triggerEvent(EVENTS.MOVE_END, e, isTrusted, { + direction: this.direction + }); + }; + + return AnimatingState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var DisabledState = + /*#__PURE__*/ + function (_super) { + __extends(DisabledState, _super); + + function DisabledState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + + _this.type = STATE_TYPE.DISABLED; + _this.holding = false; + _this.playing = true; + return _this; + } + + var __proto = DisabledState.prototype; + + __proto.onAnimationEnd = function (e, _a) { + var transitTo = _a.transitTo; + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onChange = function (e, _a) { + var viewport = _a.viewport, + transitTo = _a.transitTo; // Can stop Axes's change event + + e.stop(); // Should update axes position as it's already changed at this moment + + viewport.updateAxesPosition(viewport.getCameraPosition()); + transitTo(STATE_TYPE.IDLE); + }; + + __proto.onRelease = function (e, _a) { + var transitTo = _a.transitTo; // This is needed when stopped hold start event + + if (e.delta.flick === 0) { + transitTo(STATE_TYPE.IDLE); + } + }; + + return DisabledState; + }(State); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var StateMachine = + /*#__PURE__*/ + function () { + function StateMachine() { + var _this = this; + + this.state = new IdleState(); + + this.transitTo = function (nextStateType) { + var currentState = _this.state; + + if (currentState.type !== nextStateType) { + var nextState = void 0; + + switch (nextStateType) { + case STATE_TYPE.IDLE: + nextState = new IdleState(); + break; + + case STATE_TYPE.HOLDING: + nextState = new HoldingState(); + break; + + case STATE_TYPE.DRAGGING: + nextState = new DraggingState(); + break; + + case STATE_TYPE.ANIMATING: + nextState = new AnimatingState(); + break; + + case STATE_TYPE.DISABLED: + nextState = new DisabledState(); + break; + } + + currentState.onExit(nextState); + nextState.onEnter(currentState); + _this.state = nextState; + } + + return _this.state; + }; + } + + var __proto = StateMachine.prototype; + + __proto.fire = function (eventType, e, context) { + var currentState = this.state; + + switch (eventType) { + case AXES_EVENTS.HOLD: + currentState.onHold(e, context); + break; + + case AXES_EVENTS.CHANGE: + currentState.onChange(e, context); + break; + + case AXES_EVENTS.RELEASE: + currentState.onRelease(e, context); + break; + + case AXES_EVENTS.ANIMATION_END: + currentState.onAnimationEnd(e, context); + break; + + case AXES_EVENTS.FINISH: + currentState.onFinish(e, context); + break; + } + }; + + __proto.getState = function () { + return this.state; + }; + + return StateMachine; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var MoveType = + /*#__PURE__*/ + function () { + function MoveType() {} + + var __proto = MoveType.prototype; + + __proto.is = function (type) { + return type === this.type; + }; + + __proto.findRestorePanel = function (ctx) { + var viewport = ctx.viewport; + var options = viewport.options; + var panel = options.circular ? this.findRestorePanelInCircularMode(ctx) : viewport.getCurrentPanel(); + return { + panel: panel, + destPos: viewport.findEstimatedPosition(panel), + duration: options.duration, + eventType: EVENTS.RESTORE + }; + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var state = ctx.state, + viewport = ctx.viewport; + var targetPanel = state.targetPanel; + return { + panel: targetPanel, + destPos: viewport.findEstimatedPosition(targetPanel), + duration: viewport.options.duration, + eventType: "" + }; + }; // Calculate minimum distance to "change" panel + + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var relativeAnchorPosition = currentPanel.getRelativeAnchorPosition(); // Minimum distance needed to decide prev/next panel as nearest + + /* + * | Prev | Next | + * |--------|--------------| + * [][ |<-Anchor ][] <- Panel + Half-Gap + */ + + var minimumDistanceToChange = isNextDirection ? currentPanel.getSize() - relativeAnchorPosition + halfGap : relativeAnchorPosition + halfGap; + minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold); + return minimumDistanceToChange; + }; + + __proto.findRestorePanelInCircularMode = function (ctx) { + var viewport = ctx.viewport; + var originalPanel = viewport.getCurrentPanel().getOriginalPanel(); + var hangerPosition = viewport.getHangerPosition(); + var firstClonedPanel = originalPanel.getIdenticalPanels()[1]; + var lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); + return !ctx.isNextDirection && lapped ? firstClonedPanel : originalPanel; + }; + + return MoveType; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var Snap = + /*#__PURE__*/ + function (_super) { + __extends(Snap, _super); + + function Snap(count) { + var _this = _super.call(this) || this; + + _this.type = MOVE_TYPE.SNAP; + _this.count = count; + return _this; + } + + var __proto = Snap.prototype; + + __proto.findTargetPanel = function (ctx) { + var viewport = ctx.viewport, + axesEvent = ctx.axesEvent, + swipeDistance = ctx.swipeDistance; + var snapCount = this.count; + var eventDelta = Math.abs(axesEvent.delta.flick); + var currentPanel = viewport.getCurrentPanel(); + var nearestPanel = viewport.getNearestPanel(); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex(); // This can happen when bounce is 0 + + var shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent; + var shouldMoveToAdjacent = !viewport.isOutOfBound() && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0); + + if (snapCount > 1 && eventDelta > minimumDistanceToChange) { + return this.findSnappedPanel(ctx); + } else if (shouldMoveToAdjacent) { + return this.findAdjacentPanel(ctx); + } else { + return { + panel: nearestPanel, + duration: viewport.options.duration, + destPos: viewport.findEstimatedPosition(nearestPanel), + // As swipeDistance holds mouse/touch position change regardless of bounce option value + // swipDistance > minimumDistanceToChange can happen in bounce area + // Second condition is for handling that. + eventType: swipeDistance <= minimumDistanceToChange || viewport.isOutOfBound() && nearestIsCurrent ? EVENTS.RESTORE : EVENTS.CHANGE + }; + } + }; + + __proto.findSnappedPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + viewport = ctx.viewport, + state = ctx.state, + isNextDirection = ctx.isNextDirection; + var eventDelta = Math.abs(axesEvent.delta.flick); + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var snapCount = this.count; + var options = viewport.options; + var scrollAreaSize = viewport.getScrollAreaSize(); + var halfGap = options.gap / 2; + var estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition(); + var panelToMove = viewport.getNearestPanel(); + var cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone) + + var passedPanelCount = 0; + + while (passedPanelCount < snapCount) { + // Since panelToMove holds also cloned panels, we should use original panel's position + var originalPanel = panelToMove.getOriginalPanel(); + var panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize; + var panelSize = originalPanel.getSize(); + var panelNextPosition = panelPosition + panelSize + halfGap; + var panelPrevPosition = panelPosition - halfGap; // Current panelToMove contains destPos + + if (isNextDirection && panelNextPosition > estimatedHangerPos || !isNextDirection && panelPrevPosition < estimatedHangerPos) { + break; + } + + var siblingPanel = isNextDirection ? panelToMove.nextSibling : panelToMove.prevSibling; + + if (!siblingPanel) { + break; + } + + var panelIndex = panelToMove.getIndex(); + var siblingIndex = siblingPanel.getIndex(); + + if (isNextDirection && siblingIndex <= panelIndex || !isNextDirection && siblingIndex >= panelIndex) { + cycleIndex = isNextDirection ? cycleIndex + 1 : cycleIndex - 1; + } + + panelToMove = siblingPanel; + passedPanelCount += 1; + } + + var originalPosition = panelToMove.getOriginalPanel().getPosition(); + + if (cycleIndex !== 0) { + panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true); + panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize); + } + + var defaultDuration = viewport.options.duration; + var duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount); + return { + panel: panelToMove, + destPos: viewport.findEstimatedPosition(panelToMove), + duration: duration, + eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange ? EVENTS.CHANGE : EVENTS.RESTORE + }; + }; + + __proto.findAdjacentPanel = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentIndex = viewport.getCurrentIndex(); + var currentPanel = viewport.panelManager.get(currentIndex); + var hangerPosition = viewport.getHangerPosition(); + var scrollArea = viewport.getScrollArea(); + var firstClonedPanel = currentPanel.getIdenticalPanels()[1]; + var lapped = options.circular && Math.abs(currentPanel.getAnchorPosition() - hangerPosition) > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition); // If lapped in circular mode, use first cloned panel as base panel + + var basePanel = lapped ? firstClonedPanel : currentPanel; + var basePosition = basePanel.getPosition(); + var adjacentPanel = isNextDirection ? basePanel.nextSibling : basePanel.prevSibling; + var eventType = adjacentPanel ? EVENTS.CHANGE : EVENTS.RESTORE; + var panelToMove = adjacentPanel ? adjacentPanel : basePanel; + var targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition(); + var estimatedPanelPosition = options.circular ? isNextDirection ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap : panelToMove.getAnchorPosition(); + var estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition(); + var destPos = viewport.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return { + panel: panelToMove, + destPos: destPos, + duration: options.duration, + eventType: eventType + }; + }; + + return Snap; + }(MoveType); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + + var FreeScroll = + /*#__PURE__*/ + function (_super) { + __extends(FreeScroll, _super); + + function FreeScroll() { + var _this = // Set snap count to Infinity + _super.call(this, Infinity) || this; + + _this.type = MOVE_TYPE.FREE_SCROLL; + return _this; + } + + var __proto = FreeScroll.prototype; + + __proto.findTargetPanel = function (ctx) { + var axesEvent = ctx.axesEvent, + state = ctx.state, + viewport = ctx.viewport; + var destPos = axesEvent.destPos.flick; + var minimumDistanceToChange = this.calcBrinkOfChange(ctx); + var scrollArea = viewport.getScrollArea(); + var currentPanel = viewport.getCurrentPanel(); + var options = viewport.options; + var delta = Math.abs(axesEvent.delta.flick + state.delta); + + if (delta > minimumDistanceToChange) { + var destInfo = _super.prototype.findSnappedPanel.call(this, ctx); + + destInfo.duration = axesEvent.duration; + destInfo.destPos = destPos; + destInfo.eventType = !options.circular && destInfo.panel === currentPanel ? "" : EVENTS.CHANGE; + return destInfo; + } else { + var estimatedPosition = options.circular ? circulate(destPos, scrollArea.prev, scrollArea.next, false) : destPos; + estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next); + estimatedPosition += viewport.getRelativeHangerPosition(); + var estimatedPanel = viewport.findNearestPanelAt(estimatedPosition); + return { + panel: estimatedPanel, + destPos: destPos, + duration: axesEvent.duration, + eventType: "" + }; + } + }; + + __proto.findRestorePanel = function (ctx) { + return this.findTargetPanel(ctx); + }; + + __proto.findPanelWhenInterrupted = function (ctx) { + var viewport = ctx.viewport; + return { + panel: viewport.getNearestPanel(), + destPos: viewport.getCameraPosition(), + duration: 0, + eventType: "" + }; + }; + + __proto.calcBrinkOfChange = function (ctx) { + var viewport = ctx.viewport, + isNextDirection = ctx.isNextDirection; + var options = viewport.options; + var currentPanel = viewport.getCurrentPanel(); + var halfGap = options.gap / 2; + var lastPosition = viewport.stateMachine.getState().lastPosition; + var currentPanelPosition = currentPanel.getPosition(); // As camera can stop anywhere in free scroll mode, + // minimumDistanceToChange should be calculated differently. + // Ref #191(https://github.com/naver/egjs-flicking/issues/191) + + var lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition(); + var scrollAreaSize = viewport.getScrollAreaSize(); + var minimumDistanceToChange = isNextDirection ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap : lastHangerPosition - currentPanelPosition + halfGap; + minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize); + return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange); + }; + + return FreeScroll; + }(Snap); + + var Viewport = + /*#__PURE__*/ + function () { + function Viewport(flicking, options, triggerEvent) { + var _this = this; + + this.plugins = []; + + this.stopCamera = function (axesEvent) { + if (axesEvent && axesEvent.setTo) { + axesEvent.setTo({ + flick: _this.state.position + }, 0); + } + + _this.stateMachine.transitTo(STATE_TYPE.IDLE); + }; + + this.flicking = flicking; + this.triggerEvent = triggerEvent; + this.state = { + size: 0, + position: 0, + panelMaintainRatio: 0, + relativeHangerPosition: 0, + positionOffset: 0, + scrollArea: { + prev: 0, + next: 0 + }, + translate: TRANSFORM$1, + infiniteThreshold: 0, + checkedIndexes: [], + isAdaptiveCached: false, + isViewportGiven: false, + isCameraGiven: false, + originalViewportStyle: { + className: null, + style: null + }, + originalCameraStyle: { + className: null, + style: null + }, + cachedBbox: null + }; + this.options = options; + this.stateMachine = new StateMachine(); + this.visiblePanels = []; + this.panelBboxes = {}; + this.build(); + } + + var __proto = Viewport.prototype; + + __proto.moveTo = function (panel, destPos, eventType, axesEvent, duration) { + var _this = this; + + if (duration === void 0) { + duration = this.options.duration; + } + + var state = this.state; + var currentState = this.stateMachine.getState(); + var currentPosition = state.position; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + var direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + var eventResult; + + if (eventType === EVENTS.CHANGE) { + eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, { + index: panel.getIndex(), + panel: panel, + direction: direction + }); + } else if (eventType === EVENTS.RESTORE) { + eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted); + } else { + eventResult = { + onSuccess: function (callback) { + callback(); + return this; + }, + onStopped: function () { + return this; + } + }; + } + + eventResult.onSuccess(function () { + currentState.delta = 0; + currentState.lastPosition = _this.getCameraPosition(); + currentState.targetPanel = panel; + currentState.direction = destPos === currentPosition ? null : destPos > currentPosition ? DIRECTION.NEXT : DIRECTION.PREV; + + if (destPos === currentPosition) { + // no move + _this.nearestPanel = panel; + _this.currentPanel = panel; + } + + if (axesEvent && axesEvent.setTo) { + // freeScroll only occurs in release events + axesEvent.setTo({ + flick: destPos + }, duration); + } else { + _this.axes.setTo({ + flick: destPos + }, duration); + } + }); + return eventResult; + }; + + __proto.moveCamera = function (pos, axesEvent) { + var state = this.state; + var options = this.options; + var transform = state.translate.name; + var scrollArea = state.scrollArea; // Update position & nearestPanel + + if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) { + pos = circulate(pos, scrollArea.prev, scrollArea.next, false); + } + + state.position = pos; + this.nearestPanel = this.findNearestPanel(); + var nearestPanel = this.nearestPanel; + var originalNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; // From 0(panel position) to 1(panel position + panel size) + // When it's on gap area value will be (val > 1 || val < 0) + + if (nearestPanel) { + var hangerPosition = this.getHangerPosition(); + var panelPosition = nearestPanel.getPosition(); + var panelSize = nearestPanel.getSize(); + var halfGap = options.gap / 2; // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap + + state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap); + } else { + state.panelMaintainRatio = 0; + } + + this.checkNeedPanel(axesEvent); // Possibly modified after need panel, if it's looped + + var modifiedNearestPosition = nearestPanel ? nearestPanel.getPosition() : 0; + pos += modifiedNearestPosition - originalNearestPosition; + state.position = pos; + this.updateVisiblePanels(); // Offset is needed to fix camera layer size in visible-only rendering mode + + var posOffset = options.renderOnlyVisible ? state.positionOffset : 0; + var moveVector = options.horizontal ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)]; + var moveCoord = moveVector.map(function (coord) { + return Math.round(coord) + "px"; + }).join(", "); + this.cameraElement.style[transform] = state.translate.has3d ? "translate3d(" + moveCoord + ", 0px)" : "translate(" + moveCoord + ")"; + }; + + __proto.unCacheBbox = function () { + var state = this.state; + var options = this.options; + state.cachedBbox = null; + this.visiblePanels = []; + var viewportElement = this.viewportElement; + + if (!options.horizontal) { + // Don't preserve previous width for adaptive resizing + viewportElement.style.width = ""; + } else { + viewportElement.style.height = ""; + } + + state.isAdaptiveCached = false; + this.panelBboxes = {}; + }; + + __proto.resize = function () { + this.updateSize(); + this.updateOriginalPanelPositions(); + this.updateAdaptiveSize(); + this.updateScrollArea(); + this.updateClonePanels(); + this.updateVisiblePanelPositions(); + this.updateCameraPosition(); + this.updatePlugins(); + }; // Find nearest anchor from current hanger position + + + __proto.findNearestPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var hangerPosition = this.getHangerPosition(); + + if (this.isOutOfBound()) { + var position = state.position; + return position <= state.scrollArea.prev ? panelManager.firstPanel() : panelManager.lastPanel(); + } + + return this.findNearestPanelAt(hangerPosition); + }; + + __proto.findNearestPanelAt = function (position) { + var panelManager = this.panelManager; + var allPanels = panelManager.allPanels(); + var minimumDistance = Infinity; + var nearestPanel; + + for (var _i = 0, allPanels_1 = allPanels; _i < allPanels_1.length; _i++) { + var panel = allPanels_1[_i]; + + if (!panel) { + continue; + } + + var prevPosition = panel.getPosition(); + var nextPosition = prevPosition + panel.getSize(); // Use shortest distance from panel's range + + var distance = isBetween(position, prevPosition, nextPosition) ? 0 : Math.min(Math.abs(prevPosition - position), Math.abs(nextPosition - position)); + + if (distance > minimumDistance) { + break; + } else if (distance === minimumDistance) { + var minimumAnchorDistance = Math.abs(position - nearestPanel.getAnchorPosition()); + var anchorDistance = Math.abs(position - panel.getAnchorPosition()); + + if (anchorDistance > minimumAnchorDistance) { + break; + } + } + + minimumDistance = distance; + nearestPanel = panel; + } + + return nearestPanel; + }; + + __proto.findNearestIdenticalPanel = function (panel) { + var nearest = panel; + var shortestDistance = Infinity; + var hangerPosition = this.getHangerPosition(); + var identicals = panel.getIdenticalPanels(); + identicals.forEach(function (identical) { + var anchorPosition = identical.getAnchorPosition(); + var distance = Math.abs(anchorPosition - hangerPosition); + + if (distance < shortestDistance) { + nearest = identical; + shortestDistance = distance; + } + }); + return nearest; + }; // Find shortest camera position that distance is minimum + + + __proto.findShortestPositionToPanel = function (panel) { + var state = this.state; + var options = this.options; + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = this.getHangerPosition(); + var distance = Math.abs(hangerPosition - anchorPosition); + var scrollAreaSize = state.scrollArea.next - state.scrollArea.prev; + + if (!options.circular) { + var position = anchorPosition - state.relativeHangerPosition; + return this.canSetBoundMode() ? clamp(position, state.scrollArea.prev, state.scrollArea.next) : position; + } else { + // If going out of viewport border is more efficient way of moving, choose that position + return distance <= scrollAreaSize - distance ? anchorPosition - state.relativeHangerPosition : anchorPosition > hangerPosition // PREV TO NEXT + ? anchorPosition - state.relativeHangerPosition - scrollAreaSize // NEXT TO PREV + : anchorPosition - state.relativeHangerPosition + scrollAreaSize; + } + }; + + __proto.findEstimatedPosition = function (panel) { + var scrollArea = this.getScrollArea(); + var estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition(); + estimatedPosition = this.canSetBoundMode() ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next) : estimatedPosition; + return estimatedPosition; + }; + + __proto.addVisiblePanel = function (panel) { + if (this.getVisibleIndexOf(panel) < 0) { + this.visiblePanels.push(panel); + } + }; + + __proto.enable = function () { + if (!this.panInput) { + this.createPanInput(); + } + }; + + __proto.disable = function () { + if (this.panInput) { + this.panInput.destroy(); + this.panInput = null; + this.stateMachine.transitTo(STATE_TYPE.IDLE); + } + }; + + __proto.insert = function (index, element) { + var _this = this; + + var lastIndex = this.panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var state = this.state; + var options = this.options; + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var pushedIndex = this.panelManager.insert(index, panels); // ...then calc bbox for all panels + + this.resizePanels(panels); + + if (!this.currentPanel) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + }); + state.checkedIndexes.forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; + + if (index < min) { + // Push checked index + state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + } + }); + this.resize(); + return panels; + }; + + __proto.replace = function (index, element) { + var _this = this; + + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var lastIndex = panelManager.getLastIndex(); // Index should not below 0 + + if (index < 0 || index > lastIndex) { + return []; + } + + var parsedElements = parseElement(element); + var panels = parsedElements.map(function (el, idx) { + return new Panel(el, index + idx, _this); + }).slice(0, lastIndex - index + 1); + + if (panels.length <= 0) { + return []; + } + + var replacedPanels = panelManager.replace(index, panels); + replacedPanels.forEach(function (panel) { + var visibleIndex = _this.getVisibleIndexOf(panel); + + if (visibleIndex > -1) { + _this.visiblePanels.splice(visibleIndex, 1); + } + }); // ...then calc bbox for all panels + + this.resizePanels(panels); + var currentPanel = this.currentPanel; + var wasEmpty = !currentPanel; + + if (wasEmpty) { + this.currentPanel = panels[0]; + this.nearestPanel = panels[0]; + var newCenterPanel = panels[0]; + var newPanelPosition = this.findEstimatedPosition(newCenterPanel); + state.position = newPanelPosition; + this.updateAxesPosition(newPanelPosition); + state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap); + } else if (isBetween(currentPanel.getIndex(), index, index + panels.length - 1)) { + // Current panel is replaced + this.currentPanel = panelManager.get(currentPanel.getIndex()); + } // Update checked indexes in infinite mode + + + this.updateCheckedIndexes({ + min: index, + max: index + panels.length - 1 + }); + this.resize(); + return panels; + }; + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + var state = this.state; // Index should not below 0 + + index = Math.max(index, 0); + var panelManager = this.panelManager; + var currentIndex = this.getCurrentIndex(); + var removedPanels = panelManager.remove(index, deleteCount); + + if (isBetween(currentIndex, index, index + deleteCount - 1)) { + // Current panel is removed + // Use panel at removing index - 1 as new current panel if it exists + var newCurrentIndex = Math.max(index - 1, panelManager.getRange().min); + this.currentPanel = panelManager.get(newCurrentIndex); + } // Update checked indexes in infinite mode + + + if (deleteCount > 0) { + // Check whether removing index will affect checked indexes + // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa. + this.updateCheckedIndexes({ + min: index - 1, + max: index + deleteCount + }); // Uncache visible panels to refresh panels + + this.visiblePanels = []; + } + + if (panelManager.getPanelCount() <= 0) { + this.currentPanel = undefined; + this.nearestPanel = undefined; + } + + this.resize(); + var scrollArea = state.scrollArea; + + if (state.position < scrollArea.prev || state.position > scrollArea.next) { + var newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false); + this.moveCamera(newPosition); + this.updateAxesPosition(newPosition); + } + + return removedPanels; + }; + + __proto.updateAdaptiveSize = function () { + var state = this.state; + var options = this.options; + var horizontal = options.horizontal; + var currentPanel = this.getCurrentPanel(); + + if (!currentPanel) { + return; + } + + var shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached; + var viewportStyle = this.viewportElement.style; + + if (shouldApplyAdaptive) { + var sizeToApply = void 0; + + if (options.adaptive) { + var panelBbox = currentPanel.getBbox(); + sizeToApply = horizontal ? panelBbox.height : panelBbox.width; + } else { + // Find minimum height of panels to maximum panel size + var maximumPanelSize = this.panelManager.originalPanels().reduce(function (maximum, panel) { + var panelBbox = panel.getBbox(); + return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width); + }, 0); + sizeToApply = maximumPanelSize; + } + + if (!state.isAdaptiveCached) { + var viewportBbox = this.updateBbox(); + sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width); + state.isAdaptiveCached = true; + } + + var viewportSize = sizeToApply + "px"; + + if (horizontal) { + viewportStyle.height = viewportSize; + state.cachedBbox.height = sizeToApply; + } else { + viewportStyle.width = viewportSize; + state.cachedBbox.width = sizeToApply; + } + } + }; // Update camera position after resizing + + + __proto.updateCameraPosition = function () { + var state = this.state; + var currentPanel = this.getCurrentPanel(); + var cameraPosition = this.getCameraPosition(); + var currentState = this.stateMachine.getState(); + var isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var halfGap = this.options.gap / 2; + + if (currentState.holding || currentState.playing) { + this.updateVisiblePanels(); + return; + } + + var newPosition; + + if (isFreeScroll) { + var positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next); + var nearestPanel = this.getNearestPanel(); // Preserve camera position if it is bound to scroll area limit + + newPosition = positionBounded || !nearestPanel ? cameraPosition : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition; + } else { + newPosition = currentPanel ? currentPanel.getAnchorPosition() - relativeHangerPosition : cameraPosition; + } + + if (this.canSetBoundMode()) { + newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next); + } // Pause & resume axes to prevent axes's "change" event triggered + // This should be done before moveCamera, as moveCamera can trigger needPanel + + + this.updateAxesPosition(newPosition); + this.moveCamera(newPosition); + }; + + __proto.updateBbox = function () { + var state = this.state; + var options = this.options; + var viewportElement = this.viewportElement; + + if (!state.cachedBbox) { + state.cachedBbox = getBbox(viewportElement, options.useOffset); + } + + return state.cachedBbox; + }; + + __proto.updatePlugins = function () { + var _this = this; // update for resize + + + this.plugins.forEach(function (plugin) { + plugin.update && plugin.update(_this.flicking); + }); + }; + + __proto.destroy = function (option) { + var _a; + + var state = this.state; + var wrapper = this.flicking.getElement(); + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var originalPanels = this.panelManager.originalPanels(); + this.removePlugins(this.plugins); + + if (!option.preserveUI) { + restoreStyle(viewportElement, state.originalViewportStyle); + restoreStyle(cameraElement, state.originalCameraStyle); + + if (!state.isCameraGiven && !this.options.renderExternal) { + var topmostElement_1 = state.isViewportGiven ? viewportElement : wrapper; + var deletingElement = state.isViewportGiven ? cameraElement : viewportElement; + originalPanels.forEach(function (panel) { + topmostElement_1.appendChild(panel.getElement()); + }); + topmostElement_1.removeChild(deletingElement); + } + } + + this.axes.destroy(); + (_a = this.panInput) === null || _a === void 0 ? void 0 : _a.destroy(); + originalPanels.forEach(function (panel) { + panel.destroy(option); + }); // release resources + + for (var x in this) { + this[x] = null; + } + }; + + __proto.restore = function (status) { + var panels = status.panels; + var defaultIndex = this.options.defaultIndex; + var cameraElement = this.cameraElement; + var panelManager = this.panelManager; // Restore index + + cameraElement.innerHTML = panels.map(function (panel) { + return panel.html; + }).join(""); // Create panels first + + this.refreshPanels(); + var createdPanels = panelManager.originalPanels(); // ...then order it by its index + + var orderedPanels = []; + panels.forEach(function (panel, idx) { + var createdPanel = createdPanels[idx]; + createdPanel.setIndex(panel.index); + orderedPanels[panel.index] = createdPanel; + }); + panelManager.replacePanels(orderedPanels, []); + panelManager.setCloneCount(0); // No clones at this point + + var panelCount = panelManager.getPanelCount(); + + if (panelCount > 0) { + this.currentPanel = panelManager.get(status.index) || panelManager.get(defaultIndex) || panelManager.firstPanel(); + } else { + this.currentPanel = undefined; + } + + this.visiblePanels = orderedPanels.filter(function (panel) { + return Boolean(panel); + }); + this.resize(); + this.axes.setTo({ + flick: status.position + }, 0); + this.moveCamera(status.position); + }; + + __proto.calcVisiblePanels = function () { + var allPanels = this.panelManager.allPanels(); + + if (this.options.renderOnlyVisible) { + var cameraPos_1 = this.getCameraPosition(); + var viewportSize_1 = this.getSize(); + var basePanel = this.nearestPanel; + + var getNextPanel = function (panel) { + var nextPanel = panel.nextSibling; + + if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) { + return nextPanel; + } else { + return null; + } + }; + + var getPrevPanel = function (panel) { + var prevPanel = panel.prevSibling; + + if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) { + return prevPanel; + } else { + return null; + } + }; + + var isOutOfBoundNext = function (panel) { + return panel.getPosition() >= cameraPos_1 + viewportSize_1; + }; + + var isOutOfBoundPrev = function (panel) { + return panel.getPosition() + panel.getSize() <= cameraPos_1; + }; + + var getVisiblePanels = function (panel, getNext, isOutOfViewport) { + var visiblePanels = []; + var lastPanel = panel; + + while (true) { + var nextPanel = getNext(lastPanel); + + if (!nextPanel || isOutOfViewport(nextPanel)) { + break; + } + + visiblePanels.push(nextPanel); + lastPanel = nextPanel; + } + + return visiblePanels; + }; + + var panelCount_1 = this.panelManager.getPanelCount(); + + var getAbsIndex_1 = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount_1; + }; + + var nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext); + var prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev); + return __spreadArrays([basePanel], nextPanels, prevPanels).sort(function (panel1, panel2) { + return getAbsIndex_1(panel1) - getAbsIndex_1(panel2); + }); + } else { + return allPanels.filter(function (panel) { + var outsetProgress = panel.getOutsetProgress(); + return outsetProgress > -1 && outsetProgress < 1; + }); + } + }; + + __proto.getCurrentPanel = function () { + return this.currentPanel; + }; + + __proto.getCurrentIndex = function () { + var currentPanel = this.currentPanel; + return currentPanel ? currentPanel.getIndex() : -1; + }; + + __proto.getNearestPanel = function () { + return this.nearestPanel; + }; // Get progress from nearest panel + + + __proto.getCurrentProgress = function () { + var currentState = this.stateMachine.getState(); + var nearestPanel = currentState.playing || currentState.holding ? this.nearestPanel : this.currentPanel; + var panelManager = this.panelManager; + + if (!nearestPanel) { + // There're no panels + return NaN; + } + + var _a = this.getScrollArea(), + prevRange = _a.prev, + nextRange = _a.next; + + var cameraPosition = this.getCameraPosition(); + var isOutOfBound = this.isOutOfBound(); + var prevPanel = nearestPanel.prevSibling; + var nextPanel = nearestPanel.nextSibling; + var hangerPosition = this.getHangerPosition(); + var nearestAnchorPos = nearestPanel.getAnchorPosition(); + + if (isOutOfBound && prevPanel && nextPanel && cameraPosition < nextRange // On the basis of anchor, prevPanel is nearestPanel. + && hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition) { + nearestPanel = prevPanel; + nextPanel = nearestPanel.nextSibling; + prevPanel = nearestPanel.prevSibling; + nearestAnchorPos = nearestPanel.getAnchorPosition(); + } + + var nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount(); + var nearestSize = nearestPanel.getSize(); + + if (isOutOfBound) { + var relativeHangerPosition = this.getRelativeHangerPosition(); + + if (nearestAnchorPos > nextRange + relativeHangerPosition) { + // next bounce area: hangerPosition - relativeHangerPosition - nextRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange; + } else if (nearestAnchorPos < prevRange + relativeHangerPosition) { + // prev bounce area: hangerPosition - relativeHangerPosition - prevRange + hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange; + } + } + + var hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos; + var gap = this.options.gap; + var basePosition = nearestAnchorPos; + var targetPosition = nearestAnchorPos; + + if (hangerIsNextToNearestPanel) { + targetPosition = nextPanel ? nextPanel.getAnchorPosition() : nearestAnchorPos + nearestSize + gap; + } else { + basePosition = prevPanel ? prevPanel.getAnchorPosition() : nearestAnchorPos - nearestSize - gap; + } + + var progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition); + var startIndex = hangerIsNextToNearestPanel ? nearestIndex : prevPanel ? prevPanel.getIndex() : nearestIndex - 1; + return startIndex + progressBetween; + }; // Update axes flick position without triggering event + + + __proto.updateAxesPosition = function (position) { + var axes = this.axes; + axes.off(); + axes.setTo({ + flick: position + }, 0); + axes.on(this.axesHandlers); + }; + + __proto.getSize = function () { + return this.state.size; + }; + + __proto.getScrollArea = function () { + return this.state.scrollArea; + }; + + __proto.isOutOfBound = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + return !options.circular && options.bound && (state.position <= scrollArea.prev || state.position >= scrollArea.next); + }; + + __proto.canSetBoundMode = function () { + var options = this.options; + return options.bound && !options.circular; + }; + + __proto.getViewportElement = function () { + return this.viewportElement; + }; + + __proto.getCameraElement = function () { + return this.cameraElement; + }; + + __proto.getScrollAreaSize = function () { + var scrollArea = this.state.scrollArea; + return scrollArea.next - scrollArea.prev; + }; + + __proto.getRelativeHangerPosition = function () { + return this.state.relativeHangerPosition; + }; + + __proto.getHangerPosition = function () { + return this.state.position + this.state.relativeHangerPosition; + }; + + __proto.getCameraPosition = function () { + return this.state.position; + }; + + __proto.getPositionOffset = function () { + return this.state.positionOffset; + }; + + __proto.getCheckedIndexes = function () { + return this.state.checkedIndexes; + }; + + __proto.getVisiblePanels = function () { + return this.visiblePanels; + }; + + __proto.setCurrentPanel = function (panel) { + this.currentPanel = panel; + }; + + __proto.setLastIndex = function (index) { + var currentPanel = this.currentPanel; + var panelManager = this.panelManager; + panelManager.setLastIndex(index); + + if (currentPanel && currentPanel.getIndex() > index) { + this.currentPanel = panelManager.lastPanel(); + } + + this.resize(); + }; + + __proto.setVisiblePanels = function (panels) { + this.visiblePanels = panels; + }; + + __proto.connectAxesHandler = function (handlers) { + var axes = this.axes; + this.axesHandlers = handlers; + axes.on(handlers); + }; + + __proto.addPlugins = function (plugins) { + var _this = this; + + var newPlugins = [].concat(plugins); + newPlugins.forEach(function (plugin) { + plugin.init(_this.flicking); + }); + this.plugins = this.plugins.concat(newPlugins); + return this; + }; + + __proto.removePlugins = function (plugins) { + var _this = this; + + var currentPlugins = this.plugins; + var removedPlugins = [].concat(plugins); + removedPlugins.forEach(function (plugin) { + var index = currentPlugins.indexOf(plugin); + + if (index > -1) { + currentPlugins.splice(index, 1); + } + + plugin.destroy(_this.flicking); + }); + return this; + }; + + __proto.updateCheckedIndexes = function (changedRange) { + var state = this.state; + var removed = 0; + state.checkedIndexes.concat().forEach(function (indexes, idx) { + var min = indexes[0], + max = indexes[1]; // Can fill part of indexes in range + + if (changedRange.min <= max && changedRange.max >= min) { + // Remove checked index from list + state.checkedIndexes.splice(idx - removed, 1); + removed++; + } + }); + }; + + __proto.appendUncachedPanelElements = function (panels) { + var _this = this; + + var options = this.options; + var fragment = document.createDocumentFragment(); + + if (options.isEqualSize) { + var prevVisiblePanels = this.visiblePanels; + var equalSizeClasses_1 = options.isEqualSize; // for readability + + var cached_1 = {}; + this.visiblePanels = []; + Object.keys(this.panelBboxes).forEach(function (className) { + cached_1[className] = true; + }); + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_1); + + if (overlappedClass && !cached_1[overlappedClass]) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + + cached_1[overlappedClass] = true; + } else if (!overlappedClass) { + if (!options.renderExternal) { + fragment.appendChild(panel.getElement()); + } + + _this.visiblePanels.push(panel); + } + }); + prevVisiblePanels.forEach(function (panel) { + _this.addVisiblePanel(panel); + }); + } else { + if (!options.renderExternal) { + panels.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + } + + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + } + + if (!options.renderExternal) { + this.cameraElement.appendChild(fragment); + } + }; + + __proto.updateClonePanels = function () { + var panelManager = this.panelManager; // Clone panels in circular mode + + if (this.options.circular && panelManager.getPanelCount() > 0) { + this.clonePanels(); + this.updateClonedPanelPositions(); + } + + panelManager.chainAllPanels(); + }; + + __proto.getVisibleIndexOf = function (panel) { + return findIndex(this.visiblePanels, function (visiblePanel) { + return visiblePanel === panel; + }); + }; + + __proto.build = function () { + this.setElements(); + this.applyCSSValue(); + this.setMoveType(); + this.setAxesInstance(); + this.refreshPanels(); + this.setDefaultPanel(); + this.resize(); + this.moveToDefaultPanel(); + }; + + __proto.setElements = function () { + var state = this.state; + var options = this.options; + var wrapper = this.flicking.getElement(); + var classPrefix = options.classPrefix; + var viewportCandidate = wrapper.children[0]; + var hasViewportElement = viewportCandidate && hasClass(viewportCandidate, classPrefix + "-viewport"); + var viewportElement = hasViewportElement ? viewportCandidate : document.createElement("div"); + var cameraCandidate = hasViewportElement ? viewportElement.children[0] : wrapper.children[0]; + var hasCameraElement = cameraCandidate && hasClass(cameraCandidate, classPrefix + "-camera"); + var cameraElement = hasCameraElement ? cameraCandidate : document.createElement("div"); + + if (!hasCameraElement) { + cameraElement.className = classPrefix + "-camera"; + var panelElements = hasViewportElement ? viewportElement.children : wrapper.children; // Make all panels to be a child of camera element + // wrapper <- viewport <- camera <- panels[1...n] + + toArray$3(panelElements).forEach(function (child) { + cameraElement.appendChild(child); + }); + } else { + state.originalCameraStyle = { + className: cameraElement.getAttribute("class"), + style: cameraElement.getAttribute("style") + }; + } + + if (!hasViewportElement) { + viewportElement.className = classPrefix + "-viewport"; // Add viewport element to wrapper + + wrapper.appendChild(viewportElement); + } else { + state.originalViewportStyle = { + className: viewportElement.getAttribute("class"), + style: viewportElement.getAttribute("style") + }; + } + + if (!hasCameraElement || !hasViewportElement) { + viewportElement.appendChild(cameraElement); + } + + this.viewportElement = viewportElement; + this.cameraElement = cameraElement; + state.isViewportGiven = hasViewportElement; + state.isCameraGiven = hasCameraElement; + }; + + __proto.applyCSSValue = function () { + var options = this.options; + var viewportElement = this.viewportElement; + var cameraElement = this.cameraElement; + var viewportStyle = this.viewportElement.style; // Set default css values for each element + + applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS); + applyCSS(cameraElement, DEFAULT_CAMERA_CSS); + viewportElement.style.zIndex = "" + options.zIndex; + + if (options.horizontal) { + viewportStyle.minHeight = "100%"; + viewportStyle.width = "100%"; + } else { + viewportStyle.minWidth = "100%"; + viewportStyle.height = "100%"; + } + + if (options.overflow) { + viewportStyle.overflow = "visible"; + } + + this.panelManager = new PanelManager(this.cameraElement, options); + }; + + __proto.setMoveType = function () { + var moveType = this.options.moveType; + + switch (moveType.type) { + case MOVE_TYPE.SNAP: + this.moveType = new Snap(moveType.count); + break; + + case MOVE_TYPE.FREE_SCROLL: + this.moveType = new FreeScroll(); + break; + + default: + throw new Error("moveType is not correct!"); + } + }; + + __proto.setAxesInstance = function () { + var state = this.state; + var options = this.options; + var scrollArea = state.scrollArea; + this.axes = new Axes({ + flick: { + range: [scrollArea.prev, scrollArea.next], + circular: options.circular, + bounce: [0, 0] + } + }, { + easing: options.panelEffect, + deceleration: options.deceleration, + interruptable: true + }); + this.createPanInput(); + }; + + __proto.refreshPanels = function () { + var _this = this; + + var panelManager = this.panelManager; // Panel elements were attached to camera element by Flicking class + + var panelElements = this.cameraElement.children; // Initialize panels + + var panels = toArray$3(panelElements).map(function (el, idx) { + return new Panel(el, idx, _this); + }); + panelManager.replacePanels(panels, []); + this.visiblePanels = panels.filter(function (panel) { + return Boolean(panel); + }); + }; + + __proto.setDefaultPanel = function () { + var options = this.options; + var panelManager = this.panelManager; + var indexRange = this.panelManager.getRange(); + var index = clamp(options.defaultIndex, indexRange.min, indexRange.max); + this.currentPanel = panelManager.get(index); + }; + + __proto.clonePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var gap = options.gap; + var viewportSize = state.size; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); // There're no panels exist + + if (!firstPanel) { + return; + } // For each panels, clone itself while last panel's position + size is below viewport size + + + var panels = panelManager.originalPanels(); + var reversedPanels = panels.concat().reverse(); + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap; + var relativeAnchorPosition = firstPanel.getRelativeAnchorPosition(); + var relativeHangerPosition = this.getRelativeHangerPosition(); + var areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize; + var sizeSum = 0; + var panelAtLeftBoundary; + + for (var _i = 0, reversedPanels_1 = reversedPanels; _i < reversedPanels_1.length; _i++) { + var panel = reversedPanels_1[_i]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaPrev) { + panelAtLeftBoundary = panel; + break; + } + } + + var areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize; + sizeSum = 0; + var panelAtRightBoundary; + + for (var _a = 0, panels_1 = panels; _a < panels_1.length; _a++) { + var panel = panels_1[_a]; + + if (!panel) { + continue; + } + + sizeSum += panel.getSize() + gap; + + if (sizeSum >= areaNext) { + panelAtRightBoundary = panel; + break; + } + } // Need one more set of clones on prev area of original panel 0 + + + var needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0 && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex(); // Visible count of panel 0 on first screen + + var panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize) + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize) - 1; // duplication + + var cloneCount = panel0OnFirstscreen + (needCloneOnPrev ? 1 : 0); + var prevCloneCount = panelManager.getCloneCount(); + panelManager.setCloneCount(cloneCount); + + if (options.renderExternal) { + return; + } + + if (cloneCount > prevCloneCount) { + var _loop_1 = function (cloneIndex) { + var _a; + + var clones = panels.map(function (origPanel) { + return origPanel.clone(cloneIndex); + }); + var fragment = document.createDocumentFragment(); + clones.forEach(function (panel) { + return fragment.appendChild(panel.getElement()); + }); + this_1.cameraElement.appendChild(fragment); + + (_a = this_1.visiblePanels).push.apply(_a, clones.filter(function (clone) { + return Boolean(clone); + })); + + panelManager.insertClones(cloneIndex, 0, clones); + }; + + var this_1 = this; // should clone more + + for (var cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) { + _loop_1(cloneIndex); + } + } else if (cloneCount < prevCloneCount) { + // should remove some + panelManager.removeClonesAfter(cloneCount); + } + }; + + __proto.moveToDefaultPanel = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var indexRange = this.panelManager.getRange(); + var defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max); + var defaultPanel = panelManager.get(defaultIndex); + var defaultPosition = 0; + + if (defaultPanel) { + defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition; + defaultPosition = this.canSetBoundMode() ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next) : defaultPosition; + } + + this.moveCamera(defaultPosition); + this.axes.setTo({ + flick: defaultPosition + }, 0); + }; + + __proto.updateSize = function () { + var state = this.state; + var options = this.options; + var panels = this.panelManager.originalPanels().filter(function (panel) { + return Boolean(panel); + }); + var bbox = this.updateBbox(); + var prevSize = state.size; // Update size & hanger position + + state.size = options.horizontal ? bbox.width : bbox.height; + + if (prevSize !== state.size) { + state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size); + state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size); + } + + if (panels.length <= 0) { + return; + } + + this.resizePanels(panels); + }; + + __proto.updateOriginalPanelPositions = function () { + var gap = this.options.gap; + var panelManager = this.panelManager; + var firstPanel = panelManager.firstPanel(); + var panels = panelManager.originalPanels(); + + if (!firstPanel) { + return; + } + + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + var scrollArea = this.state.scrollArea; // Update panel position && fit to wrapper + + var nextPanelPos = firstPanel.getPosition(); + var maintainingPanel = firstPanel; + + if (nearestPanel) { + // We should maintain nearestPanel's position + var looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next); + maintainingPanel = looped ? currentPanel : nearestPanel; + } else if (firstPanel.getIndex() > 0) { + maintainingPanel = currentPanel; + } + + var panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length); + var accumulatedSize = panelsBeforeMaintainPanel.reduce(function (total, panel) { + return total + panel.getSize() + gap; + }, 0); + nextPanelPos = maintainingPanel.getPosition() - accumulatedSize; + panels.forEach(function (panel) { + var newPosition = nextPanelPos; + var panelSize = panel.getSize(); + panel.setPosition(newPosition); + nextPanelPos += panelSize + gap; + }); + + if (!this.options.renderOnlyVisible) { + panels.forEach(function (panel) { + return panel.setPositionCSS(); + }); + } + }; + + __proto.updateClonedPanelPositions = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var clonedPanels = panelManager.clonedPanels().reduce(function (allClones, clones) { + return __spreadArrays(allClones, clones); + }, []).filter(function (panel) { + return Boolean(panel); + }); + var scrollArea = state.scrollArea; + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + + if (!firstPanel) { + return; + } + + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Locate all cloned panels linearly first + + for (var _i = 0, clonedPanels_1 = clonedPanels; _i < clonedPanels_1.length; _i++) { + var panel = clonedPanels_1[_i]; + var origPanel = panel.getOriginalPanel(); + var cloneIndex = panel.getCloneIndex(); + var cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1); + var clonedPanelPos = cloneBasePos + origPanel.getPosition(); + panel.setPosition(clonedPanelPos); + } + + var lastReplacePosition = firstPanel.getPosition(); // reverse() pollutes original array, so copy it with concat() + + for (var _a = 0, _b = clonedPanels.concat().reverse(); _a < _b.length; _a++) { + var panel = _b[_a]; + var panelSize = panel.getSize(); + var replacePosition = lastReplacePosition - panelSize - options.gap; + + if (replacePosition + panelSize <= scrollArea.prev) { + // Replace is not meaningful, as it won't be seen in current scroll area + break; + } + + panel.setPosition(replacePosition); + lastReplacePosition = replacePosition; + } + + if (!this.options.renderOnlyVisible) { + clonedPanels.forEach(function (panel) { + panel.setPositionCSS(); + }); + } + }; + + __proto.updateVisiblePanelPositions = function () { + var _this = this; + + if (this.options.renderOnlyVisible) { + this.visiblePanels.forEach(function (panel) { + panel.setPositionCSS(_this.state.positionOffset); + }); + } + }; + + __proto.updateScrollArea = function () { + var state = this.state; + var panelManager = this.panelManager; + var options = this.options; + var axes = this.axes; // Set viewport scrollable area + + var firstPanel = panelManager.firstPanel(); + var lastPanel = panelManager.lastPanel(); + var relativeHangerPosition = state.relativeHangerPosition; + + if (!firstPanel) { + state.scrollArea = { + prev: 0, + next: 0 + }; + } else if (this.canSetBoundMode()) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition(); + + if (sumOriginalPanelSize >= state.size) { + state.scrollArea = { + prev: firstPanel.getPosition(), + next: lastPanel.getPosition() + lastPanel.getSize() - state.size + }; + } else { + // Find anchor position of set of the combined panels + var relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize); + var anchorPos = firstPanel.getPosition() + clamp(relAnchorPosOfCombined, sumOriginalPanelSize - (state.size - relativeHangerPosition), relativeHangerPosition); + state.scrollArea = { + prev: anchorPos - relativeHangerPosition, + next: anchorPos - relativeHangerPosition + }; + } + } else if (options.circular) { + var sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap; // Maximum scroll extends to first clone sequence's first panel + + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition + }; + } else { + state.scrollArea = { + prev: firstPanel.getAnchorPosition() - relativeHangerPosition, + next: lastPanel.getAnchorPosition() - relativeHangerPosition + }; + } + + var viewportSize = state.size; + var bounce = options.bounce; + var parsedBounce; + + if (isArray(bounce)) { + parsedBounce = bounce.map(function (val) { + return parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce); + }); + } else { + var parsedVal = parseArithmeticExpression(bounce, viewportSize, DEFAULT_OPTIONS.bounce); + parsedBounce = [parsedVal, parsedVal]; + } // Update axes range and bounce + + + var flick = axes.axis.flick; + flick.range = [state.scrollArea.prev, state.scrollArea.next]; + flick.bounce = parsedBounce; + }; + + __proto.checkNeedPanel = function (axesEvent) { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentPanel = this.currentPanel; + var nearestPanel = this.nearestPanel; + var currentState = this.stateMachine.getState(); + + if (!options.infinite) { + return; + } + + var gap = options.gap; + var infiniteThreshold = state.infiniteThreshold; + var maxLastIndex = panelManager.getLastIndex(); + + if (maxLastIndex < 0) { + return; + } + + if (!currentPanel || !nearestPanel) { + // There're no panels + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: null, + direction: null, + indexRange: { + min: 0, + max: maxLastIndex, + length: maxLastIndex + 1 + } + }); + return; + } + + var originalNearestPosition = nearestPanel.getPosition(); // Check next direction + + var checkingPanel = !currentState.holding && !currentState.playing ? currentPanel : nearestPanel; + + while (checkingPanel) { + var currentIndex = checkingPanel.getIndex(); + var nextSibling = checkingPanel.nextSibling; + var lastPanel = panelManager.lastPanel(); + var atLastPanel = currentIndex === lastPanel.getIndex(); + var nextIndex = !atLastPanel && nextSibling ? nextSibling.getIndex() : maxLastIndex + 1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition); + var cameraNext = state.position + state.size; // There're empty panels between + + var emptyPanelExistsBetween = nextIndex - currentIndex > 1; // Expected prev panel's left position is smaller than camera position + + var overThreshold = panelRight + gap - infiniteThreshold <= cameraNext; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: currentIndex + 1, + max: nextIndex - 1, + length: nextIndex - currentIndex - 1 + } + }); + } // Trigger needPanel in circular & at max panel index + + + if (options.circular && currentIndex === maxLastIndex && overThreshold) { + var firstPanel = panelManager.firstPanel(); + var firstIndex = firstPanel ? firstPanel.getIndex() : -1; + + if (firstIndex > 0) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.NEXT, + indexRange: { + min: 0, + max: firstIndex - 1, + length: firstIndex + } + }); + } + } // Check whether panels are changed + + + var lastPanelAfterNeed = panelManager.lastPanel(); + var atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex(); + + if (atLastPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.nextSibling; + } // Check prev direction + + + checkingPanel = nearestPanel; + + while (checkingPanel) { + var cameraPrev = state.position; + var checkingIndex = checkingPanel.getIndex(); + var prevSibling = checkingPanel.prevSibling; + var firstPanel = panelManager.firstPanel(); + var atFirstPanel = checkingIndex === firstPanel.getIndex(); + var prevIndex = !atFirstPanel && prevSibling ? prevSibling.getIndex() : -1; + var currentNearestPosition = nearestPanel.getPosition(); + var panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition); // There're empty panels between + + var emptyPanelExistsBetween = checkingIndex - prevIndex > 1; // Expected prev panel's right position is smaller than camera position + + var overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev; + + if (emptyPanelExistsBetween && overThreshold) { + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: prevIndex + 1, + max: checkingIndex - 1, + length: checkingIndex - prevIndex - 1 + } + }); + } // Trigger needPanel in circular & at panel 0 + + + if (options.circular && checkingIndex === 0 && overThreshold) { + var lastPanel = panelManager.lastPanel(); + + if (lastPanel && lastPanel.getIndex() < maxLastIndex) { + var lastIndex = lastPanel.getIndex(); + this.triggerNeedPanel({ + axesEvent: axesEvent, + siblingPanel: checkingPanel, + direction: DIRECTION.PREV, + indexRange: { + min: lastIndex + 1, + max: maxLastIndex, + length: maxLastIndex - lastIndex + } + }); + } + } // Check whether panels were changed + + + var firstPanelAfterNeed = panelManager.firstPanel(); + var atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex(); // Looped in circular mode + + if (atFirstPanelAfterNeed || !overThreshold) { + break; + } + + checkingPanel = checkingPanel.prevSibling; + } + }; + + __proto.triggerNeedPanel = function (params) { + var _this = this; + + var axesEvent = params.axesEvent, + siblingPanel = params.siblingPanel, + direction = params.direction, + indexRange = params.indexRange; + var options = this.options; + var checkedIndexes = this.state.checkedIndexes; + var alreadyTriggered = checkedIndexes.some(function (_a) { + var min = _a[0], + max = _a[1]; + return min === indexRange.min || max === indexRange.max; + }); + var hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL); + + if (alreadyTriggered || !hasHandler) { + return; + } // Should done before triggering event, as we can directly add panels by event callback + + + checkedIndexes.push([indexRange.min, indexRange.max]); + var index = siblingPanel ? siblingPanel.getIndex() : 0; + var isTrusted = axesEvent ? axesEvent.isTrusted : false; + this.triggerEvent(EVENTS.NEED_PANEL, axesEvent, isTrusted, { + index: index, + panel: siblingPanel, + direction: direction, + range: indexRange, + fill: function (element) { + var panelManager = _this.panelManager; + + if (!siblingPanel) { + return _this.insert(panelManager.getRange().max + 1, element); + } + + var parsedElements = parseElement(element); // Slice elements to fit size equal to empty spaces + + var elements = direction === DIRECTION.NEXT ? parsedElements.slice(0, indexRange.length) : parsedElements.slice(-indexRange.length); + + if (direction === DIRECTION.NEXT) { + if (options.circular && index === panelManager.getLastIndex()) { + // needPanel event is triggered on last index, insert at index 0 + return _this.insert(0, elements); + } else { + return siblingPanel.insertAfter(elements); + } + } else if (direction === DIRECTION.PREV) { + if (options.circular && index === 0) { + // needPanel event is triggered on first index(0), insert at the last index + return _this.insert(indexRange.max - elements.length + 1, elements); + } else { + return siblingPanel.insertBefore(elements); + } + } else { + // direction is null when there're no panels exist + return _this.insert(0, elements); + } + } + }); + }; + + __proto.updateVisiblePanels = function () { + var state = this.state; + var options = this.options; + var panelManager = this.panelManager; + var currentState = this.stateMachine.getState(); + var cameraElement = this.cameraElement; + var renderExternal = options.renderExternal, + renderOnlyVisible = options.renderOnlyVisible; + + if (!renderOnlyVisible) { + return; + } + + if (!this.nearestPanel) { + this.visiblePanels = []; + + while (cameraElement.firstChild) { + cameraElement.removeChild(cameraElement.firstChild); + } + + return; + } + + var prevVisiblePanels = this.visiblePanels; + var newVisiblePanels = this.calcVisiblePanels(); + + var _a = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels), + addedPanels = _a.addedPanels, + removedPanels = _a.removedPanels; + + if (addedPanels.length <= 0 && removedPanels.length <= 0) { + // Visible panels not changed + return; + } + + if (currentState.holding) { + newVisiblePanels.push.apply(newVisiblePanels, removedPanels); + } else { + var firstVisiblePanelPos = newVisiblePanels[0].getPosition(); + state.positionOffset = firstVisiblePanelPos; + } + + newVisiblePanels.forEach(function (panel) { + panel.setPositionCSS(state.positionOffset); + }); + + if (!renderExternal) { + if (!currentState.holding) { + removedPanels.forEach(function (panel) { + var panelElement = panel.getElement(); + panelElement.parentNode && cameraElement.removeChild(panelElement); + }); + } + + var fragment_1 = document.createDocumentFragment(); + addedPanels.forEach(function (panel) { + fragment_1.appendChild(panel.getElement()); + }); + cameraElement.appendChild(fragment_1); + } + + var firstVisiblePanel = newVisiblePanels[0]; + var lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1]; + + var getAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount(); + }; + + var newVisibleRange = { + min: getAbsIndex(firstVisiblePanel), + max: getAbsIndex(lastVisiblePanel) + }; + this.visiblePanels = newVisiblePanels; + this.flicking.trigger(EVENTS.VISIBLE_CHANGE, { + type: EVENTS.VISIBLE_CHANGE, + range: newVisibleRange + }); + }; + + __proto.checkVisiblePanelChange = function (prevVisiblePanels, newVisiblePanels) { + var prevRefCount = prevVisiblePanels.map(function () { + return 0; + }); + var newRefCount = newVisiblePanels.map(function () { + return 0; + }); + prevVisiblePanels.forEach(function (prevPanel, prevIndex) { + newVisiblePanels.forEach(function (newPanel, newIndex) { + if (prevPanel === newPanel) { + prevRefCount[prevIndex]++; + newRefCount[newIndex]++; + } + }); + }); + var removedPanels = prevRefCount.reduce(function (removed, count, index) { + return count === 0 ? __spreadArrays(removed, [prevVisiblePanels[index]]) : removed; + }, []); + var addedPanels = newRefCount.reduce(function (added, count, index) { + return count === 0 ? __spreadArrays(added, [newVisiblePanels[index]]) : added; + }, []); + return { + removedPanels: removedPanels, + addedPanels: addedPanels + }; + }; + + __proto.resizePanels = function (panels) { + var options = this.options; + var panelBboxes = this.panelBboxes; + + if (options.isEqualSize === true) { + if (!panelBboxes.default) { + var defaultPanel = panels[0]; + panelBboxes.default = defaultPanel.getBbox(); + } + + var defaultBbox_1 = panelBboxes.default; + panels.forEach(function (panel) { + panel.resize(defaultBbox_1); + }); + return; + } else if (options.isEqualSize) { + var equalSizeClasses_2 = options.isEqualSize; + panels.forEach(function (panel) { + var overlappedClass = panel.getOverlappedClass(equalSizeClasses_2); + + if (overlappedClass) { + panel.resize(panelBboxes[overlappedClass]); + panelBboxes[overlappedClass] = panel.getBbox(); + } else { + panel.resize(); + } + }); + return; + } + + panels.forEach(function (panel) { + panel.resize(); + }); + }; + + __proto.createPanInput = function () { + var options = this.options; + this.panInput = new PanInput(this.viewportElement, { + inputType: options.inputType, + thresholdAngle: options.thresholdAngle, + iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold, + scale: options.horizontal ? [-1, 0] : [0, -1] + }); + this.axes.connect(options.horizontal ? ["flick", ""] : ["", "flick"], this.panInput); + }; + + return Viewport; + }(); + + /** + * Copyright (c) 2015 NAVER Corp. + * egjs projects are licensed under the MIT license + */ + /** + * @memberof eg + * @extends eg.Component + * @support {"ie": "10+", "ch" : "latest", "ff" : "latest", "sf" : "latest" , "edge" : "latest", "ios" : "7+", "an" : "4.X+"} + * @requires {@link https://github.com/naver/egjs-component|eg.Component} + * @requires {@link https://github.com/naver/egjs-axes|eg.Axes} + * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/} + */ + + var Flicking = + /*#__PURE__*/ + function (_super) { + __extends(Flicking, _super); + /** + * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다. + * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체 + * @param {string} [options.classPrefix="eg-flick"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사. + * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다. + * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향) + * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다. + * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다. + * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리. + * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
+ * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다. + * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다. + * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수. + * @param {string[]} [options.inputType=["touch,"mouse"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고}) + * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
+ * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, "10px", "20%")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, "10px", "20%")
+ * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부. + * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부. + * @param {number|""} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값. + * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다. + * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다. + * @param {string} [options.hanger="50%"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {string} [options.anchor="50%"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) "50", "100px", "0%", "25% + 100px"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) "50", "100px", "0%", "25% + 100px"
+ * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px) + * @param {eg.Flicking.MoveTypeOption} [options.moveType="snap"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll) + * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
+ * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다. + * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
+ * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다. + * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다. + * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
+ * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다. + */ + + + function Flicking(element, options) { + if (options === void 0) { + options = {}; + } + + var _this = _super.call(this) || this; + + _this.contentsReadyChecker = null; + _this.isPanelChangedAtBeforeSync = false; + /** + * Update panels to current state. + * @ko 패널들을 현재 상태에 맞춰 갱신한다. + * @method + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + _this.resize = function () { + var viewport = _this.viewport; + var options = _this.options; + + var wrapper = _this.getElement(); + + var allPanels = viewport.panelManager.allPanels(); + + if (!options.isConstantSize) { + allPanels.forEach(function (panel) { + return panel.unCacheBbox(); + }); + } + + var shouldResetElements = options.renderOnlyVisible && !options.isConstantSize && options.isEqualSize !== true; // Temporarily set parent's height to prevent scroll (#333) + + var parent = wrapper.parentElement; + var origStyle = parent.style.height; + parent.style.height = parent.offsetHeight + "px"; + viewport.unCacheBbox(); // This should be done before adding panels, to lower performance issue + + viewport.updateBbox(); + + if (shouldResetElements) { + viewport.appendUncachedPanelElements(allPanels); + } + + viewport.resize(); + parent.style.height = origStyle; + return _this; + }; + + _this.triggerEvent = function (eventName, // visibleChange event has no common event definition from other events + axesEvent, isTrusted, params) { + if (params === void 0) { + params = {}; + } + + var viewport = _this.viewport; + var canceled = true; // Ignore events before viewport is initialized + + if (viewport) { + var state = viewport.stateMachine.getState(); + + var _a = viewport.getScrollArea(), + prev = _a.prev, + next = _a.next; + + var pos = viewport.getCameraPosition(); + var progress = getProgress(pos, [prev, prev, next]); + + if (_this.options.circular) { + progress %= 1; + } + + canceled = !_super.prototype.trigger.call(_this, eventName, merge({ + type: eventName, + index: _this.getIndex(), + panel: _this.getCurrentPanel(), + direction: state.direction, + holding: state.holding, + progress: progress, + axesEvent: axesEvent, + isTrusted: isTrusted + }, params)); + } + + return { + onSuccess: function (callback) { + if (!canceled) { + callback(); + } + + return this; + }, + onStopped: function (callback) { + if (canceled) { + callback(); + } + + return this; + } + }; + }; // Return result of "move" event triggered + + + _this.moveCamera = function (axesEvent) { + var viewport = _this.viewport; + var state = viewport.stateMachine.getState(); + var options = _this.options; + var pos = axesEvent.pos.flick; + var previousPosition = viewport.getCameraPosition(); + + if (axesEvent.isTrusted && state.holding) { + var inputOffset = options.horizontal ? axesEvent.inputEvent.offsetX : axesEvent.inputEvent.offsetY; + var isNextDirection = inputOffset < 0; + var cameraChange = pos - previousPosition; + var looped = isNextDirection === pos < previousPosition; + + if (options.circular && looped) { + // Reached at max/min range of axes + var scrollAreaSize = viewport.getScrollAreaSize(); + cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange)); + } + + var currentDirection = cameraChange === 0 ? state.direction : cameraChange > 0 ? DIRECTION.NEXT : DIRECTION.PREV; + state.direction = currentDirection; + } + + state.delta += axesEvent.delta.flick; + viewport.moveCamera(pos, axesEvent); + return _this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted).onStopped(function () { + // Undo camera movement + viewport.moveCamera(previousPosition, axesEvent); + }); + }; // Set flicking wrapper user provided + + + var wrapper; + + if (isString(element)) { + wrapper = document.querySelector(element); + + if (!wrapper) { + throw new Error("Base element doesn't exist."); + } + } else if (element.nodeName && element.nodeType === 1) { + wrapper = element; + } else { + throw new Error("Element should be provided in string or HTMLElement."); + } + + _this.wrapper = wrapper; // Override default options + + _this.options = merge({}, DEFAULT_OPTIONS, options); // Override moveType option + + var currentOptions = _this.options; + var moveType = currentOptions.moveType; + + if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) { + currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType]; + } // Make viewport instance with panel container element + + + _this.viewport = new Viewport(_this, _this.options, _this.triggerEvent); + + _this.listenInput(); + + _this.listenResize(); + + return _this; // if (this.options.collectStatistics) { + // sendEvent( + // "usage", + // "options", + // options, + // ); + // } + } + /** + * Move to the previous panel if it exists. + * @ko 이전 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + var __proto = Flicking.prototype; + + __proto.prev = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var prevPanel = currentPanel.prev(); + + if (prevPanel) { + prevPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the next panel if it exists. + * @ko 다음 패널이 존재시 해당 패널로 이동한다. + * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.next = function (duration) { + var currentPanel = this.getCurrentPanel(); + var currentState = this.viewport.stateMachine.getState(); + + if (currentPanel && currentState.type === STATE_TYPE.IDLE) { + var nextPanel = currentPanel.next(); + + if (nextPanel) { + nextPanel.focus(duration); + } + } + + return this; + }; + /** + * Move to the panel of given index. + * @ko 주어진 인덱스에 해당하는 패널로 이동한다. + * @param index The index number of the panel to move.이동할 패널의 인덱스 번호. + * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms) + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.moveTo = function (index, duration) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + var state = viewport.stateMachine.getState(); + + if (!panel || state.type !== STATE_TYPE.IDLE) { + return this; + } + + var anchorPosition = panel.getAnchorPosition(); + var hangerPosition = viewport.getHangerPosition(); + var targetPanel = panel; + + if (this.options.circular) { + var scrollAreaSize = viewport.getScrollAreaSize(); // Check all three possible locations, find the nearest position among them. + + var possiblePositions = [anchorPosition - scrollAreaSize, anchorPosition, anchorPosition + scrollAreaSize]; + var nearestPosition = possiblePositions.reduce(function (nearest, current) { + return Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition) ? current : nearest; + }, Infinity) - panel.getRelativeAnchorPosition(); + var identicals = panel.getIdenticalPanels(); + var offset = nearestPosition - anchorPosition; + + if (offset > 0) { + // First cloned panel is nearest + targetPanel = identicals[1]; + } else if (offset < 0) { + // Last cloned panel is nearest + targetPanel = identicals[identicals.length - 1]; + } + + targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true); + targetPanel.setPosition(nearestPosition); + } + + var currentIndex = this.getIndex(); + + if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) { + return this; + } + + var eventType = panel.getIndex() === viewport.getCurrentIndex() ? "" : EVENTS.CHANGE; + viewport.moveTo(targetPanel, viewport.findEstimatedPosition(targetPanel), eventType, null, duration); + return this; + }; + /** + * Return index of the current panel. `-1` if no panel exists. + * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다. + * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수. + */ + + + __proto.getIndex = function () { + return this.viewport.getCurrentIndex(); + }; + /** + * Return the wrapper element user provided in constructor. + * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다. + * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트. + */ + + + __proto.getElement = function () { + return this.wrapper; + }; + /** + * Return the viewport element's size. + * @ko 뷰포트 엘리먼트의 크기를 반환한다. + * @return Width if horizontal: true, height if horizontal: false + */ + + + __proto.getSize = function () { + return this.viewport.getSize(); + }; + /** + * Return current panel. `null` if no panel exists. + * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다. + * @return Current panel.현재 패널. + */ + + + __proto.getCurrentPanel = function () { + var viewport = this.viewport; + var panel = viewport.getCurrentPanel(); + return panel ? panel : null; + }; + /** + * Return the panel of given index. `null` if it doesn't exists. + * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다. + * @return Panel of given index.주어진 인덱스에 해당하는 패널. + */ + + + __proto.getPanel = function (index) { + var viewport = this.viewport; + var panel = viewport.panelManager.get(index); + return panel ? panel : null; + }; + /** + * Return all panels. + * @ko 모든 패널들을 반환한다. + * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부. + * @return All panels.모든 패널들. + */ + + + __proto.getAllPanels = function (includeClone) { + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var panels = includeClone ? panelManager.allPanels() : panelManager.originalPanels(); + return panels.filter(function (panel) { + return !!panel; + }); + }; + /** + * Return the panels currently shown in viewport area. + * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다. + * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들 + */ + + + __proto.getVisiblePanels = function () { + return this.viewport.calcVisiblePanels(); + }; + /** + * Return length of original panels. + * @ko 원본 패널의 개수를 반환한다. + * @return Length of original panels.원본 패널의 개수 + */ + + + __proto.getPanelCount = function () { + return this.viewport.panelManager.getPanelCount(); + }; + /** + * Return how many groups of clones are created. + * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다. + * @return Length of cloned panel groups.클론된 패널 그룹의 개수 + */ + + + __proto.getCloneCount = function () { + return this.viewport.panelManager.getCloneCount(); + }; + /** + * Get maximum panel index for `infinite` mode. + * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다. + * @see {@link eg.Flicking.FlickingOptions} + * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스. + */ + + + __proto.getLastIndex = function () { + return this.viewport.panelManager.getLastIndex(); + }; + /** + * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it. + * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다. + * @param - Maximum panel index. + * @see {@link eg.Flicking.FlickingOptions} + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.setLastIndex = function (index) { + this.viewport.setLastIndex(index); + return this; + }; + /** + * Return panel movement animation. + * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다. + * @return Is animating or not.애니메이션 진행 여부. + */ + + + __proto.isPlaying = function () { + return this.viewport.stateMachine.getState().playing; + }; + /** + * Unblock input devices. + * @ko 막았던 입력 장치로부터의 입력을 푼다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.enableInput = function () { + this.viewport.enable(); + return this; + }; + /** + * Block input devices. + * @ko 입력 장치로부터의 입력을 막는다. + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.disableInput = function () { + this.viewport.disable(); + return this; + }; + /** + * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}. + * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다. + * @return An object with current status value information.현재 상태값 정보를 가진 객체. + */ + + + __proto.getStatus = function () { + var viewport = this.viewport; + var panels = viewport.panelManager.originalPanels().filter(function (panel) { + return !!panel; + }).map(function (panel) { + return { + html: panel.getElement().outerHTML, + index: panel.getIndex() + }; + }); + return { + index: viewport.getCurrentIndex(), + panels: panels, + position: viewport.getCameraPosition() + }; + }; + /** + * Restore to the state of the `status`. + * @ko `status`의 상태로 복원한다. + * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다. + */ + + + __proto.setStatus = function (status) { + this.viewport.restore(status); + }; + /** + * Add plugins that can have different effects on Flicking. + * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다. + * @param - The plugin(s) to add.추가할 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.addPlugins = function (plugins) { + this.viewport.addPlugins(plugins); + return this; + }; + /** + * Remove plugins from Flicking. + * @ko 플리킹으로부터 플러그인들을 제거한다. + * @param - The plugin(s) to remove.제거 플러그인(들). + * @return {eg.Flicking} The instance itself.인스턴스 자기 자신. + */ + + + __proto.removePlugins = function (plugins) { + this.viewport.removePlugins(plugins); + return this; + }; + /** + * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes). + * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다. + * @example + * const flick = new eg.Flicking("#flick"); + * flick.destroy(); + * console.log(flick.moveTo); // null + */ + + + __proto.destroy = function (option) { + var _a; + + if (option === void 0) { + option = {}; + } + + this.off(); + + if (this.options.autoResize) { + window.removeEventListener("resize", this.resize); + } + + this.viewport.destroy(option); + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.destroy(); // release resources + + for (var x in this) { + this[x] = null; + } + }; + /** + * Add new panels at the beginning of panels. + * @ko 제일 앞에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.replace(3, document.createElement("div")); // Add new panel at index 3 + * flicking.prepend("\Panel\"); // Prepended at index 2 + * flicking.prepend(["\Panel\", document.createElement("div")]); // Prepended at index 0, 1 + * flicking.prepend("\Panel\"); // Prepended at index 0, pushing every panels behind it. + */ + + + __proto.prepend = function (element) { + var viewport = this.viewport; + var parsedElements = parseElement(element); + var insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0); + var prependedPanels = viewport.insert(insertingIndex, parsedElements); + this.checkContentsReady(prependedPanels); + return prependedPanels; + }; + /** + * Add new panels at the end of panels. + * @ko 제일 끝에 새로운 패널을 추가한다. + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of appended panels.추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * flicking.append(document.createElement("div")); // Appended at index 0 + * flicking.append("\Panel\"); // Appended at index 1 + * flicking.append(["\Panel\", document.createElement("div")]); // Appended at index 2, 3 + * // Even this is possible + * flicking.append("\Panel 1\\Panel 2\"); // Appended at index 4, 5 + */ + + + __proto.append = function (element) { + var viewport = this.viewport; + var appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element); + this.checkContentsReady(appendedPanels); + return appendedPanels; + }; + /** + * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index. + * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다. + * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스 + * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
+ * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열 + * @example + * // Suppose there were no panels at initialization + * const flicking = new eg.Flicking("#flick"); + * + * // This will add new panel at index 3, + * // Index 0, 1, 2 is empty at this moment. + * // [empty, empty, empty, PANEL] + * flicking.replace(3, document.createElement("div")); + * + * // As index 2 was empty, this will also add new panel at index 2. + * // [empty, empty, PANEL, PANEL] + * flicking.replace(2, "\Panel\"); + * + * // Index 3 was not empty, so it will replace previous one. + * // It will also add new panels at index 4 and 5. + * // before - [empty, empty, PANEL, PANEL] + * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL] + * flicking.replace(3, ["\Panel\", "\Panel\", "\Panel\"]) + */ + + + __proto.replace = function (index, element) { + var replacedPanels = this.viewport.replace(index, element); + this.checkContentsReady(replacedPanels); + return replacedPanels; + }; + /** + * Remove panel at target index. This will decrease index of panels behind it. + * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다. + * @param index - Index of panel to remove.제거할 패널의 인덱스 + * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수. + * @return Array of removed panels제거된 패널들의 배열 + */ + + + __proto.remove = function (index, deleteCount) { + if (deleteCount === void 0) { + deleteCount = 1; + } + + return this.viewport.remove(index, deleteCount); + }; + /** + * Get indexes to render. Should be used with `renderOnlyVisible` option. + * `beforeSync` should be called before this method for a correct result. + * @private + * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다. + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @return Array of indexes to render.렌더링할 인덱스의 배열 + */ + + + __proto.getRenderingIndexes = function (diffResult) { + var viewport = this.viewport; + var visiblePanels = viewport.getVisiblePanels(); + var maintained = diffResult.maintained.reduce(function (values, _a) { + var before = _a[0], + after = _a[1]; + values[after] = before; + return values; + }, {}); + var panelCount = diffResult.list.length; + var added = diffResult.added; + + var getPanelAbsIndex = function (panel) { + return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount; + }; + + var visibleIndexes = visiblePanels.map(function (panel) { + return getPanelAbsIndex(panel); + }).filter(function (val) { + return maintained[val % panelCount] != null; + }); + + var renderingPanels = __spreadArrays(visibleIndexes, added); + + var allPanels = viewport.panelManager.allPanels(); + viewport.setVisiblePanels(renderingPanels.map(function (index) { + return allPanels[index]; + })); + return renderingPanels; + }; + /** + * Synchronize info of panels instance with info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다. + * @private + * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트. + * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 + */ + + + __proto.beforeSync = function (diffInfo) { + var _this = this; + + var maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; + var viewport = this.viewport; + var panelManager = viewport.panelManager; + var isCircular = this.options.circular; + var cloneCount = panelManager.getCloneCount(); + var prevClonedPanels = panelManager.clonedPanels(); // Update visible panels + + var newVisiblePanels = viewport.getVisiblePanels().filter(function (panel) { + return findIndex(removed, function (index) { + return index === panel.getIndex(); + }) < 0; + }); + viewport.setVisiblePanels(newVisiblePanels); // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0 && cloneCount === prevClonedPanels.length) { + return this; + } + + var prevOriginalPanels = panelManager.originalPanels(); + var newPanels = []; + var newClones = counter(cloneCount).map(function () { + return []; + }); + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newPanels[afterIdx] = prevOriginalPanels[beforeIdx]; + newPanels[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + newPanels[addIndex] = new Panel(null, addIndex, _this.viewport); + }); + + if (isCircular) { + counter(cloneCount).forEach(function (groupIndex) { + var prevCloneGroup = prevClonedPanels[groupIndex]; + var newCloneGroup = newClones[groupIndex]; + maintained.forEach(function (_a) { + var beforeIdx = _a[0], + afterIdx = _a[1]; + newCloneGroup[afterIdx] = prevCloneGroup ? prevCloneGroup[beforeIdx] : newPanels[afterIdx].clone(groupIndex, false); + newCloneGroup[afterIdx].setIndex(afterIdx); + }); + added.forEach(function (addIndex) { + var newPanel = newPanels[addIndex]; + newCloneGroup[addIndex] = newPanel.clone(groupIndex, false); + }); + }); + } + + added.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index, + max: index + }); + }); + removed.forEach(function (index) { + viewport.updateCheckedIndexes({ + min: index - 1, + max: index + 1 + }); + }); + var checkedIndexes = viewport.getCheckedIndexes(); + checkedIndexes.forEach(function (_a, idx) { + var min = _a[0], + max = _a[1]; // Push checked indexes backward + + var pushedIndex = added.filter(function (index) { + return index < min && panelManager.has(index); + }).length - removed.filter(function (index) { + return index < min; + }).length; + checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]); + }); // Only effective only when there are least one panel which have changed its index + + if (changed.length > 0) { + // Removed checked index by changed ones after pushing + maintained.forEach(function (_a) { + var next = _a[1]; + viewport.updateCheckedIndexes({ + min: next, + max: next + }); + }); + } + + panelManager.replacePanels(newPanels, newClones); + this.isPanelChangedAtBeforeSync = true; + }; + /** + * Synchronize info of panels with DOM info given by external rendering. + * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다. + * @private + * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트. + */ + + + __proto.sync = function (diffInfo) { + var list = diffInfo.list, + maintained = diffInfo.maintained, + added = diffInfo.added, + changed = diffInfo.changed, + removed = diffInfo.removed; // Did not changed at all + + if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) { + return this; + } + + var viewport = this.viewport; + var _a = this.options, + renderOnlyVisible = _a.renderOnlyVisible, + circular = _a.circular; + var panelManager = viewport.panelManager; + + if (!renderOnlyVisible) { + var indexRange = panelManager.getRange(); + var beforeDiffInfo = diffInfo; + + if (circular) { + var prevOriginalPanelCount_1 = indexRange.max; + var originalPanelCount_1 = list.length / (panelManager.getCloneCount() + 1) >> 0; + var originalAdded = added.filter(function (index) { + return index < originalPanelCount_1; + }); + var originalRemoved = removed.filter(function (index) { + return index <= prevOriginalPanelCount_1; + }); + var originalMaintained = maintained.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + var originalChanged = changed.filter(function (_a) { + var beforeIdx = _a[0]; + return beforeIdx <= prevOriginalPanelCount_1; + }); + beforeDiffInfo = { + added: originalAdded, + maintained: originalMaintained, + removed: originalRemoved, + changed: originalChanged + }; + } + + this.beforeSync(beforeDiffInfo); + } + + var visiblePanels = renderOnlyVisible ? viewport.getVisiblePanels() : this.getAllPanels(true); + added.forEach(function (addedIndex) { + var addedElement = list[addedIndex]; + var beforePanel = visiblePanels[addedIndex]; + beforePanel.setElement(addedElement); // As it can be 0 + + beforePanel.unCacheBbox(); + }); + + if (this.isPanelChangedAtBeforeSync) { + // Reset visible panels + viewport.setVisiblePanels([]); + this.isPanelChangedAtBeforeSync = false; + } + + viewport.resize(); + return this; + }; + + __proto.listenInput = function () { + var flicking = this; + var viewport = flicking.viewport; + var stateMachine = viewport.stateMachine; // Set event context + + flicking.eventContext = { + flicking: flicking, + viewport: flicking.viewport, + transitTo: stateMachine.transitTo, + triggerEvent: flicking.triggerEvent, + moveCamera: flicking.moveCamera, + stopCamera: viewport.stopCamera + }; + var handlers = {}; + + var _loop_1 = function (key) { + var eventType = AXES_EVENTS[key]; + + handlers[eventType] = function (e) { + return stateMachine.fire(eventType, e, flicking.eventContext); + }; + }; + + for (var key in AXES_EVENTS) { + _loop_1(key); + } // Connect Axes instance with PanInput + + + flicking.viewport.connectAxesHandler(handlers); + }; + + __proto.listenResize = function () { + var _this = this; + + var options = this.options; + + if (options.autoResize) { + window.addEventListener("resize", this.resize); + } + + if (options.resizeOnContentsReady) { + var contentsReadyChecker = new ImReady(); + contentsReadyChecker.on("preReady", function () { + _this.resize(); + }); + contentsReadyChecker.on("readyElement", function (e) { + if (e.hasLoading && e.isPreReadyOver) { + _this.resize(); + } + }); + contentsReadyChecker.on("error", function (e) { + _this.trigger(EVENTS.CONTENT_ERROR, { + type: EVENTS.CONTENT_ERROR, + element: e.element + }); + }); + contentsReadyChecker.check([this.wrapper]); + this.contentsReadyChecker = contentsReadyChecker; + } + }; + + __proto.checkContentsReady = function (panels) { + var _a; + + (_a = this.contentsReadyChecker) === null || _a === void 0 ? void 0 : _a.check(panels.map(function (panel) { + return panel.getElement(); + })); + }; + /** + * Version info string + * @ko 버전정보 문자열 + * @example + * eg.Flicking.VERSION; // ex) 3.0.0 + * @memberof eg.Flicking + */ + + + Flicking.VERSION = "3.7.2"; + /** + * Direction constant - "PREV" or "NEXT" + * @ko 방향 상수 - "PREV" 또는 "NEXT" + * @type {object} + * @property {"PREV"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
+ * @property {"NEXT"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
+ * @example + * eg.Flicking.DIRECTION.PREV; // "PREV" + * eg.Flicking.DIRECTION.NEXT; // "NEXT" + */ + + Flicking.DIRECTION = DIRECTION; + /** + * Event type object with event name strings. + * @ko 이벤트 이름 문자열들을 담은 객체 + * @type {object} + * @property {"holdStart"} HOLD_START - holdStart eventholdStart 이벤트 + * @property {"holdEnd"} HOLD_END - holdEnd eventholdEnd 이벤트 + * @property {"moveStart"} MOVE_START - moveStart eventmoveStart 이벤트 + * @property {"move"} MOVE - move eventmove 이벤트 + * @property {"moveEnd"} MOVE_END - moveEnd eventmoveEnd 이벤트 + * @property {"change"} CHANGE - change eventchange 이벤트 + * @property {"restore"} RESTORE - restore eventrestore 이벤트 + * @property {"select"} SELECT - select eventselect 이벤트 + * @property {"needPanel"} NEED_PANEL - needPanel eventneedPanel 이벤트 + * @example + * eg.Flicking.EVENTS.MOVE_START; // "MOVE_START" + */ + + Flicking.EVENTS = EVENTS; + return Flicking; + }(Component); + + Flicking.withFlickingMethods = withFlickingMethods; + Flicking.DEFAULT_OPTIONS = DEFAULT_OPTIONS; + Flicking.MOVE_TYPE = MOVE_TYPE; + + return Flicking; + +}))); +//# sourceMappingURL=flicking.pkgd.js.map diff --git a/dist/flicking.pkgd.js.map b/dist/flicking.pkgd.js.map new file mode 100644 index 0000000000..59735eed97 --- /dev/null +++ b/dist/flicking.pkgd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"flicking.pkgd.js","sources":["../src/consts.ts","../src/utils.ts","../src/components/Panel.ts","../src/components/PanelManager.ts","../src/states/State.ts","../src/states/IdleState.ts","../src/states/HoldingState.ts","../src/states/DraggingState.ts","../src/states/AnimatingState.ts","../src/states/DisabledState.ts","../src/components/StateMachine.ts","../src/moves/MoveType.ts","../src/moves/Snap.ts","../src/moves/FreeScroll.ts","../src/components/Viewport.ts","../src/Flicking.ts","../src/index.umd.ts"],"sourcesContent":["/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { FlickingOptions, EventType, Direction, AxesEventType, StateType, MoveTypeSnapOption, MoveTypeFreeScrollOption, FlickingMethodsKeys } from \"./types\";\n\nexport const MOVE_TYPE: {\n SNAP: \"snap\";\n FREE_SCROLL: \"freeScroll\";\n} = {\n SNAP: \"snap\",\n FREE_SCROLL: \"freeScroll\",\n};\n\nexport const DEFAULT_MOVE_TYPE_OPTIONS: {\n snap: MoveTypeSnapOption,\n freeScroll: MoveTypeFreeScrollOption,\n} = {\n snap: {\n type: \"snap\",\n count: 1,\n },\n freeScroll: {\n type: \"freeScroll\",\n },\n};\nexport const isBrowser = typeof document !== \"undefined\";\n\n/**\n * Default options for creating Flicking.\n * @ko 플리킹을 만들 때 사용하는 기본 옵션들\n * @private\n * @memberof eg.Flicking\n */\nexport const DEFAULT_OPTIONS: Readonly = {\n classPrefix: \"eg-flick\",\n deceleration: 0.0075,\n horizontal: true,\n circular: false,\n infinite: false,\n infiniteThreshold: 0,\n lastIndex: Infinity,\n threshold: 40,\n duration: 100,\n panelEffect: x => 1 - Math.pow(1 - x, 3),\n defaultIndex: 0,\n inputType: [\"touch\", \"mouse\"],\n thresholdAngle: 45,\n bounce: 10,\n autoResize: false,\n adaptive: false,\n zIndex: 2000,\n bound: false,\n overflow: false,\n hanger: \"50%\",\n anchor: \"50%\",\n gap: 0,\n moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap,\n useOffset: false,\n isEqualSize: false,\n isConstantSize: false,\n renderOnlyVisible: false,\n renderExternal: false,\n resizeOnContentsReady: false,\n iOSEdgeSwipeThreshold: 30,\n collectStatistics: true,\n};\n\nexport const DEFAULT_VIEWPORT_CSS = {\n position: \"relative\",\n zIndex: DEFAULT_OPTIONS.zIndex,\n overflow: \"hidden\",\n};\n\nexport const DEFAULT_CAMERA_CSS = {\n width: \"100%\",\n height: \"100%\",\n willChange: \"transform\",\n};\n\nexport const DEFAULT_PANEL_CSS = {\n position: \"absolute\",\n};\n\nexport const EVENTS: EventType = {\n HOLD_START: \"holdStart\",\n HOLD_END: \"holdEnd\",\n MOVE_START: \"moveStart\",\n MOVE: \"move\",\n MOVE_END: \"moveEnd\",\n CHANGE: \"change\",\n RESTORE: \"restore\",\n SELECT: \"select\",\n NEED_PANEL: \"needPanel\",\n VISIBLE_CHANGE: \"visibleChange\",\n CONTENT_ERROR: \"contentError\",\n};\n\nexport const AXES_EVENTS: AxesEventType = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\",\n};\n\nexport const STATE_TYPE: StateType = {\n IDLE: 0,\n HOLDING: 1,\n DRAGGING: 2,\n ANIMATING: 3,\n DISABLED: 4,\n};\n\nexport const DIRECTION: Direction = {\n PREV: \"PREV\",\n NEXT: \"NEXT\",\n};\nexport const FLICKING_METHODS: {[key in FlickingMethodsKeys]: true} = {\n prev: true,\n next: true,\n moveTo: true,\n getIndex: true,\n getAllPanels: true,\n getCurrentPanel: true,\n getElement: true,\n getSize: true,\n getPanel: true,\n getPanelCount: true,\n getStatus: true,\n getVisiblePanels: true,\n enableInput: true,\n disableInput: true,\n destroy: true,\n resize: true,\n setStatus: true,\n isPlaying: true,\n};\n\n// Check whether browser supports transform: translate3d\n// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\nexport let checkTranslateSupport = () => {\n const transforms = {\n webkitTransform: \"-webkit-transform\",\n msTransform: \"-ms-transform\",\n MozTransform: \"-moz-transform\",\n OTransform: \"-o-transform\",\n transform: \"transform\",\n };\n\n if (!isBrowser) {\n return {\n name: transforms.transform,\n has3d: true,\n };\n }\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform in transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new Error(\"Browser doesn't support CSS3 2D Transforms.\");\n }\n\n const el = document.createElement(\"div\");\n\n document.documentElement.insertBefore(el, null);\n\n el.style[transformName] = \"translate3d(1px, 1px, 1px)\";\n const styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]);\n\n el.parentElement!.removeChild(el);\n\n const transformInfo = {\n name: transformName,\n has3d: styleVal.length > 0 && styleVal !== \"none\",\n };\n\n checkTranslateSupport = () => transformInfo;\n\n return transformInfo;\n};\n\nexport const TRANSFORM = checkTranslateSupport();\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ElementLike, OriginalStyle, BoundingBox } from \"./types\";\nimport Flicking from \"./Flicking\";\nimport { FLICKING_METHODS } from \"./consts\";\n\nexport function merge(target: object, ...srcs: object[]): object {\n srcs.forEach(source => {\n Object.keys(source).forEach(key => {\n const value = source[key];\n target[key] = value;\n });\n });\n\n return target;\n}\n\nexport function parseElement(element: ElementLike | ElementLike[]): HTMLElement[] {\n if (!Array.isArray(element)) {\n element = [element];\n }\n\n const elements: HTMLElement[] = [];\n element.forEach(el => {\n if (isString(el)) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = el;\n\n elements.push(...toArray(tempDiv.children) as HTMLElement[]);\n while (tempDiv.firstChild) {\n tempDiv.removeChild(tempDiv.firstChild);\n }\n } else {\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n// Get class list of element as string array\nexport function classList(element: HTMLElement): string[] {\n return element.classList\n ? toArray(element.classList)\n : element.className.split(\" \");\n}\n\n// Add class to specified element\nexport function addClass(element: HTMLElement, className: string): void {\n if (element.classList) {\n element.classList.add(className);\n } else {\n if (!hasClass(element, className)) {\n element.className = (`${element.className} ${className}`).replace(/\\s{2,}/g, \" \");\n }\n }\n}\n\nexport function hasClass(element: HTMLElement, className: string): boolean {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return (element.className.split(\" \").indexOf(className) >= 0);\n }\n}\n\nexport function applyCSS(element: HTMLElement, cssObj: object): void {\n Object.keys(cssObj).forEach(property => {\n element.style[property] = cssObj[property];\n });\n}\n\nexport function clamp(val: number, min: number, max: number) {\n return Math.max(Math.min(val, max), min);\n}\n\n// Min: inclusive, Max: exclusive\nexport function isBetween(val: number, min: number, max: number) {\n return val >= min && val <= max;\n}\n\nexport interface ArrayLike {\n length: number;\n [index: number]: T;\n}\n\nexport function toArray(iterable: ArrayLike): T[] {\n return [].slice.call(iterable);\n}\n\nexport function isArray(arr: any): boolean {\n return arr && arr.constructor === Array;\n}\n\nexport function parseArithmeticExpression(cssValue: number | string, base: number, defaultVal?: number): number {\n // Set base / 2 to default value, if it's undefined\n const defaultValue = defaultVal != null ? defaultVal : base / 2;\n const cssRegex = /(?:(\\+|\\-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return clamp(cssValue, 0, base);\n }\n\n let idx = 0;\n let calculatedValue = 0;\n let matchResult = cssRegex.exec(cssValue);\n while (matchResult != null) {\n let sign = matchResult[1];\n const value = matchResult[2];\n const unit = matchResult[3];\n\n let parsedValue = parseFloat(value);\n\n if (idx <= 0) {\n sign = sign || \"+\";\n }\n\n // Return default value for values not in good form\n if (!sign) {\n return defaultValue;\n }\n\n if (unit === \"%\") {\n parsedValue = (parsedValue / 100) * base;\n }\n\n calculatedValue += sign === \"+\"\n ? parsedValue\n : -parsedValue;\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return defaultValue;\n }\n\n // Clamp between 0 ~ base\n return clamp(calculatedValue, 0, base);\n}\n\nexport function getProgress(pos: number, range: number[]) {\n // start, anchor, end\n // -1 , 0 , 1\n const [min, center, max] = range;\n\n if (pos > center && (max - center)) {\n // 0 ~ 1\n return (pos - center) / (max - center);\n } else if (pos < center && (center - min)) {\n // -1 ~ 0\n return (pos - center) / (center - min);\n } else if (pos !== center && max - min) {\n return (pos - min) / (max - min);\n }\n return 0;\n}\n\nexport function findIndex(iterable: T[], callback: (el: T) => boolean): number {\n for (let i = 0; i < iterable.length; i += 1) {\n const element = iterable[i];\n if (element && callback(element)) {\n return i;\n }\n }\n\n return -1;\n}\n\n// return [0, 1, ...., max - 1]\nexport function counter(max: number): number[] {\n const counterArray: number[] = [];\n for (let i = 0; i < max; i += 1) {\n counterArray[i] = i;\n }\n return counterArray;\n}\n\n// Circulate number between range [min, max]\n/*\n * \"indexed\" means min and max is not same, so if it's true \"min - 1\" should be max\n * While if it's false, \"min - 1\" should be \"max - 1\"\n * use `indexed: true` when it should be used for circulating integers like index\n * or `indexed: false` when it should be used for something like positions.\n */\nexport function circulate(value: number, min: number, max: number, indexed: boolean): number {\n const size = indexed\n ? max - min + 1\n : max - min;\n if (value < min) {\n const offset = indexed\n ? (min - value - 1) % size\n : (min - value) % size;\n value = max - offset;\n } else if (value > max) {\n const offset = indexed\n ? (value - max - 1) % size\n : (value - max) % size;\n value = min + offset;\n }\n\n return value;\n}\n\nexport function restoreStyle(element: HTMLElement, originalStyle: OriginalStyle): void {\n originalStyle.className\n ? element.setAttribute(\"class\", originalStyle.className)\n : element.removeAttribute(\"class\");\n originalStyle.style\n ? element.setAttribute(\"style\", originalStyle.style)\n : element.removeAttribute(\"style\");\n}\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터.\n * @memberof eg.Flicking\n * @private\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nexport function withFlickingMethods(prototype: any, flickingName: string) {\n Object.keys(FLICKING_METHODS).forEach((name: keyof Flicking) => {\n if (prototype[name]) {\n return;\n }\n prototype[name] = function(...args) {\n const result = this[flickingName][name](...args);\n\n // fix `this` type to return your own `flicking` instance to the instance using the decorator.\n if (result === this[flickingName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n}\n\nexport function getBbox(element: HTMLElement, useOffset: boolean) {\n let bbox: BoundingBox;\n if (useOffset) {\n bbox = {\n x: 0,\n y: 0,\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n } else {\n const clientRect = element.getBoundingClientRect();\n bbox = {\n x: clientRect.left,\n y: clientRect.top,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n return bbox;\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Viewport from \"./Viewport\";\nimport { OriginalStyle, FlickingPanel, ElementLike, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_PANEL_CSS, EVENTS } from \"../consts\";\nimport { addClass, applyCSS, parseArithmeticExpression, parseElement, getProgress, restoreStyle, hasClass, getBbox } from \"../utils\";\n\nclass Panel implements FlickingPanel {\n public viewport: Viewport;\n public prevSibling: Panel | null;\n public nextSibling: Panel | null;\n\n protected state: {\n index: number;\n position: number;\n relativeAnchorPosition: number;\n size: number;\n isClone: boolean;\n isVirtual: boolean;\n // Index of cloned panel, zero-based integer(original: -1, cloned: [0, 1, 2, ...])\n // if cloneIndex is 0, that means it's first cloned panel of original panel\n cloneIndex: number;\n originalStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n private element: HTMLElement;\n private original?: Panel;\n private clonedPanels: Panel[];\n\n public constructor(\n element?: HTMLElement | null,\n index?: number,\n viewport?: Viewport,\n ) {\n this.viewport = viewport!;\n this.prevSibling = null;\n this.nextSibling = null;\n this.clonedPanels = [];\n\n this.state = {\n index: index!,\n position: 0,\n relativeAnchorPosition: 0,\n size: 0,\n isClone: false,\n isVirtual: false,\n cloneIndex: -1,\n originalStyle: {\n className: \"\",\n style: \"\",\n },\n cachedBbox: null,\n };\n this.setElement(element);\n }\n\n public resize(givenBbox?: BoundingBox): void {\n const state = this.state;\n const options = this.viewport.options;\n const bbox = givenBbox\n ? givenBbox\n : this.getBbox();\n this.state.cachedBbox = bbox;\n const prevSize = state.size;\n\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size);\n }\n\n if (!state.isClone) {\n this.clonedPanels.forEach(panel => {\n const cloneState = panel.state;\n\n cloneState.size = state.size;\n cloneState.cachedBbox = state.cachedBbox;\n cloneState.relativeAnchorPosition = state.relativeAnchorPosition;\n });\n }\n }\n\n public unCacheBbox(): void {\n this.state.cachedBbox = null;\n }\n\n public getProgress() {\n const viewport = this.viewport;\n const options = viewport.options;\n const panelCount = viewport.panelManager.getPanelCount();\n const scrollAreaSize = viewport.getScrollAreaSize();\n\n const relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex();\n const progress = relativeIndex - viewport.getCurrentProgress();\n\n return progress;\n }\n\n public getOutsetProgress() {\n const viewport = this.viewport;\n const outsetRange = [\n -this.getSize(),\n viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(),\n viewport.getSize(),\n ];\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const outsetProgress = getProgress(relativePanelPosition, outsetRange);\n\n return outsetProgress;\n }\n\n public getVisibleRatio() {\n const viewport = this.viewport;\n const panelSize = this.getSize();\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const rightRelativePanelPosition = relativePanelPosition + panelSize;\n\n const visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0);\n const visibleRatio = visibleSize >= 0\n ? visibleSize / panelSize\n : 0;\n\n return visibleRatio;\n }\n\n public focus(duration?: number): void {\n const viewport = this.viewport;\n const currentPanel = viewport.getCurrentPanel();\n const hangerPosition = viewport.getHangerPosition();\n const anchorPosition = this.getAnchorPosition();\n if (hangerPosition === anchorPosition || !currentPanel) {\n return;\n }\n\n const currentPosition = currentPanel.getPosition();\n const eventType = currentPosition === this.getPosition()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration);\n }\n\n public update(updateFunction: ((element: HTMLElement) => any) | null = null, shouldResize: boolean = true): void {\n const identicalPanels = this.getIdenticalPanels();\n\n if (updateFunction) {\n identicalPanels.forEach(eachPanel => {\n updateFunction(eachPanel.getElement());\n });\n }\n\n if (shouldResize) {\n identicalPanels.forEach(eachPanel => {\n eachPanel.unCacheBbox();\n });\n this.viewport.addVisiblePanel(this);\n this.viewport.resize();\n }\n }\n\n public prev(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const prevSibling = this.prevSibling;\n\n if (!prevSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const prevPanelIndex = prevSibling.getIndex();\n const prevPanelPosition = prevSibling.getPosition();\n const prevPanelSize = prevSibling.getSize();\n\n const hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1;\n const notYetMinPanel = options.infinite\n && currentIndex > 0\n && prevPanelIndex > currentIndex;\n\n if (hasEmptyPanelBetween || notYetMinPanel) {\n // Empty panel exists between\n return null;\n }\n\n const newPosition = currentPosition - prevPanelSize - options.gap;\n\n let prevPanel = prevSibling;\n if (prevPanelPosition !== newPosition) {\n prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true);\n prevPanel.setPosition(newPosition);\n }\n\n return prevPanel;\n }\n\n public next(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const nextSibling = this.nextSibling;\n const lastIndex = viewport.panelManager.getLastIndex();\n\n if (!nextSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const nextPanelIndex = nextSibling.getIndex();\n const nextPanelPosition = nextSibling.getPosition();\n\n const hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1;\n const notYetMaxPanel = options.infinite\n && currentIndex < lastIndex\n && nextPanelIndex < currentIndex;\n\n if (hasEmptyPanelBetween || notYetMaxPanel) {\n return null;\n }\n\n const newPosition = currentPosition + this.getSize() + options.gap;\n\n let nextPanel = nextSibling;\n if (nextPanelPosition !== newPosition) {\n nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true);\n nextPanel.setPosition(newPosition);\n }\n\n return nextPanel;\n }\n\n public insertBefore(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n const firstPanel = viewport.panelManager.firstPanel()!;\n const prevSibling = this.prevSibling;\n // Finding correct inserting index\n // While it should insert removing empty spaces,\n // It also should have to be bigger than prevSibling' s index\n const targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex()\n ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length)\n : Math.max(this.getIndex() - parsedElements.length, 0);\n\n return viewport.insert(targetIndex, parsedElements);\n }\n\n public insertAfter(element: ElementLike | ElementLike[]): FlickingPanel[] {\n return this.viewport.insert(this.getIndex() + 1, element);\n }\n\n public remove(): FlickingPanel {\n this.viewport.remove(this.getIndex());\n\n return this;\n }\n\n public destroy(option: Partial): void {\n if (!option.preserveUI) {\n const originalStyle = this.state.originalStyle;\n\n restoreStyle(this.element, originalStyle);\n }\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getAnchorPosition(): number {\n return this.state.position + this.state.relativeAnchorPosition;\n }\n\n public getRelativeAnchorPosition(): number {\n return this.state.relativeAnchorPosition;\n }\n\n public getIndex(): number {\n return this.state.index;\n }\n\n public getPosition(): number {\n return this.state.position;\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getBbox(): BoundingBox {\n const state = this.state;\n const viewport = this.viewport;\n const element = this.element;\n const options = viewport.options;\n\n if (!element) {\n state.cachedBbox = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n } else if (!state.cachedBbox) {\n const wasVisible = Boolean(element.parentNode);\n const cameraElement = viewport.getCameraElement();\n if (!wasVisible) {\n cameraElement.appendChild(element);\n viewport.addVisiblePanel(this);\n }\n state.cachedBbox = getBbox(element, options.useOffset);\n\n if (!wasVisible && viewport.options.renderExternal) {\n cameraElement.removeChild(element);\n }\n }\n return state.cachedBbox!;\n }\n\n public isClone(): boolean {\n return this.state.isClone;\n }\n\n public getOverlappedClass(classes: string[]): string | undefined {\n const element = this.element;\n\n for (const className of classes) {\n if (hasClass(element, className)) {\n return className;\n }\n }\n }\n\n public getCloneIndex(): number {\n return this.state.cloneIndex;\n }\n\n public getClonedPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getClonedPanels()\n : this.clonedPanels;\n }\n\n public getIdenticalPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getIdenticalPanels()\n : [this, ...this.clonedPanels];\n }\n\n public getOriginalPanel(): Panel {\n return this.state.isClone\n ? this.original!\n : this;\n }\n\n public setIndex(index: number): void {\n const state = this.state;\n\n state.index = index;\n this.clonedPanels.forEach(panel => panel.state.index = index);\n }\n\n public setPosition(pos: number): this {\n this.state.position = pos;\n\n return this;\n }\n\n public setPositionCSS(offset: number = 0): void {\n if (!this.element) {\n return;\n }\n const state = this.state;\n const pos = state.position;\n const options = this.viewport.options;\n const elementStyle = this.element.style;\n const currentElementStyle = options.horizontal\n ? elementStyle.left\n : elementStyle.top;\n const styleToApply = `${pos - offset}px`;\n\n if (!state.isVirtual && currentElementStyle !== styleToApply) {\n options.horizontal\n ? elementStyle.left = styleToApply\n : elementStyle.top = styleToApply;\n }\n }\n\n public clone(cloneIndex: number, isVirtual: boolean = false, element?: HTMLElement | null): Panel {\n const state = this.state;\n const viewport = this.viewport;\n let cloneElement = element;\n\n if (!cloneElement && this.element) {\n cloneElement = isVirtual ? this.element : this.element.cloneNode(true) as HTMLElement;\n }\n const clonedPanel = new Panel(cloneElement, state.index, viewport);\n const clonedState = clonedPanel.state;\n\n clonedPanel.original = state.isClone\n ? this.original\n : this;\n clonedState.isClone = true;\n clonedState.isVirtual = isVirtual;\n clonedState.cloneIndex = cloneIndex;\n // Inherit some state values\n clonedState.size = state.size;\n clonedState.relativeAnchorPosition = state.relativeAnchorPosition;\n clonedState.originalStyle = state.originalStyle;\n clonedState.cachedBbox = state.cachedBbox;\n\n if (!isVirtual) {\n this.clonedPanels.push(clonedPanel);\n } else {\n clonedPanel.prevSibling = this.prevSibling;\n clonedPanel.nextSibling = this.nextSibling;\n }\n\n return clonedPanel;\n }\n\n public removeElement(): void {\n if (!this.viewport.options.renderExternal) {\n const element = this.element;\n element.parentNode && element.parentNode.removeChild(element);\n }\n\n // Do the same thing for clones\n if (!this.state.isClone) {\n this.removeClonedPanelsAfter(0);\n }\n }\n\n public removeClonedPanelsAfter(start: number): void {\n const options = this.viewport.options;\n const removingPanels = this.clonedPanels.splice(start);\n\n if (!options.renderExternal) {\n removingPanels.forEach(panel => {\n panel.removeElement();\n });\n }\n }\n\n public setElement(element?: HTMLElement | null): void {\n if (!element) {\n return;\n }\n const currentElement = this.element;\n if (element !== currentElement) {\n const options = this.viewport.options;\n\n if (currentElement) {\n if (options.horizontal) {\n element.style.left = currentElement.style.left;\n } else {\n element.style.top = currentElement.style.top;\n }\n } else {\n const originalStyle = this.state.originalStyle;\n\n originalStyle.className = element.getAttribute(\"class\");\n originalStyle.style = element.getAttribute(\"style\");\n }\n\n this.element = element;\n\n if (options.classPrefix) {\n addClass(element, `${options.classPrefix}-panel`);\n }\n\n // Update size info after applying panel css\n applyCSS(this.element, DEFAULT_PANEL_CSS);\n }\n }\n}\n\nexport default Panel;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"./Panel\";\nimport { FlickingOptions } from \"../types\";\nimport { findIndex, counter } from \"../utils\";\n\nclass PanelManager {\n private cameraElement: HTMLElement;\n private options: FlickingOptions;\n private panels: Panel[];\n private clones: Panel[][];\n // index range of existing panels\n private range: {\n min: number;\n max: number;\n };\n private length: number;\n private lastIndex: number;\n private cloneCount: number;\n\n constructor(\n cameraElement: HTMLElement,\n options: FlickingOptions,\n ) {\n this.cameraElement = cameraElement;\n this.panels = [];\n this.clones = [];\n this.range = {\n min: -1,\n max: -1,\n };\n this.length = 0;\n this.cloneCount = 0;\n this.options = options;\n this.lastIndex = options.lastIndex;\n }\n\n public firstPanel(): Panel | undefined {\n return this.panels[this.range.min];\n }\n\n public lastPanel(): Panel | undefined {\n return this.panels[this.range.max];\n }\n\n public allPanels(): ReadonlyArray {\n return [\n ...this.panels,\n ...this.clones.reduce((allClones, clones) => [...allClones, ...clones], []),\n ];\n }\n\n public originalPanels(): ReadonlyArray {\n return this.panels;\n }\n\n public clonedPanels(): ReadonlyArray {\n return this.clones;\n }\n\n public replacePanels(newPanels: Panel[], newClones: Panel[][]): void {\n this.panels = newPanels;\n this.clones = newClones;\n\n this.range = {\n min: findIndex(newPanels, panel => Boolean(panel)),\n max: newPanels.length - 1,\n };\n this.length = newPanels.filter(panel => Boolean(panel)).length;\n }\n\n public has(index: number): boolean {\n return !!this.panels[index];\n }\n\n public get(index: number): Panel | undefined {\n return this.panels[index];\n }\n\n public getPanelCount(): number {\n return this.length;\n }\n\n public getLastIndex(): number {\n return this.lastIndex;\n }\n\n public getRange(): Readonly<{ min: number, max: number }> {\n return this.range;\n }\n\n public getCloneCount(): number {\n return this.cloneCount;\n }\n\n public setLastIndex(lastIndex: number): void {\n this.lastIndex = lastIndex;\n\n const firstPanel = this.firstPanel();\n const lastPanel = this.lastPanel();\n\n if (!firstPanel || !lastPanel) {\n return; // no meaning of updating range & length\n }\n\n // Remove panels above new last index\n const range = this.range;\n if (lastPanel.getIndex() > lastIndex) {\n const removingPanels = this.panels.splice(lastIndex + 1);\n this.length -= removingPanels.length;\n\n const firstRemovedPanel = removingPanels.filter(panel => !!panel)[0];\n const possibleLastPanel = firstRemovedPanel.prevSibling;\n if (possibleLastPanel) {\n range.max = possibleLastPanel.getIndex();\n } else {\n range.min = -1;\n range.max = -1;\n }\n\n if (this.shouldRender()) {\n removingPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n public setCloneCount(cloneCount: number): void {\n this.cloneCount = cloneCount;\n }\n\n // Insert at index\n // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it\n public insert(index: number, newPanels: Panel[]): number {\n const panels = this.panels;\n const range = this.range;\n const isCircular = this.options.circular;\n const lastIndex = this.lastIndex;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n let pushedIndex = newPanels.length;\n // Like when setting index 50 while visible panels are 0, 1, 2\n if (index > range.max) {\n newPanels.forEach((panel, offset) => {\n panels[index + offset] = panel;\n });\n } else {\n const panelsAfterIndex = panels.slice(index, index + newPanels.length);\n // Find empty from beginning\n let emptyPanelCount = findIndex(panelsAfterIndex, panel => !!panel);\n if (emptyPanelCount < 0) {\n // All empty\n emptyPanelCount = panelsAfterIndex.length;\n }\n pushedIndex = newPanels.length - emptyPanelCount;\n\n // Insert removing empty panels\n panels.splice(index, emptyPanelCount, ...newPanels);\n\n // Remove panels after last index\n if (panels.length > lastIndex + 1) {\n const removedPanels = panels.splice(lastIndex + 1)\n .filter(panel => Boolean(panel));\n this.length -= removedPanels.length;\n\n // Find first\n const newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), panel => !!panel);\n\n // Can be filled with empty after newLastIndex\n this.panels.splice(newLastIndex + 1);\n this.range.max = newLastIndex;\n\n if (this.shouldRender()) {\n removedPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n // Update index of previous panels\n if (pushedIndex > 0) {\n panels.slice(index + newPanels.length).forEach(panel => {\n panel.setIndex(panel.getIndex() + pushedIndex);\n });\n }\n\n // Update state\n this.length += newPanels.length;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling);\n const clones = this.clones;\n const panelCount = this.panels.length;\n if (clones[0] && clones[0].length > lastIndex + 1) {\n clones.forEach(cloneSet => {\n cloneSet.splice(panelCount);\n });\n }\n }\n\n return pushedIndex;\n }\n\n public replace(index: number, newPanels: Panel[]): Panel[] {\n const panels = this.panels;\n const range = this.range;\n const options = this.options;\n const isCircular = options.circular;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index + newPanels.length);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n if (index > range.max) {\n // Temporarily insert null at index to use splice()\n (panels[index] as any) = null;\n }\n\n const replacedPanels = panels.splice(index, newPanels.length, ...newPanels);\n const wasNonEmptyCount = replacedPanels.filter(panel => Boolean(panel)).length;\n\n // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1]\n // So length should be increased by 3(inserting panels) - 1(non-empty panels)\n this.length += newPanels.length - wasNonEmptyCount;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length, nextSibling);\n }\n\n if (this.shouldRender()) {\n replacedPanels.forEach(panel => panel && panel.removeElement());\n }\n\n return replacedPanels;\n }\n\n public remove(index: number, deleteCount: number = 1): Panel[] {\n const isCircular = this.options.circular;\n const panels = this.panels;\n const clones = this.clones;\n // Delete count should be equal or larger than 0\n deleteCount = Math.max(deleteCount, 0);\n\n const deletedPanels = panels\n .splice(index, deleteCount)\n .filter(panel => !!panel);\n\n if (this.shouldRender()) {\n deletedPanels.forEach(panel => panel.removeElement());\n }\n\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(index, deleteCount);\n });\n }\n\n // Update indexes\n panels\n .slice(index)\n .forEach(panel => {\n panel.setIndex(panel.getIndex() - deleteCount);\n });\n\n // Check last panel is empty\n let lastIndex = panels.length - 1;\n if (!panels[lastIndex]) {\n const reversedPanels = panels.concat().reverse();\n const nonEmptyIndexFromLast = findIndex(reversedPanels, panel => !!panel);\n lastIndex = nonEmptyIndexFromLast < 0\n ? -1 // All empty\n : lastIndex - nonEmptyIndexFromLast;\n\n // Remove all empty panels from last\n panels.splice(lastIndex + 1);\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(lastIndex + 1);\n });\n }\n }\n\n // Update range & length\n this.range = {\n min: findIndex(panels, panel => !!panel),\n max: lastIndex,\n };\n this.length -= deletedPanels.length;\n\n if (this.length <= 0) {\n // Reset clones\n this.clones = [];\n this.cloneCount = 0;\n }\n\n return deletedPanels;\n }\n\n public chainAllPanels() {\n const allPanels = this.allPanels().filter(panel => !!panel);\n const allPanelsCount = allPanels.length;\n\n if (allPanelsCount <= 1) {\n return;\n }\n\n allPanels.slice(1, allPanels.length - 1).forEach((panel, idx) => {\n const prevPanel = allPanels[idx];\n const nextPanel = allPanels[idx + 2];\n\n panel.prevSibling = prevPanel;\n panel.nextSibling = nextPanel;\n });\n\n const firstPanel = allPanels[0];\n const lastPanel = allPanels[allPanelsCount - 1];\n\n firstPanel.prevSibling = null;\n firstPanel.nextSibling = allPanels[1];\n lastPanel.prevSibling = allPanels[allPanelsCount - 2];\n lastPanel.nextSibling = null;\n\n if (this.options.circular) {\n firstPanel.prevSibling = lastPanel;\n lastPanel.nextSibling = firstPanel;\n }\n }\n\n public insertClones(cloneIndex: number, index: number, clonedPanels: Panel[], deleteCount: number = 0): void {\n const clones = this.clones;\n const lastIndex = this.lastIndex;\n\n if (!clones[cloneIndex]) {\n const newClones: Panel[] = [];\n clonedPanels.forEach((panel, offset) => {\n newClones[index + offset] = panel;\n });\n\n clones[cloneIndex] = newClones;\n } else {\n const insertTarget = clones[cloneIndex];\n\n if (index >= insertTarget.length) {\n clonedPanels.forEach((panel, offset) => {\n insertTarget[index + offset] = panel;\n });\n } else {\n insertTarget.splice(index, deleteCount, ...clonedPanels);\n // Remove panels after last index\n if (clonedPanels.length > lastIndex + 1) {\n clonedPanels.splice(lastIndex + 1);\n }\n }\n }\n }\n\n // clones are operating in set\n public removeClonesAfter(cloneIndex: number): void {\n const panels = this.panels;\n\n panels.forEach(panel => {\n panel.removeClonedPanelsAfter(cloneIndex);\n });\n this.clones.splice(cloneIndex);\n }\n\n public findPanelOf(element: HTMLElement): Panel | undefined {\n const allPanels = this.allPanels();\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const panelElement = panel.getElement();\n if (panelElement.contains(element)) {\n return panel;\n }\n }\n }\n\n public findFirstPanelFrom(index: number): Panel | undefined {\n for (const panel of this.panels.slice(index)) {\n if (panel && panel.getIndex() >= index && panel.getElement().parentNode) {\n return panel;\n }\n }\n }\n\n private addNewClones(index: number, originalPanels: Panel[], deleteCount: number, nextSibling: Panel | undefined) {\n const cameraElement = this.cameraElement;\n const cloneCount = this.getCloneCount();\n const lastPanel = this.lastPanel();\n const lastPanelClones: Panel[] = lastPanel\n ? lastPanel.getClonedPanels()\n : [];\n const nextSiblingClones: Panel[] = nextSibling\n ? nextSibling.getClonedPanels()\n : [];\n\n for (const cloneIndex of counter(cloneCount)) {\n const cloneNextSibling = nextSiblingClones[cloneIndex];\n const lastPanelSibling = lastPanelClones[cloneIndex];\n\n const cloneSiblingElement = cloneNextSibling\n ? cloneNextSibling.getElement()\n : lastPanelSibling\n ? lastPanelSibling.getElement().nextElementSibling\n : null;\n\n const newClones = originalPanels.map(panel => {\n const clone = panel.clone(cloneIndex);\n\n if (this.shouldRender()) {\n cameraElement.insertBefore(clone.getElement(), cloneSiblingElement);\n }\n\n return clone;\n });\n\n this.insertClones(cloneIndex, index, newClones, deleteCount);\n }\n }\n\n private updateIndex(insertingIndex: number) {\n const panels = this.panels;\n const range = this.range;\n\n const newLastIndex = panels.length - 1;\n if (newLastIndex > range.max) {\n range.max = newLastIndex;\n }\n if (insertingIndex < range.min || range.min < 0) {\n range.min = insertingIndex;\n }\n }\n\n private insertNewPanels(newPanels: Panel[], siblingElement: HTMLElement | null) {\n if (this.shouldRender()) {\n const fragment = document.createDocumentFragment();\n newPanels.forEach(panel => fragment.appendChild(panel.getElement()));\n this.cameraElement.insertBefore(fragment, siblingElement);\n }\n }\n\n private shouldRender(): boolean {\n const options = this.options;\n\n return !options.renderExternal && !options.renderOnlyVisible;\n }\n}\n\nexport default PanelManager;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"../components/Panel\";\nimport { ValueOf, Direction, StateType, FlickingContext } from \"../types\";\n\nabstract class State {\n public delta: number = 0;\n public direction: ValueOf | null = null;\n public targetPanel: Panel | null = null;\n public lastPosition: number = 0;\n public abstract readonly type: ValueOf;\n public abstract readonly holding: boolean;\n public abstract readonly playing: boolean;\n\n public onEnter(prevState: State): void {\n this.delta = prevState.delta;\n this.direction = prevState.direction;\n this.targetPanel = prevState.targetPanel;\n this.lastPosition = prevState.lastPosition;\n }\n\n public onExit(nextState: State): void {\n // DO NOTHING\n }\n\n public onHold(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onChange(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onAnimationEnd(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onFinish(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n}\n\nexport default State;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { EVENTS, STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass IdleState extends State {\n public readonly type = STATE_TYPE.IDLE;\n public readonly holding = false;\n public readonly playing = false;\n\n public onEnter() {\n this.direction = null;\n this.targetPanel = null;\n this.delta = 0;\n this.lastPosition = 0;\n }\n\n public onHold(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Shouldn't do any action until any panels on flicking area\n if (flicking.getPanelCount() <= 0) {\n if (viewport.options.infinite) {\n viewport.moveCamera(viewport.getCameraPosition(), e);\n }\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n this.lastPosition = viewport.getCameraPosition();\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.HOLDING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n // By methods call\n public onChange(e: any, context: FlickingContext): void {\n const { triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.MOVE_START, e, false)\n .onSuccess(() => {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n}\n\nexport default IdleState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS, DIRECTION } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass HoldingState extends State {\n public readonly type = STATE_TYPE.HOLDING;\n public readonly holding = true;\n public readonly playing = true;\n\n private releaseEvent: any = null;\n\n public onChange(e: any, context: FlickingContext): void {\n const { flicking, triggerEvent, transitTo } = context;\n\n const offset = flicking.options.horizontal\n ? e.inputEvent.offsetX\n : e.inputEvent.offsetY;\n this.direction = offset < 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n triggerEvent(EVENTS.MOVE_START, e, true)\n .onSuccess(() => {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { viewport, triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n if (e.delta.flick !== 0) {\n // Sometimes \"release\" event on axes triggered before \"change\" event\n // Especially if user flicked panel fast in really short amount of time\n // if delta is not zero, that means above case happened.\n\n // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END\n // At least one move event should be included between holdStart and holdEnd\n e.setTo({ flick: viewport.getCameraPosition() }, 0);\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n // Can't handle select event here,\n // As \"finish\" axes event happens\n this.releaseEvent = e;\n }\n\n public onFinish(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Should transite to IDLE state before select event\n // As user expects hold is already finished\n transitTo(STATE_TYPE.IDLE);\n\n if (!this.releaseEvent) {\n return;\n }\n\n // Handle release event here\n // To prevent finish event called twice\n const releaseEvent = this.releaseEvent;\n\n // Static click\n const srcEvent = releaseEvent.inputEvent.srcEvent;\n\n let clickedElement: HTMLElement;\n if (srcEvent.type === \"touchend\") {\n const touchEvent = srcEvent as TouchEvent;\n const touch = touchEvent.changedTouches[0];\n clickedElement = document.elementFromPoint(touch.clientX, touch.clientY) as HTMLElement;\n } else {\n clickedElement = srcEvent.target;\n }\n const clickedPanel = viewport.panelManager.findPanelOf(clickedElement);\n const cameraPosition = viewport.getCameraPosition();\n\n if (clickedPanel) {\n const clickedPanelPosition = clickedPanel.getPosition();\n const direction = clickedPanelPosition > cameraPosition\n ? DIRECTION.NEXT\n : clickedPanelPosition < cameraPosition\n ? DIRECTION.PREV\n : null;\n\n // Don't provide axes event, to use axes instance instead\n triggerEvent(EVENTS.SELECT, null, true, {\n direction, // Direction to the clicked panel\n index: clickedPanel.getIndex(),\n panel: clickedPanel,\n });\n }\n }\n}\n\nexport default HoldingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DraggingState extends State {\n public readonly type = STATE_TYPE.DRAGGING;\n public readonly holding = true;\n public readonly playing = true;\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { flicking, viewport, triggerEvent, transitTo, stopCamera } = context;\n\n const delta = this.delta;\n const absDelta = Math.abs(delta);\n const options = flicking.options;\n const horizontal = options.horizontal;\n const moveType = viewport.moveType;\n const inputEvent = e.inputEvent;\n\n const velocity = horizontal\n ? inputEvent.velocityX\n : inputEvent.velocityY;\n const inputDelta = horizontal\n ? inputEvent.deltaX\n : inputEvent.deltaY;\n const isNextDirection = Math.abs(velocity) > 1\n ? velocity < 0\n : absDelta > 0\n ? delta > 0\n : inputDelta < 0;\n\n const swipeDistance = viewport.options.bound\n ? Math.max(absDelta, Math.abs(inputDelta))\n : absDelta;\n const swipeAngle = inputEvent.deltaX\n ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI)\n : 90;\n const belowAngleThreshold = horizontal\n ? swipeAngle <= options.thresholdAngle\n : swipeAngle > options.thresholdAngle;\n const overThreshold = swipeDistance >= options.threshold\n && belowAngleThreshold;\n\n const moveTypeContext = {\n viewport,\n axesEvent: e,\n state: this,\n swipeDistance,\n isNextDirection,\n };\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n const targetPanel = this.targetPanel;\n if (!overThreshold && targetPanel) {\n // Interrupted while animating\n const interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext);\n\n viewport.moveTo(\n interruptDestInfo.panel,\n interruptDestInfo.destPos,\n interruptDestInfo.eventType,\n e,\n interruptDestInfo.duration,\n );\n transitTo(STATE_TYPE.ANIMATING);\n return;\n }\n\n const currentPanel = viewport.getCurrentPanel();\n const nearestPanel = viewport.getNearestPanel();\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n e.stop();\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n const destInfo = overThreshold\n ? moveType.findTargetPanel(moveTypeContext)\n : moveType.findRestorePanel(moveTypeContext);\n\n viewport.moveTo(\n destInfo.panel,\n destInfo.destPos,\n destInfo.eventType,\n e,\n destInfo.duration,\n ).onSuccess(() => {\n transitTo(STATE_TYPE.ANIMATING);\n }).onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n stopCamera(e);\n });\n }\n}\n\nexport default DraggingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\nimport { circulate } from \"../utils\";\n\nclass AnimatingState extends State {\n public readonly type = STATE_TYPE.ANIMATING;\n public readonly holding = false;\n public readonly playing = true;\n\n public onHold(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n const options = viewport.options;\n const scrollArea = viewport.getScrollArea();\n const scrollAreaSize = viewport.getScrollAreaSize();\n const loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize);\n\n const targetPanel = this.targetPanel;\n if (options.circular && loopCount !== 0 && targetPanel) {\n const cloneCount = viewport.panelManager.getCloneCount();\n const originalTargetPosition = targetPanel.getPosition();\n\n // cloneIndex is from -1 to cloneCount - 1\n const newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true);\n const newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize;\n const newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true);\n\n // Set new target panel considering looped count\n newTargetPanel.setPosition(newTargetPosition);\n this.targetPanel = newTargetPanel;\n }\n\n // Reset last position and delta\n this.delta = 0;\n this.lastPosition = viewport.getCameraPosition();\n\n // Update current panel as current nearest panel\n viewport.setCurrentPanel(viewport.getNearestPanel()!);\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.DRAGGING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onFinish(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext) {\n const isTrusted = e && e.isTrusted;\n\n viewport.options.bound\n ? viewport.setCurrentPanel(this.targetPanel!)\n : viewport.setCurrentPanel(viewport.getNearestPanel()!);\n\n if (flicking.options.adaptive) {\n viewport.updateAdaptiveSize();\n }\n\n transitTo(STATE_TYPE.IDLE);\n viewport.updateCameraPosition();\n triggerEvent(EVENTS.MOVE_END, e, isTrusted, {\n direction: this.direction,\n });\n }\n}\n\nexport default AnimatingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DisabledState extends State {\n public readonly type = STATE_TYPE.DISABLED;\n public readonly holding = false;\n public readonly playing = true;\n\n public onAnimationEnd(e: any, { transitTo }: FlickingContext): void {\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(e: any, { viewport, transitTo }: FlickingContext): void {\n // Can stop Axes's change event\n e.stop();\n\n // Should update axes position as it's already changed at this moment\n viewport.updateAxesPosition(viewport.getCameraPosition());\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(e: any, { transitTo }: FlickingContext): void {\n // This is needed when stopped hold start event\n if (e.delta.flick === 0) {\n transitTo(STATE_TYPE.IDLE);\n }\n }\n}\n\nexport default DisabledState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"../states/State\";\nimport { AxesEventType, ValueOf, FlickingContext, StateType } from \"../types\";\nimport { AXES_EVENTS, STATE_TYPE } from \"../consts\";\nimport IdleState from \"../states/IdleState\";\nimport HoldingState from \"../states/HoldingState\";\nimport DraggingState from \"../states/DraggingState\";\nimport AnimatingState from \"../states/AnimatingState\";\nimport DisabledState from \"../states/DisabledState\";\n\nclass StateMachine {\n private state: State = new IdleState();\n\n public fire(eventType: ValueOf, e: any, context: FlickingContext) {\n const currentState = this.state;\n switch (eventType) {\n case AXES_EVENTS.HOLD:\n currentState.onHold(e, context);\n break;\n case AXES_EVENTS.CHANGE:\n currentState.onChange(e, context);\n break;\n case AXES_EVENTS.RELEASE:\n currentState.onRelease(e, context);\n break;\n case AXES_EVENTS.ANIMATION_END:\n currentState.onAnimationEnd(e, context);\n break;\n case AXES_EVENTS.FINISH:\n currentState.onFinish(e, context);\n break;\n }\n }\n\n public getState(): State {\n return this.state;\n }\n\n public transitTo = (nextStateType: ValueOf): State => {\n const currentState = this.state;\n\n if (currentState.type !== nextStateType) {\n let nextState: State;\n\n switch (nextStateType) {\n case STATE_TYPE.IDLE:\n nextState = new IdleState();\n break;\n case STATE_TYPE.HOLDING:\n nextState = new HoldingState();\n break;\n case STATE_TYPE.DRAGGING:\n nextState = new DraggingState();\n break;\n case STATE_TYPE.ANIMATING:\n nextState = new AnimatingState();\n break;\n case STATE_TYPE.DISABLED:\n nextState = new DisabledState();\n break;\n }\n\n currentState.onExit(nextState!);\n nextState!.onEnter(currentState);\n\n this.state = nextState!;\n }\n return this.state;\n }\n}\n\nexport default StateMachine;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { MoveTypeStringOption, MoveTypeContext, DestinationInfo } from \"../types\";\nimport Panel from \"../components/Panel\";\nimport { EVENTS } from \"../consts\";\n\nabstract class MoveType {\n protected readonly abstract type: string;\n\n public abstract findTargetPanel(ctx: MoveTypeContext): DestinationInfo;\n\n public is(type: MoveTypeStringOption): boolean {\n return type === this.type;\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n const viewport = ctx.viewport;\n const options = viewport.options;\n\n const panel = options.circular\n ? this.findRestorePanelInCircularMode(ctx)\n : viewport.getCurrentPanel()!;\n\n return {\n panel,\n destPos: viewport.findEstimatedPosition(panel),\n duration: options.duration,\n eventType: EVENTS.RESTORE,\n };\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { state, viewport } = ctx;\n const targetPanel = state.targetPanel!;\n\n return {\n panel: targetPanel,\n destPos: viewport.findEstimatedPosition(targetPanel),\n duration: viewport.options.duration,\n eventType: \"\",\n };\n }\n\n // Calculate minimum distance to \"change\" panel\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const relativeAnchorPosition = currentPanel.getRelativeAnchorPosition();\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |--------|--------------|\n * [][ |<-Anchor ][] <- Panel + Half-Gap\n */\n let minimumDistanceToChange = isNextDirection\n ? currentPanel.getSize() - relativeAnchorPosition + halfGap\n : relativeAnchorPosition + halfGap;\n\n minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold);\n\n return minimumDistanceToChange;\n }\n\n private findRestorePanelInCircularMode(ctx: MoveTypeContext): Panel {\n const viewport = ctx.viewport;\n const originalPanel = viewport.getCurrentPanel()!.getOriginalPanel();\n const hangerPosition = viewport.getHangerPosition();\n\n const firstClonedPanel = originalPanel.getIdenticalPanels()[1];\n const lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition);\n\n return (!ctx.isNextDirection && lapped)\n ? firstClonedPanel\n : originalPanel;\n }\n}\n\nexport default MoveType;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport MoveType from \"./MoveType\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { clamp } from \"../utils\";\n\nclass Snap extends MoveType {\n protected readonly type: string = MOVE_TYPE.SNAP;\n protected count: number;\n\n constructor(count: number) {\n super();\n this.count = count;\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, axesEvent, swipeDistance } = ctx;\n const snapCount = this.count;\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const currentPanel = viewport.getCurrentPanel()!;\n const nearestPanel = viewport.getNearestPanel()!;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex();\n\n // This can happen when bounce is 0\n const shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent;\n const shouldMoveToAdjacent = !viewport.isOutOfBound()\n && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0);\n\n if (snapCount > 1 && eventDelta > minimumDistanceToChange) {\n return this.findSnappedPanel(ctx);\n } else if (shouldMoveToAdjacent) {\n return this.findAdjacentPanel(ctx);\n } else {\n return {\n panel: nearestPanel,\n duration: viewport.options.duration,\n destPos: viewport.findEstimatedPosition(nearestPanel),\n // As swipeDistance holds mouse/touch position change regardless of bounce option value\n // swipDistance > minimumDistanceToChange can happen in bounce area\n // Second condition is for handling that.\n eventType: (swipeDistance <= minimumDistanceToChange)\n || (viewport.isOutOfBound() && nearestIsCurrent)\n ? EVENTS.RESTORE\n : EVENTS.CHANGE,\n };\n }\n }\n\n protected findSnappedPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, viewport, state, isNextDirection } = ctx;\n\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const snapCount = this.count;\n const options = viewport.options;\n const scrollAreaSize = viewport.getScrollAreaSize();\n const halfGap = options.gap / 2;\n const estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition();\n\n let panelToMove = viewport.getNearestPanel()!;\n let cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone)\n let passedPanelCount = 0;\n\n while (passedPanelCount < snapCount) {\n // Since panelToMove holds also cloned panels, we should use original panel's position\n const originalPanel = panelToMove.getOriginalPanel();\n const panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize;\n const panelSize = originalPanel.getSize();\n\n const panelNextPosition = panelPosition + panelSize + halfGap;\n const panelPrevPosition = panelPosition - halfGap;\n\n // Current panelToMove contains destPos\n if (\n (isNextDirection && panelNextPosition > estimatedHangerPos)\n || (!isNextDirection && panelPrevPosition < estimatedHangerPos)\n ) {\n break;\n }\n\n const siblingPanel = isNextDirection\n ? panelToMove.nextSibling\n : panelToMove.prevSibling;\n if (!siblingPanel) {\n break;\n }\n\n const panelIndex = panelToMove.getIndex();\n const siblingIndex = siblingPanel.getIndex();\n if ((isNextDirection && siblingIndex <= panelIndex)\n || (!isNextDirection && siblingIndex >= panelIndex)\n ) {\n cycleIndex = isNextDirection\n ? cycleIndex + 1\n : cycleIndex - 1;\n }\n panelToMove = siblingPanel;\n passedPanelCount += 1;\n }\n\n const originalPosition = panelToMove.getOriginalPanel().getPosition();\n\n if (cycleIndex !== 0) {\n panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true);\n panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize);\n }\n\n const defaultDuration = viewport.options.duration;\n const duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount);\n\n return {\n panel: panelToMove,\n destPos: viewport.findEstimatedPosition(panelToMove),\n duration,\n eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange\n ? EVENTS.CHANGE\n : EVENTS.RESTORE,\n };\n }\n\n private findAdjacentPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentIndex = viewport.getCurrentIndex();\n const currentPanel = viewport.panelManager.get(currentIndex)!;\n const hangerPosition = viewport.getHangerPosition();\n const scrollArea = viewport.getScrollArea();\n\n const firstClonedPanel = currentPanel.getIdenticalPanels()[1];\n const lapped = options.circular\n && (Math.abs(currentPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition));\n\n // If lapped in circular mode, use first cloned panel as base panel\n const basePanel = lapped\n ? firstClonedPanel\n : currentPanel;\n const basePosition = basePanel.getPosition();\n\n const adjacentPanel = isNextDirection\n ? basePanel.nextSibling\n : basePanel.prevSibling;\n\n const eventType = adjacentPanel\n ? EVENTS.CHANGE\n : EVENTS.RESTORE;\n const panelToMove = adjacentPanel\n ? adjacentPanel\n : basePanel;\n const targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition();\n\n const estimatedPanelPosition = options.circular\n ? isNextDirection\n ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap\n : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap\n : panelToMove.getAnchorPosition();\n const estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition();\n const destPos = viewport.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return {\n panel: panelToMove,\n destPos,\n duration: options.duration,\n eventType,\n };\n }\n}\n\nexport default Snap;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Snap from \"./Snap\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { circulate, clamp } from \"../utils\";\n\nclass FreeScroll extends Snap {\n protected readonly type: string = MOVE_TYPE.FREE_SCROLL;\n\n constructor() {\n // Set snap count to Infinity\n super(Infinity);\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, state, viewport } = ctx;\n const destPos = axesEvent.destPos.flick;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const scrollArea = viewport.getScrollArea();\n const currentPanel = viewport.getCurrentPanel()!;\n const options = viewport.options;\n\n const delta = Math.abs(axesEvent.delta.flick + state.delta);\n if (delta > minimumDistanceToChange) {\n const destInfo = super.findSnappedPanel(ctx);\n\n destInfo.duration = axesEvent.duration;\n destInfo.destPos = destPos;\n destInfo.eventType = !options.circular && destInfo.panel === currentPanel\n ? \"\"\n : EVENTS.CHANGE;\n\n return destInfo;\n } else {\n let estimatedPosition = options.circular\n ? circulate(destPos, scrollArea.prev, scrollArea.next, false)\n : destPos;\n estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next);\n estimatedPosition += viewport.getRelativeHangerPosition();\n\n const estimatedPanel = viewport.findNearestPanelAt(estimatedPosition)!;\n\n return {\n panel: estimatedPanel,\n destPos,\n duration: axesEvent.duration,\n eventType: \"\",\n };\n }\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n return this.findTargetPanel(ctx);\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { viewport } = ctx;\n\n return {\n panel: viewport.getNearestPanel()!,\n destPos: viewport.getCameraPosition(),\n duration: 0,\n eventType: \"\",\n };\n }\n\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const lastPosition = viewport.stateMachine.getState().lastPosition;\n const currentPanelPosition = currentPanel.getPosition();\n\n // As camera can stop anywhere in free scroll mode,\n // minimumDistanceToChange should be calculated differently.\n // Ref #191(https://github.com/naver/egjs-flicking/issues/191)\n const lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition();\n\n const scrollAreaSize = viewport.getScrollAreaSize();\n let minimumDistanceToChange = isNextDirection\n ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap\n : lastHangerPosition - currentPanelPosition + halfGap;\n minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize);\n\n return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange);\n }\n}\n\nexport default FreeScroll;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Axes, { PanInput } from \"@egjs/axes\";\n\nimport Flicking from \"../Flicking\";\nimport Panel from \"./Panel\";\nimport PanelManager from \"./PanelManager\";\nimport StateMachine from \"./StateMachine\";\nimport MoveType from \"../moves/MoveType\";\nimport { FlickingOptions, FlickingPanel, FlickingStatus, ElementLike, EventType, TriggerCallback, NeedPanelEvent, FlickingEvent, MoveTypeObjectOption, OriginalStyle, Plugin, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_VIEWPORT_CSS, DEFAULT_CAMERA_CSS, TRANSFORM, DEFAULT_OPTIONS, EVENTS, DIRECTION, STATE_TYPE, MOVE_TYPE } from \"../consts\";\nimport { clamp, applyCSS, toArray, parseArithmeticExpression, isBetween, isArray, parseElement, hasClass, restoreStyle, circulate, findIndex, getBbox } from \"../utils\";\nimport Snap from \"../moves/Snap\";\nimport FreeScroll from \"../moves/FreeScroll\";\n\nexport default class Viewport {\n public options: FlickingOptions;\n public stateMachine: StateMachine;\n public panelManager: PanelManager;\n public moveType: MoveType;\n\n private flicking: Flicking;\n private axes: Axes;\n private panInput: PanInput | null;\n\n private viewportElement: HTMLElement;\n private cameraElement: HTMLElement;\n\n private triggerEvent: Flicking[\"triggerEvent\"];\n private axesHandlers: { [key: string]: any };\n\n private currentPanel: Panel | undefined;\n private nearestPanel: Panel | undefined;\n private visiblePanels: Panel[];\n\n private plugins: Plugin[] = [];\n private panelBboxes: { [className: string]: BoundingBox };\n private state: {\n size: number;\n position: number;\n panelMaintainRatio: number;\n relativeHangerPosition: number;\n positionOffset: number;\n scrollArea: {\n prev: number;\n next: number;\n };\n translate: {\n name: string,\n has3d: boolean,\n };\n infiniteThreshold: number;\n checkedIndexes: Array<[number, number]>;\n isAdaptiveCached: boolean;\n isViewportGiven: boolean;\n isCameraGiven: boolean;\n originalViewportStyle: OriginalStyle;\n originalCameraStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n\n constructor(\n flicking: Flicking,\n options: FlickingOptions,\n triggerEvent: Flicking[\"triggerEvent\"],\n ) {\n this.flicking = flicking;\n this.triggerEvent = triggerEvent;\n\n this.state = {\n size: 0,\n position: 0,\n panelMaintainRatio: 0,\n relativeHangerPosition: 0,\n positionOffset: 0,\n scrollArea: {\n prev: 0,\n next: 0,\n },\n translate: TRANSFORM,\n infiniteThreshold: 0,\n checkedIndexes: [],\n isAdaptiveCached: false,\n isViewportGiven: false,\n isCameraGiven: false,\n originalViewportStyle: {\n className: null,\n style: null,\n },\n originalCameraStyle: {\n className: null,\n style: null,\n },\n cachedBbox: null,\n };\n this.options = options;\n this.stateMachine = new StateMachine();\n this.visiblePanels = [];\n this.panelBboxes = {};\n\n this.build();\n }\n\n public moveTo(\n panel: Panel,\n destPos: number,\n eventType: EventType[\"CHANGE\"] | EventType[\"RESTORE\"] | \"\",\n axesEvent: any,\n duration: number = this.options.duration,\n ): TriggerCallback {\n const state = this.state;\n const currentState = this.stateMachine.getState();\n const currentPosition = state.position;\n\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n const direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n let eventResult: TriggerCallback;\n if (eventType === EVENTS.CHANGE) {\n eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, {\n index: panel.getIndex(),\n panel,\n direction,\n });\n } else if (eventType === EVENTS.RESTORE) {\n eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted);\n } else {\n eventResult = {\n onSuccess(callback: () => void): TriggerCallback {\n callback();\n return this;\n },\n onStopped(): TriggerCallback {\n return this;\n },\n };\n }\n\n eventResult.onSuccess(() => {\n currentState.delta = 0;\n currentState.lastPosition = this.getCameraPosition();\n currentState.targetPanel = panel;\n currentState.direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n if (destPos === currentPosition) {\n // no move\n this.nearestPanel = panel;\n this.currentPanel = panel;\n }\n\n if (axesEvent && axesEvent.setTo) {\n // freeScroll only occurs in release events\n axesEvent.setTo({ flick: destPos }, duration);\n } else {\n this.axes.setTo({ flick: destPos }, duration);\n }\n });\n\n return eventResult;\n }\n\n public moveCamera(pos: number, axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const transform = state.translate.name;\n const scrollArea = state.scrollArea;\n\n // Update position & nearestPanel\n if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) {\n pos = circulate(pos, scrollArea.prev, scrollArea.next, false);\n }\n state.position = pos;\n this.nearestPanel = this.findNearestPanel();\n const nearestPanel = this.nearestPanel;\n const originalNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n // From 0(panel position) to 1(panel position + panel size)\n // When it's on gap area value will be (val > 1 || val < 0)\n if (nearestPanel) {\n const hangerPosition = this.getHangerPosition();\n const panelPosition = nearestPanel.getPosition();\n const panelSize = nearestPanel.getSize();\n const halfGap = options.gap / 2;\n\n // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap\n state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap);\n } else {\n state.panelMaintainRatio = 0;\n }\n\n this.checkNeedPanel(axesEvent);\n\n // Possibly modified after need panel, if it's looped\n const modifiedNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n pos += (modifiedNearestPosition - originalNearestPosition);\n state.position = pos;\n\n this.updateVisiblePanels();\n\n // Offset is needed to fix camera layer size in visible-only rendering mode\n const posOffset = options.renderOnlyVisible\n ? state.positionOffset\n : 0;\n const moveVector = options.horizontal\n ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)];\n const moveCoord = moveVector.map(coord => `${Math.round(coord)}px`).join(\", \");\n\n this.cameraElement.style[transform] = state.translate.has3d\n ? `translate3d(${moveCoord}, 0px)`\n : `translate(${moveCoord})`;\n }\n\n public stopCamera = (axesEvent: any): void => {\n if (axesEvent && axesEvent.setTo) {\n axesEvent.setTo({ flick: this.state.position }, 0);\n }\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n\n public unCacheBbox(): void {\n const state = this.state;\n const options = this.options;\n\n state.cachedBbox = null;\n this.visiblePanels = [];\n\n const viewportElement = this.viewportElement;\n if (!options.horizontal) {\n // Don't preserve previous width for adaptive resizing\n viewportElement.style.width = \"\";\n } else {\n viewportElement.style.height = \"\";\n }\n state.isAdaptiveCached = false;\n this.panelBboxes = {};\n }\n\n public resize(): void {\n this.updateSize();\n this.updateOriginalPanelPositions();\n this.updateAdaptiveSize();\n this.updateScrollArea();\n this.updateClonePanels();\n this.updateVisiblePanelPositions();\n this.updateCameraPosition();\n this.updatePlugins();\n }\n\n // Find nearest anchor from current hanger position\n public findNearestPanel(): Panel | undefined {\n const state = this.state;\n const panelManager = this.panelManager;\n const hangerPosition = this.getHangerPosition();\n\n if (this.isOutOfBound()) {\n const position = state.position;\n\n return position <= state.scrollArea.prev\n ? panelManager.firstPanel()\n : panelManager.lastPanel();\n }\n\n return this.findNearestPanelAt(hangerPosition);\n }\n\n public findNearestPanelAt(position: number): Panel | undefined {\n const panelManager = this.panelManager;\n\n const allPanels = panelManager.allPanels();\n let minimumDistance = Infinity;\n let nearestPanel: Panel | undefined;\n\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const prevPosition = panel.getPosition();\n const nextPosition = prevPosition + panel.getSize();\n\n // Use shortest distance from panel's range\n const distance = isBetween(position, prevPosition, nextPosition)\n ? 0\n : Math.min(\n Math.abs(prevPosition - position),\n Math.abs(nextPosition - position),\n );\n\n if (distance > minimumDistance) {\n break;\n } else if (distance === minimumDistance) {\n const minimumAnchorDistance = Math.abs(position - nearestPanel!.getAnchorPosition());\n const anchorDistance = Math.abs(position - panel.getAnchorPosition());\n\n if (anchorDistance > minimumAnchorDistance) {\n break;\n }\n }\n\n minimumDistance = distance;\n nearestPanel = panel;\n }\n\n return nearestPanel;\n }\n\n public findNearestIdenticalPanel(panel: Panel): Panel {\n let nearest = panel;\n let shortestDistance = Infinity;\n const hangerPosition = this.getHangerPosition();\n\n const identicals = panel.getIdenticalPanels();\n identicals.forEach(identical => {\n const anchorPosition = identical.getAnchorPosition();\n const distance = Math.abs(anchorPosition - hangerPosition);\n\n if (distance < shortestDistance) {\n nearest = identical;\n shortestDistance = distance;\n }\n });\n\n return nearest;\n }\n\n // Find shortest camera position that distance is minimum\n public findShortestPositionToPanel(panel: Panel): number {\n const state = this.state;\n const options = this.options;\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = this.getHangerPosition();\n const distance = Math.abs(hangerPosition - anchorPosition);\n const scrollAreaSize = state.scrollArea.next - state.scrollArea.prev;\n\n if (!options.circular) {\n const position = anchorPosition - state.relativeHangerPosition;\n return this.canSetBoundMode()\n ? clamp(position, state.scrollArea.prev, state.scrollArea.next)\n : position;\n } else {\n // If going out of viewport border is more efficient way of moving, choose that position\n return distance <= scrollAreaSize - distance\n ? anchorPosition - state.relativeHangerPosition\n : anchorPosition > hangerPosition\n // PREV TO NEXT\n ? anchorPosition - state.relativeHangerPosition - scrollAreaSize\n // NEXT TO PREV\n : anchorPosition - state.relativeHangerPosition + scrollAreaSize;\n }\n }\n\n public findEstimatedPosition(panel: Panel): number {\n const scrollArea = this.getScrollArea();\n\n let estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition();\n estimatedPosition = this.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return estimatedPosition;\n }\n\n public addVisiblePanel(panel: Panel): void {\n if (this.getVisibleIndexOf(panel) < 0) {\n this.visiblePanels.push(panel);\n }\n }\n\n public enable(): void {\n if (!this.panInput) {\n this.createPanInput();\n }\n }\n\n public disable(): void {\n if (this.panInput) {\n this.panInput.destroy();\n this.panInput = null;\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n }\n\n public insert(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const lastIndex = this.panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const state = this.state;\n const options = this.options;\n const parsedElements = parseElement(element);\n\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const pushedIndex = this.panelManager.insert(index, panels);\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n if (!this.currentPanel) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index });\n state.checkedIndexes.forEach((indexes, idx) => {\n const [min, max] = indexes;\n if (index < min) {\n // Push checked index\n state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n }\n });\n\n this.resize();\n\n return panels;\n }\n\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const lastIndex = panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const parsedElements = parseElement(element);\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const replacedPanels = panelManager.replace(index, panels);\n\n replacedPanels.forEach(panel => {\n const visibleIndex = this.getVisibleIndexOf(panel);\n if (visibleIndex > -1) {\n this.visiblePanels.splice(visibleIndex, 1);\n }\n });\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n const currentPanel = this.currentPanel;\n const wasEmpty = !currentPanel;\n if (wasEmpty) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n } else if (isBetween(currentPanel!.getIndex(), index, index + panels.length - 1)) {\n // Current panel is replaced\n this.currentPanel = panelManager.get(currentPanel!.getIndex());\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index + panels.length - 1 });\n\n this.resize();\n\n return panels;\n }\n\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n const state = this.state;\n // Index should not below 0\n index = Math.max(index, 0);\n\n const panelManager = this.panelManager;\n const currentIndex = this.getCurrentIndex();\n\n const removedPanels = panelManager.remove(index, deleteCount);\n if (isBetween(currentIndex, index, index + deleteCount - 1)) {\n // Current panel is removed\n // Use panel at removing index - 1 as new current panel if it exists\n const newCurrentIndex = Math.max(index - 1, panelManager.getRange().min);\n this.currentPanel = panelManager.get(newCurrentIndex);\n }\n\n // Update checked indexes in infinite mode\n if (deleteCount > 0) {\n // Check whether removing index will affect checked indexes\n // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa.\n this.updateCheckedIndexes({ min: index - 1, max: index + deleteCount });\n // Uncache visible panels to refresh panels\n this.visiblePanels = [];\n }\n\n if (panelManager.getPanelCount() <= 0) {\n this.currentPanel = undefined;\n this.nearestPanel = undefined;\n }\n\n this.resize();\n\n const scrollArea = state.scrollArea;\n if (state.position < scrollArea.prev || state.position > scrollArea.next) {\n const newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false);\n this.moveCamera(newPosition);\n this.updateAxesPosition(newPosition);\n }\n\n return removedPanels;\n }\n\n public updateAdaptiveSize(): void {\n const state = this.state;\n const options = this.options;\n const horizontal = options.horizontal;\n const currentPanel = this.getCurrentPanel();\n\n if (!currentPanel) {\n return;\n }\n\n const shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached;\n const viewportStyle = this.viewportElement.style;\n if (shouldApplyAdaptive) {\n let sizeToApply: number;\n if (options.adaptive) {\n const panelBbox = currentPanel.getBbox();\n\n sizeToApply = horizontal ? panelBbox.height : panelBbox.width;\n } else {\n // Find minimum height of panels to maximum panel size\n const maximumPanelSize = this.panelManager.originalPanels().reduce((maximum, panel) => {\n const panelBbox = panel.getBbox();\n return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width);\n }, 0);\n\n sizeToApply = maximumPanelSize;\n }\n\n if (!state.isAdaptiveCached) {\n const viewportBbox = this.updateBbox();\n sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width);\n state.isAdaptiveCached = true;\n }\n\n const viewportSize = `${sizeToApply}px`;\n if (horizontal) {\n viewportStyle.height = viewportSize;\n state.cachedBbox!.height = sizeToApply;\n } else {\n viewportStyle.width = viewportSize;\n state.cachedBbox!.width = sizeToApply;\n }\n }\n }\n\n // Update camera position after resizing\n public updateCameraPosition(): void {\n const state = this.state;\n const currentPanel = this.getCurrentPanel();\n const cameraPosition = this.getCameraPosition();\n const currentState = this.stateMachine.getState();\n const isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL);\n const relativeHangerPosition = this.getRelativeHangerPosition();\n const halfGap = this.options.gap / 2;\n\n if (currentState.holding || currentState.playing) {\n this.updateVisiblePanels();\n return;\n }\n\n let newPosition: number;\n if (isFreeScroll) {\n const positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next);\n const nearestPanel = this.getNearestPanel();\n\n // Preserve camera position if it is bound to scroll area limit\n newPosition = positionBounded || !nearestPanel\n ? cameraPosition\n : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition;\n } else {\n newPosition = currentPanel\n ? currentPanel.getAnchorPosition() - relativeHangerPosition\n : cameraPosition;\n }\n\n if (this.canSetBoundMode()) {\n newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next);\n }\n\n // Pause & resume axes to prevent axes's \"change\" event triggered\n // This should be done before moveCamera, as moveCamera can trigger needPanel\n this.updateAxesPosition(newPosition);\n\n this.moveCamera(newPosition);\n }\n\n public updateBbox(): BoundingBox {\n const state = this.state;\n const options = this.options;\n const viewportElement = this.viewportElement;\n\n if (!state.cachedBbox) {\n state.cachedBbox = getBbox(viewportElement, options.useOffset);\n }\n\n return state.cachedBbox!;\n }\n\n public updatePlugins(): void {\n // update for resize\n this.plugins.forEach(plugin => {\n plugin.update && plugin.update(this.flicking);\n });\n }\n\n public destroy(option: Partial): void {\n const state = this.state;\n const wrapper = this.flicking.getElement();\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const originalPanels = this.panelManager.originalPanels();\n\n this.removePlugins(this.plugins);\n if (!option.preserveUI) {\n restoreStyle(viewportElement, state.originalViewportStyle);\n restoreStyle(cameraElement, state.originalCameraStyle);\n\n if (!state.isCameraGiven && !this.options.renderExternal) {\n const topmostElement = state.isViewportGiven\n ? viewportElement\n : wrapper;\n const deletingElement = state.isViewportGiven\n ? cameraElement\n : viewportElement;\n\n originalPanels.forEach(panel => {\n topmostElement.appendChild(panel.getElement());\n });\n\n topmostElement.removeChild(deletingElement);\n }\n }\n\n this.axes.destroy();\n this.panInput?.destroy();\n\n originalPanels.forEach(panel => { panel.destroy(option); });\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public restore(status: FlickingStatus): void {\n const panels = status.panels;\n const defaultIndex = this.options.defaultIndex;\n const cameraElement = this.cameraElement;\n const panelManager = this.panelManager;\n\n // Restore index\n cameraElement.innerHTML = panels.map(panel => panel.html).join(\"\");\n\n // Create panels first\n this.refreshPanels();\n const createdPanels = panelManager.originalPanels();\n\n // ...then order it by its index\n const orderedPanels: Panel[] = [];\n panels.forEach((panel, idx) => {\n const createdPanel = createdPanels[idx];\n createdPanel.setIndex(panel.index);\n orderedPanels[panel.index] = createdPanel;\n });\n panelManager.replacePanels(orderedPanels, []);\n panelManager.setCloneCount(0); // No clones at this point\n\n const panelCount = panelManager.getPanelCount();\n if (panelCount > 0) {\n this.currentPanel = panelManager.get(status.index)\n || panelManager.get(defaultIndex)\n || panelManager.firstPanel();\n } else {\n this.currentPanel = undefined;\n }\n this.visiblePanels = orderedPanels.filter(panel => Boolean(panel));\n\n this.resize();\n\n this.axes.setTo({ flick: status.position }, 0);\n this.moveCamera(status.position);\n }\n\n public calcVisiblePanels(): Panel[] {\n const allPanels = this.panelManager.allPanels();\n if (this.options.renderOnlyVisible) {\n const cameraPos = this.getCameraPosition();\n const viewportSize = this.getSize();\n const basePanel = this.nearestPanel!;\n\n const getNextPanel = (panel: Panel) => {\n const nextPanel = panel.nextSibling;\n\n if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) {\n return nextPanel;\n } else {\n return null;\n }\n };\n\n const getPrevPanel = (panel: Panel) => {\n const prevPanel = panel.prevSibling;\n\n if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) {\n return prevPanel;\n } else {\n return null;\n }\n };\n\n const isOutOfBoundNext = (panel: Panel) => panel.getPosition() >= cameraPos + viewportSize;\n const isOutOfBoundPrev = (panel: Panel) => panel.getPosition() + panel.getSize() <= cameraPos;\n\n const getVisiblePanels = (\n panel: Panel,\n getNext: (panel: Panel) => Panel | null,\n isOutOfViewport: (panel: Panel) => boolean,\n ): Panel[] => {\n const visiblePanels: Panel[] = [];\n\n let lastPanel = panel;\n while (true) {\n const nextPanel = getNext(lastPanel);\n if (!nextPanel || isOutOfViewport(nextPanel)) {\n break;\n }\n visiblePanels.push(nextPanel);\n lastPanel = nextPanel;\n }\n return visiblePanels;\n };\n\n const panelCount = this.panelManager.getPanelCount();\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n const nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext);\n const prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev);\n\n return [basePanel, ...nextPanels, ...prevPanels].sort((panel1, panel2) => getAbsIndex(panel1) - getAbsIndex(panel2));\n } else {\n return allPanels.filter(panel => {\n const outsetProgress = panel.getOutsetProgress();\n\n return outsetProgress > -1 && outsetProgress < 1;\n });\n }\n }\n\n public getCurrentPanel(): Panel | undefined {\n return this.currentPanel;\n }\n\n public getCurrentIndex(): number {\n const currentPanel = this.currentPanel;\n\n return currentPanel\n ? currentPanel.getIndex()\n : -1;\n }\n\n public getNearestPanel(): Panel | undefined {\n return this.nearestPanel;\n }\n\n // Get progress from nearest panel\n public getCurrentProgress(): number {\n const currentState = this.stateMachine.getState();\n let nearestPanel = currentState.playing || currentState.holding\n ? this.nearestPanel\n : this.currentPanel;\n\n const panelManager = this.panelManager;\n if (!nearestPanel) {\n // There're no panels\n return NaN;\n }\n const { prev: prevRange, next: nextRange } = this.getScrollArea();\n const cameraPosition = this.getCameraPosition();\n const isOutOfBound = this.isOutOfBound();\n let prevPanel = nearestPanel.prevSibling;\n let nextPanel = nearestPanel.nextSibling;\n let hangerPosition = this.getHangerPosition();\n let nearestAnchorPos = nearestPanel.getAnchorPosition();\n\n if (\n isOutOfBound\n && prevPanel\n && nextPanel\n && cameraPosition < nextRange\n // On the basis of anchor, prevPanel is nearestPanel.\n && (hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition)\n ) {\n nearestPanel = prevPanel;\n nextPanel = nearestPanel.nextSibling;\n prevPanel = nearestPanel.prevSibling;\n nearestAnchorPos = nearestPanel.getAnchorPosition();\n }\n const nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount();\n const nearestSize = nearestPanel.getSize();\n\n if (isOutOfBound) {\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n if (nearestAnchorPos > nextRange + relativeHangerPosition) {\n // next bounce area: hangerPosition - relativeHangerPosition - nextRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange;\n } else if (nearestAnchorPos < prevRange + relativeHangerPosition) {\n // prev bounce area: hangerPosition - relativeHangerPosition - prevRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange;\n }\n }\n const hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos;\n const gap = this.options.gap;\n\n let basePosition = nearestAnchorPos;\n let targetPosition = nearestAnchorPos;\n if (hangerIsNextToNearestPanel) {\n targetPosition = nextPanel\n ? nextPanel.getAnchorPosition()\n : nearestAnchorPos + nearestSize + gap;\n } else {\n basePosition = prevPanel\n ? prevPanel.getAnchorPosition()\n : nearestAnchorPos - nearestSize - gap;\n }\n\n const progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition);\n const startIndex = hangerIsNextToNearestPanel\n ? nearestIndex\n : prevPanel\n ? prevPanel.getIndex()\n : nearestIndex - 1;\n\n return startIndex + progressBetween;\n }\n\n // Update axes flick position without triggering event\n public updateAxesPosition(position: number) {\n const axes = this.axes;\n axes.off();\n axes.setTo({\n flick: position,\n }, 0);\n axes.on(this.axesHandlers);\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getScrollArea(): { prev: number, next: number } {\n return this.state.scrollArea;\n }\n\n public isOutOfBound(): boolean {\n const state = this.state;\n const options = this.options;\n const scrollArea = state.scrollArea;\n\n return !options.circular\n && options.bound\n && (state.position <= scrollArea.prev || state.position >= scrollArea.next);\n }\n\n public canSetBoundMode(): boolean {\n const options = this.options;\n\n return options.bound && !options.circular;\n }\n\n public getViewportElement(): HTMLElement {\n return this.viewportElement;\n }\n\n public getCameraElement(): HTMLElement {\n return this.cameraElement;\n }\n\n public getScrollAreaSize(): number {\n const scrollArea = this.state.scrollArea;\n\n return scrollArea.next - scrollArea.prev;\n }\n\n public getRelativeHangerPosition(): number {\n return this.state.relativeHangerPosition;\n }\n\n public getHangerPosition(): number {\n return this.state.position + this.state.relativeHangerPosition;\n }\n\n public getCameraPosition(): number {\n return this.state.position;\n }\n\n public getPositionOffset(): number {\n return this.state.positionOffset;\n }\n\n public getCheckedIndexes(): Array<[number, number]> {\n return this.state.checkedIndexes;\n }\n\n public getVisiblePanels(): Panel[] {\n return this.visiblePanels;\n }\n\n public setCurrentPanel(panel: Panel): void {\n this.currentPanel = panel;\n }\n\n public setLastIndex(index: number): void {\n const currentPanel = this.currentPanel;\n const panelManager = this.panelManager;\n\n panelManager.setLastIndex(index);\n if (currentPanel && currentPanel.getIndex() > index) {\n this.currentPanel = panelManager.lastPanel();\n }\n\n this.resize();\n }\n\n public setVisiblePanels(panels: Panel[]): void {\n this.visiblePanels = panels;\n }\n\n public connectAxesHandler(handlers: { [key: string]: (event: { [key: string]: any; }) => any }): void {\n const axes = this.axes;\n\n this.axesHandlers = handlers;\n axes.on(handlers);\n }\n\n public addPlugins(plugins: Plugin | Plugin[]) {\n const newPlugins = ([] as Plugin[]).concat(plugins);\n\n newPlugins.forEach(plugin => {\n plugin.init(this.flicking);\n });\n\n this.plugins = this.plugins.concat(newPlugins);\n return this;\n }\n\n public removePlugins(plugins: Plugin | Plugin[]) {\n const currentPlugins = this.plugins;\n const removedPlugins = ([] as Plugin[]).concat(plugins);\n\n removedPlugins.forEach(plugin => {\n const index = currentPlugins.indexOf(plugin);\n\n if (index > -1) {\n currentPlugins.splice(index, 1);\n }\n\n plugin.destroy(this.flicking);\n });\n return this;\n }\n\n public updateCheckedIndexes(changedRange: { min: number, max: number }): void {\n const state = this.state;\n\n let removed = 0;\n state.checkedIndexes.concat().forEach((indexes, idx) => {\n const [min, max] = indexes;\n // Can fill part of indexes in range\n if (changedRange.min <= max && changedRange.max >= min) {\n // Remove checked index from list\n state.checkedIndexes.splice(idx - removed, 1);\n removed++;\n }\n });\n }\n\n public appendUncachedPanelElements(panels: Panel[]): void {\n const options = this.options;\n const fragment = document.createDocumentFragment();\n\n if (options.isEqualSize) {\n const prevVisiblePanels = this.visiblePanels;\n const equalSizeClasses = options.isEqualSize as string[]; // for readability\n const cached: { [className: string]: boolean } = {};\n\n this.visiblePanels = [];\n\n Object.keys(this.panelBboxes).forEach(className => {\n cached[className] = true;\n });\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass && !cached[overlappedClass]) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n cached[overlappedClass] = true;\n } else if (!overlappedClass) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n }\n });\n prevVisiblePanels.forEach(panel => {\n this.addVisiblePanel(panel);\n });\n } else {\n if (!options.renderExternal) {\n panels.forEach(panel => fragment.appendChild(panel.getElement()));\n }\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n if (!options.renderExternal) {\n this.cameraElement.appendChild(fragment);\n }\n }\n\n private updateClonePanels() {\n const panelManager = this.panelManager;\n\n // Clone panels in circular mode\n if (this.options.circular && panelManager.getPanelCount() > 0) {\n this.clonePanels();\n this.updateClonedPanelPositions();\n }\n panelManager.chainAllPanels();\n }\n\n private getVisibleIndexOf(panel: Panel): number {\n return findIndex(this.visiblePanels, visiblePanel => visiblePanel === panel);\n }\n\n private build(): void {\n this.setElements();\n this.applyCSSValue();\n this.setMoveType();\n this.setAxesInstance();\n this.refreshPanels();\n this.setDefaultPanel();\n this.resize();\n this.moveToDefaultPanel();\n }\n\n private setElements(): void {\n const state = this.state;\n const options = this.options;\n const wrapper = this.flicking.getElement();\n const classPrefix = options.classPrefix;\n\n const viewportCandidate = wrapper.children[0] as HTMLElement;\n const hasViewportElement = viewportCandidate && hasClass(viewportCandidate, `${classPrefix}-viewport`);\n\n const viewportElement = hasViewportElement\n ? viewportCandidate\n : document.createElement(\"div\");\n\n const cameraCandidate = hasViewportElement\n ? viewportElement.children[0] as HTMLElement\n : wrapper.children[0] as HTMLElement;\n const hasCameraElement = cameraCandidate && hasClass(cameraCandidate, `${classPrefix}-camera`);\n\n const cameraElement = hasCameraElement\n ? cameraCandidate\n : document.createElement(\"div\");\n\n if (!hasCameraElement) {\n cameraElement.className = `${classPrefix}-camera`;\n\n const panelElements = hasViewportElement\n ? viewportElement.children\n : wrapper.children;\n\n // Make all panels to be a child of camera element\n // wrapper <- viewport <- camera <- panels[1...n]\n toArray(panelElements).forEach(child => {\n cameraElement.appendChild(child);\n });\n } else {\n state.originalCameraStyle = {\n className: cameraElement.getAttribute(\"class\"),\n style: cameraElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasViewportElement) {\n viewportElement.className = `${classPrefix}-viewport`;\n\n // Add viewport element to wrapper\n wrapper.appendChild(viewportElement);\n } else {\n state.originalViewportStyle = {\n className: viewportElement.getAttribute(\"class\"),\n style: viewportElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasCameraElement || !hasViewportElement) {\n viewportElement.appendChild(cameraElement);\n }\n\n this.viewportElement = viewportElement;\n this.cameraElement = cameraElement;\n state.isViewportGiven = hasViewportElement;\n state.isCameraGiven = hasCameraElement;\n }\n\n private applyCSSValue(): void {\n const options = this.options;\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const viewportStyle = this.viewportElement.style;\n\n // Set default css values for each element\n applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS);\n applyCSS(cameraElement, DEFAULT_CAMERA_CSS);\n\n viewportElement.style.zIndex = `${options.zIndex}`;\n if (options.horizontal) {\n viewportStyle.minHeight = \"100%\";\n viewportStyle.width = \"100%\";\n } else {\n viewportStyle.minWidth = \"100%\";\n viewportStyle.height = \"100%\";\n }\n if (options.overflow) {\n viewportStyle.overflow = \"visible\";\n }\n\n this.panelManager = new PanelManager(this.cameraElement, options);\n }\n\n private setMoveType(): void {\n const moveType = this.options.moveType as MoveTypeObjectOption;\n\n switch (moveType.type) {\n case MOVE_TYPE.SNAP:\n this.moveType = new Snap(moveType.count);\n break;\n case MOVE_TYPE.FREE_SCROLL:\n this.moveType = new FreeScroll();\n break;\n default:\n throw new Error(\"moveType is not correct!\");\n }\n }\n\n private setAxesInstance(): void {\n const state = this.state;\n const options = this.options;\n\n const scrollArea = state.scrollArea;\n\n this.axes = new Axes({\n flick: {\n range: [scrollArea.prev, scrollArea.next],\n circular: options.circular,\n bounce: [0, 0], // will be updated in resize()\n },\n }, {\n easing: options.panelEffect,\n deceleration: options.deceleration,\n interruptable: true,\n });\n\n this.createPanInput();\n }\n\n private refreshPanels(): void {\n const panelManager = this.panelManager;\n // Panel elements were attached to camera element by Flicking class\n const panelElements = this.cameraElement.children;\n\n // Initialize panels\n const panels = toArray(panelElements).map(\n (el: HTMLElement, idx: number) => new Panel(el, idx, this),\n );\n\n panelManager.replacePanels(panels, []);\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n private setDefaultPanel(): void {\n const options = this.options;\n const panelManager = this.panelManager;\n const indexRange = this.panelManager.getRange();\n const index = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n\n this.currentPanel = panelManager.get(index);\n }\n\n private clonePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n\n const gap = options.gap;\n const viewportSize = state.size;\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n // There're no panels exist\n if (!firstPanel) {\n return;\n }\n\n // For each panels, clone itself while last panel's position + size is below viewport size\n const panels = panelManager.originalPanels();\n const reversedPanels = panels.concat().reverse();\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap;\n const relativeAnchorPosition = firstPanel.getRelativeAnchorPosition();\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n const areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize;\n let sizeSum = 0;\n let panelAtLeftBoundary!: Panel;\n for (const panel of reversedPanels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaPrev) {\n panelAtLeftBoundary = panel;\n break;\n }\n }\n\n const areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize;\n sizeSum = 0;\n let panelAtRightBoundary!: Panel;\n for (const panel of panels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaNext) {\n panelAtRightBoundary = panel;\n break;\n }\n }\n\n // Need one more set of clones on prev area of original panel 0\n const needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0\n && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex();\n\n // Visible count of panel 0 on first screen\n const panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize)\n + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize)\n - 1; // duplication\n\n const cloneCount = panel0OnFirstscreen\n + (needCloneOnPrev ? 1 : 0);\n const prevCloneCount = panelManager.getCloneCount();\n\n panelManager.setCloneCount(cloneCount);\n if (options.renderExternal) {\n return;\n }\n\n if (cloneCount > prevCloneCount) {\n // should clone more\n for (let cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) {\n const clones = panels.map(origPanel => origPanel.clone(cloneIndex));\n const fragment = document.createDocumentFragment();\n clones.forEach(panel => fragment.appendChild(panel.getElement()));\n\n this.cameraElement.appendChild(fragment);\n this.visiblePanels.push(...clones.filter(clone => Boolean(clone)));\n panelManager.insertClones(cloneIndex, 0, clones);\n }\n } else if (cloneCount < prevCloneCount) {\n // should remove some\n panelManager.removeClonesAfter(cloneCount);\n }\n }\n\n private moveToDefaultPanel(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const indexRange = this.panelManager.getRange();\n\n const defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n const defaultPanel = panelManager.get(defaultIndex);\n\n let defaultPosition = 0;\n if (defaultPanel) {\n defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition;\n defaultPosition = this.canSetBoundMode()\n ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next)\n : defaultPosition;\n }\n\n this.moveCamera(defaultPosition);\n this.axes.setTo({ flick: defaultPosition }, 0);\n }\n\n private updateSize(): void {\n const state = this.state;\n const options = this.options;\n const panels = this.panelManager.originalPanels()\n .filter(panel => Boolean(panel));\n const bbox = this.updateBbox();\n\n const prevSize = state.size;\n // Update size & hanger position\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size);\n state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size);\n }\n\n if (panels.length <= 0) {\n return;\n }\n\n this.resizePanels(panels);\n }\n\n private updateOriginalPanelPositions(): void {\n const gap = this.options.gap;\n const panelManager = this.panelManager;\n\n const firstPanel = panelManager.firstPanel();\n const panels = panelManager.originalPanels();\n\n if (!firstPanel) {\n return;\n }\n\n const currentPanel = this.currentPanel!;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n const scrollArea = this.state.scrollArea;\n\n // Update panel position && fit to wrapper\n let nextPanelPos = firstPanel.getPosition();\n let maintainingPanel: Panel = firstPanel;\n if (nearestPanel) {\n // We should maintain nearestPanel's position\n const looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next);\n\n maintainingPanel = looped\n ? currentPanel\n : nearestPanel;\n } else if (firstPanel.getIndex() > 0) {\n maintainingPanel = currentPanel;\n }\n\n const panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length);\n const accumulatedSize = panelsBeforeMaintainPanel.reduce((total, panel) => {\n return total + panel.getSize() + gap;\n }, 0);\n\n nextPanelPos = maintainingPanel.getPosition() - accumulatedSize;\n\n panels.forEach(panel => {\n const newPosition = nextPanelPos;\n const panelSize = panel.getSize();\n\n panel.setPosition(newPosition);\n nextPanelPos += panelSize + gap;\n });\n\n if (!this.options.renderOnlyVisible) {\n panels.forEach(panel => panel.setPositionCSS());\n }\n }\n\n private updateClonedPanelPositions(): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const clonedPanels = panelManager.clonedPanels()\n .reduce((allClones, clones) => [...allClones, ...clones], [])\n .filter(panel => Boolean(panel));\n\n const scrollArea = state.scrollArea;\n\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n if (!firstPanel) {\n return;\n }\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Locate all cloned panels linearly first\n for (const panel of clonedPanels) {\n const origPanel = panel.getOriginalPanel();\n const cloneIndex = panel.getCloneIndex();\n const cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1);\n const clonedPanelPos = cloneBasePos + origPanel.getPosition();\n\n panel.setPosition(clonedPanelPos);\n }\n\n let lastReplacePosition = firstPanel.getPosition();\n // reverse() pollutes original array, so copy it with concat()\n for (const panel of clonedPanels.concat().reverse()) {\n const panelSize = panel.getSize();\n const replacePosition = lastReplacePosition - panelSize - options.gap;\n\n if (replacePosition + panelSize <= scrollArea.prev) {\n // Replace is not meaningful, as it won't be seen in current scroll area\n break;\n }\n\n panel.setPosition(replacePosition);\n lastReplacePosition = replacePosition;\n }\n\n if (!this.options.renderOnlyVisible) {\n clonedPanels.forEach(panel => {\n panel.setPositionCSS();\n });\n }\n }\n\n private updateVisiblePanelPositions(): void {\n if (this.options.renderOnlyVisible) {\n this.visiblePanels.forEach(panel => {\n panel.setPositionCSS(this.state.positionOffset);\n });\n }\n }\n\n private updateScrollArea(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const axes = this.axes;\n\n // Set viewport scrollable area\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel() as Panel;\n const relativeHangerPosition = state.relativeHangerPosition;\n\n if (!firstPanel) {\n state.scrollArea = {\n prev: 0,\n next: 0,\n };\n } else if (this.canSetBoundMode()) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition();\n\n if (sumOriginalPanelSize >= state.size) {\n state.scrollArea = {\n prev: firstPanel.getPosition(),\n next: lastPanel.getPosition() + lastPanel.getSize() - state.size,\n };\n } else {\n // Find anchor position of set of the combined panels\n const relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize);\n const anchorPos = firstPanel.getPosition() + clamp(\n relAnchorPosOfCombined,\n sumOriginalPanelSize - (state.size - relativeHangerPosition),\n relativeHangerPosition,\n );\n\n state.scrollArea = {\n prev: anchorPos - relativeHangerPosition,\n next: anchorPos - relativeHangerPosition,\n };\n }\n } else if (options.circular) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Maximum scroll extends to first clone sequence's first panel\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition,\n };\n } else {\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: lastPanel.getAnchorPosition() - relativeHangerPosition,\n };\n }\n\n const viewportSize = state.size;\n const bounce = options.bounce;\n\n let parsedBounce: number[];\n if (isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce as number));\n } else {\n const parsedVal = parseArithmeticExpression(bounce as number | string, viewportSize, DEFAULT_OPTIONS.bounce as number);\n parsedBounce = [parsedVal, parsedVal];\n }\n\n // Update axes range and bounce\n const flick = axes.axis.flick;\n flick.range = [state.scrollArea.prev, state.scrollArea.next];\n flick.bounce = parsedBounce;\n }\n\n private checkNeedPanel(axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentPanel = this.currentPanel;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n\n if (!options.infinite) {\n return;\n }\n\n const gap = options.gap;\n const infiniteThreshold = state.infiniteThreshold;\n const maxLastIndex = panelManager.getLastIndex();\n\n if (maxLastIndex < 0) {\n return;\n }\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: null,\n direction: null,\n indexRange: {\n min: 0,\n max: maxLastIndex,\n length: maxLastIndex + 1,\n },\n });\n return;\n }\n\n const originalNearestPosition = nearestPanel.getPosition();\n\n // Check next direction\n let checkingPanel: Panel | null = !currentState.holding && !currentState.playing\n ? currentPanel\n : nearestPanel;\n\n while (checkingPanel) {\n const currentIndex = checkingPanel.getIndex();\n const nextSibling = checkingPanel.nextSibling;\n const lastPanel = panelManager.lastPanel()!;\n const atLastPanel = currentIndex === lastPanel.getIndex();\n const nextIndex = !atLastPanel && nextSibling\n ? nextSibling.getIndex()\n : maxLastIndex + 1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition);\n const cameraNext = state.position + state.size;\n\n // There're empty panels between\n const emptyPanelExistsBetween = (nextIndex - currentIndex > 1);\n // Expected prev panel's left position is smaller than camera position\n const overThreshold = panelRight + gap - infiniteThreshold <= cameraNext;\n\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: currentIndex + 1,\n max: nextIndex - 1,\n length: nextIndex - currentIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at max panel index\n if (options.circular && currentIndex === maxLastIndex && overThreshold) {\n const firstPanel = panelManager.firstPanel();\n const firstIndex = firstPanel\n ? firstPanel.getIndex()\n : -1;\n\n if (firstIndex > 0) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: 0,\n max: firstIndex - 1,\n length: firstIndex,\n },\n });\n }\n }\n\n // Check whether panels are changed\n const lastPanelAfterNeed = panelManager.lastPanel()!;\n const atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex();\n\n if (atLastPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.nextSibling;\n }\n\n // Check prev direction\n checkingPanel = nearestPanel;\n while (checkingPanel) {\n const cameraPrev = state.position;\n const checkingIndex = checkingPanel.getIndex();\n const prevSibling = checkingPanel.prevSibling;\n const firstPanel = panelManager.firstPanel()!;\n const atFirstPanel = checkingIndex === firstPanel.getIndex();\n const prevIndex = !atFirstPanel && prevSibling\n ? prevSibling.getIndex()\n : -1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition);\n\n // There're empty panels between\n const emptyPanelExistsBetween = checkingIndex - prevIndex > 1;\n // Expected prev panel's right position is smaller than camera position\n const overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev;\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: prevIndex + 1,\n max: checkingIndex - 1,\n length: checkingIndex - prevIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at panel 0\n if (options.circular && checkingIndex === 0 && overThreshold) {\n const lastPanel = panelManager.lastPanel();\n\n if (lastPanel && lastPanel.getIndex() < maxLastIndex) {\n const lastIndex = lastPanel.getIndex();\n\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: lastIndex + 1,\n max: maxLastIndex,\n length: maxLastIndex - lastIndex,\n },\n });\n }\n }\n\n // Check whether panels were changed\n const firstPanelAfterNeed = panelManager.firstPanel();\n const atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex();\n\n // Looped in circular mode\n if (atFirstPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.prevSibling;\n }\n }\n\n private triggerNeedPanel(params: {\n axesEvent: any;\n siblingPanel: Panel | null,\n direction: FlickingEvent[\"direction\"];\n indexRange: NeedPanelEvent[\"range\"];\n }): void {\n const { axesEvent, siblingPanel, direction, indexRange } = params;\n const options = this.options;\n const checkedIndexes = this.state.checkedIndexes;\n const alreadyTriggered = checkedIndexes.some(([min, max]) => min === indexRange.min || max === indexRange.max);\n const hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL);\n\n if (alreadyTriggered || !hasHandler) {\n return;\n }\n\n // Should done before triggering event, as we can directly add panels by event callback\n checkedIndexes.push([indexRange.min, indexRange.max]);\n\n const index = siblingPanel\n ? siblingPanel.getIndex()\n : 0;\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n\n this.triggerEvent(\n EVENTS.NEED_PANEL,\n axesEvent,\n isTrusted,\n {\n index,\n panel: siblingPanel,\n direction,\n range: indexRange,\n fill: (element: ElementLike | ElementLike[]) => {\n const panelManager = this.panelManager;\n if (!siblingPanel) {\n return this.insert(panelManager.getRange().max + 1, element);\n }\n\n const parsedElements = parseElement(element);\n // Slice elements to fit size equal to empty spaces\n const elements = direction === DIRECTION.NEXT\n ? parsedElements.slice(0, indexRange.length)\n : parsedElements.slice(-indexRange.length);\n\n if (direction === DIRECTION.NEXT) {\n if (options.circular && index === panelManager.getLastIndex()) {\n // needPanel event is triggered on last index, insert at index 0\n return this.insert(0, elements);\n } else {\n return siblingPanel.insertAfter(elements);\n }\n } else if (direction === DIRECTION.PREV) {\n if (options.circular && index === 0) {\n // needPanel event is triggered on first index(0), insert at the last index\n return this.insert(indexRange.max - elements.length + 1, elements);\n } else {\n return siblingPanel.insertBefore(elements);\n }\n } else {\n // direction is null when there're no panels exist\n return this.insert(0, elements);\n }\n },\n } as Partial,\n );\n }\n\n private updateVisiblePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentState = this.stateMachine.getState();\n const cameraElement = this.cameraElement;\n const { renderExternal, renderOnlyVisible } = options;\n if (!renderOnlyVisible) {\n return;\n }\n\n if (!this.nearestPanel) {\n this.visiblePanels = [];\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n return;\n }\n\n const prevVisiblePanels = this.visiblePanels;\n const newVisiblePanels = this.calcVisiblePanels();\n\n const { addedPanels, removedPanels } = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels);\n\n if (addedPanels.length <= 0 && removedPanels.length <= 0) {\n // Visible panels not changed\n return;\n }\n\n if (currentState.holding) {\n newVisiblePanels.push(...removedPanels);\n } else {\n const firstVisiblePanelPos = newVisiblePanels[0].getPosition();\n state.positionOffset = firstVisiblePanelPos;\n }\n\n newVisiblePanels.forEach(panel => {\n panel.setPositionCSS(state.positionOffset);\n });\n\n if (!renderExternal) {\n if (!currentState.holding) {\n removedPanels.forEach(panel => {\n const panelElement = panel.getElement();\n panelElement.parentNode && cameraElement.removeChild(panelElement);\n });\n }\n\n const fragment = document.createDocumentFragment();\n addedPanels.forEach(panel => {\n fragment.appendChild(panel.getElement());\n });\n\n cameraElement.appendChild(fragment);\n }\n\n const firstVisiblePanel = newVisiblePanels[0];\n const lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1];\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount();\n\n const newVisibleRange = {\n min: getAbsIndex(firstVisiblePanel),\n max: getAbsIndex(lastVisiblePanel),\n };\n this.visiblePanels = newVisiblePanels;\n this.flicking.trigger(EVENTS.VISIBLE_CHANGE, {\n type: EVENTS.VISIBLE_CHANGE,\n range: newVisibleRange,\n });\n }\n\n private checkVisiblePanelChange(prevVisiblePanels: Panel[], newVisiblePanels: Panel[]) {\n const prevRefCount = prevVisiblePanels.map(() => 0);\n const newRefCount = newVisiblePanels.map(() => 0);\n\n prevVisiblePanels.forEach((prevPanel, prevIndex) => {\n newVisiblePanels.forEach((newPanel, newIndex) => {\n if (prevPanel === newPanel) {\n prevRefCount[prevIndex]++;\n newRefCount[newIndex]++;\n }\n });\n });\n\n const removedPanels = prevRefCount.reduce((removed: Panel[], count, index) => {\n return count === 0\n ? [...removed, prevVisiblePanels[index]]\n : removed;\n }, []);\n const addedPanels = newRefCount.reduce((added: Panel[], count, index) => {\n return count === 0\n ? [...added, newVisiblePanels[index]]\n : added;\n }, []);\n\n return { removedPanels, addedPanels };\n }\n\n private resizePanels(panels: Panel[]): void {\n const options = this.options;\n const panelBboxes = this.panelBboxes;\n\n if (options.isEqualSize === true) {\n if (!panelBboxes.default) {\n const defaultPanel = panels[0];\n panelBboxes.default = defaultPanel.getBbox();\n }\n\n const defaultBbox = panelBboxes.default;\n\n panels.forEach(panel => {\n panel.resize(defaultBbox);\n });\n return;\n } else if (options.isEqualSize) {\n const equalSizeClasses = options.isEqualSize;\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass) {\n panel.resize(panelBboxes[overlappedClass]);\n panelBboxes[overlappedClass] = panel.getBbox();\n } else {\n panel.resize();\n }\n });\n return;\n }\n panels.forEach(panel => {\n panel.resize();\n });\n }\n\n private createPanInput() {\n const options = this.options;\n\n this.panInput = new PanInput(this.viewportElement, {\n inputType: options.inputType,\n thresholdAngle: options.thresholdAngle,\n iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold,\n scale: options.horizontal ? [-1, 0] : [0, -1],\n });\n\n this.axes.connect(options.horizontal ? [\"flick\", \"\"] : [\"\", \"flick\"], this.panInput);\n }\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Component from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport Viewport from \"./components/Viewport\";\nimport Panel from \"./components/Panel\";\n\nimport { merge, getProgress, parseElement, isString, counter, findIndex } from \"./utils\";\nimport { DEFAULT_OPTIONS, EVENTS, DIRECTION, AXES_EVENTS, STATE_TYPE, DEFAULT_MOVE_TYPE_OPTIONS } from \"./consts\";\nimport {\n FlickingOptions,\n FlickingEvent,\n Direction,\n EventType,\n FlickingPanel,\n TriggerCallback,\n FlickingContext,\n FlickingStatus,\n Plugin,\n ElementLike,\n DestroyOption,\n BeforeSyncResult,\n SyncResult,\n ChangeEvent,\n SelectEvent,\n NeedPanelEvent,\n VisibleChangeEvent,\n ContentErrorEvent,\n MoveTypeStringOption,\n ValueOf,\n} from \"./types\";\n// import { sendEvent } from \"./ga/ga\";\nimport { DiffResult } from \"@egjs/list-differ\";\n\n/**\n * @memberof eg\n * @extends eg.Component\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"4.X+\"}\n * @requires {@link https://github.com/naver/egjs-component|eg.Component}\n * @requires {@link https://github.com/naver/egjs-axes|eg.Axes}\n * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/}\n */\nclass Flicking extends Component<{\n holdStart: FlickingEvent;\n holdEnd: FlickingEvent;\n moveStart: FlickingEvent;\n move: FlickingEvent;\n moveEnd: FlickingEvent;\n change: ChangeEvent;\n restore: FlickingEvent;\n select: SelectEvent;\n needPanel: NeedPanelEvent;\n visibleChange: VisibleChangeEvent;\n contentError: ContentErrorEvent;\n}> {\n /**\n * Version info string\n * @ko 버전정보 문자열\n * @example\n * eg.Flicking.VERSION; // ex) 3.0.0\n * @memberof eg.Flicking\n */\n public static VERSION: string = \"#__VERSION__#\";\n /**\n * Direction constant - \"PREV\" or \"NEXT\"\n * @ko 방향 상수 - \"PREV\" 또는 \"NEXT\"\n * @type {object}\n * @property {\"PREV\"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
\n * @property {\"NEXT\"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
\n * @example\n * eg.Flicking.DIRECTION.PREV; // \"PREV\"\n * eg.Flicking.DIRECTION.NEXT; // \"NEXT\"\n */\n public static DIRECTION: Direction = DIRECTION;\n\n /**\n * Event type object with event name strings.\n * @ko 이벤트 이름 문자열들을 담은 객체\n * @type {object}\n * @property {\"holdStart\"} HOLD_START - holdStart eventholdStart 이벤트\n * @property {\"holdEnd\"} HOLD_END - holdEnd eventholdEnd 이벤트\n * @property {\"moveStart\"} MOVE_START - moveStart eventmoveStart 이벤트\n * @property {\"move\"} MOVE - move eventmove 이벤트\n * @property {\"moveEnd\"} MOVE_END - moveEnd eventmoveEnd 이벤트\n * @property {\"change\"} CHANGE - change eventchange 이벤트\n * @property {\"restore\"} RESTORE - restore eventrestore 이벤트\n * @property {\"select\"} SELECT - select eventselect 이벤트\n * @property {\"needPanel\"} NEED_PANEL - needPanel eventneedPanel 이벤트\n * @example\n * eg.Flicking.EVENTS.MOVE_START; // \"MOVE_START\"\n */\n public static EVENTS: EventType = EVENTS;\n\n public options: FlickingOptions;\n\n private wrapper: HTMLElement;\n private viewport: Viewport;\n private contentsReadyChecker: ImReady | null = null;\n\n private eventContext: FlickingContext;\n private isPanelChangedAtBeforeSync: boolean = false;\n\n /**\n * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체\n * @param {string} [options.classPrefix=\"eg-flick\"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사.\n * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향)\n * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다.\n * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다.\n * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리.\n * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
\n * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다.\n * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다.\n * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수.\n * @param {string[]} [options.inputType=[\"touch,\"mouse\"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고})\n * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
\n * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, \"10px\", \"20%\")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, \"10px\", \"20%\")
\n * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부.\n * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부.\n * @param {number|\"\"} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값.\n * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다.\n * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다.\n * @param {string} [options.hanger=\"50%\"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {string} [options.anchor=\"50%\"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px)\n * @param {eg.Flicking.MoveTypeOption} [options.moveType=\"snap\"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll)\n * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
\n * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다.\n * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
\n * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.\n * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다.\n * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
\n * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다.\n */\n constructor(\n element: string | HTMLElement,\n options: Partial = {},\n ) {\n super();\n\n // Set flicking wrapper user provided\n let wrapper: HTMLElement | null;\n if (isString(element)) {\n wrapper = document.querySelector(element);\n if (!wrapper) {\n throw new Error(\"Base element doesn't exist.\");\n }\n } else if (element.nodeName && element.nodeType === 1) {\n wrapper = element;\n } else {\n throw new Error(\"Element should be provided in string or HTMLElement.\");\n }\n\n this.wrapper = wrapper;\n // Override default options\n this.options = merge({}, DEFAULT_OPTIONS, options) as FlickingOptions;\n // Override moveType option\n const currentOptions = this.options;\n const moveType = currentOptions.moveType as MoveTypeStringOption;\n\n if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) {\n currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType as keyof typeof DEFAULT_MOVE_TYPE_OPTIONS];\n }\n\n // Make viewport instance with panel container element\n this.viewport = new Viewport(this, this.options, this.triggerEvent);\n this.listenInput();\n this.listenResize();\n\n // if (this.options.collectStatistics) {\n // sendEvent(\n // \"usage\",\n // \"options\",\n // options,\n // );\n // }\n }\n\n /**\n * Move to the previous panel if it exists.\n * @ko 이전 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public prev(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const prevPanel = currentPanel.prev();\n if (prevPanel) {\n prevPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the next panel if it exists.\n * @ko 다음 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public next(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const nextPanel = currentPanel.next();\n if (nextPanel) {\n nextPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the panel of given index.\n * @ko 주어진 인덱스에 해당하는 패널로 이동한다.\n * @param index The index number of the panel to move.이동할 패널의 인덱스 번호.\n * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public moveTo(index: number, duration?: number): this {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n const state = viewport.stateMachine.getState();\n\n if (!panel || state.type !== STATE_TYPE.IDLE) {\n return this;\n }\n\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = viewport.getHangerPosition();\n\n let targetPanel = panel;\n if (this.options.circular) {\n const scrollAreaSize = viewport.getScrollAreaSize();\n // Check all three possible locations, find the nearest position among them.\n const possiblePositions = [\n anchorPosition - scrollAreaSize,\n anchorPosition,\n anchorPosition + scrollAreaSize,\n ];\n const nearestPosition = possiblePositions.reduce((nearest, current) => {\n return (Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition))\n ? current\n : nearest;\n }, Infinity) - panel.getRelativeAnchorPosition();\n\n const identicals = panel.getIdenticalPanels();\n const offset = nearestPosition - anchorPosition;\n if (offset > 0) {\n // First cloned panel is nearest\n targetPanel = identicals[1];\n } else if (offset < 0) {\n // Last cloned panel is nearest\n targetPanel = identicals[identicals.length - 1];\n }\n\n targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true);\n targetPanel.setPosition(nearestPosition);\n }\n const currentIndex = this.getIndex();\n\n if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) {\n return this;\n }\n\n const eventType = panel.getIndex() === viewport.getCurrentIndex()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(\n targetPanel,\n viewport.findEstimatedPosition(targetPanel),\n eventType,\n null,\n duration,\n );\n return this;\n }\n\n /**\n * Return index of the current panel. `-1` if no panel exists.\n * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다.\n * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n */\n public getIndex(): number {\n return this.viewport.getCurrentIndex();\n }\n\n /**\n * Return the wrapper element user provided in constructor.\n * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다.\n * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트.\n */\n public getElement(): HTMLElement {\n return this.wrapper;\n }\n\n /**\n * Return the viewport element's size.\n * @ko 뷰포트 엘리먼트의 크기를 반환한다.\n * @return Width if horizontal: true, height if horizontal: false\n */\n public getSize(): number {\n return this.viewport.getSize();\n }\n\n /**\n * Return current panel. `null` if no panel exists.\n * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다.\n * @return Current panel.현재 패널.\n */\n public getCurrentPanel(): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.getCurrentPanel();\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return the panel of given index. `null` if it doesn't exists.\n * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다.\n * @return Panel of given index.주어진 인덱스에 해당하는 패널.\n */\n public getPanel(index: number): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return all panels.\n * @ko 모든 패널들을 반환한다.\n * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부.\n * @return All panels.모든 패널들.\n */\n public getAllPanels(includeClone?: boolean): FlickingPanel[] {\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const panels = includeClone\n ? panelManager.allPanels()\n : panelManager.originalPanels();\n\n return panels\n .filter(panel => !!panel);\n }\n\n /**\n * Return the panels currently shown in viewport area.\n * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다.\n * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들\n */\n public getVisiblePanels(): FlickingPanel[] {\n return this.viewport.calcVisiblePanels();\n }\n\n /**\n * Return length of original panels.\n * @ko 원본 패널의 개수를 반환한다.\n * @return Length of original panels.원본 패널의 개수\n */\n public getPanelCount(): number {\n return this.viewport.panelManager.getPanelCount();\n }\n\n /**\n * Return how many groups of clones are created.\n * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다.\n * @return Length of cloned panel groups.클론된 패널 그룹의 개수\n */\n public getCloneCount(): number {\n return this.viewport.panelManager.getCloneCount();\n }\n\n /**\n * Get maximum panel index for `infinite` mode.\n * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스.\n */\n public getLastIndex(): number {\n return this.viewport.panelManager.getLastIndex();\n }\n\n /**\n * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it.\n * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다.\n * @param - Maximum panel index.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public setLastIndex(index: number): this {\n this.viewport.setLastIndex(index);\n\n return this;\n }\n\n /**\n * Return panel movement animation.\n * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다.\n * @return Is animating or not.애니메이션 진행 여부.\n */\n public isPlaying(): boolean {\n return this.viewport.stateMachine.getState().playing;\n }\n\n /**\n * Unblock input devices.\n * @ko 막았던 입력 장치로부터의 입력을 푼다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public enableInput(): this {\n this.viewport.enable();\n\n return this;\n }\n\n /**\n * Block input devices.\n * @ko 입력 장치로부터의 입력을 막는다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public disableInput(): this {\n this.viewport.disable();\n\n return this;\n }\n\n /**\n * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}.\n * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다.\n * @return An object with current status value information.현재 상태값 정보를 가진 객체.\n */\n public getStatus(): FlickingStatus {\n const viewport = this.viewport;\n\n const panels = viewport.panelManager.originalPanels()\n .filter(panel => !!panel)\n .map(panel => {\n return {\n html: panel.getElement().outerHTML,\n index: panel.getIndex(),\n };\n });\n\n return {\n index: viewport.getCurrentIndex(),\n panels,\n position: viewport.getCameraPosition(),\n };\n }\n\n /**\n * Restore to the state of the `status`.\n * @ko `status`의 상태로 복원한다.\n * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다.\n */\n public setStatus(status: FlickingStatus): void {\n this.viewport.restore(status);\n }\n\n /**\n * Add plugins that can have different effects on Flicking.\n * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다.\n * @param - The plugin(s) to add.추가할 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public addPlugins(plugins: Plugin | Plugin[]) {\n this.viewport.addPlugins(plugins);\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @ko 플리킹으로부터 플러그인들을 제거한다.\n * @param - The plugin(s) to remove.제거 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public removePlugins(plugins: Plugin | Plugin[]) {\n this.viewport.removePlugins(plugins);\n return this;\n }\n\n /**\n * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n * @example\n * const flick = new eg.Flicking(\"#flick\");\n * flick.destroy();\n * console.log(flick.moveTo); // null\n */\n public destroy(option: Partial = {}): void {\n this.off();\n\n if (this.options.autoResize) {\n window.removeEventListener(\"resize\", this.resize);\n }\n\n this.viewport.destroy(option);\n this.contentsReadyChecker?.destroy();\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n /**\n * Update panels to current state.\n * @ko 패널들을 현재 상태에 맞춰 갱신한다.\n * @method\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public resize = (): this => {\n const viewport = this.viewport;\n const options = this.options;\n const wrapper = this.getElement();\n\n const allPanels = viewport.panelManager.allPanels();\n if (!options.isConstantSize) {\n allPanels.forEach(panel => panel.unCacheBbox());\n }\n\n const shouldResetElements = options.renderOnlyVisible\n && !options.isConstantSize\n && options.isEqualSize !== true;\n\n // Temporarily set parent's height to prevent scroll (#333)\n const parent = wrapper.parentElement!;\n const origStyle = parent.style.height;\n parent.style.height = `${parent.offsetHeight}px`;\n\n viewport.unCacheBbox();\n // This should be done before adding panels, to lower performance issue\n viewport.updateBbox();\n\n if (shouldResetElements) {\n viewport.appendUncachedPanelElements(allPanels as Panel[]);\n }\n\n viewport.resize();\n parent.style.height = origStyle;\n\n return this;\n }\n\n /**\n * Add new panels at the beginning of panels.\n * @ko 제일 앞에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.replace(3, document.createElement(\"div\")); // Add new panel at index 3\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 2\n * flicking.prepend([\"\\Panel\\\", document.createElement(\"div\")]); // Prepended at index 0, 1\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 0, pushing every panels behind it.\n */\n public prepend(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n\n const insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0);\n const prependedPanels = viewport.insert(insertingIndex, parsedElements);\n\n this.checkContentsReady(prependedPanels);\n\n return prependedPanels;\n }\n\n /**\n * Add new panels at the end of panels.\n * @ko 제일 끝에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\")); // Appended at index 0\n * flicking.append(\"\\Panel\\\"); // Appended at index 1\n * flicking.append([\"\\Panel\\\", document.createElement(\"div\")]); // Appended at index 2, 3\n * // Even this is possible\n * flicking.append(\"\\Panel 1\\\\Panel 2\\\"); // Appended at index 4, 5\n */\n public append(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element);\n\n this.checkContentsReady(appendedPanels);\n\n return appendedPanels;\n }\n\n /**\n * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index.\n * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다.\n * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n *\n * // This will add new panel at index 3,\n * // Index 0, 1, 2 is empty at this moment.\n * // [empty, empty, empty, PANEL]\n * flicking.replace(3, document.createElement(\"div\"));\n *\n * // As index 2 was empty, this will also add new panel at index 2.\n * // [empty, empty, PANEL, PANEL]\n * flicking.replace(2, \"\\Panel\\\");\n *\n * // Index 3 was not empty, so it will replace previous one.\n * // It will also add new panels at index 4 and 5.\n * // before - [empty, empty, PANEL, PANEL]\n * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL]\n * flicking.replace(3, [\"\\Panel\\\", \"\\Panel\\\", \"\\Panel\\\"])\n */\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const replacedPanels = this.viewport.replace(index, element);\n\n this.checkContentsReady(replacedPanels);\n\n return replacedPanels;\n }\n\n /**\n * Remove panel at target index. This will decrease index of panels behind it.\n * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다.\n * @param index - Index of panel to remove.제거할 패널의 인덱스\n * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수.\n * @return Array of removed panels제거된 패널들의 배열\n */\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n return this.viewport.remove(index, deleteCount);\n }\n\n /**\n * Get indexes to render. Should be used with `renderOnlyVisible` option.\n * `beforeSync` should be called before this method for a correct result.\n * @private\n * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다.\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @return Array of indexes to render.렌더링할 인덱스의 배열\n */\n public getRenderingIndexes(diffResult: DiffResult): number[] {\n const viewport = this.viewport;\n const visiblePanels = viewport.getVisiblePanels();\n const maintained = diffResult.maintained.reduce((values: {[key: number]: number}, [before, after]) => {\n values[after] = before;\n return values;\n }, {});\n\n const panelCount = diffResult.list.length;\n const added = diffResult.added;\n const getPanelAbsIndex = (panel: Panel) => {\n return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n };\n\n const visibleIndexes = visiblePanels.map(panel => getPanelAbsIndex(panel))\n .filter(val => maintained[val % panelCount] != null);\n\n const renderingPanels = [...visibleIndexes, ...added];\n const allPanels = viewport.panelManager.allPanels();\n\n viewport.setVisiblePanels(renderingPanels.map(index => allPanels[index]));\n\n return renderingPanels;\n }\n\n /**\n * Synchronize info of panels instance with info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다.\n * @private\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 \n */\n public beforeSync(diffInfo: BeforeSyncResult) {\n const { maintained, added, changed, removed } = diffInfo;\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const isCircular = this.options.circular;\n const cloneCount = panelManager.getCloneCount();\n const prevClonedPanels = panelManager.clonedPanels();\n\n // Update visible panels\n const newVisiblePanels = viewport.getVisiblePanels()\n .filter(panel => findIndex(removed, index => {\n return index === panel.getIndex();\n }) < 0);\n viewport.setVisiblePanels(newVisiblePanels);\n\n // Did not changed at all\n if (\n added.length <= 0\n && removed.length <= 0\n && changed.length <= 0\n && cloneCount === prevClonedPanels.length\n ) {\n return this;\n }\n const prevOriginalPanels = panelManager.originalPanels();\n const newPanels: Panel[] = [];\n const newClones: Panel[][] = counter(cloneCount).map(() => []);\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newPanels[afterIdx] = prevOriginalPanels[beforeIdx];\n newPanels[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n newPanels[addIndex] = new Panel(null, addIndex, this.viewport);\n });\n\n if (isCircular) {\n counter(cloneCount).forEach(groupIndex => {\n const prevCloneGroup = prevClonedPanels[groupIndex];\n const newCloneGroup = newClones[groupIndex];\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newCloneGroup[afterIdx] = prevCloneGroup\n ? prevCloneGroup[beforeIdx]\n : newPanels[afterIdx].clone(groupIndex, false);\n\n newCloneGroup[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n const newPanel = newPanels[addIndex];\n\n newCloneGroup[addIndex] = newPanel.clone(groupIndex, false);\n });\n });\n }\n\n added.forEach(index => { viewport.updateCheckedIndexes({ min: index, max: index }); });\n removed.forEach(index => { viewport.updateCheckedIndexes({ min: index - 1, max: index + 1 }); });\n\n const checkedIndexes = viewport.getCheckedIndexes();\n checkedIndexes.forEach(([min, max], idx) => {\n // Push checked indexes backward\n const pushedIndex = added.filter(index => index < min && panelManager.has(index)).length\n - removed.filter(index => index < min).length;\n checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n });\n\n // Only effective only when there are least one panel which have changed its index\n if (changed.length > 0) {\n // Removed checked index by changed ones after pushing\n maintained.forEach(([, next]) => { viewport.updateCheckedIndexes({ min: next, max: next }); });\n }\n panelManager.replacePanels(newPanels, newClones);\n this.isPanelChangedAtBeforeSync = true;\n }\n\n /**\n * Synchronize info of panels with DOM info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다.\n * @private\n * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트.\n */\n public sync(diffInfo: SyncResult): this {\n const { list, maintained, added, changed, removed } = diffInfo;\n\n // Did not changed at all\n if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) {\n return this;\n }\n const viewport = this.viewport;\n const { renderOnlyVisible, circular } = this.options;\n const panelManager = viewport.panelManager;\n\n if (!renderOnlyVisible) {\n const indexRange = panelManager.getRange();\n let beforeDiffInfo: BeforeSyncResult = diffInfo;\n\n if (circular) {\n const prevOriginalPanelCount = indexRange.max;\n const originalPanelCount = (list.length / (panelManager.getCloneCount() + 1)) >> 0;\n const originalAdded = added.filter(index => index < originalPanelCount);\n const originalRemoved = removed.filter(index => index <= prevOriginalPanelCount);\n const originalMaintained = maintained.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n const originalChanged = changed.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n\n beforeDiffInfo = {\n added: originalAdded,\n maintained: originalMaintained,\n removed: originalRemoved,\n changed: originalChanged,\n };\n }\n this.beforeSync(beforeDiffInfo);\n }\n\n const visiblePanels = renderOnlyVisible\n ? viewport.getVisiblePanels()\n : this.getAllPanels(true);\n\n added.forEach(addedIndex => {\n const addedElement = list[addedIndex];\n const beforePanel = visiblePanels[addedIndex] as Panel;\n\n beforePanel.setElement(addedElement);\n // As it can be 0\n beforePanel.unCacheBbox();\n });\n if (this.isPanelChangedAtBeforeSync) {\n // Reset visible panels\n viewport.setVisiblePanels([]);\n this.isPanelChangedAtBeforeSync = false;\n }\n viewport.resize();\n\n return this;\n }\n\n private listenInput(): void {\n const flicking = this;\n const viewport = flicking.viewport;\n const stateMachine = viewport.stateMachine;\n\n // Set event context\n flicking.eventContext = {\n flicking,\n viewport: flicking.viewport,\n transitTo: stateMachine.transitTo,\n triggerEvent: flicking.triggerEvent,\n moveCamera: flicking.moveCamera,\n stopCamera: viewport.stopCamera,\n };\n\n const handlers = {};\n for (const key in AXES_EVENTS) {\n const eventType = AXES_EVENTS[key];\n\n handlers[eventType] = (e: any) => stateMachine.fire(eventType, e, flicking.eventContext);\n }\n\n // Connect Axes instance with PanInput\n flicking.viewport.connectAxesHandler(handlers);\n }\n\n private listenResize(): void {\n const options = this.options;\n\n if (options.autoResize) {\n window.addEventListener(\"resize\", this.resize);\n }\n\n if (options.resizeOnContentsReady) {\n const contentsReadyChecker = new ImReady();\n\n contentsReadyChecker.on(\"preReady\", () => {\n this.resize();\n });\n contentsReadyChecker.on(\"readyElement\", e => {\n if (e.hasLoading && e.isPreReadyOver) {\n this.resize();\n }\n });\n contentsReadyChecker.on(\"error\", e => {\n this.trigger(EVENTS.CONTENT_ERROR, {\n type: EVENTS.CONTENT_ERROR,\n element: e.element,\n });\n });\n contentsReadyChecker.check([this.wrapper]);\n\n this.contentsReadyChecker = contentsReadyChecker;\n }\n }\n\n private triggerEvent = (\n eventName: ValueOf>, // visibleChange event has no common event definition from other events\n axesEvent: any,\n isTrusted: boolean,\n params: Partial = {},\n ): TriggerCallback => {\n const viewport = this.viewport;\n\n let canceled: boolean = true;\n\n // Ignore events before viewport is initialized\n if (viewport) {\n const state = viewport.stateMachine.getState();\n const { prev, next } = viewport.getScrollArea();\n const pos = viewport.getCameraPosition();\n let progress = getProgress(pos, [prev, prev, next]);\n\n if (this.options.circular) {\n progress %= 1;\n }\n canceled = !super.trigger(eventName, merge({\n type: eventName,\n index: this.getIndex(),\n panel: this.getCurrentPanel(),\n direction: state.direction,\n holding: state.holding,\n progress,\n axesEvent,\n isTrusted,\n }, params) as FlickingEvent);\n }\n\n return {\n onSuccess(callback: () => void): TriggerCallback {\n if (!canceled) {\n callback();\n }\n return this;\n },\n onStopped(callback: () => void): TriggerCallback {\n if (canceled) {\n callback();\n }\n return this;\n },\n } as TriggerCallback;\n }\n\n // Return result of \"move\" event triggered\n private moveCamera = (axesEvent: any): TriggerCallback => {\n const viewport = this.viewport;\n const state = viewport.stateMachine.getState();\n const options = this.options;\n\n const pos = axesEvent.pos.flick;\n const previousPosition = viewport.getCameraPosition();\n\n if (axesEvent.isTrusted && state.holding) {\n const inputOffset = options.horizontal\n ? axesEvent.inputEvent.offsetX\n : axesEvent.inputEvent.offsetY;\n\n const isNextDirection = inputOffset < 0;\n\n let cameraChange = pos - previousPosition;\n const looped = isNextDirection === (pos < previousPosition);\n if (options.circular && looped) {\n // Reached at max/min range of axes\n const scrollAreaSize = viewport.getScrollAreaSize();\n cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange));\n }\n\n const currentDirection = cameraChange === 0\n ? state.direction\n : cameraChange > 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n state.direction = currentDirection;\n }\n state.delta += axesEvent.delta.flick;\n\n viewport.moveCamera(pos, axesEvent);\n return this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted)\n .onStopped(() => {\n // Undo camera movement\n viewport.moveCamera(previousPosition, axesEvent);\n });\n }\n\n private checkContentsReady(panels: FlickingPanel[]) {\n this.contentsReadyChecker?.check(panels.map(panel => panel.getElement()));\n }\n}\n\nexport default Flicking;\n","import Flicking from \"./Flicking\";\nimport { withFlickingMethods } from \"./utils\";\nimport { DEFAULT_OPTIONS, MOVE_TYPE } from \"./consts\";\n\n(Flicking as any).withFlickingMethods = withFlickingMethods;\n(Flicking as any).DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n(Flicking as any).MOVE_TYPE = MOVE_TYPE;\nexport default Flicking;\n"],"names":["MOVE_TYPE","SNAP","FREE_SCROLL","DEFAULT_MOVE_TYPE_OPTIONS","snap","type","count","freeScroll","isBrowser","document","DEFAULT_OPTIONS","classPrefix","deceleration","horizontal","circular","infinite","infiniteThreshold","lastIndex","Infinity","threshold","duration","panelEffect","x","Math","pow","defaultIndex","inputType","thresholdAngle","bounce","autoResize","adaptive","zIndex","bound","overflow","hanger","anchor","gap","moveType","useOffset","isEqualSize","isConstantSize","renderOnlyVisible","renderExternal","resizeOnContentsReady","iOSEdgeSwipeThreshold","collectStatistics","DEFAULT_VIEWPORT_CSS","position","DEFAULT_CAMERA_CSS","width","height","willChange","DEFAULT_PANEL_CSS","EVENTS","HOLD_START","HOLD_END","MOVE_START","MOVE","MOVE_END","CHANGE","RESTORE","SELECT","NEED_PANEL","VISIBLE_CHANGE","CONTENT_ERROR","AXES_EVENTS","HOLD","RELEASE","ANIMATION_END","FINISH","STATE_TYPE","IDLE","HOLDING","DRAGGING","ANIMATING","DISABLED","DIRECTION","PREV","NEXT","FLICKING_METHODS","prev","next","moveTo","getIndex","getAllPanels","getCurrentPanel","getElement","getSize","getPanel","getPanelCount","getStatus","getVisiblePanels","enableInput","disableInput","destroy","resize","setStatus","isPlaying","checkTranslateSupport","transforms","webkitTransform","msTransform","MozTransform","OTransform","transform","name","has3d","supportedStyle","documentElement","style","transformName","prefixedTransform","Error","el","createElement","insertBefore","styleVal","window","getComputedStyle","getPropertyValue","parentElement","removeChild","transformInfo","length","TRANSFORM","merge","target","_i","srcs","forEach","source","Object","keys","key","value","parseElement","element","Array","isArray","elements","isString","tempDiv","innerHTML","push","toArray","children","firstChild","addClass","className","classList","add","hasClass","replace","contains","split","indexOf","applyCSS","cssObj","property","clamp","val","min","max","isBetween","iterable","slice","call","arr","constructor","parseArithmeticExpression","cssValue","base","defaultVal","defaultValue","cssRegex","idx","calculatedValue","matchResult","exec","sign","unit","parsedValue","parseFloat","getProgress","pos","range","center","findIndex","callback","i","counter","counterArray","circulate","indexed","size","offset","restoreStyle","originalStyle","setAttribute","removeAttribute","withFlickingMethods","prototype","flickingName","args","result","_a","getBbox","bbox","y","offsetWidth","offsetHeight","clientRect","getBoundingClientRect","left","top","index","viewport","prevSibling","nextSibling","clonedPanels","state","relativeAnchorPosition","isClone","isVirtual","cloneIndex","cachedBbox","setElement","givenBbox","options","prevSize","panel","cloneState","panelCount","panelManager","scrollAreaSize","getScrollAreaSize","relativeIndex","floor","getPosition","progress","getCurrentProgress","outsetRange","getRelativeHangerPosition","getRelativeAnchorPosition","relativePanelPosition","getCameraPosition","outsetProgress","panelSize","rightRelativePanelPosition","visibleSize","visibleRatio","currentPanel","hangerPosition","getHangerPosition","anchorPosition","getAnchorPosition","currentPosition","eventType","findEstimatedPosition","updateFunction","shouldResize","identicalPanels","getIdenticalPanels","eachPanel","unCacheBbox","addVisiblePanel","currentIndex","prevPanelIndex","prevPanelPosition","prevPanelSize","hasEmptyPanelBetween","notYetMinPanel","newPosition","prevPanel","clone","getCloneIndex","setPosition","getLastIndex","nextPanelIndex","nextPanelPosition","notYetMaxPanel","nextPanel","parsedElements","firstPanel","targetIndex","insert","remove","option","preserveUI","wasVisible","Boolean","parentNode","cameraElement","getCameraElement","appendChild","classes","classes_1","original","getClonedPanels","elementStyle","currentElementStyle","styleToApply","cloneElement","cloneNode","clonedPanel","Panel","clonedState","removeClonedPanelsAfter","start","removingPanels","splice","removeElement","currentElement","getAttribute","panels","clones","cloneCount","reduce","allClones","newPanels","newClones","filter","lastPanel","firstRemovedPanel","possibleLastPanel","shouldRender","isCircular","findFirstPanelFrom","siblingElement","insertNewPanels","pushedIndex","panelsAfterIndex","emptyPanelCount","removedPanels","newLastIndex","concat","reverse","setIndex","updateIndex","addNewClones","panelCount_1","cloneSet","replacedPanels","wasNonEmptyCount","deleteCount","deletedPanels","reversedPanels","nonEmptyIndexFromLast","allPanels","allPanelsCount","newClones_1","insertTarget_1","allPanels_1","panelElement","originalPanels","getCloneCount","lastPanelClones","nextSiblingClones","cloneNextSibling","lastPanelSibling","cloneSiblingElement","nextElementSibling","map","_this","this_1","insertClones","insertingIndex","fragment_1","createDocumentFragment","prevState","delta","direction","targetPanel","lastPosition","nextState","e","context","__extends","flicking","triggerEvent","transitTo","moveCamera","onSuccess","onStopped","onChange","State","inputEvent","offsetX","offsetY","flick","setTo","releaseEvent","srcEvent","clickedElement","touchEvent","touch","changedTouches","elementFromPoint","clientX","clientY","clickedPanel","findPanelOf","cameraPosition","clickedPanelPosition","stopCamera","absDelta","abs","velocity","velocityX","velocityY","inputDelta","deltaX","deltaY","isNextDirection","swipeDistance","swipeAngle","atan","PI","belowAngleThreshold","overThreshold","moveTypeContext","axesEvent","interruptDestInfo","findPanelWhenInterrupted","destPos","nearestPanel","getNearestPanel","stop","destInfo","findTargetPanel","findRestorePanel","scrollArea","getScrollArea","loopCount","originalTargetPosition","newCloneIndex","newTargetPosition","newTargetPanel","setCurrentPanel","isTrusted","updateAdaptiveSize","updateCameraPosition","updateAxesPosition","IdleState","nextStateType","currentState","HoldingState","DraggingState","AnimatingState","DisabledState","onExit","onEnter","onHold","onRelease","onAnimationEnd","onFinish","ctx","findRestorePanelInCircularMode","halfGap","minimumDistanceToChange","originalPanel","getOriginalPanel","firstClonedPanel","lapped","_super","snapCount","eventDelta","calcBrinkOfChange","nearestIsCurrent","shouldMoveWhenBounceIs0","canSetBoundMode","shouldMoveToAdjacent","isOutOfBound","findSnappedPanel","findAdjacentPanel","estimatedHangerPos","panelToMove","cycleIndex","passedPanelCount","panelPosition","panelNextPosition","panelPrevPosition","siblingPanel","panelIndex","siblingIndex","originalPosition","defaultDuration","getCurrentIndex","get","basePanel","basePosition","adjacentPanel","targetRelativeAnchorPosition","estimatedPanelPosition","estimatedPosition","MoveType","estimatedPanel","findNearestPanelAt","stateMachine","getState","currentPanelPosition","lastHangerPosition","Snap","panelMaintainRatio","relativeHangerPosition","positionOffset","translate","checkedIndexes","isAdaptiveCached","isViewportGiven","isCameraGiven","originalViewportStyle","originalCameraStyle","StateMachine","visiblePanels","panelBboxes","build","eventResult","axes","findNearestPanel","originalNearestPosition","checkNeedPanel","modifiedNearestPosition","updateVisiblePanels","posOffset","moveVector","moveCoord","coord","round","join","viewportElement","updateSize","updateOriginalPanelPositions","updateScrollArea","updateClonePanels","updateVisiblePanelPositions","updatePlugins","minimumDistance","prevPosition","nextPosition","distance","minimumAnchorDistance","anchorDistance","nearest","shortestDistance","identicals","identical","getVisibleIndexOf","panInput","createPanInput","resizePanels","newCenterPanel","newPanelPosition","updateCheckedIndexes","indexes","visibleIndex","wasEmpty","newCurrentIndex","getRange","undefined","shouldApplyAdaptive","viewportStyle","sizeToApply","panelBbox","maximumPanelSize","maximum","viewportBbox","updateBbox","viewportSize","isFreeScroll","is","holding","playing","positionBounded","plugins","plugin","update","wrapper","removePlugins","topmostElement_1","deletingElement","status","html","refreshPanels","createdPanels","orderedPanels","createdPanel","replacePanels","setCloneCount","cameraPos_1","viewportSize_1","getNextPanel","getPrevPanel","isOutOfBoundNext","isOutOfBoundPrev","getNext","isOutOfViewport","getAbsIndex_1","nextPanels","prevPanels","__spreadArrays","sort","panel1","panel2","getOutsetProgress","NaN","prevRange","nextRange","nearestAnchorPos","nearestIndex","nearestSize","hangerIsNextToNearestPanel","targetPosition","progressBetween","startIndex","off","on","axesHandlers","setLastIndex","handlers","newPlugins","init","currentPlugins","removedPlugins","changedRange","removed","fragment","prevVisiblePanels","equalSizeClasses_1","cached_1","overlappedClass","getOverlappedClass","clonePanels","updateClonedPanelPositions","chainAllPanels","visiblePanel","setElements","applyCSSValue","setMoveType","setAxesInstance","setDefaultPanel","moveToDefaultPanel","viewportCandidate","hasViewportElement","cameraCandidate","hasCameraElement","panelElements","child","minHeight","minWidth","PanelManager","FreeScroll","Axes","easing","interruptable","indexRange","sumOriginalPanelSize","areaPrev","sizeSum","panelAtLeftBoundary","reversedPanels_1","areaNext","panelAtRightBoundary","panels_1","needCloneOnPrev","panel0OnFirstscreen","ceil","prevCloneCount","origPanel","removeClonesAfter","defaultPanel","defaultPosition","nextPanelPos","maintainingPanel","looped","panelsBeforeMaintainPanel","accumulatedSize","total","setPositionCSS","clonedPanels_1","cloneBasePos","clonedPanelPos","lastReplacePosition","_b","replacePosition","relAnchorPosOfCombined","anchorPos","parsedBounce","parsedVal","axis","maxLastIndex","triggerNeedPanel","checkingPanel","atLastPanel","nextIndex","currentNearestPosition","panelRight","cameraNext","emptyPanelExistsBetween","firstIndex","lastPanelAfterNeed","atLastPanelAfterNeed","cameraPrev","checkingIndex","atFirstPanel","prevIndex","panelLeft","firstPanelAfterNeed","atFirstPanelAfterNeed","params","alreadyTriggered","some","hasHandler","hasOn","fill","insertAfter","newVisiblePanels","calcVisiblePanels","checkVisiblePanelChange","addedPanels","firstVisiblePanelPos","firstVisiblePanel","lastVisiblePanel","getAbsIndex","newVisibleRange","trigger","prevRefCount","newRefCount","newPanel","newIndex","added","default","defaultBbox_1","equalSizeClasses_2","PanInput","scale","connect","shouldResetElements","parent","origStyle","appendUncachedPanelElements","eventName","canceled","previousPosition","inputOffset","cameraChange","currentDirection","querySelector","nodeName","nodeType","currentOptions","Viewport","listenInput","listenResize","focus","possiblePositions","nearestPosition","current","includeClone","enable","disable","outerHTML","restore","addPlugins","removeEventListener","contentsReadyChecker","prependedPanels","checkContentsReady","appendedPanels","diffResult","maintained","values","before","after","list","getPanelAbsIndex","visibleIndexes","renderingPanels","setVisiblePanels","diffInfo","changed","prevClonedPanels","prevOriginalPanels","beforeIdx","afterIdx","addIndex","groupIndex","prevCloneGroup","newCloneGroup","getCheckedIndexes","has","isPanelChangedAtBeforeSync","beforeDiffInfo","prevOriginalPanelCount_1","originalPanelCount_1","originalAdded","originalRemoved","originalMaintained","originalChanged","beforeSync","addedIndex","addedElement","beforePanel","eventContext","fire","connectAxesHandler","addEventListener","ImReady","hasLoading","isPreReadyOver","check","Flicking","Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"} \ No newline at end of file diff --git a/dist/flicking.pkgd.min.js b/dist/flicking.pkgd.min.js new file mode 100644 index 0000000000..933d19bf87 --- /dev/null +++ b/dist/flicking.pkgd.min.js @@ -0,0 +1,10 @@ +/* +Copyright (c) 2015-present NAVER Corp. +name: @egjs/flicking +license: MIT +author: NAVER Corp. +repository: https://github.com/naver/egjs-flicking +version: 3.7.2 +*/ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):((t=t||self).eg=t.eg||{},t.eg.Flicking=e())}(this,function(){"use strict";var i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function r(t,e){function n(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}function P(){for(var t=0,e=0,n=arguments.length;e=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}(s),u=l.next();!u.done;u=l.next()){if(u.value===e){s.splice(a,1);break}a++}}catch(t){n={error:t}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(n)throw n.error}}}return this},t.VERSION="2.2.2",t}(),o=function(t,e){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,e)};function s(t,e){function n(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var l=function(){return(l=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=F(e)?t<0?lt:ut:e<0?ht:ct}function Tt(t,e,n){return{x:e/t||0,y:n/t||0}}function At(t,e){var n=t.session,i=e.pointers,r=i.length;n.firstInput||(n.firstInput=bt(e)),1F(O.y)?O.x:O.y,e.scale=d?(g=d.pointers,wt((v=i)[0],v[1],vt)/wt(g[0],g[1],vt)):1,e.rotation=d?(m=d.pointers,St((P=i)[1],P[0],vt)+St(m[1],m[0],vt)):0,e.maxPointers=!n.prevInput||e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers,x=e,A=(y=n).lastInterval||x,R=x.timeStamp-A.timeStamp,x.eventType!==st&&(itF(b.y)?b.x:b.y,T=It(E,C),y.lastInterval=x):(I=A.velocity,w=A.velocityX,S=A.velocityY,T=A.direction),x.velocity=I,x.velocityX=w,x.velocityY=S,x.direction=T;var M=t.element,z=e.srcEvent,k=z.composedPath?z.composedPath()[0]:z.path?z.path[0]:z.target;Et(k,M)&&(M=k),e.target=M}function Rt(t,e,n){var i=n.pointers.length,r=n.changedPointers.length,o=e&rt&&i-r==0,s=e&(ot|st)&&i-r==0;n.isFirst=!!o,n.isFinal=!!s,o&&(t.session={}),n.eventType=e,At(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function Ot(t){return t.trim().split(/\s+/g)}function Mt(e,t,n){mt(Ot(t),function(t){e.addEventListener(t,n,!1)})}function zt(e,t,n){mt(Ot(t),function(t){e.removeEventListener(t,n,!1)})}function kt(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||window}var Nt=function(){function t(e,t){var n=this;this.manager=e,this.callback=t,this.element=e.element,this.target=e.options.inputTarget,this.domHandler=function(t){Pt(e.options.enable,[e])&&n.handler(t)},this.init()}var e=t.prototype;return e.handler=function(){},e.init=function(){this.evEl&&Mt(this.element,this.evEl,this.domHandler),this.evTarget&&Mt(this.target,this.evTarget,this.domHandler),this.evWin&&Mt(kt(this.element),this.evWin,this.domHandler)},e.destroy=function(){this.evEl&&zt(this.element,this.evEl,this.domHandler),this.evTarget&&zt(this.target,this.evTarget,this.domHandler),this.evWin&&zt(kt(this.element),this.evWin,this.domHandler)},t}();function _t(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;ie[n]}):i.sort()),i}(i.concat(a),"identifier",!0),a]:void 0}.call(this,t,e);n&&this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:et,srcEvent:t})},n}(Nt);var qt={mousedown:rt,mousemove:2,mouseup:ot},Wt="mousedown",Gt="mousemove mouseup",Ut=function(n){function i(){var t,e=i.prototype;return e.evEl=Wt,e.evWin=Gt,(t=n.apply(this,arguments)||this).pressed=!1,t}return k(i,n),i.prototype.handler=function(t){var e=qt[t.type];e&rt&&0===t.button&&(this.pressed=!0),2&e&&1!==t.which&&(e=ot),this.pressed&&(e&ot&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:nt,srcEvent:t}))},i}(Nt),Qt=2500,Zt=25;function Jt(t){var e,n,i=t.changedPointers[0];i.identifier===this.primaryTouch&&(e={x:i.clientX,y:i.clientY},n=this.lastTouches,this.lastTouches.push(e),setTimeout(function(){var t=n.indexOf(e);-1e.threshold&&r&e.direction},e.attrTest=function(t){return re.prototype.attrTest.call(this,t)&&(2&this.state||!(2&this.state)&&this.directionTest(t))},e.emit=function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e,n=(e=t.direction)===ct?"down":e===ht?"up":e===lt?"left":e===ut?"right":"";n&&(t.additionalEvent=this.options.event+n),i.prototype.emit.call(this,t)},t}(re),se={domEvents:!1,touchAction:W,enable:!0,inputTarget:null,inputClass:null,cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};function ae(n,i){var r,o=n.element;o.style&&(mt(n.options.cssProps,function(t,e){r=X(o.style,e),i?(n.oldCssProps[r]=o.style[r],o.style[r]=t):o.style[r]=n.oldCssProps[r]||""}),i||(n.oldCssProps={}))}var le=function(){function t(t,e){var n,i,r=this;this.options=D({},se,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=(i=(n=this).options.inputClass,new(i||($?Bt:tt?Yt:K?Kt:Ut))(n,Rt)),this.touchAction=new xt(this,this.options.touchAction),ae(this,!0),mt(this.options.recognizers,function(t){var e=r.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}var e=t.prototype;return e.set=function(t){return D(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},e.stop=function(t){this.session.stopped=t?2:1},e.recognize=function(t){var e,n=this.session;if(!n.stopped){this.touchAction.preventDefaults(t);var i=this.recognizers,r=n.curRecognizer;(!r||r&&8&r.state)&&(r=n.curRecognizer=null);for(var o=0;oe[1]}function Ie(t,e,n){return n[1]&&t>e[1]||n[0]&&t=n[e]-1e-6&&t<=n[e]+1e-6?n[e]:Le(t,i.getRoundUnit(t,e))})},e.getRoundUnit=function(t,e){var n,i,r=this.options.round,o=null;return r||(n=this.axm.getAxisOptions(e),i=Math.max(Be(n.range[0]),Be(n.range[1]),Be(t)),o=1/Math.pow(10,i)),o||r},e.getUserControll=function(t){var e=t.setTo();return e.destPos=this.axm.get(e.destPos),e.duration=Fe(e.duration,this.options.minimumDuration,this.options.maximumDuration),e},e.animateTo=function(t,e,n){var i,r=this,o=this.createAnimationParam(t,e,n),s=be({},o.depaPos),a=this.em.triggerAnimationStart(o),l=this.getUserControll(o);!a&&this.axm.every(l.destPos,function(t,e){return Ie(t,e.range,e.circular)})&&console.warn("You can't stop the 'animation' event when 'circular' is true."),a&&!De(l.destPos,s)&&(i=n&&n.event||null,this.animateLoop({depaPos:s,destPos:l.destPos,duration:l.duration,delta:this.axm.getDelta(s,l.destPos),isTrusted:!!i,inputEvent:i,input:n&&n.input||null},function(){return r.animationEnd()}))},e.easing=function(t){return 1]*)>/)?((i=document.createElement("div")).innerHTML=t,Ae(i.childNodes)):Ae(document.querySelectorAll(t)),n||(r=1<=r.length?r[0]:void 0)):t===Ce||t.nodeName&&(1===t.nodeType||9===t.nodeType)?r=t:"jQuery"in Ce&&t instanceof jQuery||t.constructor.prototype.jquery?r=n?t.toArray():t.get(0):Array.isArray(t)&&(r=t.map(function(t){return e(t)}),n||(r=1<=r.length?r[0]:void 0)),r}(t),this.options=be({inputType:["touch","mouse","pointer"],scale:[1,1],thresholdAngle:45,threshold:0,iOSEdgeSwipeThreshold:30,hammerManagerOptions:{cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",userDrag:"none"}}},e),this.onHammerInput=this.onHammerInput.bind(this),this.onPanmove=this.onPanmove.bind(this),this.onPanend=this.onPanend.bind(this)}var e=t.prototype;return e.mapAxes=function(t){var e=!!t[0],n=!!t[1];this._direction=e&&n?pt:e?dt:n?ft:at,this.axes=t},e.connect=function(t){var e={direction:this._direction,threshold:this.options.threshold};if(this.hammer)this.removeRecognizer(),this.dettachEvent();else{var n=(n=this.element[un])||String(Math.round(Math.random()*(new Date).getTime())),i=function(t){void 0===t&&(t=[]);var e=!1,n=!1,i=!1;return t.forEach(function(t){switch(t){case"mouse":n=!0;break;case"touch":e=ln;break;case"pointer":i=an}}),i?Bt:e&&n?Kt:e?Yt:n?Ut:null}(this.options.inputType);if(!i)throw new Error("Wrong inputType parameter!");this.hammer=function(t,e){try{return new le(t,be({},e))}catch(t){return null}}(this.element,be({inputClass:i},this.options.hammerManagerOptions)),this.element[un]=n}return this.panRecognizer=new oe(e),this.hammer.add(this.panRecognizer),this.attachEvent(t),this},e.disconnect=function(){return this.removeRecognizer(),this.hammer&&this.dettachEvent(),this._direction=at,this},e.destroy=function(){this.disconnect(),this.hammer&&0===this.hammer.recognizers.length&&this.hammer.destroy(),delete this.element[un],this.element=null,this.hammer=null},e.enable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!0),this},e.disable=function(){return this.hammer&&(this.hammer.get("pan").options.enable=!1),this},e.isEnable=function(){return!(!this.hammer||!this.hammer.get("pan").options.enable)},e.removeRecognizer=function(){this.hammer&&this.panRecognizer&&(this.hammer.remove(this.panRecognizer),this.panRecognizer=null)},e.onHammerInput=function(t){var e;this.isEnable()&&(t.isFirst?(this.panFlag=!1)!==t.srcEvent.cancelable&&(e=this.options.iOSEdgeSwipeThreshold,this.observer.hold(this,t),this.isRightEdge=rn&&t.center.x>window.innerWidth-e,this.panFlag=!0):t.isFinal&&this.onPanend(t))},e.onPanmove=function(t){var e=this;if(this.panFlag){var n,i=function(t,e){if(e<0||90t&&(n=this.panels.splice(t+1),this.length-=n.length,(i=n.filter(function(t){return!!t})[0].prevSibling)?e.max=i.getIndex():(e.min=-1,e.max=-1),this.shouldRender()&&n.forEach(function(t){return t.removeElement()})))},e.setCloneCount=function(t){this.cloneCount=t},e.insert=function(n,t){var i=this.panels,e=this.range,r=this.options.circular,o=this.lastIndex,s=this.findFirstPanelFrom(n),a=this.firstPanel(),l=s?s.getElement():r&&a?a.getClonedPanels()[0].getElement():null;this.insertNewPanels(t,l);var u,h,c,d,f,p,g=t.length;return n>e.max?t.forEach(function(t,e){i[n+e]=t}):((h=Fn(u=i.slice(n,n+t.length),function(t){return t}))<0&&(h=u.length),g=t.length-h,i.splice.apply(i,P([n,h],t)),i.length>o+1&&(c=i.splice(o+1).filter(function(t){return Boolean(t)}),this.length-=c.length,d=o-Fn(this.panels.concat().reverse(),function(t){return t}),this.panels.splice(1+d),this.range.max=d,this.shouldRender()&&c.forEach(function(t){return t.removeElement()}))),0o+1&&f.forEach(function(t){t.splice(p)})),g},e.replace=function(t,e){var n=this.panels,i=this.range,r=this.options.circular,o=this.findFirstPanelFrom(t+e.length),s=this.firstPanel(),a=o?o.getElement():r&&s?s.getClonedPanels()[0].getElement():null;this.insertNewPanels(e,a),t>i.max&&(n[t]=null);var l=n.splice.apply(n,P([t,e.length],e)),u=l.filter(function(t){return Boolean(t)}).length;return this.length+=e.length-u,this.updateIndex(t),r&&this.addNewClones(t,e,e.length,o),this.shouldRender()&&l.forEach(function(t){return t&&t.removeElement()}),l},e.remove=function(e,n){void 0===n&&(n=1);var t=this.options.circular,i=this.panels,r=this.clones;n=Math.max(n,0);var o=i.splice(e,n).filter(function(t){return!!t});this.shouldRender()&&o.forEach(function(t){return t.removeElement()}),t&&r.forEach(function(t){t.splice(e,n)}),i.slice(e).forEach(function(t){t.setIndex(t.getIndex()-n)});var s,a=i.length-1;return i[a]||(s=Fn(i.concat().reverse(),function(t){return t}),a=s<0?-1:a-s,i.splice(a+1),t&&r.forEach(function(t){t.splice(a+1)})),this.range={min:Fn(i,function(t){return t}),max:a},this.length-=o.length,this.length<=0&&(this.clones=[],this.cloneCount=0),o},e.chainAllPanels=function(){var t,e,r=this.allPanels().filter(function(t){return!!t}),n=r.length;n<=1||(r.slice(1,r.length-1).forEach(function(t,e){var n=r[e],i=r[e+2];t.prevSibling=n,t.nextSibling=i}),t=r[0],e=r[n-1],t.prevSibling=null,t.nextSibling=r[1],e.prevSibling=r[n-2],e.nextSibling=null,this.options.circular&&((t.prevSibling=e).nextSibling=t))},e.insertClones=function(t,n,e,i){void 0===i&&(i=0);var r,o,s=this.clones,a=this.lastIndex;s[t]?(r=s[t],n>=r.length?e.forEach(function(t,e){r[n+e]=t}):(r.splice.apply(r,P([n,i],e)),e.length>a+1&&e.splice(a+1))):(o=[],e.forEach(function(t,e){o[n+e]=t}),s[t]=o)},e.removeClonesAfter=function(e){this.panels.forEach(function(t){t.removeClonedPanelsAfter(e)}),this.clones.splice(e)},e.findPanelOf=function(t){for(var e=0,n=this.allPanels();e=t&&i.getElement().parentNode)return i}},e.addNewClones=function(o,s,a,t){for(var l=this,u=this.cameraElement,e=this.getCloneCount(),n=this.lastPanel(),h=n?n.getClonedPanels():[],c=t?t.getClonedPanels():[],d=this,i=0,r=jn(e);in.max&&(n.max=i),(tu.thresholdAngle,y=v>=u.threshold&&P,x={viewport:i,axesEvent:t,state:this,swipeDistance:v,isNextDirection:g};r(xn.HOLD_END,t,!0);var E=this.targetPanel;if(!y&&E){var C=c.findPanelWhenInterrupted(x);return i.moveTo(C.panel,C.destPos,C.eventType,t,C.duration),void o(Sn)}var b=i.getCurrentPanel(),w=i.getNearestPanel();if(!b||!w)return t.stop(),void o(Cn);var S=y?c.findTargetPanel(x):c.findRestorePanel(x);i.moveTo(S.panel,S.destPos,S.eventType,t,S.duration).onSuccess(function(){o(Sn)}).onStopped(function(){o(In),s(t)})},t}(Un),Kn=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.type=Sn,t.holding=!1,t.playing=!0,t}r(t,e);var n=t.prototype;return n.onHold=function(t,e){var n,i,r,o,s,a=e.viewport,l=e.triggerEvent,u=e.transitTo,h=a.options,c=a.getScrollArea(),d=a.getScrollAreaSize(),f=Math.floor((this.lastPosition+this.delta-c.prev)/d),p=this.targetPanel;h.circular&&0!==f&&p&&(n=a.panelManager.getCloneCount(),i=p.getPosition(),r=Xn(p.getCloneIndex()-f,-1,n-1,!0),o=i-f*d,(s=p.getIdenticalPanels()[r+1].clone(r,!0)).setPosition(o),this.targetPanel=s),this.delta=0,this.lastPosition=a.getCameraPosition(),a.setCurrentPanel(a.getNearestPanel()),l(xn.HOLD_START,t,!0).onSuccess(function(){u(wn)}).onStopped(function(){u(In)})},n.onChange=function(t,e){var n=e.moveCamera,i=e.transitTo;t.delta.flick&&n(t).onStopped(function(){i(In)})},n.onFinish=function(t,e){var n=e.flicking,i=e.viewport,r=e.triggerEvent,o=e.transitTo,s=t&&t.isTrusted;i.options.bound?i.setCurrentPanel(this.targetPanel):i.setCurrentPanel(i.getNearestPanel()),n.options.adaptive&&i.updateAdaptiveSize(),o(Cn),i.updateCameraPosition(),r(xn.MOVE_END,t,s,{direction:this.direction})},t}(Un),$n=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.type=In,t.holding=!1,t.playing=!0,t}r(t,e);var n=t.prototype;return n.onAnimationEnd=function(t,e){(0,e.transitTo)(Cn)},n.onChange=function(t,e){var n=e.viewport,i=e.transitTo;t.stop(),n.updateAxesPosition(n.getCameraPosition()),i(Cn)},n.onRelease=function(t,e){var n=e.transitTo;0===t.delta.flick&&n(Cn)},t}(Un),ti=function(){function t(){var i=this;this.state=new Qn,this.transitTo=function(t){var e=i.state;if(e.type!==t){var n=void 0;switch(t){case Cn:n=new Qn;break;case bn:n=new Zn;break;case wn:n=new Jn;break;case Sn:n=new Kn;break;case In:n=new $n}e.onExit(n),n.onEnter(e),i.state=n}return i.state}}var e=t.prototype;return e.fire=function(t,e,n){var i=this.state;switch(t){case En.HOLD:i.onHold(e,n);break;case En.CHANGE:i.onChange(e,n);break;case En.RELEASE:i.onRelease(e,n);break;case En.ANIMATION_END:i.onAnimationEnd(e,n);break;case En.FINISH:i.onFinish(e,n)}},e.getState=function(){return this.state},t}(),ei=function(n){function t(t){var e=n.call(this)||this;return e.type=fn.SNAP,e.count=t,e}r(t,n);var e=t.prototype;return e.findTargetPanel=function(t){var e=t.viewport,n=t.axesEvent,i=t.swipeDistance,r=this.count,o=Math.abs(n.delta.flick),s=e.getCurrentPanel(),a=e.getNearestPanel(),l=this.calcBrinkOfChange(t),u=a.getIndex()===s.getIndex(),h=e.canSetBoundMode()&&u,c=!e.isOutOfBound()&&(i<=l||h);return 1s?xn.CHANGE:xn.RESTORE}},e.findAdjacentPanel=function(t){var e=t.viewport,n=t.isNextDirection,i=e.options,r=e.getCurrentIndex(),o=e.panelManager.get(r),s=e.getHangerPosition(),a=e.getScrollArea(),l=o.getIdenticalPanels()[1],u=i.circular&&Math.abs(o.getAnchorPosition()-s)>Math.abs(l.getAnchorPosition()-s)?l:o,h=u.getPosition(),c=n?u.nextSibling:u.prevSibling,d=c?xn.CHANGE:xn.RESTORE,f=c||u,p=f.getRelativeAnchorPosition(),g=(i.circular?n?h+u.getSize()+p+i.gap:h-(f.getSize()-p)-i.gap:f.getAnchorPosition())-e.getRelativeHangerPosition();return{panel:f,destPos:e.canSetBoundMode()?Dn(g,a.prev,a.next):g,duration:i.duration,eventType:d}},t}(function(){function t(){}var e=t.prototype;return e.is=function(t){return t===this.type},e.findRestorePanel=function(t){var e=t.viewport,n=e.options,i=n.circular?this.findRestorePanelInCircularMode(t):e.getCurrentPanel();return{panel:i,destPos:e.findEstimatedPosition(i),duration:n.duration,eventType:xn.RESTORE}},e.findPanelWhenInterrupted=function(t){var e=t.state,n=t.viewport,i=e.targetPanel;return{panel:i,destPos:n.findEstimatedPosition(i),duration:n.options.duration,eventType:""}},e.calcBrinkOfChange=function(t){var e=t.viewport,n=t.isNextDirection,i=e.options,r=e.getCurrentPanel(),o=i.gap/2,s=r.getRelativeAnchorPosition(),a=n?r.getSize()-s+o:s+o;return a=Math.max(a,i.threshold)},e.findRestorePanelInCircularMode=function(t){var e=t.viewport,n=e.getCurrentPanel().getOriginalPanel(),i=e.getHangerPosition(),r=n.getIdenticalPanels()[1],o=Math.abs(n.getAnchorPosition()-i)>Math.abs(r.getAnchorPosition()-i);return!t.isNextDirection&&o?r:n},t}()),ni=function(c){function t(){var t=c.call(this,1/0)||this;return t.type=fn.FREE_SCROLL,t}r(t,c);var e=t.prototype;return e.findTargetPanel=function(t){var e=t.axesEvent,n=t.state,i=t.viewport,r=e.destPos.flick,o=this.calcBrinkOfChange(t),s=i.getScrollArea(),a=i.getCurrentPanel(),l=i.options;if(ol.next)&&(a=Xn(n.position,l.prev,l.next,!1),this.moveCamera(a),this.updateAxesPosition(a)),s},e.updateAdaptiveSize=function(){var t,e,n,i,r,o,s=this.state,a=this.options,l=a.horizontal,u=this.getCurrentPanel();u&&(t=a.adaptive||!s.isAdaptiveCached,e=this.viewportElement.style,t&&(i=void 0,i=a.adaptive?(n=u.getBbox(),l?n.height:n.width):this.panelManager.originalPanels().reduce(function(t,e){var n=e.getBbox();return Math.max(t,l?n.height:n.width)},0),s.isAdaptiveCached||(r=this.updateBbox(),i=Math.max(i,l?r.height:r.width),s.isAdaptiveCached=!0),o=i+"px",l?(e.height=o,s.cachedBbox.height=i):(e.width=o,s.cachedBbox.width=i)))},e.updateCameraPosition=function(){var t,e,n,i=this.state,r=this.getCurrentPanel(),o=this.getCameraPosition(),s=this.stateMachine.getState(),a=this.moveType.is(fn.FREE_SCROLL),l=this.getRelativeHangerPosition(),u=this.options.gap/2;s.holding||s.playing?this.updateVisiblePanels():(n=a?(t=this.canSetBoundMode()&&(o===i.scrollArea.prev||o===i.scrollArea.next),e=this.getNearestPanel(),t||!e?o:e.getPosition()-u+(e.getSize()+2*u)*i.panelMaintainRatio-l):r?r.getAnchorPosition()-l:o,this.canSetBoundMode()&&(n=Dn(n,i.scrollArea.prev,i.scrollArea.next)),this.updateAxesPosition(n),this.moveCamera(n))},e.updateBbox=function(){var t=this.state,e=this.options,n=this.viewportElement;return t.cachedBbox||(t.cachedBbox=qn(n,e.useOffset)),t.cachedBbox},e.updatePlugins=function(){var e=this;this.plugins.forEach(function(t){t.update&&t.update(e.flicking)})},e.destroy=function(e){var t,n,i,r=this.state,o=this.flicking.getElement(),s=this.viewportElement,a=this.cameraElement,l=this.panelManager.originalPanels();for(var u in this.removePlugins(this.plugins),e.preserveUI||(Yn(s,r.originalViewportStyle),Yn(a,r.originalCameraStyle),r.isCameraGiven||this.options.renderExternal||(n=r.isViewportGiven?s:o,i=r.isViewportGiven?a:s,l.forEach(function(t){n.appendChild(t.getElement())}),n.removeChild(i))),this.axes.destroy(),null!==(t=this.panInput)&&void 0!==t&&t.destroy(),l.forEach(function(t){t.destroy(e)}),this)this[u]=null},e.restore=function(t){var e=t.panels,n=this.options.defaultIndex,i=this.cameraElement,r=this.panelManager;i.innerHTML=e.map(function(t){return t.html}).join(""),this.refreshPanels();var o=r.originalPanels(),s=[];e.forEach(function(t,e){var n=o[e];n.setIndex(t.index),s[t.index]=n}),r.replacePanels(s,[]),r.setCloneCount(0);var a=r.getPanelCount();this.currentPanel=0=t.getPosition()?e:null},function(t){return t.getPosition()>=e+n}),r(i,function(t){var e=t.prevSibling;return e&&e.getPosition()<=t.getPosition()?e:null},function(t){return t.getPosition()+t.getSize()<=e})).sort(function(t,e){return s(t)-s(e)})}return t.filter(function(t){var e=t.getOutsetProgress();return-1=n.next)},e.canSetBoundMode=function(){var t=this.options;return t.bound&&!t.circular},e.getViewportElement=function(){return this.viewportElement},e.getCameraElement=function(){return this.cameraElement},e.getScrollAreaSize=function(){var t=this.state.scrollArea;return t.next-t.prev},e.getRelativeHangerPosition=function(){return this.state.relativeHangerPosition},e.getHangerPosition=function(){return this.state.position+this.state.relativeHangerPosition},e.getCameraPosition=function(){return this.state.position},e.getPositionOffset=function(){return this.state.positionOffset},e.getCheckedIndexes=function(){return this.state.checkedIndexes},e.getVisiblePanels=function(){return this.visiblePanels},e.setCurrentPanel=function(t){this.currentPanel=t},e.setLastIndex=function(t){var e=this.currentPanel,n=this.panelManager;n.setLastIndex(t),e&&e.getIndex()>t&&(this.currentPanel=n.lastPanel()),this.resize()},e.setVisiblePanels=function(t){this.visiblePanels=t},e.connectAxesHandler=function(t){var e=this.axes;this.axesHandlers=t,e.on(t)},e.addPlugins=function(t){var e=this,n=[].concat(t);return n.forEach(function(t){t.init(e.flicking)}),this.plugins=this.plugins.concat(n),this},e.removePlugins=function(t){var n=this,i=this.plugins;return[].concat(t).forEach(function(t){var e=i.indexOf(t);-1=n&&(o.checkedIndexes.splice(e-s,1),s++)})},e.appendUncachedPanelElements=function(t){var e,n,i,r=this,o=this.options,s=document.createDocumentFragment();o.isEqualSize?(e=this.visiblePanels,n=o.isEqualSize,i={},this.visiblePanels=[],Object.keys(this.panelBboxes).forEach(function(t){i[t]=!0}),t.forEach(function(t){var e=t.getOverlappedClass(n);e&&!i[e]?(o.renderExternal||s.appendChild(t.getElement()),r.visiblePanels.push(t),i[e]=!0):e||(o.renderExternal||s.appendChild(t.getElement()),r.visiblePanels.push(t))}),e.forEach(function(t){r.addVisiblePanel(t)})):(o.renderExternal||t.forEach(function(t){return s.appendChild(t.getElement())}),this.visiblePanels=t.filter(function(t){return Boolean(t)})),o.renderExternal||this.cameraElement.appendChild(s)},e.updateClonePanels=function(){var t=this.panelManager;this.options.circular&&0=i.size?i.scrollArea={prev:a.getPosition(),next:l.getPosition()+l.getSize()-i.size}:(t=Vn(o.anchor,n),e=a.getPosition()+Dn(t,n-(i.size-u),u),i.scrollArea={prev:e-u,next:e-u}):o.circular?(n=l.getPosition()+l.getSize()-a.getPosition()+o.gap,i.scrollArea={prev:a.getAnchorPosition()-u,next:n+a.getAnchorPosition()-u}):i.scrollArea={prev:a.getAnchorPosition()-u,next:l.getAnchorPosition()-u}:i.scrollArea={prev:0,next:0};var h,c,d,f=i.size,p=o.bounce;c=(d=p)&&d.constructor===Array?p.map(function(t){return Vn(t,f,vn.bounce)}):[h=Vn(p,f,vn.bounce),h];var g=s.axis.flick;g.range=[i.scrollArea.prev,i.scrollArea.next],g.bounce=c},e.checkNeedPanel=function(t){var e=this.state,n=this.options,i=this.panelManager,r=this.currentPanel,o=this.nearestPanel,s=this.stateMachine.getState();if(n.infinite){var a=n.gap,l=e.infiniteThreshold,u=i.getLastIndex();if(!(u<0))if(r&&o){for(var h=o.getPosition(),c=s.holding||s.playing?o:r;c;){var d,f=c.getIndex(),p=c.nextSibling,g=!(f===(x=i.lastPanel()).getIndex())&&p?p.getIndex():u+1,v=o.getPosition(),m=c.getPosition()+c.getSize()-(v-h)+a-l<=e.position+e.size;1>0,u=n.filter(function(t){return t = {\n classPrefix: \"eg-flick\",\n deceleration: 0.0075,\n horizontal: true,\n circular: false,\n infinite: false,\n infiniteThreshold: 0,\n lastIndex: Infinity,\n threshold: 40,\n duration: 100,\n panelEffect: x => 1 - Math.pow(1 - x, 3),\n defaultIndex: 0,\n inputType: [\"touch\", \"mouse\"],\n thresholdAngle: 45,\n bounce: 10,\n autoResize: false,\n adaptive: false,\n zIndex: 2000,\n bound: false,\n overflow: false,\n hanger: \"50%\",\n anchor: \"50%\",\n gap: 0,\n moveType: DEFAULT_MOVE_TYPE_OPTIONS.snap,\n useOffset: false,\n isEqualSize: false,\n isConstantSize: false,\n renderOnlyVisible: false,\n renderExternal: false,\n resizeOnContentsReady: false,\n iOSEdgeSwipeThreshold: 30,\n collectStatistics: true,\n};\n\nexport const DEFAULT_VIEWPORT_CSS = {\n position: \"relative\",\n zIndex: DEFAULT_OPTIONS.zIndex,\n overflow: \"hidden\",\n};\n\nexport const DEFAULT_CAMERA_CSS = {\n width: \"100%\",\n height: \"100%\",\n willChange: \"transform\",\n};\n\nexport const DEFAULT_PANEL_CSS = {\n position: \"absolute\",\n};\n\nexport const EVENTS: EventType = {\n HOLD_START: \"holdStart\",\n HOLD_END: \"holdEnd\",\n MOVE_START: \"moveStart\",\n MOVE: \"move\",\n MOVE_END: \"moveEnd\",\n CHANGE: \"change\",\n RESTORE: \"restore\",\n SELECT: \"select\",\n NEED_PANEL: \"needPanel\",\n VISIBLE_CHANGE: \"visibleChange\",\n CONTENT_ERROR: \"contentError\",\n};\n\nexport const AXES_EVENTS: AxesEventType = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\",\n};\n\nexport const STATE_TYPE: StateType = {\n IDLE: 0,\n HOLDING: 1,\n DRAGGING: 2,\n ANIMATING: 3,\n DISABLED: 4,\n};\n\nexport const DIRECTION: Direction = {\n PREV: \"PREV\",\n NEXT: \"NEXT\",\n};\nexport const FLICKING_METHODS: {[key in FlickingMethodsKeys]: true} = {\n prev: true,\n next: true,\n moveTo: true,\n getIndex: true,\n getAllPanels: true,\n getCurrentPanel: true,\n getElement: true,\n getSize: true,\n getPanel: true,\n getPanelCount: true,\n getStatus: true,\n getVisiblePanels: true,\n enableInput: true,\n disableInput: true,\n destroy: true,\n resize: true,\n setStatus: true,\n isPlaying: true,\n};\n\n// Check whether browser supports transform: translate3d\n// https://stackoverflow.com/questions/5661671/detecting-transform-translate3d-support\nexport let checkTranslateSupport = () => {\n const transforms = {\n webkitTransform: \"-webkit-transform\",\n msTransform: \"-ms-transform\",\n MozTransform: \"-moz-transform\",\n OTransform: \"-o-transform\",\n transform: \"transform\",\n };\n\n if (!isBrowser) {\n return {\n name: transforms.transform,\n has3d: true,\n };\n }\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform in transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new Error(\"Browser doesn't support CSS3 2D Transforms.\");\n }\n\n const el = document.createElement(\"div\");\n\n document.documentElement.insertBefore(el, null);\n\n el.style[transformName] = \"translate3d(1px, 1px, 1px)\";\n const styleVal = window.getComputedStyle(el).getPropertyValue(transforms[transformName]);\n\n el.parentElement!.removeChild(el);\n\n const transformInfo = {\n name: transformName,\n has3d: styleVal.length > 0 && styleVal !== \"none\",\n };\n\n checkTranslateSupport = () => transformInfo;\n\n return transformInfo;\n};\n\nexport const TRANSFORM = checkTranslateSupport();\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ElementLike, OriginalStyle, BoundingBox } from \"./types\";\nimport Flicking from \"./Flicking\";\nimport { FLICKING_METHODS } from \"./consts\";\n\nexport function merge(target: object, ...srcs: object[]): object {\n srcs.forEach(source => {\n Object.keys(source).forEach(key => {\n const value = source[key];\n target[key] = value;\n });\n });\n\n return target;\n}\n\nexport function parseElement(element: ElementLike | ElementLike[]): HTMLElement[] {\n if (!Array.isArray(element)) {\n element = [element];\n }\n\n const elements: HTMLElement[] = [];\n element.forEach(el => {\n if (isString(el)) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = el;\n\n elements.push(...toArray(tempDiv.children) as HTMLElement[]);\n while (tempDiv.firstChild) {\n tempDiv.removeChild(tempDiv.firstChild);\n }\n } else {\n elements.push(el as HTMLElement);\n }\n });\n\n return elements;\n}\n\nexport function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\n// Get class list of element as string array\nexport function classList(element: HTMLElement): string[] {\n return element.classList\n ? toArray(element.classList)\n : element.className.split(\" \");\n}\n\n// Add class to specified element\nexport function addClass(element: HTMLElement, className: string): void {\n if (element.classList) {\n element.classList.add(className);\n } else {\n if (!hasClass(element, className)) {\n element.className = (`${element.className} ${className}`).replace(/\\s{2,}/g, \" \");\n }\n }\n}\n\nexport function hasClass(element: HTMLElement, className: string): boolean {\n if (element.classList) {\n return element.classList.contains(className);\n } else {\n return (element.className.split(\" \").indexOf(className) >= 0);\n }\n}\n\nexport function applyCSS(element: HTMLElement, cssObj: object): void {\n Object.keys(cssObj).forEach(property => {\n element.style[property] = cssObj[property];\n });\n}\n\nexport function clamp(val: number, min: number, max: number) {\n return Math.max(Math.min(val, max), min);\n}\n\n// Min: inclusive, Max: exclusive\nexport function isBetween(val: number, min: number, max: number) {\n return val >= min && val <= max;\n}\n\nexport interface ArrayLike {\n length: number;\n [index: number]: T;\n}\n\nexport function toArray(iterable: ArrayLike): T[] {\n return [].slice.call(iterable);\n}\n\nexport function isArray(arr: any): boolean {\n return arr && arr.constructor === Array;\n}\n\nexport function parseArithmeticExpression(cssValue: number | string, base: number, defaultVal?: number): number {\n // Set base / 2 to default value, if it's undefined\n const defaultValue = defaultVal != null ? defaultVal : base / 2;\n const cssRegex = /(?:(\\+|\\-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return clamp(cssValue, 0, base);\n }\n\n let idx = 0;\n let calculatedValue = 0;\n let matchResult = cssRegex.exec(cssValue);\n while (matchResult != null) {\n let sign = matchResult[1];\n const value = matchResult[2];\n const unit = matchResult[3];\n\n let parsedValue = parseFloat(value);\n\n if (idx <= 0) {\n sign = sign || \"+\";\n }\n\n // Return default value for values not in good form\n if (!sign) {\n return defaultValue;\n }\n\n if (unit === \"%\") {\n parsedValue = (parsedValue / 100) * base;\n }\n\n calculatedValue += sign === \"+\"\n ? parsedValue\n : -parsedValue;\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return defaultValue;\n }\n\n // Clamp between 0 ~ base\n return clamp(calculatedValue, 0, base);\n}\n\nexport function getProgress(pos: number, range: number[]) {\n // start, anchor, end\n // -1 , 0 , 1\n const [min, center, max] = range;\n\n if (pos > center && (max - center)) {\n // 0 ~ 1\n return (pos - center) / (max - center);\n } else if (pos < center && (center - min)) {\n // -1 ~ 0\n return (pos - center) / (center - min);\n } else if (pos !== center && max - min) {\n return (pos - min) / (max - min);\n }\n return 0;\n}\n\nexport function findIndex(iterable: T[], callback: (el: T) => boolean): number {\n for (let i = 0; i < iterable.length; i += 1) {\n const element = iterable[i];\n if (element && callback(element)) {\n return i;\n }\n }\n\n return -1;\n}\n\n// return [0, 1, ...., max - 1]\nexport function counter(max: number): number[] {\n const counterArray: number[] = [];\n for (let i = 0; i < max; i += 1) {\n counterArray[i] = i;\n }\n return counterArray;\n}\n\n// Circulate number between range [min, max]\n/*\n * \"indexed\" means min and max is not same, so if it's true \"min - 1\" should be max\n * While if it's false, \"min - 1\" should be \"max - 1\"\n * use `indexed: true` when it should be used for circulating integers like index\n * or `indexed: false` when it should be used for something like positions.\n */\nexport function circulate(value: number, min: number, max: number, indexed: boolean): number {\n const size = indexed\n ? max - min + 1\n : max - min;\n if (value < min) {\n const offset = indexed\n ? (min - value - 1) % size\n : (min - value) % size;\n value = max - offset;\n } else if (value > max) {\n const offset = indexed\n ? (value - max - 1) % size\n : (value - max) % size;\n value = min + offset;\n }\n\n return value;\n}\n\nexport function restoreStyle(element: HTMLElement, originalStyle: OriginalStyle): void {\n originalStyle.className\n ? element.setAttribute(\"class\", originalStyle.className)\n : element.removeAttribute(\"class\");\n originalStyle.style\n ? element.setAttribute(\"style\", originalStyle.style)\n : element.removeAttribute(\"style\");\n}\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @ko 프레임워크에서 플리킹의 메소드를 사용할 수 있게 하는 데코레이터.\n * @memberof eg.Flicking\n * @private\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nexport function withFlickingMethods(prototype: any, flickingName: string) {\n Object.keys(FLICKING_METHODS).forEach((name: keyof Flicking) => {\n if (prototype[name]) {\n return;\n }\n prototype[name] = function(...args) {\n const result = this[flickingName][name](...args);\n\n // fix `this` type to return your own `flicking` instance to the instance using the decorator.\n if (result === this[flickingName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n}\n\nexport function getBbox(element: HTMLElement, useOffset: boolean) {\n let bbox: BoundingBox;\n if (useOffset) {\n bbox = {\n x: 0,\n y: 0,\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n } else {\n const clientRect = element.getBoundingClientRect();\n bbox = {\n x: clientRect.left,\n y: clientRect.top,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n return bbox;\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Viewport from \"./Viewport\";\nimport { OriginalStyle, FlickingPanel, ElementLike, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_PANEL_CSS, EVENTS } from \"../consts\";\nimport { addClass, applyCSS, parseArithmeticExpression, parseElement, getProgress, restoreStyle, hasClass, getBbox } from \"../utils\";\n\nclass Panel implements FlickingPanel {\n public viewport: Viewport;\n public prevSibling: Panel | null;\n public nextSibling: Panel | null;\n\n protected state: {\n index: number;\n position: number;\n relativeAnchorPosition: number;\n size: number;\n isClone: boolean;\n isVirtual: boolean;\n // Index of cloned panel, zero-based integer(original: -1, cloned: [0, 1, 2, ...])\n // if cloneIndex is 0, that means it's first cloned panel of original panel\n cloneIndex: number;\n originalStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n private element: HTMLElement;\n private original?: Panel;\n private clonedPanels: Panel[];\n\n public constructor(\n element?: HTMLElement | null,\n index?: number,\n viewport?: Viewport,\n ) {\n this.viewport = viewport!;\n this.prevSibling = null;\n this.nextSibling = null;\n this.clonedPanels = [];\n\n this.state = {\n index: index!,\n position: 0,\n relativeAnchorPosition: 0,\n size: 0,\n isClone: false,\n isVirtual: false,\n cloneIndex: -1,\n originalStyle: {\n className: \"\",\n style: \"\",\n },\n cachedBbox: null,\n };\n this.setElement(element);\n }\n\n public resize(givenBbox?: BoundingBox): void {\n const state = this.state;\n const options = this.viewport.options;\n const bbox = givenBbox\n ? givenBbox\n : this.getBbox();\n this.state.cachedBbox = bbox;\n const prevSize = state.size;\n\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeAnchorPosition = parseArithmeticExpression(options.anchor, state.size);\n }\n\n if (!state.isClone) {\n this.clonedPanels.forEach(panel => {\n const cloneState = panel.state;\n\n cloneState.size = state.size;\n cloneState.cachedBbox = state.cachedBbox;\n cloneState.relativeAnchorPosition = state.relativeAnchorPosition;\n });\n }\n }\n\n public unCacheBbox(): void {\n this.state.cachedBbox = null;\n }\n\n public getProgress() {\n const viewport = this.viewport;\n const options = viewport.options;\n const panelCount = viewport.panelManager.getPanelCount();\n const scrollAreaSize = viewport.getScrollAreaSize();\n\n const relativeIndex = (options.circular ? Math.floor(this.getPosition() / scrollAreaSize) * panelCount : 0) + this.getIndex();\n const progress = relativeIndex - viewport.getCurrentProgress();\n\n return progress;\n }\n\n public getOutsetProgress() {\n const viewport = this.viewport;\n const outsetRange = [\n -this.getSize(),\n viewport.getRelativeHangerPosition() - this.getRelativeAnchorPosition(),\n viewport.getSize(),\n ];\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const outsetProgress = getProgress(relativePanelPosition, outsetRange);\n\n return outsetProgress;\n }\n\n public getVisibleRatio() {\n const viewport = this.viewport;\n const panelSize = this.getSize();\n const relativePanelPosition = this.getPosition() - viewport.getCameraPosition();\n const rightRelativePanelPosition = relativePanelPosition + panelSize;\n\n const visibleSize = Math.min(viewport.getSize(), rightRelativePanelPosition) - Math.max(relativePanelPosition, 0);\n const visibleRatio = visibleSize >= 0\n ? visibleSize / panelSize\n : 0;\n\n return visibleRatio;\n }\n\n public focus(duration?: number): void {\n const viewport = this.viewport;\n const currentPanel = viewport.getCurrentPanel();\n const hangerPosition = viewport.getHangerPosition();\n const anchorPosition = this.getAnchorPosition();\n if (hangerPosition === anchorPosition || !currentPanel) {\n return;\n }\n\n const currentPosition = currentPanel.getPosition();\n const eventType = currentPosition === this.getPosition()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(this, viewport.findEstimatedPosition(this), eventType, null, duration);\n }\n\n public update(updateFunction: ((element: HTMLElement) => any) | null = null, shouldResize: boolean = true): void {\n const identicalPanels = this.getIdenticalPanels();\n\n if (updateFunction) {\n identicalPanels.forEach(eachPanel => {\n updateFunction(eachPanel.getElement());\n });\n }\n\n if (shouldResize) {\n identicalPanels.forEach(eachPanel => {\n eachPanel.unCacheBbox();\n });\n this.viewport.addVisiblePanel(this);\n this.viewport.resize();\n }\n }\n\n public prev(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const prevSibling = this.prevSibling;\n\n if (!prevSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const prevPanelIndex = prevSibling.getIndex();\n const prevPanelPosition = prevSibling.getPosition();\n const prevPanelSize = prevSibling.getSize();\n\n const hasEmptyPanelBetween = currentIndex - prevPanelIndex > 1;\n const notYetMinPanel = options.infinite\n && currentIndex > 0\n && prevPanelIndex > currentIndex;\n\n if (hasEmptyPanelBetween || notYetMinPanel) {\n // Empty panel exists between\n return null;\n }\n\n const newPosition = currentPosition - prevPanelSize - options.gap;\n\n let prevPanel = prevSibling;\n if (prevPanelPosition !== newPosition) {\n prevPanel = prevSibling.clone(prevSibling.getCloneIndex(), true);\n prevPanel.setPosition(newPosition);\n }\n\n return prevPanel;\n }\n\n public next(): FlickingPanel | null {\n const viewport = this.viewport;\n const options = viewport.options;\n const nextSibling = this.nextSibling;\n const lastIndex = viewport.panelManager.getLastIndex();\n\n if (!nextSibling) {\n return null;\n }\n\n const currentIndex = this.getIndex();\n const currentPosition = this.getPosition();\n const nextPanelIndex = nextSibling.getIndex();\n const nextPanelPosition = nextSibling.getPosition();\n\n const hasEmptyPanelBetween = nextPanelIndex - currentIndex > 1;\n const notYetMaxPanel = options.infinite\n && currentIndex < lastIndex\n && nextPanelIndex < currentIndex;\n\n if (hasEmptyPanelBetween || notYetMaxPanel) {\n return null;\n }\n\n const newPosition = currentPosition + this.getSize() + options.gap;\n\n let nextPanel = nextSibling;\n if (nextPanelPosition !== newPosition) {\n nextPanel = nextSibling.clone(nextSibling.getCloneIndex(), true);\n nextPanel.setPosition(newPosition);\n }\n\n return nextPanel;\n }\n\n public insertBefore(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n const firstPanel = viewport.panelManager.firstPanel()!;\n const prevSibling = this.prevSibling;\n // Finding correct inserting index\n // While it should insert removing empty spaces,\n // It also should have to be bigger than prevSibling' s index\n const targetIndex = prevSibling && firstPanel.getIndex() !== this.getIndex()\n ? Math.max(prevSibling.getIndex() + 1, this.getIndex() - parsedElements.length)\n : Math.max(this.getIndex() - parsedElements.length, 0);\n\n return viewport.insert(targetIndex, parsedElements);\n }\n\n public insertAfter(element: ElementLike | ElementLike[]): FlickingPanel[] {\n return this.viewport.insert(this.getIndex() + 1, element);\n }\n\n public remove(): FlickingPanel {\n this.viewport.remove(this.getIndex());\n\n return this;\n }\n\n public destroy(option: Partial): void {\n if (!option.preserveUI) {\n const originalStyle = this.state.originalStyle;\n\n restoreStyle(this.element, originalStyle);\n }\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public getElement(): HTMLElement {\n return this.element;\n }\n\n public getAnchorPosition(): number {\n return this.state.position + this.state.relativeAnchorPosition;\n }\n\n public getRelativeAnchorPosition(): number {\n return this.state.relativeAnchorPosition;\n }\n\n public getIndex(): number {\n return this.state.index;\n }\n\n public getPosition(): number {\n return this.state.position;\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getBbox(): BoundingBox {\n const state = this.state;\n const viewport = this.viewport;\n const element = this.element;\n const options = viewport.options;\n\n if (!element) {\n state.cachedBbox = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n } else if (!state.cachedBbox) {\n const wasVisible = Boolean(element.parentNode);\n const cameraElement = viewport.getCameraElement();\n if (!wasVisible) {\n cameraElement.appendChild(element);\n viewport.addVisiblePanel(this);\n }\n state.cachedBbox = getBbox(element, options.useOffset);\n\n if (!wasVisible && viewport.options.renderExternal) {\n cameraElement.removeChild(element);\n }\n }\n return state.cachedBbox!;\n }\n\n public isClone(): boolean {\n return this.state.isClone;\n }\n\n public getOverlappedClass(classes: string[]): string | undefined {\n const element = this.element;\n\n for (const className of classes) {\n if (hasClass(element, className)) {\n return className;\n }\n }\n }\n\n public getCloneIndex(): number {\n return this.state.cloneIndex;\n }\n\n public getClonedPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getClonedPanels()\n : this.clonedPanels;\n }\n\n public getIdenticalPanels(): Panel[] {\n const state = this.state;\n\n return state.isClone\n ? this.original!.getIdenticalPanels()\n : [this, ...this.clonedPanels];\n }\n\n public getOriginalPanel(): Panel {\n return this.state.isClone\n ? this.original!\n : this;\n }\n\n public setIndex(index: number): void {\n const state = this.state;\n\n state.index = index;\n this.clonedPanels.forEach(panel => panel.state.index = index);\n }\n\n public setPosition(pos: number): this {\n this.state.position = pos;\n\n return this;\n }\n\n public setPositionCSS(offset: number = 0): void {\n if (!this.element) {\n return;\n }\n const state = this.state;\n const pos = state.position;\n const options = this.viewport.options;\n const elementStyle = this.element.style;\n const currentElementStyle = options.horizontal\n ? elementStyle.left\n : elementStyle.top;\n const styleToApply = `${pos - offset}px`;\n\n if (!state.isVirtual && currentElementStyle !== styleToApply) {\n options.horizontal\n ? elementStyle.left = styleToApply\n : elementStyle.top = styleToApply;\n }\n }\n\n public clone(cloneIndex: number, isVirtual: boolean = false, element?: HTMLElement | null): Panel {\n const state = this.state;\n const viewport = this.viewport;\n let cloneElement = element;\n\n if (!cloneElement && this.element) {\n cloneElement = isVirtual ? this.element : this.element.cloneNode(true) as HTMLElement;\n }\n const clonedPanel = new Panel(cloneElement, state.index, viewport);\n const clonedState = clonedPanel.state;\n\n clonedPanel.original = state.isClone\n ? this.original\n : this;\n clonedState.isClone = true;\n clonedState.isVirtual = isVirtual;\n clonedState.cloneIndex = cloneIndex;\n // Inherit some state values\n clonedState.size = state.size;\n clonedState.relativeAnchorPosition = state.relativeAnchorPosition;\n clonedState.originalStyle = state.originalStyle;\n clonedState.cachedBbox = state.cachedBbox;\n\n if (!isVirtual) {\n this.clonedPanels.push(clonedPanel);\n } else {\n clonedPanel.prevSibling = this.prevSibling;\n clonedPanel.nextSibling = this.nextSibling;\n }\n\n return clonedPanel;\n }\n\n public removeElement(): void {\n if (!this.viewport.options.renderExternal) {\n const element = this.element;\n element.parentNode && element.parentNode.removeChild(element);\n }\n\n // Do the same thing for clones\n if (!this.state.isClone) {\n this.removeClonedPanelsAfter(0);\n }\n }\n\n public removeClonedPanelsAfter(start: number): void {\n const options = this.viewport.options;\n const removingPanels = this.clonedPanels.splice(start);\n\n if (!options.renderExternal) {\n removingPanels.forEach(panel => {\n panel.removeElement();\n });\n }\n }\n\n public setElement(element?: HTMLElement | null): void {\n if (!element) {\n return;\n }\n const currentElement = this.element;\n if (element !== currentElement) {\n const options = this.viewport.options;\n\n if (currentElement) {\n if (options.horizontal) {\n element.style.left = currentElement.style.left;\n } else {\n element.style.top = currentElement.style.top;\n }\n } else {\n const originalStyle = this.state.originalStyle;\n\n originalStyle.className = element.getAttribute(\"class\");\n originalStyle.style = element.getAttribute(\"style\");\n }\n\n this.element = element;\n\n if (options.classPrefix) {\n addClass(element, `${options.classPrefix}-panel`);\n }\n\n // Update size info after applying panel css\n applyCSS(this.element, DEFAULT_PANEL_CSS);\n }\n }\n}\n\nexport default Panel;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"./Panel\";\nimport { FlickingOptions } from \"../types\";\nimport { findIndex, counter } from \"../utils\";\n\nclass PanelManager {\n private cameraElement: HTMLElement;\n private options: FlickingOptions;\n private panels: Panel[];\n private clones: Panel[][];\n // index range of existing panels\n private range: {\n min: number;\n max: number;\n };\n private length: number;\n private lastIndex: number;\n private cloneCount: number;\n\n constructor(\n cameraElement: HTMLElement,\n options: FlickingOptions,\n ) {\n this.cameraElement = cameraElement;\n this.panels = [];\n this.clones = [];\n this.range = {\n min: -1,\n max: -1,\n };\n this.length = 0;\n this.cloneCount = 0;\n this.options = options;\n this.lastIndex = options.lastIndex;\n }\n\n public firstPanel(): Panel | undefined {\n return this.panels[this.range.min];\n }\n\n public lastPanel(): Panel | undefined {\n return this.panels[this.range.max];\n }\n\n public allPanels(): ReadonlyArray {\n return [\n ...this.panels,\n ...this.clones.reduce((allClones, clones) => [...allClones, ...clones], []),\n ];\n }\n\n public originalPanels(): ReadonlyArray {\n return this.panels;\n }\n\n public clonedPanels(): ReadonlyArray {\n return this.clones;\n }\n\n public replacePanels(newPanels: Panel[], newClones: Panel[][]): void {\n this.panels = newPanels;\n this.clones = newClones;\n\n this.range = {\n min: findIndex(newPanels, panel => Boolean(panel)),\n max: newPanels.length - 1,\n };\n this.length = newPanels.filter(panel => Boolean(panel)).length;\n }\n\n public has(index: number): boolean {\n return !!this.panels[index];\n }\n\n public get(index: number): Panel | undefined {\n return this.panels[index];\n }\n\n public getPanelCount(): number {\n return this.length;\n }\n\n public getLastIndex(): number {\n return this.lastIndex;\n }\n\n public getRange(): Readonly<{ min: number, max: number }> {\n return this.range;\n }\n\n public getCloneCount(): number {\n return this.cloneCount;\n }\n\n public setLastIndex(lastIndex: number): void {\n this.lastIndex = lastIndex;\n\n const firstPanel = this.firstPanel();\n const lastPanel = this.lastPanel();\n\n if (!firstPanel || !lastPanel) {\n return; // no meaning of updating range & length\n }\n\n // Remove panels above new last index\n const range = this.range;\n if (lastPanel.getIndex() > lastIndex) {\n const removingPanels = this.panels.splice(lastIndex + 1);\n this.length -= removingPanels.length;\n\n const firstRemovedPanel = removingPanels.filter(panel => !!panel)[0];\n const possibleLastPanel = firstRemovedPanel.prevSibling;\n if (possibleLastPanel) {\n range.max = possibleLastPanel.getIndex();\n } else {\n range.min = -1;\n range.max = -1;\n }\n\n if (this.shouldRender()) {\n removingPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n public setCloneCount(cloneCount: number): void {\n this.cloneCount = cloneCount;\n }\n\n // Insert at index\n // Returns pushed elements from index, inserting at 'empty' position doesn't push elements behind it\n public insert(index: number, newPanels: Panel[]): number {\n const panels = this.panels;\n const range = this.range;\n const isCircular = this.options.circular;\n const lastIndex = this.lastIndex;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n let pushedIndex = newPanels.length;\n // Like when setting index 50 while visible panels are 0, 1, 2\n if (index > range.max) {\n newPanels.forEach((panel, offset) => {\n panels[index + offset] = panel;\n });\n } else {\n const panelsAfterIndex = panels.slice(index, index + newPanels.length);\n // Find empty from beginning\n let emptyPanelCount = findIndex(panelsAfterIndex, panel => !!panel);\n if (emptyPanelCount < 0) {\n // All empty\n emptyPanelCount = panelsAfterIndex.length;\n }\n pushedIndex = newPanels.length - emptyPanelCount;\n\n // Insert removing empty panels\n panels.splice(index, emptyPanelCount, ...newPanels);\n\n // Remove panels after last index\n if (panels.length > lastIndex + 1) {\n const removedPanels = panels.splice(lastIndex + 1)\n .filter(panel => Boolean(panel));\n this.length -= removedPanels.length;\n\n // Find first\n const newLastIndex = lastIndex - findIndex(this.panels.concat().reverse(), panel => !!panel);\n\n // Can be filled with empty after newLastIndex\n this.panels.splice(newLastIndex + 1);\n this.range.max = newLastIndex;\n\n if (this.shouldRender()) {\n removedPanels.forEach(panel => panel.removeElement());\n }\n }\n }\n\n // Update index of previous panels\n if (pushedIndex > 0) {\n panels.slice(index + newPanels.length).forEach(panel => {\n panel.setIndex(panel.getIndex() + pushedIndex);\n });\n }\n\n // Update state\n this.length += newPanels.length;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length - pushedIndex, nextSibling);\n const clones = this.clones;\n const panelCount = this.panels.length;\n if (clones[0] && clones[0].length > lastIndex + 1) {\n clones.forEach(cloneSet => {\n cloneSet.splice(panelCount);\n });\n }\n }\n\n return pushedIndex;\n }\n\n public replace(index: number, newPanels: Panel[]): Panel[] {\n const panels = this.panels;\n const range = this.range;\n const options = this.options;\n const isCircular = options.circular;\n\n // Find first panel that index is greater than inserting index\n const nextSibling = this.findFirstPanelFrom(index + newPanels.length);\n\n // if it's null, element will be inserted at last position\n // https://developer.mozilla.org/ko/docs/Web/API/Node/insertBefore#Syntax\n const firstPanel = this.firstPanel();\n const siblingElement = nextSibling\n ? nextSibling.getElement()\n : isCircular && firstPanel\n ? firstPanel.getClonedPanels()[0].getElement()\n : null;\n\n // Insert panels before sibling element\n this.insertNewPanels(newPanels, siblingElement);\n\n if (index > range.max) {\n // Temporarily insert null at index to use splice()\n (panels[index] as any) = null;\n }\n\n const replacedPanels = panels.splice(index, newPanels.length, ...newPanels);\n const wasNonEmptyCount = replacedPanels.filter(panel => Boolean(panel)).length;\n\n // Suppose inserting [1, 2, 3] at 0 position when there were [empty, 1]\n // So length should be increased by 3(inserting panels) - 1(non-empty panels)\n this.length += newPanels.length - wasNonEmptyCount;\n this.updateIndex(index);\n\n if (isCircular) {\n this.addNewClones(index, newPanels, newPanels.length, nextSibling);\n }\n\n if (this.shouldRender()) {\n replacedPanels.forEach(panel => panel && panel.removeElement());\n }\n\n return replacedPanels;\n }\n\n public remove(index: number, deleteCount: number = 1): Panel[] {\n const isCircular = this.options.circular;\n const panels = this.panels;\n const clones = this.clones;\n // Delete count should be equal or larger than 0\n deleteCount = Math.max(deleteCount, 0);\n\n const deletedPanels = panels\n .splice(index, deleteCount)\n .filter(panel => !!panel);\n\n if (this.shouldRender()) {\n deletedPanels.forEach(panel => panel.removeElement());\n }\n\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(index, deleteCount);\n });\n }\n\n // Update indexes\n panels\n .slice(index)\n .forEach(panel => {\n panel.setIndex(panel.getIndex() - deleteCount);\n });\n\n // Check last panel is empty\n let lastIndex = panels.length - 1;\n if (!panels[lastIndex]) {\n const reversedPanels = panels.concat().reverse();\n const nonEmptyIndexFromLast = findIndex(reversedPanels, panel => !!panel);\n lastIndex = nonEmptyIndexFromLast < 0\n ? -1 // All empty\n : lastIndex - nonEmptyIndexFromLast;\n\n // Remove all empty panels from last\n panels.splice(lastIndex + 1);\n if (isCircular) {\n clones.forEach(cloneSet => {\n cloneSet.splice(lastIndex + 1);\n });\n }\n }\n\n // Update range & length\n this.range = {\n min: findIndex(panels, panel => !!panel),\n max: lastIndex,\n };\n this.length -= deletedPanels.length;\n\n if (this.length <= 0) {\n // Reset clones\n this.clones = [];\n this.cloneCount = 0;\n }\n\n return deletedPanels;\n }\n\n public chainAllPanels() {\n const allPanels = this.allPanels().filter(panel => !!panel);\n const allPanelsCount = allPanels.length;\n\n if (allPanelsCount <= 1) {\n return;\n }\n\n allPanels.slice(1, allPanels.length - 1).forEach((panel, idx) => {\n const prevPanel = allPanels[idx];\n const nextPanel = allPanels[idx + 2];\n\n panel.prevSibling = prevPanel;\n panel.nextSibling = nextPanel;\n });\n\n const firstPanel = allPanels[0];\n const lastPanel = allPanels[allPanelsCount - 1];\n\n firstPanel.prevSibling = null;\n firstPanel.nextSibling = allPanels[1];\n lastPanel.prevSibling = allPanels[allPanelsCount - 2];\n lastPanel.nextSibling = null;\n\n if (this.options.circular) {\n firstPanel.prevSibling = lastPanel;\n lastPanel.nextSibling = firstPanel;\n }\n }\n\n public insertClones(cloneIndex: number, index: number, clonedPanels: Panel[], deleteCount: number = 0): void {\n const clones = this.clones;\n const lastIndex = this.lastIndex;\n\n if (!clones[cloneIndex]) {\n const newClones: Panel[] = [];\n clonedPanels.forEach((panel, offset) => {\n newClones[index + offset] = panel;\n });\n\n clones[cloneIndex] = newClones;\n } else {\n const insertTarget = clones[cloneIndex];\n\n if (index >= insertTarget.length) {\n clonedPanels.forEach((panel, offset) => {\n insertTarget[index + offset] = panel;\n });\n } else {\n insertTarget.splice(index, deleteCount, ...clonedPanels);\n // Remove panels after last index\n if (clonedPanels.length > lastIndex + 1) {\n clonedPanels.splice(lastIndex + 1);\n }\n }\n }\n }\n\n // clones are operating in set\n public removeClonesAfter(cloneIndex: number): void {\n const panels = this.panels;\n\n panels.forEach(panel => {\n panel.removeClonedPanelsAfter(cloneIndex);\n });\n this.clones.splice(cloneIndex);\n }\n\n public findPanelOf(element: HTMLElement): Panel | undefined {\n const allPanels = this.allPanels();\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const panelElement = panel.getElement();\n if (panelElement.contains(element)) {\n return panel;\n }\n }\n }\n\n public findFirstPanelFrom(index: number): Panel | undefined {\n for (const panel of this.panels.slice(index)) {\n if (panel && panel.getIndex() >= index && panel.getElement().parentNode) {\n return panel;\n }\n }\n }\n\n private addNewClones(index: number, originalPanels: Panel[], deleteCount: number, nextSibling: Panel | undefined) {\n const cameraElement = this.cameraElement;\n const cloneCount = this.getCloneCount();\n const lastPanel = this.lastPanel();\n const lastPanelClones: Panel[] = lastPanel\n ? lastPanel.getClonedPanels()\n : [];\n const nextSiblingClones: Panel[] = nextSibling\n ? nextSibling.getClonedPanels()\n : [];\n\n for (const cloneIndex of counter(cloneCount)) {\n const cloneNextSibling = nextSiblingClones[cloneIndex];\n const lastPanelSibling = lastPanelClones[cloneIndex];\n\n const cloneSiblingElement = cloneNextSibling\n ? cloneNextSibling.getElement()\n : lastPanelSibling\n ? lastPanelSibling.getElement().nextElementSibling\n : null;\n\n const newClones = originalPanels.map(panel => {\n const clone = panel.clone(cloneIndex);\n\n if (this.shouldRender()) {\n cameraElement.insertBefore(clone.getElement(), cloneSiblingElement);\n }\n\n return clone;\n });\n\n this.insertClones(cloneIndex, index, newClones, deleteCount);\n }\n }\n\n private updateIndex(insertingIndex: number) {\n const panels = this.panels;\n const range = this.range;\n\n const newLastIndex = panels.length - 1;\n if (newLastIndex > range.max) {\n range.max = newLastIndex;\n }\n if (insertingIndex < range.min || range.min < 0) {\n range.min = insertingIndex;\n }\n }\n\n private insertNewPanels(newPanels: Panel[], siblingElement: HTMLElement | null) {\n if (this.shouldRender()) {\n const fragment = document.createDocumentFragment();\n newPanels.forEach(panel => fragment.appendChild(panel.getElement()));\n this.cameraElement.insertBefore(fragment, siblingElement);\n }\n }\n\n private shouldRender(): boolean {\n const options = this.options;\n\n return !options.renderExternal && !options.renderOnlyVisible;\n }\n}\n\nexport default PanelManager;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel from \"../components/Panel\";\nimport { ValueOf, Direction, StateType, FlickingContext } from \"../types\";\n\nabstract class State {\n public delta: number = 0;\n public direction: ValueOf | null = null;\n public targetPanel: Panel | null = null;\n public lastPosition: number = 0;\n public abstract readonly type: ValueOf;\n public abstract readonly holding: boolean;\n public abstract readonly playing: boolean;\n\n public onEnter(prevState: State): void {\n this.delta = prevState.delta;\n this.direction = prevState.direction;\n this.targetPanel = prevState.targetPanel;\n this.lastPosition = prevState.lastPosition;\n }\n\n public onExit(nextState: State): void {\n // DO NOTHING\n }\n\n public onHold(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onChange(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onAnimationEnd(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n\n public onFinish(e: any, context: FlickingContext): void {\n // DO NOTHING\n }\n}\n\nexport default State;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { EVENTS, STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass IdleState extends State {\n public readonly type = STATE_TYPE.IDLE;\n public readonly holding = false;\n public readonly playing = false;\n\n public onEnter() {\n this.direction = null;\n this.targetPanel = null;\n this.delta = 0;\n this.lastPosition = 0;\n }\n\n public onHold(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Shouldn't do any action until any panels on flicking area\n if (flicking.getPanelCount() <= 0) {\n if (viewport.options.infinite) {\n viewport.moveCamera(viewport.getCameraPosition(), e);\n }\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n this.lastPosition = viewport.getCameraPosition();\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.HOLDING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n // By methods call\n public onChange(e: any, context: FlickingContext): void {\n const { triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.MOVE_START, e, false)\n .onSuccess(() => {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n}\n\nexport default IdleState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS, DIRECTION } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass HoldingState extends State {\n public readonly type = STATE_TYPE.HOLDING;\n public readonly holding = true;\n public readonly playing = true;\n\n private releaseEvent: any = null;\n\n public onChange(e: any, context: FlickingContext): void {\n const { flicking, triggerEvent, transitTo } = context;\n\n const offset = flicking.options.horizontal\n ? e.inputEvent.offsetX\n : e.inputEvent.offsetY;\n this.direction = offset < 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n triggerEvent(EVENTS.MOVE_START, e, true)\n .onSuccess(() => {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING)\n .onChange(e, context);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { viewport, triggerEvent, transitTo } = context;\n\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n if (e.delta.flick !== 0) {\n // Sometimes \"release\" event on axes triggered before \"change\" event\n // Especially if user flicked panel fast in really short amount of time\n // if delta is not zero, that means above case happened.\n\n // Event flow should be HOLD_START -> MOVE_START -> MOVE -> HOLD_END\n // At least one move event should be included between holdStart and holdEnd\n e.setTo({ flick: viewport.getCameraPosition() }, 0);\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n // Can't handle select event here,\n // As \"finish\" axes event happens\n this.releaseEvent = e;\n }\n\n public onFinish(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n // Should transite to IDLE state before select event\n // As user expects hold is already finished\n transitTo(STATE_TYPE.IDLE);\n\n if (!this.releaseEvent) {\n return;\n }\n\n // Handle release event here\n // To prevent finish event called twice\n const releaseEvent = this.releaseEvent;\n\n // Static click\n const srcEvent = releaseEvent.inputEvent.srcEvent;\n\n let clickedElement: HTMLElement;\n if (srcEvent.type === \"touchend\") {\n const touchEvent = srcEvent as TouchEvent;\n const touch = touchEvent.changedTouches[0];\n clickedElement = document.elementFromPoint(touch.clientX, touch.clientY) as HTMLElement;\n } else {\n clickedElement = srcEvent.target;\n }\n const clickedPanel = viewport.panelManager.findPanelOf(clickedElement);\n const cameraPosition = viewport.getCameraPosition();\n\n if (clickedPanel) {\n const clickedPanelPosition = clickedPanel.getPosition();\n const direction = clickedPanelPosition > cameraPosition\n ? DIRECTION.NEXT\n : clickedPanelPosition < cameraPosition\n ? DIRECTION.PREV\n : null;\n\n // Don't provide axes event, to use axes instance instead\n triggerEvent(EVENTS.SELECT, null, true, {\n direction, // Direction to the clicked panel\n index: clickedPanel.getIndex(),\n panel: clickedPanel,\n });\n }\n }\n}\n\nexport default HoldingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DraggingState extends State {\n public readonly type = STATE_TYPE.DRAGGING;\n public readonly holding = true;\n public readonly playing = true;\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onRelease(e: any, context: FlickingContext): void {\n const { flicking, viewport, triggerEvent, transitTo, stopCamera } = context;\n\n const delta = this.delta;\n const absDelta = Math.abs(delta);\n const options = flicking.options;\n const horizontal = options.horizontal;\n const moveType = viewport.moveType;\n const inputEvent = e.inputEvent;\n\n const velocity = horizontal\n ? inputEvent.velocityX\n : inputEvent.velocityY;\n const inputDelta = horizontal\n ? inputEvent.deltaX\n : inputEvent.deltaY;\n const isNextDirection = Math.abs(velocity) > 1\n ? velocity < 0\n : absDelta > 0\n ? delta > 0\n : inputDelta < 0;\n\n const swipeDistance = viewport.options.bound\n ? Math.max(absDelta, Math.abs(inputDelta))\n : absDelta;\n const swipeAngle = inputEvent.deltaX\n ? Math.abs(180 * Math.atan(inputEvent.deltaY / inputEvent.deltaX) / Math.PI)\n : 90;\n const belowAngleThreshold = horizontal\n ? swipeAngle <= options.thresholdAngle\n : swipeAngle > options.thresholdAngle;\n const overThreshold = swipeDistance >= options.threshold\n && belowAngleThreshold;\n\n const moveTypeContext = {\n viewport,\n axesEvent: e,\n state: this,\n swipeDistance,\n isNextDirection,\n };\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n triggerEvent(EVENTS.HOLD_END, e, true);\n\n const targetPanel = this.targetPanel;\n if (!overThreshold && targetPanel) {\n // Interrupted while animating\n const interruptDestInfo = moveType.findPanelWhenInterrupted(moveTypeContext);\n\n viewport.moveTo(\n interruptDestInfo.panel,\n interruptDestInfo.destPos,\n interruptDestInfo.eventType,\n e,\n interruptDestInfo.duration,\n );\n transitTo(STATE_TYPE.ANIMATING);\n return;\n }\n\n const currentPanel = viewport.getCurrentPanel();\n const nearestPanel = viewport.getNearestPanel();\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n e.stop();\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n const destInfo = overThreshold\n ? moveType.findTargetPanel(moveTypeContext)\n : moveType.findRestorePanel(moveTypeContext);\n\n viewport.moveTo(\n destInfo.panel,\n destInfo.destPos,\n destInfo.eventType,\n e,\n destInfo.duration,\n ).onSuccess(() => {\n transitTo(STATE_TYPE.ANIMATING);\n }).onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n stopCamera(e);\n });\n }\n}\n\nexport default DraggingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE, EVENTS } from \"../consts\";\nimport { FlickingContext } from \"../types\";\nimport { circulate } from \"../utils\";\n\nclass AnimatingState extends State {\n public readonly type = STATE_TYPE.ANIMATING;\n public readonly holding = false;\n public readonly playing = true;\n\n public onHold(e: any, { viewport, triggerEvent, transitTo }: FlickingContext): void {\n const options = viewport.options;\n const scrollArea = viewport.getScrollArea();\n const scrollAreaSize = viewport.getScrollAreaSize();\n const loopCount = Math.floor((this.lastPosition + this.delta - scrollArea.prev) / scrollAreaSize);\n\n const targetPanel = this.targetPanel;\n if (options.circular && loopCount !== 0 && targetPanel) {\n const cloneCount = viewport.panelManager.getCloneCount();\n const originalTargetPosition = targetPanel.getPosition();\n\n // cloneIndex is from -1 to cloneCount - 1\n const newCloneIndex = circulate(targetPanel.getCloneIndex() - loopCount, -1, cloneCount - 1, true);\n const newTargetPosition = originalTargetPosition - loopCount * scrollAreaSize;\n const newTargetPanel = targetPanel.getIdenticalPanels()[newCloneIndex + 1].clone(newCloneIndex, true);\n\n // Set new target panel considering looped count\n newTargetPanel.setPosition(newTargetPosition);\n this.targetPanel = newTargetPanel;\n }\n\n // Reset last position and delta\n this.delta = 0;\n this.lastPosition = viewport.getCameraPosition();\n\n // Update current panel as current nearest panel\n viewport.setCurrentPanel(viewport.getNearestPanel()!);\n triggerEvent(EVENTS.HOLD_START, e, true)\n .onSuccess(() => {\n transitTo(STATE_TYPE.DRAGGING);\n })\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onChange(e: any, { moveCamera, transitTo }: FlickingContext): void {\n if (!e.delta.flick) {\n return;\n }\n\n moveCamera(e)\n .onStopped(() => {\n transitTo(STATE_TYPE.DISABLED);\n });\n }\n\n public onFinish(e: any, { flicking, viewport, triggerEvent, transitTo }: FlickingContext) {\n const isTrusted = e && e.isTrusted;\n\n viewport.options.bound\n ? viewport.setCurrentPanel(this.targetPanel!)\n : viewport.setCurrentPanel(viewport.getNearestPanel()!);\n\n if (flicking.options.adaptive) {\n viewport.updateAdaptiveSize();\n }\n\n transitTo(STATE_TYPE.IDLE);\n viewport.updateCameraPosition();\n triggerEvent(EVENTS.MOVE_END, e, isTrusted, {\n direction: this.direction,\n });\n }\n}\n\nexport default AnimatingState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"./State\";\nimport { STATE_TYPE } from \"../consts\";\nimport { FlickingContext } from \"../types\";\n\nclass DisabledState extends State {\n public readonly type = STATE_TYPE.DISABLED;\n public readonly holding = false;\n public readonly playing = true;\n\n public onAnimationEnd(e: any, { transitTo }: FlickingContext): void {\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(e: any, { viewport, transitTo }: FlickingContext): void {\n // Can stop Axes's change event\n e.stop();\n\n // Should update axes position as it's already changed at this moment\n viewport.updateAxesPosition(viewport.getCameraPosition());\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(e: any, { transitTo }: FlickingContext): void {\n // This is needed when stopped hold start event\n if (e.delta.flick === 0) {\n transitTo(STATE_TYPE.IDLE);\n }\n }\n}\n\nexport default DisabledState;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport State from \"../states/State\";\nimport { AxesEventType, ValueOf, FlickingContext, StateType } from \"../types\";\nimport { AXES_EVENTS, STATE_TYPE } from \"../consts\";\nimport IdleState from \"../states/IdleState\";\nimport HoldingState from \"../states/HoldingState\";\nimport DraggingState from \"../states/DraggingState\";\nimport AnimatingState from \"../states/AnimatingState\";\nimport DisabledState from \"../states/DisabledState\";\n\nclass StateMachine {\n private state: State = new IdleState();\n\n public fire(eventType: ValueOf, e: any, context: FlickingContext) {\n const currentState = this.state;\n switch (eventType) {\n case AXES_EVENTS.HOLD:\n currentState.onHold(e, context);\n break;\n case AXES_EVENTS.CHANGE:\n currentState.onChange(e, context);\n break;\n case AXES_EVENTS.RELEASE:\n currentState.onRelease(e, context);\n break;\n case AXES_EVENTS.ANIMATION_END:\n currentState.onAnimationEnd(e, context);\n break;\n case AXES_EVENTS.FINISH:\n currentState.onFinish(e, context);\n break;\n }\n }\n\n public getState(): State {\n return this.state;\n }\n\n public transitTo = (nextStateType: ValueOf): State => {\n const currentState = this.state;\n\n if (currentState.type !== nextStateType) {\n let nextState: State;\n\n switch (nextStateType) {\n case STATE_TYPE.IDLE:\n nextState = new IdleState();\n break;\n case STATE_TYPE.HOLDING:\n nextState = new HoldingState();\n break;\n case STATE_TYPE.DRAGGING:\n nextState = new DraggingState();\n break;\n case STATE_TYPE.ANIMATING:\n nextState = new AnimatingState();\n break;\n case STATE_TYPE.DISABLED:\n nextState = new DisabledState();\n break;\n }\n\n currentState.onExit(nextState!);\n nextState!.onEnter(currentState);\n\n this.state = nextState!;\n }\n return this.state;\n }\n}\n\nexport default StateMachine;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport MoveType from \"./MoveType\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { clamp } from \"../utils\";\n\nclass Snap extends MoveType {\n protected readonly type: string = MOVE_TYPE.SNAP;\n protected count: number;\n\n constructor(count: number) {\n super();\n this.count = count;\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, axesEvent, swipeDistance } = ctx;\n const snapCount = this.count;\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const currentPanel = viewport.getCurrentPanel()!;\n const nearestPanel = viewport.getNearestPanel()!;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const nearestIsCurrent = nearestPanel.getIndex() === currentPanel.getIndex();\n\n // This can happen when bounce is 0\n const shouldMoveWhenBounceIs0 = viewport.canSetBoundMode() && nearestIsCurrent;\n const shouldMoveToAdjacent = !viewport.isOutOfBound()\n && (swipeDistance <= minimumDistanceToChange || shouldMoveWhenBounceIs0);\n\n if (snapCount > 1 && eventDelta > minimumDistanceToChange) {\n return this.findSnappedPanel(ctx);\n } else if (shouldMoveToAdjacent) {\n return this.findAdjacentPanel(ctx);\n } else {\n return {\n panel: nearestPanel,\n duration: viewport.options.duration,\n destPos: viewport.findEstimatedPosition(nearestPanel),\n // As swipeDistance holds mouse/touch position change regardless of bounce option value\n // swipDistance > minimumDistanceToChange can happen in bounce area\n // Second condition is for handling that.\n eventType: (swipeDistance <= minimumDistanceToChange)\n || (viewport.isOutOfBound() && nearestIsCurrent)\n ? EVENTS.RESTORE\n : EVENTS.CHANGE,\n };\n }\n }\n\n protected findSnappedPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, viewport, state, isNextDirection } = ctx;\n\n const eventDelta = Math.abs(axesEvent.delta.flick);\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const snapCount = this.count;\n const options = viewport.options;\n const scrollAreaSize = viewport.getScrollAreaSize();\n const halfGap = options.gap / 2;\n const estimatedHangerPos = axesEvent.destPos.flick + viewport.getRelativeHangerPosition();\n\n let panelToMove = viewport.getNearestPanel()!;\n let cycleIndex = panelToMove.getCloneIndex() + 1; // 0(original) or 1(clone)\n let passedPanelCount = 0;\n\n while (passedPanelCount < snapCount) {\n // Since panelToMove holds also cloned panels, we should use original panel's position\n const originalPanel = panelToMove.getOriginalPanel();\n const panelPosition = originalPanel.getPosition() + cycleIndex * scrollAreaSize;\n const panelSize = originalPanel.getSize();\n\n const panelNextPosition = panelPosition + panelSize + halfGap;\n const panelPrevPosition = panelPosition - halfGap;\n\n // Current panelToMove contains destPos\n if (\n (isNextDirection && panelNextPosition > estimatedHangerPos)\n || (!isNextDirection && panelPrevPosition < estimatedHangerPos)\n ) {\n break;\n }\n\n const siblingPanel = isNextDirection\n ? panelToMove.nextSibling\n : panelToMove.prevSibling;\n if (!siblingPanel) {\n break;\n }\n\n const panelIndex = panelToMove.getIndex();\n const siblingIndex = siblingPanel.getIndex();\n if ((isNextDirection && siblingIndex <= panelIndex)\n || (!isNextDirection && siblingIndex >= panelIndex)\n ) {\n cycleIndex = isNextDirection\n ? cycleIndex + 1\n : cycleIndex - 1;\n }\n panelToMove = siblingPanel;\n passedPanelCount += 1;\n }\n\n const originalPosition = panelToMove.getOriginalPanel().getPosition();\n\n if (cycleIndex !== 0) {\n panelToMove = panelToMove.clone(panelToMove.getCloneIndex(), true);\n panelToMove.setPosition(originalPosition + cycleIndex * scrollAreaSize);\n }\n\n const defaultDuration = viewport.options.duration;\n const duration = clamp(axesEvent.duration, defaultDuration, defaultDuration * passedPanelCount);\n\n return {\n panel: panelToMove,\n destPos: viewport.findEstimatedPosition(panelToMove),\n duration,\n eventType: Math.max(eventDelta, state.delta) > minimumDistanceToChange\n ? EVENTS.CHANGE\n : EVENTS.RESTORE,\n };\n }\n\n private findAdjacentPanel(ctx: MoveTypeContext): DestinationInfo {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentIndex = viewport.getCurrentIndex();\n const currentPanel = viewport.panelManager.get(currentIndex)!;\n const hangerPosition = viewport.getHangerPosition();\n const scrollArea = viewport.getScrollArea();\n\n const firstClonedPanel = currentPanel.getIdenticalPanels()[1];\n const lapped = options.circular\n && (Math.abs(currentPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition));\n\n // If lapped in circular mode, use first cloned panel as base panel\n const basePanel = lapped\n ? firstClonedPanel\n : currentPanel;\n const basePosition = basePanel.getPosition();\n\n const adjacentPanel = isNextDirection\n ? basePanel.nextSibling\n : basePanel.prevSibling;\n\n const eventType = adjacentPanel\n ? EVENTS.CHANGE\n : EVENTS.RESTORE;\n const panelToMove = adjacentPanel\n ? adjacentPanel\n : basePanel;\n const targetRelativeAnchorPosition = panelToMove.getRelativeAnchorPosition();\n\n const estimatedPanelPosition = options.circular\n ? isNextDirection\n ? basePosition + basePanel.getSize() + targetRelativeAnchorPosition + options.gap\n : basePosition - (panelToMove.getSize() - targetRelativeAnchorPosition) - options.gap\n : panelToMove.getAnchorPosition();\n const estimatedPosition = estimatedPanelPosition - viewport.getRelativeHangerPosition();\n const destPos = viewport.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return {\n panel: panelToMove,\n destPos,\n duration: options.duration,\n eventType,\n };\n }\n}\n\nexport default Snap;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { MoveTypeStringOption, MoveTypeContext, DestinationInfo } from \"../types\";\nimport Panel from \"../components/Panel\";\nimport { EVENTS } from \"../consts\";\n\nabstract class MoveType {\n protected readonly abstract type: string;\n\n public abstract findTargetPanel(ctx: MoveTypeContext): DestinationInfo;\n\n public is(type: MoveTypeStringOption): boolean {\n return type === this.type;\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n const viewport = ctx.viewport;\n const options = viewport.options;\n\n const panel = options.circular\n ? this.findRestorePanelInCircularMode(ctx)\n : viewport.getCurrentPanel()!;\n\n return {\n panel,\n destPos: viewport.findEstimatedPosition(panel),\n duration: options.duration,\n eventType: EVENTS.RESTORE,\n };\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { state, viewport } = ctx;\n const targetPanel = state.targetPanel!;\n\n return {\n panel: targetPanel,\n destPos: viewport.findEstimatedPosition(targetPanel),\n duration: viewport.options.duration,\n eventType: \"\",\n };\n }\n\n // Calculate minimum distance to \"change\" panel\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const relativeAnchorPosition = currentPanel.getRelativeAnchorPosition();\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |--------|--------------|\n * [][ |<-Anchor ][] <- Panel + Half-Gap\n */\n let minimumDistanceToChange = isNextDirection\n ? currentPanel.getSize() - relativeAnchorPosition + halfGap\n : relativeAnchorPosition + halfGap;\n\n minimumDistanceToChange = Math.max(minimumDistanceToChange, options.threshold);\n\n return minimumDistanceToChange;\n }\n\n private findRestorePanelInCircularMode(ctx: MoveTypeContext): Panel {\n const viewport = ctx.viewport;\n const originalPanel = viewport.getCurrentPanel()!.getOriginalPanel();\n const hangerPosition = viewport.getHangerPosition();\n\n const firstClonedPanel = originalPanel.getIdenticalPanels()[1];\n const lapped = Math.abs(originalPanel.getAnchorPosition() - hangerPosition)\n > Math.abs(firstClonedPanel.getAnchorPosition() - hangerPosition);\n\n return (!ctx.isNextDirection && lapped)\n ? firstClonedPanel\n : originalPanel;\n }\n}\n\nexport default MoveType;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Snap from \"./Snap\";\nimport { MOVE_TYPE, EVENTS } from \"../consts\";\nimport { MoveTypeContext, DestinationInfo } from \"../types\";\nimport { circulate, clamp } from \"../utils\";\n\nclass FreeScroll extends Snap {\n protected readonly type: string = MOVE_TYPE.FREE_SCROLL;\n\n constructor() {\n // Set snap count to Infinity\n super(Infinity);\n }\n\n public findTargetPanel(ctx: MoveTypeContext): DestinationInfo {\n const { axesEvent, state, viewport } = ctx;\n const destPos = axesEvent.destPos.flick;\n const minimumDistanceToChange = this.calcBrinkOfChange(ctx);\n const scrollArea = viewport.getScrollArea();\n const currentPanel = viewport.getCurrentPanel()!;\n const options = viewport.options;\n\n const delta = Math.abs(axesEvent.delta.flick + state.delta);\n if (delta > minimumDistanceToChange) {\n const destInfo = super.findSnappedPanel(ctx);\n\n destInfo.duration = axesEvent.duration;\n destInfo.destPos = destPos;\n destInfo.eventType = !options.circular && destInfo.panel === currentPanel\n ? \"\"\n : EVENTS.CHANGE;\n\n return destInfo;\n } else {\n let estimatedPosition = options.circular\n ? circulate(destPos, scrollArea.prev, scrollArea.next, false)\n : destPos;\n estimatedPosition = clamp(estimatedPosition, scrollArea.prev, scrollArea.next);\n estimatedPosition += viewport.getRelativeHangerPosition();\n\n const estimatedPanel = viewport.findNearestPanelAt(estimatedPosition)!;\n\n return {\n panel: estimatedPanel,\n destPos,\n duration: axesEvent.duration,\n eventType: \"\",\n };\n }\n }\n\n public findRestorePanel(ctx: MoveTypeContext): DestinationInfo {\n return this.findTargetPanel(ctx);\n }\n\n public findPanelWhenInterrupted(ctx: MoveTypeContext): DestinationInfo {\n const { viewport } = ctx;\n\n return {\n panel: viewport.getNearestPanel()!,\n destPos: viewport.getCameraPosition(),\n duration: 0,\n eventType: \"\",\n };\n }\n\n protected calcBrinkOfChange(ctx: MoveTypeContext): number {\n const { viewport, isNextDirection } = ctx;\n\n const options = viewport.options;\n const currentPanel = viewport.getCurrentPanel()!;\n const halfGap = options.gap / 2;\n\n const lastPosition = viewport.stateMachine.getState().lastPosition;\n const currentPanelPosition = currentPanel.getPosition();\n\n // As camera can stop anywhere in free scroll mode,\n // minimumDistanceToChange should be calculated differently.\n // Ref #191(https://github.com/naver/egjs-flicking/issues/191)\n const lastHangerPosition = lastPosition + viewport.getRelativeHangerPosition();\n\n const scrollAreaSize = viewport.getScrollAreaSize();\n let minimumDistanceToChange = isNextDirection\n ? currentPanelPosition + currentPanel.getSize() - lastHangerPosition + halfGap\n : lastHangerPosition - currentPanelPosition + halfGap;\n minimumDistanceToChange = Math.abs(minimumDistanceToChange % scrollAreaSize);\n\n return Math.min(minimumDistanceToChange, scrollAreaSize - minimumDistanceToChange);\n }\n}\n\nexport default FreeScroll;\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Axes, { PanInput } from \"@egjs/axes\";\n\nimport Flicking from \"../Flicking\";\nimport Panel from \"./Panel\";\nimport PanelManager from \"./PanelManager\";\nimport StateMachine from \"./StateMachine\";\nimport MoveType from \"../moves/MoveType\";\nimport { FlickingOptions, FlickingPanel, FlickingStatus, ElementLike, EventType, TriggerCallback, NeedPanelEvent, FlickingEvent, MoveTypeObjectOption, OriginalStyle, Plugin, DestroyOption, BoundingBox } from \"../types\";\nimport { DEFAULT_VIEWPORT_CSS, DEFAULT_CAMERA_CSS, TRANSFORM, DEFAULT_OPTIONS, EVENTS, DIRECTION, STATE_TYPE, MOVE_TYPE } from \"../consts\";\nimport { clamp, applyCSS, toArray, parseArithmeticExpression, isBetween, isArray, parseElement, hasClass, restoreStyle, circulate, findIndex, getBbox } from \"../utils\";\nimport Snap from \"../moves/Snap\";\nimport FreeScroll from \"../moves/FreeScroll\";\n\nexport default class Viewport {\n public options: FlickingOptions;\n public stateMachine: StateMachine;\n public panelManager: PanelManager;\n public moveType: MoveType;\n\n private flicking: Flicking;\n private axes: Axes;\n private panInput: PanInput | null;\n\n private viewportElement: HTMLElement;\n private cameraElement: HTMLElement;\n\n private triggerEvent: Flicking[\"triggerEvent\"];\n private axesHandlers: { [key: string]: any };\n\n private currentPanel: Panel | undefined;\n private nearestPanel: Panel | undefined;\n private visiblePanels: Panel[];\n\n private plugins: Plugin[] = [];\n private panelBboxes: { [className: string]: BoundingBox };\n private state: {\n size: number;\n position: number;\n panelMaintainRatio: number;\n relativeHangerPosition: number;\n positionOffset: number;\n scrollArea: {\n prev: number;\n next: number;\n };\n translate: {\n name: string,\n has3d: boolean,\n };\n infiniteThreshold: number;\n checkedIndexes: Array<[number, number]>;\n isAdaptiveCached: boolean;\n isViewportGiven: boolean;\n isCameraGiven: boolean;\n originalViewportStyle: OriginalStyle;\n originalCameraStyle: OriginalStyle;\n cachedBbox: BoundingBox | null;\n };\n\n constructor(\n flicking: Flicking,\n options: FlickingOptions,\n triggerEvent: Flicking[\"triggerEvent\"],\n ) {\n this.flicking = flicking;\n this.triggerEvent = triggerEvent;\n\n this.state = {\n size: 0,\n position: 0,\n panelMaintainRatio: 0,\n relativeHangerPosition: 0,\n positionOffset: 0,\n scrollArea: {\n prev: 0,\n next: 0,\n },\n translate: TRANSFORM,\n infiniteThreshold: 0,\n checkedIndexes: [],\n isAdaptiveCached: false,\n isViewportGiven: false,\n isCameraGiven: false,\n originalViewportStyle: {\n className: null,\n style: null,\n },\n originalCameraStyle: {\n className: null,\n style: null,\n },\n cachedBbox: null,\n };\n this.options = options;\n this.stateMachine = new StateMachine();\n this.visiblePanels = [];\n this.panelBboxes = {};\n\n this.build();\n }\n\n public moveTo(\n panel: Panel,\n destPos: number,\n eventType: EventType[\"CHANGE\"] | EventType[\"RESTORE\"] | \"\",\n axesEvent: any,\n duration: number = this.options.duration,\n ): TriggerCallback {\n const state = this.state;\n const currentState = this.stateMachine.getState();\n const currentPosition = state.position;\n\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n const direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n let eventResult: TriggerCallback;\n if (eventType === EVENTS.CHANGE) {\n eventResult = this.triggerEvent(EVENTS.CHANGE, axesEvent, isTrusted, {\n index: panel.getIndex(),\n panel,\n direction,\n });\n } else if (eventType === EVENTS.RESTORE) {\n eventResult = this.triggerEvent(EVENTS.RESTORE, axesEvent, isTrusted);\n } else {\n eventResult = {\n onSuccess(callback: () => void): TriggerCallback {\n callback();\n return this;\n },\n onStopped(): TriggerCallback {\n return this;\n },\n };\n }\n\n eventResult.onSuccess(() => {\n currentState.delta = 0;\n currentState.lastPosition = this.getCameraPosition();\n currentState.targetPanel = panel;\n currentState.direction = destPos === currentPosition\n ? null\n : destPos > currentPosition\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n if (destPos === currentPosition) {\n // no move\n this.nearestPanel = panel;\n this.currentPanel = panel;\n }\n\n if (axesEvent && axesEvent.setTo) {\n // freeScroll only occurs in release events\n axesEvent.setTo({ flick: destPos }, duration);\n } else {\n this.axes.setTo({ flick: destPos }, duration);\n }\n });\n\n return eventResult;\n }\n\n public moveCamera(pos: number, axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const transform = state.translate.name;\n const scrollArea = state.scrollArea;\n\n // Update position & nearestPanel\n if (options.circular && !isBetween(pos, scrollArea.prev, scrollArea.next)) {\n pos = circulate(pos, scrollArea.prev, scrollArea.next, false);\n }\n state.position = pos;\n this.nearestPanel = this.findNearestPanel();\n const nearestPanel = this.nearestPanel;\n const originalNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n // From 0(panel position) to 1(panel position + panel size)\n // When it's on gap area value will be (val > 1 || val < 0)\n if (nearestPanel) {\n const hangerPosition = this.getHangerPosition();\n const panelPosition = nearestPanel.getPosition();\n const panelSize = nearestPanel.getSize();\n const halfGap = options.gap / 2;\n\n // As panel's range is from panel position - half gap ~ panel pos + panel size + half gap\n state.panelMaintainRatio = (hangerPosition - panelPosition + halfGap) / (panelSize + 2 * halfGap);\n } else {\n state.panelMaintainRatio = 0;\n }\n\n this.checkNeedPanel(axesEvent);\n\n // Possibly modified after need panel, if it's looped\n const modifiedNearestPosition = nearestPanel\n ? nearestPanel.getPosition()\n : 0;\n\n pos += (modifiedNearestPosition - originalNearestPosition);\n state.position = pos;\n\n this.updateVisiblePanels();\n\n // Offset is needed to fix camera layer size in visible-only rendering mode\n const posOffset = options.renderOnlyVisible\n ? state.positionOffset\n : 0;\n const moveVector = options.horizontal\n ? [-(pos - posOffset), 0] : [0, -(pos - posOffset)];\n const moveCoord = moveVector.map(coord => `${Math.round(coord)}px`).join(\", \");\n\n this.cameraElement.style[transform] = state.translate.has3d\n ? `translate3d(${moveCoord}, 0px)`\n : `translate(${moveCoord})`;\n }\n\n public stopCamera = (axesEvent: any): void => {\n if (axesEvent && axesEvent.setTo) {\n axesEvent.setTo({ flick: this.state.position }, 0);\n }\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n\n public unCacheBbox(): void {\n const state = this.state;\n const options = this.options;\n\n state.cachedBbox = null;\n this.visiblePanels = [];\n\n const viewportElement = this.viewportElement;\n if (!options.horizontal) {\n // Don't preserve previous width for adaptive resizing\n viewportElement.style.width = \"\";\n } else {\n viewportElement.style.height = \"\";\n }\n state.isAdaptiveCached = false;\n this.panelBboxes = {};\n }\n\n public resize(): void {\n this.updateSize();\n this.updateOriginalPanelPositions();\n this.updateAdaptiveSize();\n this.updateScrollArea();\n this.updateClonePanels();\n this.updateVisiblePanelPositions();\n this.updateCameraPosition();\n this.updatePlugins();\n }\n\n // Find nearest anchor from current hanger position\n public findNearestPanel(): Panel | undefined {\n const state = this.state;\n const panelManager = this.panelManager;\n const hangerPosition = this.getHangerPosition();\n\n if (this.isOutOfBound()) {\n const position = state.position;\n\n return position <= state.scrollArea.prev\n ? panelManager.firstPanel()\n : panelManager.lastPanel();\n }\n\n return this.findNearestPanelAt(hangerPosition);\n }\n\n public findNearestPanelAt(position: number): Panel | undefined {\n const panelManager = this.panelManager;\n\n const allPanels = panelManager.allPanels();\n let minimumDistance = Infinity;\n let nearestPanel: Panel | undefined;\n\n for (const panel of allPanels) {\n if (!panel) {\n continue;\n }\n const prevPosition = panel.getPosition();\n const nextPosition = prevPosition + panel.getSize();\n\n // Use shortest distance from panel's range\n const distance = isBetween(position, prevPosition, nextPosition)\n ? 0\n : Math.min(\n Math.abs(prevPosition - position),\n Math.abs(nextPosition - position),\n );\n\n if (distance > minimumDistance) {\n break;\n } else if (distance === minimumDistance) {\n const minimumAnchorDistance = Math.abs(position - nearestPanel!.getAnchorPosition());\n const anchorDistance = Math.abs(position - panel.getAnchorPosition());\n\n if (anchorDistance > minimumAnchorDistance) {\n break;\n }\n }\n\n minimumDistance = distance;\n nearestPanel = panel;\n }\n\n return nearestPanel;\n }\n\n public findNearestIdenticalPanel(panel: Panel): Panel {\n let nearest = panel;\n let shortestDistance = Infinity;\n const hangerPosition = this.getHangerPosition();\n\n const identicals = panel.getIdenticalPanels();\n identicals.forEach(identical => {\n const anchorPosition = identical.getAnchorPosition();\n const distance = Math.abs(anchorPosition - hangerPosition);\n\n if (distance < shortestDistance) {\n nearest = identical;\n shortestDistance = distance;\n }\n });\n\n return nearest;\n }\n\n // Find shortest camera position that distance is minimum\n public findShortestPositionToPanel(panel: Panel): number {\n const state = this.state;\n const options = this.options;\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = this.getHangerPosition();\n const distance = Math.abs(hangerPosition - anchorPosition);\n const scrollAreaSize = state.scrollArea.next - state.scrollArea.prev;\n\n if (!options.circular) {\n const position = anchorPosition - state.relativeHangerPosition;\n return this.canSetBoundMode()\n ? clamp(position, state.scrollArea.prev, state.scrollArea.next)\n : position;\n } else {\n // If going out of viewport border is more efficient way of moving, choose that position\n return distance <= scrollAreaSize - distance\n ? anchorPosition - state.relativeHangerPosition\n : anchorPosition > hangerPosition\n // PREV TO NEXT\n ? anchorPosition - state.relativeHangerPosition - scrollAreaSize\n // NEXT TO PREV\n : anchorPosition - state.relativeHangerPosition + scrollAreaSize;\n }\n }\n\n public findEstimatedPosition(panel: Panel): number {\n const scrollArea = this.getScrollArea();\n\n let estimatedPosition = panel.getAnchorPosition() - this.getRelativeHangerPosition();\n estimatedPosition = this.canSetBoundMode()\n ? clamp(estimatedPosition, scrollArea.prev, scrollArea.next)\n : estimatedPosition;\n\n return estimatedPosition;\n }\n\n public addVisiblePanel(panel: Panel): void {\n if (this.getVisibleIndexOf(panel) < 0) {\n this.visiblePanels.push(panel);\n }\n }\n\n public enable(): void {\n if (!this.panInput) {\n this.createPanInput();\n }\n }\n\n public disable(): void {\n if (this.panInput) {\n this.panInput.destroy();\n this.panInput = null;\n\n this.stateMachine.transitTo(STATE_TYPE.IDLE);\n }\n }\n\n public insert(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const lastIndex = this.panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const state = this.state;\n const options = this.options;\n const parsedElements = parseElement(element);\n\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const pushedIndex = this.panelManager.insert(index, panels);\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n if (!this.currentPanel) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index });\n state.checkedIndexes.forEach((indexes, idx) => {\n const [min, max] = indexes;\n if (index < min) {\n // Push checked index\n state.checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n }\n });\n\n this.resize();\n\n return panels;\n }\n\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const lastIndex = panelManager.getLastIndex();\n\n // Index should not below 0\n if (index < 0 || index > lastIndex) {\n return [];\n }\n\n const parsedElements = parseElement(element);\n const panels = parsedElements\n .map((el, idx) => new Panel(el, index + idx, this))\n .slice(0, lastIndex - index + 1);\n\n if (panels.length <= 0) {\n return [];\n }\n\n const replacedPanels = panelManager.replace(index, panels);\n\n replacedPanels.forEach(panel => {\n const visibleIndex = this.getVisibleIndexOf(panel);\n if (visibleIndex > -1) {\n this.visiblePanels.splice(visibleIndex, 1);\n }\n });\n\n // ...then calc bbox for all panels\n this.resizePanels(panels);\n\n const currentPanel = this.currentPanel;\n const wasEmpty = !currentPanel;\n if (wasEmpty) {\n this.currentPanel = panels[0];\n this.nearestPanel = panels[0];\n\n const newCenterPanel = panels[0];\n const newPanelPosition = this.findEstimatedPosition(newCenterPanel);\n state.position = newPanelPosition;\n this.updateAxesPosition(newPanelPosition);\n state.panelMaintainRatio = (newCenterPanel.getRelativeAnchorPosition() + options.gap / 2) / (newCenterPanel.getSize() + options.gap);\n } else if (isBetween(currentPanel!.getIndex(), index, index + panels.length - 1)) {\n // Current panel is replaced\n this.currentPanel = panelManager.get(currentPanel!.getIndex());\n }\n\n // Update checked indexes in infinite mode\n this.updateCheckedIndexes({ min: index, max: index + panels.length - 1 });\n\n this.resize();\n\n return panels;\n }\n\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n const state = this.state;\n // Index should not below 0\n index = Math.max(index, 0);\n\n const panelManager = this.panelManager;\n const currentIndex = this.getCurrentIndex();\n\n const removedPanels = panelManager.remove(index, deleteCount);\n if (isBetween(currentIndex, index, index + deleteCount - 1)) {\n // Current panel is removed\n // Use panel at removing index - 1 as new current panel if it exists\n const newCurrentIndex = Math.max(index - 1, panelManager.getRange().min);\n this.currentPanel = panelManager.get(newCurrentIndex);\n }\n\n // Update checked indexes in infinite mode\n if (deleteCount > 0) {\n // Check whether removing index will affect checked indexes\n // Suppose index 0 is empty and removed index 1, then checked index 0 should be deleted and vice versa.\n this.updateCheckedIndexes({ min: index - 1, max: index + deleteCount });\n // Uncache visible panels to refresh panels\n this.visiblePanels = [];\n }\n\n if (panelManager.getPanelCount() <= 0) {\n this.currentPanel = undefined;\n this.nearestPanel = undefined;\n }\n\n this.resize();\n\n const scrollArea = state.scrollArea;\n if (state.position < scrollArea.prev || state.position > scrollArea.next) {\n const newPosition = circulate(state.position, scrollArea.prev, scrollArea.next, false);\n this.moveCamera(newPosition);\n this.updateAxesPosition(newPosition);\n }\n\n return removedPanels;\n }\n\n public updateAdaptiveSize(): void {\n const state = this.state;\n const options = this.options;\n const horizontal = options.horizontal;\n const currentPanel = this.getCurrentPanel();\n\n if (!currentPanel) {\n return;\n }\n\n const shouldApplyAdaptive = options.adaptive || !state.isAdaptiveCached;\n const viewportStyle = this.viewportElement.style;\n if (shouldApplyAdaptive) {\n let sizeToApply: number;\n if (options.adaptive) {\n const panelBbox = currentPanel.getBbox();\n\n sizeToApply = horizontal ? panelBbox.height : panelBbox.width;\n } else {\n // Find minimum height of panels to maximum panel size\n const maximumPanelSize = this.panelManager.originalPanels().reduce((maximum, panel) => {\n const panelBbox = panel.getBbox();\n return Math.max(maximum, horizontal ? panelBbox.height : panelBbox.width);\n }, 0);\n\n sizeToApply = maximumPanelSize;\n }\n\n if (!state.isAdaptiveCached) {\n const viewportBbox = this.updateBbox();\n sizeToApply = Math.max(sizeToApply, horizontal ? viewportBbox.height : viewportBbox.width);\n state.isAdaptiveCached = true;\n }\n\n const viewportSize = `${sizeToApply}px`;\n if (horizontal) {\n viewportStyle.height = viewportSize;\n state.cachedBbox!.height = sizeToApply;\n } else {\n viewportStyle.width = viewportSize;\n state.cachedBbox!.width = sizeToApply;\n }\n }\n }\n\n // Update camera position after resizing\n public updateCameraPosition(): void {\n const state = this.state;\n const currentPanel = this.getCurrentPanel();\n const cameraPosition = this.getCameraPosition();\n const currentState = this.stateMachine.getState();\n const isFreeScroll = this.moveType.is(MOVE_TYPE.FREE_SCROLL);\n const relativeHangerPosition = this.getRelativeHangerPosition();\n const halfGap = this.options.gap / 2;\n\n if (currentState.holding || currentState.playing) {\n this.updateVisiblePanels();\n return;\n }\n\n let newPosition: number;\n if (isFreeScroll) {\n const positionBounded = this.canSetBoundMode() && (cameraPosition === state.scrollArea.prev || cameraPosition === state.scrollArea.next);\n const nearestPanel = this.getNearestPanel();\n\n // Preserve camera position if it is bound to scroll area limit\n newPosition = positionBounded || !nearestPanel\n ? cameraPosition\n : nearestPanel.getPosition() - halfGap + (nearestPanel.getSize() + 2 * halfGap) * state.panelMaintainRatio - relativeHangerPosition;\n } else {\n newPosition = currentPanel\n ? currentPanel.getAnchorPosition() - relativeHangerPosition\n : cameraPosition;\n }\n\n if (this.canSetBoundMode()) {\n newPosition = clamp(newPosition, state.scrollArea.prev, state.scrollArea.next);\n }\n\n // Pause & resume axes to prevent axes's \"change\" event triggered\n // This should be done before moveCamera, as moveCamera can trigger needPanel\n this.updateAxesPosition(newPosition);\n\n this.moveCamera(newPosition);\n }\n\n public updateBbox(): BoundingBox {\n const state = this.state;\n const options = this.options;\n const viewportElement = this.viewportElement;\n\n if (!state.cachedBbox) {\n state.cachedBbox = getBbox(viewportElement, options.useOffset);\n }\n\n return state.cachedBbox!;\n }\n\n public updatePlugins(): void {\n // update for resize\n this.plugins.forEach(plugin => {\n plugin.update && plugin.update(this.flicking);\n });\n }\n\n public destroy(option: Partial): void {\n const state = this.state;\n const wrapper = this.flicking.getElement();\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const originalPanels = this.panelManager.originalPanels();\n\n this.removePlugins(this.plugins);\n if (!option.preserveUI) {\n restoreStyle(viewportElement, state.originalViewportStyle);\n restoreStyle(cameraElement, state.originalCameraStyle);\n\n if (!state.isCameraGiven && !this.options.renderExternal) {\n const topmostElement = state.isViewportGiven\n ? viewportElement\n : wrapper;\n const deletingElement = state.isViewportGiven\n ? cameraElement\n : viewportElement;\n\n originalPanels.forEach(panel => {\n topmostElement.appendChild(panel.getElement());\n });\n\n topmostElement.removeChild(deletingElement);\n }\n }\n\n this.axes.destroy();\n this.panInput?.destroy();\n\n originalPanels.forEach(panel => { panel.destroy(option); });\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n public restore(status: FlickingStatus): void {\n const panels = status.panels;\n const defaultIndex = this.options.defaultIndex;\n const cameraElement = this.cameraElement;\n const panelManager = this.panelManager;\n\n // Restore index\n cameraElement.innerHTML = panels.map(panel => panel.html).join(\"\");\n\n // Create panels first\n this.refreshPanels();\n const createdPanels = panelManager.originalPanels();\n\n // ...then order it by its index\n const orderedPanels: Panel[] = [];\n panels.forEach((panel, idx) => {\n const createdPanel = createdPanels[idx];\n createdPanel.setIndex(panel.index);\n orderedPanels[panel.index] = createdPanel;\n });\n panelManager.replacePanels(orderedPanels, []);\n panelManager.setCloneCount(0); // No clones at this point\n\n const panelCount = panelManager.getPanelCount();\n if (panelCount > 0) {\n this.currentPanel = panelManager.get(status.index)\n || panelManager.get(defaultIndex)\n || panelManager.firstPanel();\n } else {\n this.currentPanel = undefined;\n }\n this.visiblePanels = orderedPanels.filter(panel => Boolean(panel));\n\n this.resize();\n\n this.axes.setTo({ flick: status.position }, 0);\n this.moveCamera(status.position);\n }\n\n public calcVisiblePanels(): Panel[] {\n const allPanels = this.panelManager.allPanels();\n if (this.options.renderOnlyVisible) {\n const cameraPos = this.getCameraPosition();\n const viewportSize = this.getSize();\n const basePanel = this.nearestPanel!;\n\n const getNextPanel = (panel: Panel) => {\n const nextPanel = panel.nextSibling;\n\n if (nextPanel && nextPanel.getPosition() >= panel.getPosition()) {\n return nextPanel;\n } else {\n return null;\n }\n };\n\n const getPrevPanel = (panel: Panel) => {\n const prevPanel = panel.prevSibling;\n\n if (prevPanel && prevPanel.getPosition() <= panel.getPosition()) {\n return prevPanel;\n } else {\n return null;\n }\n };\n\n const isOutOfBoundNext = (panel: Panel) => panel.getPosition() >= cameraPos + viewportSize;\n const isOutOfBoundPrev = (panel: Panel) => panel.getPosition() + panel.getSize() <= cameraPos;\n\n const getVisiblePanels = (\n panel: Panel,\n getNext: (panel: Panel) => Panel | null,\n isOutOfViewport: (panel: Panel) => boolean,\n ): Panel[] => {\n const visiblePanels: Panel[] = [];\n\n let lastPanel = panel;\n while (true) {\n const nextPanel = getNext(lastPanel);\n if (!nextPanel || isOutOfViewport(nextPanel)) {\n break;\n }\n visiblePanels.push(nextPanel);\n lastPanel = nextPanel;\n }\n return visiblePanels;\n };\n\n const panelCount = this.panelManager.getPanelCount();\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n const nextPanels = getVisiblePanels(basePanel, getNextPanel, isOutOfBoundNext);\n const prevPanels = getVisiblePanels(basePanel, getPrevPanel, isOutOfBoundPrev);\n\n return [basePanel, ...nextPanels, ...prevPanels].sort((panel1, panel2) => getAbsIndex(panel1) - getAbsIndex(panel2));\n } else {\n return allPanels.filter(panel => {\n const outsetProgress = panel.getOutsetProgress();\n\n return outsetProgress > -1 && outsetProgress < 1;\n });\n }\n }\n\n public getCurrentPanel(): Panel | undefined {\n return this.currentPanel;\n }\n\n public getCurrentIndex(): number {\n const currentPanel = this.currentPanel;\n\n return currentPanel\n ? currentPanel.getIndex()\n : -1;\n }\n\n public getNearestPanel(): Panel | undefined {\n return this.nearestPanel;\n }\n\n // Get progress from nearest panel\n public getCurrentProgress(): number {\n const currentState = this.stateMachine.getState();\n let nearestPanel = currentState.playing || currentState.holding\n ? this.nearestPanel\n : this.currentPanel;\n\n const panelManager = this.panelManager;\n if (!nearestPanel) {\n // There're no panels\n return NaN;\n }\n const { prev: prevRange, next: nextRange } = this.getScrollArea();\n const cameraPosition = this.getCameraPosition();\n const isOutOfBound = this.isOutOfBound();\n let prevPanel = nearestPanel.prevSibling;\n let nextPanel = nearestPanel.nextSibling;\n let hangerPosition = this.getHangerPosition();\n let nearestAnchorPos = nearestPanel.getAnchorPosition();\n\n if (\n isOutOfBound\n && prevPanel\n && nextPanel\n && cameraPosition < nextRange\n // On the basis of anchor, prevPanel is nearestPanel.\n && (hangerPosition - prevPanel.getAnchorPosition() < nearestAnchorPos - hangerPosition)\n ) {\n nearestPanel = prevPanel;\n nextPanel = nearestPanel.nextSibling;\n prevPanel = nearestPanel.prevSibling;\n nearestAnchorPos = nearestPanel.getAnchorPosition();\n }\n const nearestIndex = nearestPanel.getIndex() + (nearestPanel.getCloneIndex() + 1) * panelManager.getPanelCount();\n const nearestSize = nearestPanel.getSize();\n\n if (isOutOfBound) {\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n if (nearestAnchorPos > nextRange + relativeHangerPosition) {\n // next bounce area: hangerPosition - relativeHangerPosition - nextRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - nextRange;\n } else if (nearestAnchorPos < prevRange + relativeHangerPosition) {\n // prev bounce area: hangerPosition - relativeHangerPosition - prevRange\n hangerPosition = nearestAnchorPos + hangerPosition - relativeHangerPosition - prevRange;\n }\n }\n const hangerIsNextToNearestPanel = hangerPosition >= nearestAnchorPos;\n const gap = this.options.gap;\n\n let basePosition = nearestAnchorPos;\n let targetPosition = nearestAnchorPos;\n if (hangerIsNextToNearestPanel) {\n targetPosition = nextPanel\n ? nextPanel.getAnchorPosition()\n : nearestAnchorPos + nearestSize + gap;\n } else {\n basePosition = prevPanel\n ? prevPanel.getAnchorPosition()\n : nearestAnchorPos - nearestSize - gap;\n }\n\n const progressBetween = (hangerPosition - basePosition) / (targetPosition - basePosition);\n const startIndex = hangerIsNextToNearestPanel\n ? nearestIndex\n : prevPanel\n ? prevPanel.getIndex()\n : nearestIndex - 1;\n\n return startIndex + progressBetween;\n }\n\n // Update axes flick position without triggering event\n public updateAxesPosition(position: number) {\n const axes = this.axes;\n axes.off();\n axes.setTo({\n flick: position,\n }, 0);\n axes.on(this.axesHandlers);\n }\n\n public getSize(): number {\n return this.state.size;\n }\n\n public getScrollArea(): { prev: number, next: number } {\n return this.state.scrollArea;\n }\n\n public isOutOfBound(): boolean {\n const state = this.state;\n const options = this.options;\n const scrollArea = state.scrollArea;\n\n return !options.circular\n && options.bound\n && (state.position <= scrollArea.prev || state.position >= scrollArea.next);\n }\n\n public canSetBoundMode(): boolean {\n const options = this.options;\n\n return options.bound && !options.circular;\n }\n\n public getViewportElement(): HTMLElement {\n return this.viewportElement;\n }\n\n public getCameraElement(): HTMLElement {\n return this.cameraElement;\n }\n\n public getScrollAreaSize(): number {\n const scrollArea = this.state.scrollArea;\n\n return scrollArea.next - scrollArea.prev;\n }\n\n public getRelativeHangerPosition(): number {\n return this.state.relativeHangerPosition;\n }\n\n public getHangerPosition(): number {\n return this.state.position + this.state.relativeHangerPosition;\n }\n\n public getCameraPosition(): number {\n return this.state.position;\n }\n\n public getPositionOffset(): number {\n return this.state.positionOffset;\n }\n\n public getCheckedIndexes(): Array<[number, number]> {\n return this.state.checkedIndexes;\n }\n\n public getVisiblePanels(): Panel[] {\n return this.visiblePanels;\n }\n\n public setCurrentPanel(panel: Panel): void {\n this.currentPanel = panel;\n }\n\n public setLastIndex(index: number): void {\n const currentPanel = this.currentPanel;\n const panelManager = this.panelManager;\n\n panelManager.setLastIndex(index);\n if (currentPanel && currentPanel.getIndex() > index) {\n this.currentPanel = panelManager.lastPanel();\n }\n\n this.resize();\n }\n\n public setVisiblePanels(panels: Panel[]): void {\n this.visiblePanels = panels;\n }\n\n public connectAxesHandler(handlers: { [key: string]: (event: { [key: string]: any; }) => any }): void {\n const axes = this.axes;\n\n this.axesHandlers = handlers;\n axes.on(handlers);\n }\n\n public addPlugins(plugins: Plugin | Plugin[]) {\n const newPlugins = ([] as Plugin[]).concat(plugins);\n\n newPlugins.forEach(plugin => {\n plugin.init(this.flicking);\n });\n\n this.plugins = this.plugins.concat(newPlugins);\n return this;\n }\n\n public removePlugins(plugins: Plugin | Plugin[]) {\n const currentPlugins = this.plugins;\n const removedPlugins = ([] as Plugin[]).concat(plugins);\n\n removedPlugins.forEach(plugin => {\n const index = currentPlugins.indexOf(plugin);\n\n if (index > -1) {\n currentPlugins.splice(index, 1);\n }\n\n plugin.destroy(this.flicking);\n });\n return this;\n }\n\n public updateCheckedIndexes(changedRange: { min: number, max: number }): void {\n const state = this.state;\n\n let removed = 0;\n state.checkedIndexes.concat().forEach((indexes, idx) => {\n const [min, max] = indexes;\n // Can fill part of indexes in range\n if (changedRange.min <= max && changedRange.max >= min) {\n // Remove checked index from list\n state.checkedIndexes.splice(idx - removed, 1);\n removed++;\n }\n });\n }\n\n public appendUncachedPanelElements(panels: Panel[]): void {\n const options = this.options;\n const fragment = document.createDocumentFragment();\n\n if (options.isEqualSize) {\n const prevVisiblePanels = this.visiblePanels;\n const equalSizeClasses = options.isEqualSize as string[]; // for readability\n const cached: { [className: string]: boolean } = {};\n\n this.visiblePanels = [];\n\n Object.keys(this.panelBboxes).forEach(className => {\n cached[className] = true;\n });\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass && !cached[overlappedClass]) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n cached[overlappedClass] = true;\n } else if (!overlappedClass) {\n if (!options.renderExternal) {\n fragment.appendChild(panel.getElement());\n }\n this.visiblePanels.push(panel);\n }\n });\n prevVisiblePanels.forEach(panel => {\n this.addVisiblePanel(panel);\n });\n } else {\n if (!options.renderExternal) {\n panels.forEach(panel => fragment.appendChild(panel.getElement()));\n }\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n if (!options.renderExternal) {\n this.cameraElement.appendChild(fragment);\n }\n }\n\n private updateClonePanels() {\n const panelManager = this.panelManager;\n\n // Clone panels in circular mode\n if (this.options.circular && panelManager.getPanelCount() > 0) {\n this.clonePanels();\n this.updateClonedPanelPositions();\n }\n panelManager.chainAllPanels();\n }\n\n private getVisibleIndexOf(panel: Panel): number {\n return findIndex(this.visiblePanels, visiblePanel => visiblePanel === panel);\n }\n\n private build(): void {\n this.setElements();\n this.applyCSSValue();\n this.setMoveType();\n this.setAxesInstance();\n this.refreshPanels();\n this.setDefaultPanel();\n this.resize();\n this.moveToDefaultPanel();\n }\n\n private setElements(): void {\n const state = this.state;\n const options = this.options;\n const wrapper = this.flicking.getElement();\n const classPrefix = options.classPrefix;\n\n const viewportCandidate = wrapper.children[0] as HTMLElement;\n const hasViewportElement = viewportCandidate && hasClass(viewportCandidate, `${classPrefix}-viewport`);\n\n const viewportElement = hasViewportElement\n ? viewportCandidate\n : document.createElement(\"div\");\n\n const cameraCandidate = hasViewportElement\n ? viewportElement.children[0] as HTMLElement\n : wrapper.children[0] as HTMLElement;\n const hasCameraElement = cameraCandidate && hasClass(cameraCandidate, `${classPrefix}-camera`);\n\n const cameraElement = hasCameraElement\n ? cameraCandidate\n : document.createElement(\"div\");\n\n if (!hasCameraElement) {\n cameraElement.className = `${classPrefix}-camera`;\n\n const panelElements = hasViewportElement\n ? viewportElement.children\n : wrapper.children;\n\n // Make all panels to be a child of camera element\n // wrapper <- viewport <- camera <- panels[1...n]\n toArray(panelElements).forEach(child => {\n cameraElement.appendChild(child);\n });\n } else {\n state.originalCameraStyle = {\n className: cameraElement.getAttribute(\"class\"),\n style: cameraElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasViewportElement) {\n viewportElement.className = `${classPrefix}-viewport`;\n\n // Add viewport element to wrapper\n wrapper.appendChild(viewportElement);\n } else {\n state.originalViewportStyle = {\n className: viewportElement.getAttribute(\"class\"),\n style: viewportElement.getAttribute(\"style\"),\n };\n }\n\n if (!hasCameraElement || !hasViewportElement) {\n viewportElement.appendChild(cameraElement);\n }\n\n this.viewportElement = viewportElement;\n this.cameraElement = cameraElement;\n state.isViewportGiven = hasViewportElement;\n state.isCameraGiven = hasCameraElement;\n }\n\n private applyCSSValue(): void {\n const options = this.options;\n const viewportElement = this.viewportElement;\n const cameraElement = this.cameraElement;\n const viewportStyle = this.viewportElement.style;\n\n // Set default css values for each element\n applyCSS(viewportElement, DEFAULT_VIEWPORT_CSS);\n applyCSS(cameraElement, DEFAULT_CAMERA_CSS);\n\n viewportElement.style.zIndex = `${options.zIndex}`;\n if (options.horizontal) {\n viewportStyle.minHeight = \"100%\";\n viewportStyle.width = \"100%\";\n } else {\n viewportStyle.minWidth = \"100%\";\n viewportStyle.height = \"100%\";\n }\n if (options.overflow) {\n viewportStyle.overflow = \"visible\";\n }\n\n this.panelManager = new PanelManager(this.cameraElement, options);\n }\n\n private setMoveType(): void {\n const moveType = this.options.moveType as MoveTypeObjectOption;\n\n switch (moveType.type) {\n case MOVE_TYPE.SNAP:\n this.moveType = new Snap(moveType.count);\n break;\n case MOVE_TYPE.FREE_SCROLL:\n this.moveType = new FreeScroll();\n break;\n default:\n throw new Error(\"moveType is not correct!\");\n }\n }\n\n private setAxesInstance(): void {\n const state = this.state;\n const options = this.options;\n\n const scrollArea = state.scrollArea;\n\n this.axes = new Axes({\n flick: {\n range: [scrollArea.prev, scrollArea.next],\n circular: options.circular,\n bounce: [0, 0], // will be updated in resize()\n },\n }, {\n easing: options.panelEffect,\n deceleration: options.deceleration,\n interruptable: true,\n });\n\n this.createPanInput();\n }\n\n private refreshPanels(): void {\n const panelManager = this.panelManager;\n // Panel elements were attached to camera element by Flicking class\n const panelElements = this.cameraElement.children;\n\n // Initialize panels\n const panels = toArray(panelElements).map(\n (el: HTMLElement, idx: number) => new Panel(el, idx, this),\n );\n\n panelManager.replacePanels(panels, []);\n this.visiblePanels = panels.filter(panel => Boolean(panel));\n }\n\n private setDefaultPanel(): void {\n const options = this.options;\n const panelManager = this.panelManager;\n const indexRange = this.panelManager.getRange();\n const index = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n\n this.currentPanel = panelManager.get(index);\n }\n\n private clonePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n\n const gap = options.gap;\n const viewportSize = state.size;\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n // There're no panels exist\n if (!firstPanel) {\n return;\n }\n\n // For each panels, clone itself while last panel's position + size is below viewport size\n const panels = panelManager.originalPanels();\n const reversedPanels = panels.concat().reverse();\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + gap;\n const relativeAnchorPosition = firstPanel.getRelativeAnchorPosition();\n const relativeHangerPosition = this.getRelativeHangerPosition();\n\n const areaPrev = (relativeHangerPosition - relativeAnchorPosition) % sumOriginalPanelSize;\n let sizeSum = 0;\n let panelAtLeftBoundary!: Panel;\n for (const panel of reversedPanels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaPrev) {\n panelAtLeftBoundary = panel;\n break;\n }\n }\n\n const areaNext = (viewportSize - relativeHangerPosition + relativeAnchorPosition) % sumOriginalPanelSize;\n sizeSum = 0;\n let panelAtRightBoundary!: Panel;\n for (const panel of panels) {\n if (!panel) {\n continue;\n }\n sizeSum += panel.getSize() + gap;\n if (sizeSum >= areaNext) {\n panelAtRightBoundary = panel;\n break;\n }\n }\n\n // Need one more set of clones on prev area of original panel 0\n const needCloneOnPrev = panelAtLeftBoundary.getIndex() !== 0\n && panelAtLeftBoundary.getIndex() <= panelAtRightBoundary.getIndex();\n\n // Visible count of panel 0 on first screen\n const panel0OnFirstscreen = Math.ceil((relativeHangerPosition + firstPanel.getSize() - relativeAnchorPosition) / sumOriginalPanelSize)\n + Math.ceil((viewportSize - relativeHangerPosition + relativeAnchorPosition) / sumOriginalPanelSize)\n - 1; // duplication\n\n const cloneCount = panel0OnFirstscreen\n + (needCloneOnPrev ? 1 : 0);\n const prevCloneCount = panelManager.getCloneCount();\n\n panelManager.setCloneCount(cloneCount);\n if (options.renderExternal) {\n return;\n }\n\n if (cloneCount > prevCloneCount) {\n // should clone more\n for (let cloneIndex = prevCloneCount; cloneIndex < cloneCount; cloneIndex++) {\n const clones = panels.map(origPanel => origPanel.clone(cloneIndex));\n const fragment = document.createDocumentFragment();\n clones.forEach(panel => fragment.appendChild(panel.getElement()));\n\n this.cameraElement.appendChild(fragment);\n this.visiblePanels.push(...clones.filter(clone => Boolean(clone)));\n panelManager.insertClones(cloneIndex, 0, clones);\n }\n } else if (cloneCount < prevCloneCount) {\n // should remove some\n panelManager.removeClonesAfter(cloneCount);\n }\n }\n\n private moveToDefaultPanel(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const indexRange = this.panelManager.getRange();\n\n const defaultIndex = clamp(options.defaultIndex, indexRange.min, indexRange.max);\n const defaultPanel = panelManager.get(defaultIndex);\n\n let defaultPosition = 0;\n if (defaultPanel) {\n defaultPosition = defaultPanel.getAnchorPosition() - state.relativeHangerPosition;\n defaultPosition = this.canSetBoundMode()\n ? clamp(defaultPosition, state.scrollArea.prev, state.scrollArea.next)\n : defaultPosition;\n }\n\n this.moveCamera(defaultPosition);\n this.axes.setTo({ flick: defaultPosition }, 0);\n }\n\n private updateSize(): void {\n const state = this.state;\n const options = this.options;\n const panels = this.panelManager.originalPanels()\n .filter(panel => Boolean(panel));\n const bbox = this.updateBbox();\n\n const prevSize = state.size;\n // Update size & hanger position\n state.size = options.horizontal\n ? bbox.width\n : bbox.height;\n\n if (prevSize !== state.size) {\n state.relativeHangerPosition = parseArithmeticExpression(options.hanger, state.size);\n state.infiniteThreshold = parseArithmeticExpression(options.infiniteThreshold, state.size);\n }\n\n if (panels.length <= 0) {\n return;\n }\n\n this.resizePanels(panels);\n }\n\n private updateOriginalPanelPositions(): void {\n const gap = this.options.gap;\n const panelManager = this.panelManager;\n\n const firstPanel = panelManager.firstPanel();\n const panels = panelManager.originalPanels();\n\n if (!firstPanel) {\n return;\n }\n\n const currentPanel = this.currentPanel!;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n const scrollArea = this.state.scrollArea;\n\n // Update panel position && fit to wrapper\n let nextPanelPos = firstPanel.getPosition();\n let maintainingPanel: Panel = firstPanel;\n if (nearestPanel) {\n // We should maintain nearestPanel's position\n const looped = !isBetween(currentState.lastPosition + currentState.delta, scrollArea.prev, scrollArea.next);\n\n maintainingPanel = looped\n ? currentPanel\n : nearestPanel;\n } else if (firstPanel.getIndex() > 0) {\n maintainingPanel = currentPanel;\n }\n\n const panelsBeforeMaintainPanel = panels.slice(0, maintainingPanel.getIndex() + (maintainingPanel.getCloneIndex() + 1) * panels.length);\n const accumulatedSize = panelsBeforeMaintainPanel.reduce((total, panel) => {\n return total + panel.getSize() + gap;\n }, 0);\n\n nextPanelPos = maintainingPanel.getPosition() - accumulatedSize;\n\n panels.forEach(panel => {\n const newPosition = nextPanelPos;\n const panelSize = panel.getSize();\n\n panel.setPosition(newPosition);\n nextPanelPos += panelSize + gap;\n });\n\n if (!this.options.renderOnlyVisible) {\n panels.forEach(panel => panel.setPositionCSS());\n }\n }\n\n private updateClonedPanelPositions(): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const clonedPanels = panelManager.clonedPanels()\n .reduce((allClones, clones) => [...allClones, ...clones], [])\n .filter(panel => Boolean(panel));\n\n const scrollArea = state.scrollArea;\n\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel()!;\n\n if (!firstPanel) {\n return;\n }\n\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Locate all cloned panels linearly first\n for (const panel of clonedPanels) {\n const origPanel = panel.getOriginalPanel();\n const cloneIndex = panel.getCloneIndex();\n const cloneBasePos = sumOriginalPanelSize * (cloneIndex + 1);\n const clonedPanelPos = cloneBasePos + origPanel.getPosition();\n\n panel.setPosition(clonedPanelPos);\n }\n\n let lastReplacePosition = firstPanel.getPosition();\n // reverse() pollutes original array, so copy it with concat()\n for (const panel of clonedPanels.concat().reverse()) {\n const panelSize = panel.getSize();\n const replacePosition = lastReplacePosition - panelSize - options.gap;\n\n if (replacePosition + panelSize <= scrollArea.prev) {\n // Replace is not meaningful, as it won't be seen in current scroll area\n break;\n }\n\n panel.setPosition(replacePosition);\n lastReplacePosition = replacePosition;\n }\n\n if (!this.options.renderOnlyVisible) {\n clonedPanels.forEach(panel => {\n panel.setPositionCSS();\n });\n }\n }\n\n private updateVisiblePanelPositions(): void {\n if (this.options.renderOnlyVisible) {\n this.visiblePanels.forEach(panel => {\n panel.setPositionCSS(this.state.positionOffset);\n });\n }\n }\n\n private updateScrollArea(): void {\n const state = this.state;\n const panelManager = this.panelManager;\n const options = this.options;\n const axes = this.axes;\n\n // Set viewport scrollable area\n const firstPanel = panelManager.firstPanel();\n const lastPanel = panelManager.lastPanel() as Panel;\n const relativeHangerPosition = state.relativeHangerPosition;\n\n if (!firstPanel) {\n state.scrollArea = {\n prev: 0,\n next: 0,\n };\n } else if (this.canSetBoundMode()) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition();\n\n if (sumOriginalPanelSize >= state.size) {\n state.scrollArea = {\n prev: firstPanel.getPosition(),\n next: lastPanel.getPosition() + lastPanel.getSize() - state.size,\n };\n } else {\n // Find anchor position of set of the combined panels\n const relAnchorPosOfCombined = parseArithmeticExpression(options.anchor, sumOriginalPanelSize);\n const anchorPos = firstPanel.getPosition() + clamp(\n relAnchorPosOfCombined,\n sumOriginalPanelSize - (state.size - relativeHangerPosition),\n relativeHangerPosition,\n );\n\n state.scrollArea = {\n prev: anchorPos - relativeHangerPosition,\n next: anchorPos - relativeHangerPosition,\n };\n }\n } else if (options.circular) {\n const sumOriginalPanelSize = lastPanel.getPosition() + lastPanel.getSize() - firstPanel.getPosition() + options.gap;\n\n // Maximum scroll extends to first clone sequence's first panel\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: sumOriginalPanelSize + firstPanel.getAnchorPosition() - relativeHangerPosition,\n };\n } else {\n state.scrollArea = {\n prev: firstPanel.getAnchorPosition() - relativeHangerPosition,\n next: lastPanel.getAnchorPosition() - relativeHangerPosition,\n };\n }\n\n const viewportSize = state.size;\n const bounce = options.bounce;\n\n let parsedBounce: number[];\n if (isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticExpression(val, viewportSize, DEFAULT_OPTIONS.bounce as number));\n } else {\n const parsedVal = parseArithmeticExpression(bounce as number | string, viewportSize, DEFAULT_OPTIONS.bounce as number);\n parsedBounce = [parsedVal, parsedVal];\n }\n\n // Update axes range and bounce\n const flick = axes.axis.flick;\n flick.range = [state.scrollArea.prev, state.scrollArea.next];\n flick.bounce = parsedBounce;\n }\n\n private checkNeedPanel(axesEvent?: any): void {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentPanel = this.currentPanel;\n const nearestPanel = this.nearestPanel;\n const currentState = this.stateMachine.getState();\n\n if (!options.infinite) {\n return;\n }\n\n const gap = options.gap;\n const infiniteThreshold = state.infiniteThreshold;\n const maxLastIndex = panelManager.getLastIndex();\n\n if (maxLastIndex < 0) {\n return;\n }\n\n if (!currentPanel || !nearestPanel) {\n // There're no panels\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: null,\n direction: null,\n indexRange: {\n min: 0,\n max: maxLastIndex,\n length: maxLastIndex + 1,\n },\n });\n return;\n }\n\n const originalNearestPosition = nearestPanel.getPosition();\n\n // Check next direction\n let checkingPanel: Panel | null = !currentState.holding && !currentState.playing\n ? currentPanel\n : nearestPanel;\n\n while (checkingPanel) {\n const currentIndex = checkingPanel.getIndex();\n const nextSibling = checkingPanel.nextSibling;\n const lastPanel = panelManager.lastPanel()!;\n const atLastPanel = currentIndex === lastPanel.getIndex();\n const nextIndex = !atLastPanel && nextSibling\n ? nextSibling.getIndex()\n : maxLastIndex + 1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelRight = checkingPanel.getPosition() + checkingPanel.getSize() - (currentNearestPosition - originalNearestPosition);\n const cameraNext = state.position + state.size;\n\n // There're empty panels between\n const emptyPanelExistsBetween = (nextIndex - currentIndex > 1);\n // Expected prev panel's left position is smaller than camera position\n const overThreshold = panelRight + gap - infiniteThreshold <= cameraNext;\n\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: currentIndex + 1,\n max: nextIndex - 1,\n length: nextIndex - currentIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at max panel index\n if (options.circular && currentIndex === maxLastIndex && overThreshold) {\n const firstPanel = panelManager.firstPanel();\n const firstIndex = firstPanel\n ? firstPanel.getIndex()\n : -1;\n\n if (firstIndex > 0) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.NEXT,\n indexRange: {\n min: 0,\n max: firstIndex - 1,\n length: firstIndex,\n },\n });\n }\n }\n\n // Check whether panels are changed\n const lastPanelAfterNeed = panelManager.lastPanel()!;\n const atLastPanelAfterNeed = lastPanelAfterNeed && currentIndex === lastPanelAfterNeed.getIndex();\n\n if (atLastPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.nextSibling;\n }\n\n // Check prev direction\n checkingPanel = nearestPanel;\n while (checkingPanel) {\n const cameraPrev = state.position;\n const checkingIndex = checkingPanel.getIndex();\n const prevSibling = checkingPanel.prevSibling;\n const firstPanel = panelManager.firstPanel()!;\n const atFirstPanel = checkingIndex === firstPanel.getIndex();\n const prevIndex = !atFirstPanel && prevSibling\n ? prevSibling.getIndex()\n : -1;\n const currentNearestPosition = nearestPanel.getPosition();\n const panelLeft = checkingPanel.getPosition() - (currentNearestPosition - originalNearestPosition);\n\n // There're empty panels between\n const emptyPanelExistsBetween = checkingIndex - prevIndex > 1;\n // Expected prev panel's right position is smaller than camera position\n const overThreshold = panelLeft - gap + infiniteThreshold >= cameraPrev;\n if (emptyPanelExistsBetween && overThreshold) {\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: prevIndex + 1,\n max: checkingIndex - 1,\n length: checkingIndex - prevIndex - 1,\n },\n });\n }\n\n // Trigger needPanel in circular & at panel 0\n if (options.circular && checkingIndex === 0 && overThreshold) {\n const lastPanel = panelManager.lastPanel();\n\n if (lastPanel && lastPanel.getIndex() < maxLastIndex) {\n const lastIndex = lastPanel.getIndex();\n\n this.triggerNeedPanel({\n axesEvent,\n siblingPanel: checkingPanel,\n direction: DIRECTION.PREV,\n indexRange: {\n min: lastIndex + 1,\n max: maxLastIndex,\n length: maxLastIndex - lastIndex,\n },\n });\n }\n }\n\n // Check whether panels were changed\n const firstPanelAfterNeed = panelManager.firstPanel();\n const atFirstPanelAfterNeed = firstPanelAfterNeed && checkingIndex === firstPanelAfterNeed.getIndex();\n\n // Looped in circular mode\n if (atFirstPanelAfterNeed || !overThreshold) {\n break;\n }\n\n checkingPanel = checkingPanel.prevSibling;\n }\n }\n\n private triggerNeedPanel(params: {\n axesEvent: any;\n siblingPanel: Panel | null,\n direction: FlickingEvent[\"direction\"];\n indexRange: NeedPanelEvent[\"range\"];\n }): void {\n const { axesEvent, siblingPanel, direction, indexRange } = params;\n const options = this.options;\n const checkedIndexes = this.state.checkedIndexes;\n const alreadyTriggered = checkedIndexes.some(([min, max]) => min === indexRange.min || max === indexRange.max);\n const hasHandler = this.flicking.hasOn(EVENTS.NEED_PANEL);\n\n if (alreadyTriggered || !hasHandler) {\n return;\n }\n\n // Should done before triggering event, as we can directly add panels by event callback\n checkedIndexes.push([indexRange.min, indexRange.max]);\n\n const index = siblingPanel\n ? siblingPanel.getIndex()\n : 0;\n const isTrusted = axesEvent\n ? axesEvent.isTrusted\n : false;\n\n this.triggerEvent(\n EVENTS.NEED_PANEL,\n axesEvent,\n isTrusted,\n {\n index,\n panel: siblingPanel,\n direction,\n range: indexRange,\n fill: (element: ElementLike | ElementLike[]) => {\n const panelManager = this.panelManager;\n if (!siblingPanel) {\n return this.insert(panelManager.getRange().max + 1, element);\n }\n\n const parsedElements = parseElement(element);\n // Slice elements to fit size equal to empty spaces\n const elements = direction === DIRECTION.NEXT\n ? parsedElements.slice(0, indexRange.length)\n : parsedElements.slice(-indexRange.length);\n\n if (direction === DIRECTION.NEXT) {\n if (options.circular && index === panelManager.getLastIndex()) {\n // needPanel event is triggered on last index, insert at index 0\n return this.insert(0, elements);\n } else {\n return siblingPanel.insertAfter(elements);\n }\n } else if (direction === DIRECTION.PREV) {\n if (options.circular && index === 0) {\n // needPanel event is triggered on first index(0), insert at the last index\n return this.insert(indexRange.max - elements.length + 1, elements);\n } else {\n return siblingPanel.insertBefore(elements);\n }\n } else {\n // direction is null when there're no panels exist\n return this.insert(0, elements);\n }\n },\n } as Partial,\n );\n }\n\n private updateVisiblePanels() {\n const state = this.state;\n const options = this.options;\n const panelManager = this.panelManager;\n const currentState = this.stateMachine.getState();\n const cameraElement = this.cameraElement;\n const { renderExternal, renderOnlyVisible } = options;\n if (!renderOnlyVisible) {\n return;\n }\n\n if (!this.nearestPanel) {\n this.visiblePanels = [];\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n return;\n }\n\n const prevVisiblePanels = this.visiblePanels;\n const newVisiblePanels = this.calcVisiblePanels();\n\n const { addedPanels, removedPanels } = this.checkVisiblePanelChange(prevVisiblePanels, newVisiblePanels);\n\n if (addedPanels.length <= 0 && removedPanels.length <= 0) {\n // Visible panels not changed\n return;\n }\n\n if (currentState.holding) {\n newVisiblePanels.push(...removedPanels);\n } else {\n const firstVisiblePanelPos = newVisiblePanels[0].getPosition();\n state.positionOffset = firstVisiblePanelPos;\n }\n\n newVisiblePanels.forEach(panel => {\n panel.setPositionCSS(state.positionOffset);\n });\n\n if (!renderExternal) {\n if (!currentState.holding) {\n removedPanels.forEach(panel => {\n const panelElement = panel.getElement();\n panelElement.parentNode && cameraElement.removeChild(panelElement);\n });\n }\n\n const fragment = document.createDocumentFragment();\n addedPanels.forEach(panel => {\n fragment.appendChild(panel.getElement());\n });\n\n cameraElement.appendChild(fragment);\n }\n\n const firstVisiblePanel = newVisiblePanels[0];\n const lastVisiblePanel = newVisiblePanels[newVisiblePanels.length - 1];\n const getAbsIndex = (panel: Panel) => panel.getIndex() + (panel.getCloneIndex() + 1) * panelManager.getPanelCount();\n\n const newVisibleRange = {\n min: getAbsIndex(firstVisiblePanel),\n max: getAbsIndex(lastVisiblePanel),\n };\n this.visiblePanels = newVisiblePanels;\n this.flicking.trigger(EVENTS.VISIBLE_CHANGE, {\n type: EVENTS.VISIBLE_CHANGE,\n range: newVisibleRange,\n });\n }\n\n private checkVisiblePanelChange(prevVisiblePanels: Panel[], newVisiblePanels: Panel[]) {\n const prevRefCount = prevVisiblePanels.map(() => 0);\n const newRefCount = newVisiblePanels.map(() => 0);\n\n prevVisiblePanels.forEach((prevPanel, prevIndex) => {\n newVisiblePanels.forEach((newPanel, newIndex) => {\n if (prevPanel === newPanel) {\n prevRefCount[prevIndex]++;\n newRefCount[newIndex]++;\n }\n });\n });\n\n const removedPanels = prevRefCount.reduce((removed: Panel[], count, index) => {\n return count === 0\n ? [...removed, prevVisiblePanels[index]]\n : removed;\n }, []);\n const addedPanels = newRefCount.reduce((added: Panel[], count, index) => {\n return count === 0\n ? [...added, newVisiblePanels[index]]\n : added;\n }, []);\n\n return { removedPanels, addedPanels };\n }\n\n private resizePanels(panels: Panel[]): void {\n const options = this.options;\n const panelBboxes = this.panelBboxes;\n\n if (options.isEqualSize === true) {\n if (!panelBboxes.default) {\n const defaultPanel = panels[0];\n panelBboxes.default = defaultPanel.getBbox();\n }\n\n const defaultBbox = panelBboxes.default;\n\n panels.forEach(panel => {\n panel.resize(defaultBbox);\n });\n return;\n } else if (options.isEqualSize) {\n const equalSizeClasses = options.isEqualSize;\n\n panels.forEach(panel => {\n const overlappedClass = panel.getOverlappedClass(equalSizeClasses);\n if (overlappedClass) {\n panel.resize(panelBboxes[overlappedClass]);\n panelBboxes[overlappedClass] = panel.getBbox();\n } else {\n panel.resize();\n }\n });\n return;\n }\n panels.forEach(panel => {\n panel.resize();\n });\n }\n\n private createPanInput() {\n const options = this.options;\n\n this.panInput = new PanInput(this.viewportElement, {\n inputType: options.inputType,\n thresholdAngle: options.thresholdAngle,\n iOSEdgeSwipeThreshold: options.iOSEdgeSwipeThreshold,\n scale: options.horizontal ? [-1, 0] : [0, -1],\n });\n\n this.axes.connect(options.horizontal ? [\"flick\", \"\"] : [\"\", \"flick\"], this.panInput);\n }\n}\n","/**\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Component from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport Viewport from \"./components/Viewport\";\nimport Panel from \"./components/Panel\";\n\nimport { merge, getProgress, parseElement, isString, counter, findIndex } from \"./utils\";\nimport { DEFAULT_OPTIONS, EVENTS, DIRECTION, AXES_EVENTS, STATE_TYPE, DEFAULT_MOVE_TYPE_OPTIONS } from \"./consts\";\nimport {\n FlickingOptions,\n FlickingEvent,\n Direction,\n EventType,\n FlickingPanel,\n TriggerCallback,\n FlickingContext,\n FlickingStatus,\n Plugin,\n ElementLike,\n DestroyOption,\n BeforeSyncResult,\n SyncResult,\n ChangeEvent,\n SelectEvent,\n NeedPanelEvent,\n VisibleChangeEvent,\n ContentErrorEvent,\n MoveTypeStringOption,\n ValueOf,\n} from \"./types\";\n// import { sendEvent } from \"./ga/ga\";\nimport { DiffResult } from \"@egjs/list-differ\";\n\n/**\n * @memberof eg\n * @extends eg.Component\n * @support {\"ie\": \"10+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"4.X+\"}\n * @requires {@link https://github.com/naver/egjs-component|eg.Component}\n * @requires {@link https://github.com/naver/egjs-axes|eg.Axes}\n * @see Easing Functions Cheat Sheet {@link http://easings.net/} 이징 함수 Cheat Sheet {@link http://easings.net/}\n */\nclass Flicking extends Component<{\n holdStart: FlickingEvent;\n holdEnd: FlickingEvent;\n moveStart: FlickingEvent;\n move: FlickingEvent;\n moveEnd: FlickingEvent;\n change: ChangeEvent;\n restore: FlickingEvent;\n select: SelectEvent;\n needPanel: NeedPanelEvent;\n visibleChange: VisibleChangeEvent;\n contentError: ContentErrorEvent;\n}> {\n /**\n * Version info string\n * @ko 버전정보 문자열\n * @example\n * eg.Flicking.VERSION; // ex) 3.0.0\n * @memberof eg.Flicking\n */\n public static VERSION: string = \"#__VERSION__#\";\n /**\n * Direction constant - \"PREV\" or \"NEXT\"\n * @ko 방향 상수 - \"PREV\" 또는 \"NEXT\"\n * @type {object}\n * @property {\"PREV\"} PREV - Prev direction from current hanger position.
It's `left(←️)` direction when `horizontal: true`.
Or, `up(↑️)` direction when `horizontal: false`.현재 행어를 기준으로 이전 방향.
`horizontal: true`일 경우 `왼쪽(←️)` 방향.
`horizontal: false`일 경우 `위쪽(↑️)`방향이다.
\n * @property {\"NEXT\"} NEXT - Next direction from current hanger position.
It's `right(→)` direction when `horizontal: true`.
Or, `down(↓️)` direction when `horizontal: false`.현재 행어를 기준으로 다음 방향.
`horizontal: true`일 경우 `오른쪽(→)` 방향.
`horizontal: false`일 경우 `아래쪽(↓️)`방향이다.
\n * @example\n * eg.Flicking.DIRECTION.PREV; // \"PREV\"\n * eg.Flicking.DIRECTION.NEXT; // \"NEXT\"\n */\n public static DIRECTION: Direction = DIRECTION;\n\n /**\n * Event type object with event name strings.\n * @ko 이벤트 이름 문자열들을 담은 객체\n * @type {object}\n * @property {\"holdStart\"} HOLD_START - holdStart eventholdStart 이벤트\n * @property {\"holdEnd\"} HOLD_END - holdEnd eventholdEnd 이벤트\n * @property {\"moveStart\"} MOVE_START - moveStart eventmoveStart 이벤트\n * @property {\"move\"} MOVE - move eventmove 이벤트\n * @property {\"moveEnd\"} MOVE_END - moveEnd eventmoveEnd 이벤트\n * @property {\"change\"} CHANGE - change eventchange 이벤트\n * @property {\"restore\"} RESTORE - restore eventrestore 이벤트\n * @property {\"select\"} SELECT - select eventselect 이벤트\n * @property {\"needPanel\"} NEED_PANEL - needPanel eventneedPanel 이벤트\n * @example\n * eg.Flicking.EVENTS.MOVE_START; // \"MOVE_START\"\n */\n public static EVENTS: EventType = EVENTS;\n\n public options: FlickingOptions;\n\n private wrapper: HTMLElement;\n private viewport: Viewport;\n private contentsReadyChecker: ImReady | null = null;\n\n private eventContext: FlickingContext;\n private isPanelChangedAtBeforeSync: boolean = false;\n\n /**\n * @param element A base element for the eg.Flicking module. When specifying a value as a `string` type, you must specify a css selector string to select the element.eg.Flicking 모듈을 사용할 기준 요소. `string`타입으로 값 지정시 요소를 선택하기 위한 css 선택자 문자열을 지정해야 한다.\n * @param options An option object of the eg.Flicking moduleeg.Flicking 모듈의 옵션 객체\n * @param {string} [options.classPrefix=\"eg-flick\"] A prefix of class names will be added for the panels, viewport, and camera.패널들과 뷰포트, 카메라에 추가될 클래스 이름의 접두사.\n * @param {number} [options.deceleration=0.0075] Deceleration value for panel movement animation for animation triggered by manual user input. A higher value means a shorter running time.사용자의 동작으로 가속도가 적용된 패널 이동 애니메이션의 감속도. 값이 높을수록 애니메이션 실행 시간이 짧아진다.\n * @param {boolean} [options.horizontal=true] The direction of panel movement. (true: horizontal, false: vertical)패널 이동 방향. (true: 가로방향, false: 세로방향)\n * @param {boolean} [options.circular=false] Enables circular mode, which connects first/last panel for continuous scrolling.순환 모드를 활성화한다. 순환 모드에서는 양 끝의 패널이 서로 연결되어 끊김없는 스크롤이 가능하다.\n * @param {boolean} [options.infinite=false] Enables infinite mode, which can automatically trigger needPanel until reaching the last panel's index reaches the lastIndex.무한 모드를 활성화한다. 무한 모드에서는 needPanel 이벤트를 자동으로 트리거한다. 해당 동작은 마지막 패널의 인덱스가 lastIndex와 일치할때까지 일어난다.\n * @param {number} [options.infiniteThreshold=0] A Threshold from viewport edge before triggering `needPanel` event in infinite mode.무한 모드에서 `needPanel`이벤트가 발생하기 위한 뷰포트 끝으로부터의 최대 거리.\n * @param {number} [options.lastIndex=Infinity] Maximum panel index that Flicking can set. Flicking won't trigger `needPanel` when the event's panel index is greater than it.
Also, if the last panel's index reached a given index, you can't add more panels.Flicking이 설정 가능한 패널의 최대 인덱스. `needPanel` 이벤트에 지정된 인덱스가 최대 패널의 개수보다 같거나 커야 하는 경우에 이벤트를 트리거하지 않게 한다.
또한, 마지막 패널의 인덱스가 주어진 인덱스와 동일할 경우, 새로운 패널을 더 이상 추가할 수 없다.
\n * @param {number} [options.threshold=40] Movement threshold to change panel(unit: pixel). It should be dragged above the threshold to change the current panel.패널 변경을 위한 이동 임계값 (단위: 픽셀). 주어진 값 이상으로 스크롤해야만 패널 변경이 가능하다.\n * @param {number} [options.duration=100] Duration of the panel movement animation. (unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @param {function} [options.panelEffect=x => 1 - Math.pow(1 - x, 3)] An easing function applied to the panel movement animation. Default value is `easeOutCubic`.패널 이동 애니메이션에 적용할 easing함수. 기본값은 `easeOutCubic`이다.\n * @param {number} [options.defaultIndex=0] Index of the panel to set as default when initializing. A zero-based integer.초기화시 지정할 디폴트 패널의 인덱스로, 0부터 시작하는 정수.\n * @param {string[]} [options.inputType=[\"touch,\"mouse\"]] Types of input devices to enable.({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption Reference})활성화할 입력 장치 종류. ({@link https://naver.github.io/egjs-axes/release/latest/doc/global.html#PanInputOption 참고})\n * @param {number} [options.thresholdAngle=45] The threshold angle value(0 ~ 90).
If the input angle from click/touched position is above or below this value in horizontal and vertical mode each, scrolling won't happen.스크롤 동작을 막기 위한 임계각(0 ~ 90).
클릭/터치한 지점으로부터 계산된 사용자 입력의 각도가 horizontal/vertical 모드에서 각각 크거나 작으면, 스크롤 동작이 이루어지지 않는다.
\n * @param {number|string|number[]|string[]} [options.bounce=[10,10]] The size value of the bounce area. Only can be enabled when `circular=false`.
You can set different bounce value for prev/next direction by using array.
`number` for px value, and `string` for px, and % value relative to viewport size.(ex - 0, \"10px\", \"20%\")바운스 영역의 크기값. `circular=false`인 경우에만 사용할 수 있다.
배열을 통해 prev/next 방향에 대해 서로 다른 바운스 값을 지정 가능하다.
`number`를 통해 px값을, `stirng`을 통해 px 혹은 뷰포트 크기 대비 %값을 사용할 수 있다.(ex - 0, \"10px\", \"20%\")
\n * @param {boolean} [options.autoResize=false] Whether the `resize` method should be called automatically after a window resize event.window의 `resize` 이벤트 이후 자동으로 resize()메소드를 호출할지의 여부.\n * @param {boolean} [options.adaptive=false] Whether the height(horizontal)/width(vertical) of the viewport element reflects the height/width value of the panel after completing the movement.목적 패널로 이동한 후 그 패널의 높이(horizontal)/너비(vertical)값을 뷰포트 요소의 높이/너비값에 반영할지 여부.\n * @param {number|\"\"} [options.zIndex=2000] z-index value for viewport element.뷰포트 엘리먼트의 z-index 값.\n * @param {boolean} [options.bound=false] Prevent the view from going out of the first/last panel. Only can be enabled when `circular=false`.뷰가 첫번째와 마지막 패널 밖으로 나가는 것을 막아준다. `circular=false`인 경우에만 사용할 수 있다.\n * @param {boolean} [options.overflow=false] Disables CSS property `overflow: hidden` in viewport if `true`.`true`로 설정시 뷰포트에 `overflow: hidden` 속성을 해제한다.\n * @param {string} [options.hanger=\"50%\"] The reference position of the hanger in the viewport, which hangs panel anchors should be stopped at.
It should be provided in px or % value of viewport size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"뷰포트 내부의 행어의 위치. 패널의 앵커들이 뷰포트 내에서 멈추는 지점에 해당한다.
px값이나, 뷰포트의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {string} [options.anchor=\"50%\"] The reference position of the anchor in panels, which can be hanged by viewport hanger.
It should be provided in px or % value of panel size.
You can combinate those values with plus/minus sign.
ex) \"50\", \"100px\", \"0%\", \"25% + 100px\"패널 내부의 앵커의 위치. 뷰포트의 행어와 연계하여 패널이 화면 내에서 멈추는 지점을 설정할 수 있다.
px값이나, 패널의 크기 대비 %값을 사용할 수 있고, 이를 + 혹은 - 기호로 연계하여 사용할 수도 있다.
예) \"50\", \"100px\", \"0%\", \"25% + 100px\"
\n * @param {number} [options.gap=0] Space value between panels. Should be given in number.(px)패널간에 부여할 간격의 크기를 나타내는 숫자.(px)\n * @param {eg.Flicking.MoveTypeOption} [options.moveType=\"snap\"] Movement style by user input. (ex: snap, freeScroll)사용자 입력에 의한 이동 방식.(ex: snap, freeScroll)\n * @param {boolean} [options.useOffset=false] Whether to use `offsetWidth`/`offsetHeight` instead of `getBoundingClientRect` for panel/viewport size calculation.
You can use this option to calculate the original panel size when CSS transform is applied to viewport or panel.
⚠️ If panel size is not fixed integer value, there can be a 1px gap between panels.패널과 뷰포트의 크기를 계산할 때 `offsetWidth`/`offsetHeight`를 `getBoundingClientRect` 대신 사용할지 여부.
패널이나 뷰포트에 CSS transform이 설정되어 있을 때 원래 패널 크기를 계산하려면 옵션을 활성화한다.
⚠️ 패널의 크기가 정수로 고정되어있지 않다면 패널 사이에 1px의 공간이 생길 수 있다.
\n * @param {boolean} [options.renderOnlyVisible=false] Whether to render visible panels only. This can dramatically increase performance when there're many panels.보이는 패널만 렌더링할지 여부를 설정한다. 패널이 많을 경우에 퍼포먼스를 크게 향상시킬 수 있다.\n * @param {boolean|string[]} [options.isEqualSize=false] This option indicates whether all panels have the same size(true) of first panel, or it can hold a list of class names that determines panel size.
Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 동일한지(true), 혹은 패널 크기를 결정하는 패널 클래스들의 리스트.
이 옵션을 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.
\n * @param {boolean} [options.isConstantSize=false] Whether all panels have a constant size that won't be changed after resize. Enabling this option can increase performance while recalculating panel size.모든 패널의 크기가 불변인지의 여부. 이 옵션을 'true'로 설정하면 패널 크기 재설정시에 성능을 높일 수 있다.\n * @param {boolean} [options.renderExternal=false] Whether to use external rendering. It will delegate DOM manipulation and can synchronize the rendered state by calling `sync()` method. You can use this option to use in frameworks like React, Vue, Angular, which has its states and rendering methods.외부 렌더링을 사용할 지의 여부. 이 옵션을 사용시 렌더링을 외부에 위임할 수 있고, `sync()`를 호출하여 그 상태를 동기화할 수 있다. 이 옵션을 사용하여, React, Vue, Angular 등 자체적인 상태와 렌더링 방법을 갖는 프레임워크에 대응할 수 있다.\n * @param {boolean} [options.resizeOnContentsReady=false] Whether to resize the Flicking after the image/video elements inside viewport are ready.
Use this property to prevent wrong Flicking layout caused by dynamic image / video sizes.Flicking 내부의 이미지 / 비디오 엘리먼트들이 전부 로드되었을 때 Flicking의 크기를 재계산하기 위한 옵션.
이미지 / 비디오 크기가 고정 크기가 아닐 경우 사용하여 레이아웃이 잘못되는 것을 방지할 수 있다.
\n * @param {boolean} [options.collectStatistics=true] Whether to collect statistics on how you are using `Flicking`. These statistical data do not contain any personal information and are used only as a basis for the development of a user-friendly product.어떻게 `Flicking`을 사용하고 있는지에 대한 통계 수집 여부를 나타낸다. 이 통계자료는 개인정보를 포함하고 있지 않으며 오직 사용자 친화적인 제품으로 발전시키기 위한 근거자료로서 활용한다.\n */\n constructor(\n element: string | HTMLElement,\n options: Partial = {},\n ) {\n super();\n\n // Set flicking wrapper user provided\n let wrapper: HTMLElement | null;\n if (isString(element)) {\n wrapper = document.querySelector(element);\n if (!wrapper) {\n throw new Error(\"Base element doesn't exist.\");\n }\n } else if (element.nodeName && element.nodeType === 1) {\n wrapper = element;\n } else {\n throw new Error(\"Element should be provided in string or HTMLElement.\");\n }\n\n this.wrapper = wrapper;\n // Override default options\n this.options = merge({}, DEFAULT_OPTIONS, options) as FlickingOptions;\n // Override moveType option\n const currentOptions = this.options;\n const moveType = currentOptions.moveType as MoveTypeStringOption;\n\n if (moveType in DEFAULT_MOVE_TYPE_OPTIONS) {\n currentOptions.moveType = DEFAULT_MOVE_TYPE_OPTIONS[moveType as keyof typeof DEFAULT_MOVE_TYPE_OPTIONS];\n }\n\n // Make viewport instance with panel container element\n this.viewport = new Viewport(this, this.options, this.triggerEvent);\n this.listenInput();\n this.listenResize();\n\n // if (this.options.collectStatistics) {\n // sendEvent(\n // \"usage\",\n // \"options\",\n // options,\n // );\n // }\n }\n\n /**\n * Move to the previous panel if it exists.\n * @ko 이전 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public prev(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const prevPanel = currentPanel.prev();\n if (prevPanel) {\n prevPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the next panel if it exists.\n * @ko 다음 패널이 존재시 해당 패널로 이동한다.\n * @param [duration=options.duration] Duration of the panel movement animation(unit: ms).패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public next(duration?: number): this {\n const currentPanel = this.getCurrentPanel();\n const currentState = this.viewport.stateMachine.getState();\n\n if (currentPanel && currentState.type === STATE_TYPE.IDLE) {\n const nextPanel = currentPanel.next();\n if (nextPanel) {\n nextPanel.focus(duration);\n }\n }\n\n return this;\n }\n\n /**\n * Move to the panel of given index.\n * @ko 주어진 인덱스에 해당하는 패널로 이동한다.\n * @param index The index number of the panel to move.이동할 패널의 인덱스 번호.\n * @param duration [duration=options.duration] Duration of the panel movement.(unit: ms)패널 이동 애니메이션 진행 시간.(단위: ms)\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public moveTo(index: number, duration?: number): this {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n const state = viewport.stateMachine.getState();\n\n if (!panel || state.type !== STATE_TYPE.IDLE) {\n return this;\n }\n\n const anchorPosition = panel.getAnchorPosition();\n const hangerPosition = viewport.getHangerPosition();\n\n let targetPanel = panel;\n if (this.options.circular) {\n const scrollAreaSize = viewport.getScrollAreaSize();\n // Check all three possible locations, find the nearest position among them.\n const possiblePositions = [\n anchorPosition - scrollAreaSize,\n anchorPosition,\n anchorPosition + scrollAreaSize,\n ];\n const nearestPosition = possiblePositions.reduce((nearest, current) => {\n return (Math.abs(current - hangerPosition) < Math.abs(nearest - hangerPosition))\n ? current\n : nearest;\n }, Infinity) - panel.getRelativeAnchorPosition();\n\n const identicals = panel.getIdenticalPanels();\n const offset = nearestPosition - anchorPosition;\n if (offset > 0) {\n // First cloned panel is nearest\n targetPanel = identicals[1];\n } else if (offset < 0) {\n // Last cloned panel is nearest\n targetPanel = identicals[identicals.length - 1];\n }\n\n targetPanel = targetPanel.clone(targetPanel.getCloneIndex(), true);\n targetPanel.setPosition(nearestPosition);\n }\n const currentIndex = this.getIndex();\n\n if (hangerPosition === targetPanel.getAnchorPosition() && currentIndex === index) {\n return this;\n }\n\n const eventType = panel.getIndex() === viewport.getCurrentIndex()\n ? \"\"\n : EVENTS.CHANGE;\n\n viewport.moveTo(\n targetPanel,\n viewport.findEstimatedPosition(targetPanel),\n eventType,\n null,\n duration,\n );\n return this;\n }\n\n /**\n * Return index of the current panel. `-1` if no panel exists.\n * @ko 현재 패널의 인덱스 번호를 반환한다. 패널이 하나도 없을 경우 `-1`을 반환한다.\n * @return Current panel's index, zero-based integer.현재 패널의 인덱스 번호. 0부터 시작하는 정수.\n */\n public getIndex(): number {\n return this.viewport.getCurrentIndex();\n }\n\n /**\n * Return the wrapper element user provided in constructor.\n * @ko 사용자가 생성자에서 제공한 래퍼 엘리먼트를 반환한다.\n * @return Wrapper element user provided.사용자가 제공한 래퍼 엘리먼트.\n */\n public getElement(): HTMLElement {\n return this.wrapper;\n }\n\n /**\n * Return the viewport element's size.\n * @ko 뷰포트 엘리먼트의 크기를 반환한다.\n * @return Width if horizontal: true, height if horizontal: false\n */\n public getSize(): number {\n return this.viewport.getSize();\n }\n\n /**\n * Return current panel. `null` if no panel exists.\n * @ko 현재 패널을 반환한다. 패널이 하나도 없을 경우 `null`을 반환한다.\n * @return Current panel.현재 패널.\n */\n public getCurrentPanel(): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.getCurrentPanel();\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return the panel of given index. `null` if it doesn't exists.\n * @ko 주어진 인덱스에 해당하는 패널을 반환한다. 해당 패널이 존재하지 않을 시 `null`이다.\n * @return Panel of given index.주어진 인덱스에 해당하는 패널.\n */\n public getPanel(index: number): FlickingPanel | null {\n const viewport = this.viewport;\n const panel = viewport.panelManager.get(index);\n return panel\n ? panel\n : null;\n }\n\n /**\n * Return all panels.\n * @ko 모든 패널들을 반환한다.\n * @param - Should include cloned panels or not.복사된 패널들을 포함할지의 여부.\n * @return All panels.모든 패널들.\n */\n public getAllPanels(includeClone?: boolean): FlickingPanel[] {\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const panels = includeClone\n ? panelManager.allPanels()\n : panelManager.originalPanels();\n\n return panels\n .filter(panel => !!panel);\n }\n\n /**\n * Return the panels currently shown in viewport area.\n * @ko 현재 뷰포트 영역에서 보여지고 있는 패널들을 반환한다.\n * @return Panels currently shown in viewport area.현재 뷰포트 영역에 보여지는 패널들\n */\n public getVisiblePanels(): FlickingPanel[] {\n return this.viewport.calcVisiblePanels();\n }\n\n /**\n * Return length of original panels.\n * @ko 원본 패널의 개수를 반환한다.\n * @return Length of original panels.원본 패널의 개수\n */\n public getPanelCount(): number {\n return this.viewport.panelManager.getPanelCount();\n }\n\n /**\n * Return how many groups of clones are created.\n * @ko 몇 개의 클론 그룹이 생성되었는지를 반환한다.\n * @return Length of cloned panel groups.클론된 패널 그룹의 개수\n */\n public getCloneCount(): number {\n return this.viewport.panelManager.getCloneCount();\n }\n\n /**\n * Get maximum panel index for `infinite` mode.\n * @ko `infinite` 모드에서 적용되는 추가 가능한 패널의 최대 인덱스 값을 반환한다.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return Maximum index of panel that can be added.최대 추가 가능한 패널의 인덱스.\n */\n public getLastIndex(): number {\n return this.viewport.panelManager.getLastIndex();\n }\n\n /**\n * Set maximum panel index for `infinite' mode.
[needPanel]{@link eg.Flicking#events:needPanel} won't be triggered anymore when last panel's index reaches it.
Also, you can't add more panels after it.\n * @ko `infinite` 모드에서 적용되는 패널의 최대 인덱스를 설정한다.
마지막 패널의 인덱스가 설정한 값에 도달할 경우 더 이상 [needPanel]{@link eg.Flicking#events:needPanel} 이벤트가 발생되지 않는다.
또한, 설정한 인덱스 이후로 새로운 패널을 추가할 수 없다.\n * @param - Maximum panel index.\n * @see {@link eg.Flicking.FlickingOptions}\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public setLastIndex(index: number): this {\n this.viewport.setLastIndex(index);\n\n return this;\n }\n\n /**\n * Return panel movement animation.\n * @ko 현재 패널 이동 애니메이션이 진행 중인지를 반환한다.\n * @return Is animating or not.애니메이션 진행 여부.\n */\n public isPlaying(): boolean {\n return this.viewport.stateMachine.getState().playing;\n }\n\n /**\n * Unblock input devices.\n * @ko 막았던 입력 장치로부터의 입력을 푼다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public enableInput(): this {\n this.viewport.enable();\n\n return this;\n }\n\n /**\n * Block input devices.\n * @ko 입력 장치로부터의 입력을 막는다.\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public disableInput(): this {\n this.viewport.disable();\n\n return this;\n }\n\n /**\n * Get current flicking status. You can restore current state by giving returned value to [setStatus()]{@link eg.Flicking#setStatus}.\n * @ko 현재 상태 값을 반환한다. 반환받은 값을 [setStatus()]{@link eg.Flicking#setStatus} 메소드의 인자로 지정하면 현재 상태를 복원할 수 있다.\n * @return An object with current status value information.현재 상태값 정보를 가진 객체.\n */\n public getStatus(): FlickingStatus {\n const viewport = this.viewport;\n\n const panels = viewport.panelManager.originalPanels()\n .filter(panel => !!panel)\n .map(panel => {\n return {\n html: panel.getElement().outerHTML,\n index: panel.getIndex(),\n };\n });\n\n return {\n index: viewport.getCurrentIndex(),\n panels,\n position: viewport.getCameraPosition(),\n };\n }\n\n /**\n * Restore to the state of the `status`.\n * @ko `status`의 상태로 복원한다.\n * @param status Status value to be restored. You can specify the return value of the [getStatus()]{@link eg.Flicking#getStatus} method.복원할 상태 값. [getStatus()]{@link eg.Flicking#getStatus}메서드의 반환값을 지정하면 된다.\n */\n public setStatus(status: FlickingStatus): void {\n this.viewport.restore(status);\n }\n\n /**\n * Add plugins that can have different effects on Flicking.\n * @ko 플리킹에 다양한 효과를 부여할 수 있는 플러그인을 추가한다.\n * @param - The plugin(s) to add.추가할 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public addPlugins(plugins: Plugin | Plugin[]) {\n this.viewport.addPlugins(plugins);\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @ko 플리킹으로부터 플러그인들을 제거한다.\n * @param - The plugin(s) to remove.제거 플러그인(들).\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public removePlugins(plugins: Plugin | Plugin[]) {\n this.viewport.removePlugins(plugins);\n return this;\n }\n\n /**\n * Return the reference element and all its children to the state they were in before the instance was created. Remove all attached event handlers. Specify `null` for all attributes of the instance (including inherited attributes).\n * @ko 기준 요소와 그 하위 패널들을 인스턴스 생성전의 상태로 되돌린다. 부착된 모든 이벤트 핸들러를 탈거한다. 인스턴스의 모든 속성(상속받은 속성포함)에 `null`을 지정한다.\n * @example\n * const flick = new eg.Flicking(\"#flick\");\n * flick.destroy();\n * console.log(flick.moveTo); // null\n */\n public destroy(option: Partial = {}): void {\n this.off();\n\n if (this.options.autoResize) {\n window.removeEventListener(\"resize\", this.resize);\n }\n\n this.viewport.destroy(option);\n this.contentsReadyChecker?.destroy();\n\n // release resources\n for (const x in this) {\n (this as any)[x] = null;\n }\n }\n\n /**\n * Update panels to current state.\n * @ko 패널들을 현재 상태에 맞춰 갱신한다.\n * @method\n * @return {eg.Flicking} The instance itself.인스턴스 자기 자신.\n */\n public resize = (): this => {\n const viewport = this.viewport;\n const options = this.options;\n const wrapper = this.getElement();\n\n const allPanels = viewport.panelManager.allPanels();\n if (!options.isConstantSize) {\n allPanels.forEach(panel => panel.unCacheBbox());\n }\n\n const shouldResetElements = options.renderOnlyVisible\n && !options.isConstantSize\n && options.isEqualSize !== true;\n\n // Temporarily set parent's height to prevent scroll (#333)\n const parent = wrapper.parentElement!;\n const origStyle = parent.style.height;\n parent.style.height = `${parent.offsetHeight}px`;\n\n viewport.unCacheBbox();\n // This should be done before adding panels, to lower performance issue\n viewport.updateBbox();\n\n if (shouldResetElements) {\n viewport.appendUncachedPanelElements(allPanels as Panel[]);\n }\n\n viewport.resize();\n parent.style.height = origStyle;\n\n return this;\n }\n\n /**\n * Add new panels at the beginning of panels.\n * @ko 제일 앞에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.replace(3, document.createElement(\"div\")); // Add new panel at index 3\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 2\n * flicking.prepend([\"\\Panel\\\", document.createElement(\"div\")]); // Prepended at index 0, 1\n * flicking.prepend(\"\\Panel\\\"); // Prepended at index 0, pushing every panels behind it.\n */\n public prepend(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const parsedElements = parseElement(element);\n\n const insertingIndex = Math.max(viewport.panelManager.getRange().min - parsedElements.length, 0);\n const prependedPanels = viewport.insert(insertingIndex, parsedElements);\n\n this.checkContentsReady(prependedPanels);\n\n return prependedPanels;\n }\n\n /**\n * Add new panels at the end of panels.\n * @ko 제일 끝에 새로운 패널을 추가한다.\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of appended panels.추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\")); // Appended at index 0\n * flicking.append(\"\\Panel\\\"); // Appended at index 1\n * flicking.append([\"\\Panel\\\", document.createElement(\"div\")]); // Appended at index 2, 3\n * // Even this is possible\n * flicking.append(\"\\Panel 1\\\\Panel 2\\\"); // Appended at index 4, 5\n */\n public append(element: ElementLike | ElementLike[]): FlickingPanel[] {\n const viewport = this.viewport;\n const appendedPanels = viewport.insert(viewport.panelManager.getRange().max + 1, element);\n\n this.checkContentsReady(appendedPanels);\n\n return appendedPanels;\n }\n\n /**\n * Replace existing panels with new panels from given index. If target index is empty, add new panel at target index.\n * @ko 주어진 인덱스로부터의 패널들을 새로운 패널들로 교체한다. 인덱스에 해당하는 자리가 비어있다면, 새로운 패널을 해당 자리에 집어넣는다.\n * @param index - Start index to replace new panels.새로운 패널들로 교체할 시작 인덱스\n * @param element - Either HTMLElement, HTML string, or array of them.
It can be also HTML string of multiple elements with same depth.HTMLElement 혹은 HTML 문자열, 혹은 그것들의 배열도 가능하다.
또한, 같은 depth의 여러 개의 엘리먼트에 해당하는 HTML 문자열도 가능하다.
\n * @return Array of created panels by replace.교체되어 새롭게 추가된 패널들의 배열\n * @example\n * // Suppose there were no panels at initialization\n * const flicking = new eg.Flicking(\"#flick\");\n *\n * // This will add new panel at index 3,\n * // Index 0, 1, 2 is empty at this moment.\n * // [empty, empty, empty, PANEL]\n * flicking.replace(3, document.createElement(\"div\"));\n *\n * // As index 2 was empty, this will also add new panel at index 2.\n * // [empty, empty, PANEL, PANEL]\n * flicking.replace(2, \"\\Panel\\\");\n *\n * // Index 3 was not empty, so it will replace previous one.\n * // It will also add new panels at index 4 and 5.\n * // before - [empty, empty, PANEL, PANEL]\n * // after - [empty, empty, PANEL, NEW_PANEL, NEW_PANEL, NEW_PANEL]\n * flicking.replace(3, [\"\\Panel\\\", \"\\Panel\\\", \"\\Panel\\\"])\n */\n public replace(index: number, element: ElementLike | ElementLike[]): FlickingPanel[] {\n const replacedPanels = this.viewport.replace(index, element);\n\n this.checkContentsReady(replacedPanels);\n\n return replacedPanels;\n }\n\n /**\n * Remove panel at target index. This will decrease index of panels behind it.\n * @ko `index`에 해당하는 자리의 패널을 제거한다. 수행시 `index` 이후의 패널들의 인덱스가 감소된다.\n * @param index - Index of panel to remove.제거할 패널의 인덱스\n * @param {number} [deleteCount=1] - Number of panels to remove from index.`index` 이후로 제거할 패널의 개수.\n * @return Array of removed panels제거된 패널들의 배열\n */\n public remove(index: number, deleteCount: number = 1): FlickingPanel[] {\n return this.viewport.remove(index, deleteCount);\n }\n\n /**\n * Get indexes to render. Should be used with `renderOnlyVisible` option.\n * `beforeSync` should be called before this method for a correct result.\n * @private\n * @ko 렌더링이 필요한 인덱스들을 반환한다. `renderOnlyVisible` 옵션과 함께 사용해야 한다. 정확한 결과를 위해선 `beforeSync`를 이전에 호출해야만 합니다.\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @return Array of indexes to render.렌더링할 인덱스의 배열\n */\n public getRenderingIndexes(diffResult: DiffResult): number[] {\n const viewport = this.viewport;\n const visiblePanels = viewport.getVisiblePanels();\n const maintained = diffResult.maintained.reduce((values: {[key: number]: number}, [before, after]) => {\n values[after] = before;\n return values;\n }, {});\n\n const panelCount = diffResult.list.length;\n const added = diffResult.added;\n const getPanelAbsIndex = (panel: Panel) => {\n return panel.getIndex() + (panel.getCloneIndex() + 1) * panelCount;\n };\n\n const visibleIndexes = visiblePanels.map(panel => getPanelAbsIndex(panel))\n .filter(val => maintained[val % panelCount] != null);\n\n const renderingPanels = [...visibleIndexes, ...added];\n const allPanels = viewport.panelManager.allPanels();\n\n viewport.setVisiblePanels(renderingPanels.map(index => allPanels[index]));\n\n return renderingPanels;\n }\n\n /**\n * Synchronize info of panels instance with info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 패널의 정보와 현재 플리킹이 갖는 패널 정보를 동기화한다.\n * @private\n * @param - Info object of how panel infos are changed.패널 정보들의 변경 정보를 담는 오브젝트.\n * @param - Whether called from sync method sync 메소드로부터 호출됐는지 여부 \n */\n public beforeSync(diffInfo: BeforeSyncResult) {\n const { maintained, added, changed, removed } = diffInfo;\n const viewport = this.viewport;\n const panelManager = viewport.panelManager;\n const isCircular = this.options.circular;\n const cloneCount = panelManager.getCloneCount();\n const prevClonedPanels = panelManager.clonedPanels();\n\n // Update visible panels\n const newVisiblePanels = viewport.getVisiblePanels()\n .filter(panel => findIndex(removed, index => {\n return index === panel.getIndex();\n }) < 0);\n viewport.setVisiblePanels(newVisiblePanels);\n\n // Did not changed at all\n if (\n added.length <= 0\n && removed.length <= 0\n && changed.length <= 0\n && cloneCount === prevClonedPanels.length\n ) {\n return this;\n }\n const prevOriginalPanels = panelManager.originalPanels();\n const newPanels: Panel[] = [];\n const newClones: Panel[][] = counter(cloneCount).map(() => []);\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newPanels[afterIdx] = prevOriginalPanels[beforeIdx];\n newPanels[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n newPanels[addIndex] = new Panel(null, addIndex, this.viewport);\n });\n\n if (isCircular) {\n counter(cloneCount).forEach(groupIndex => {\n const prevCloneGroup = prevClonedPanels[groupIndex];\n const newCloneGroup = newClones[groupIndex];\n\n maintained.forEach(([beforeIdx, afterIdx]) => {\n newCloneGroup[afterIdx] = prevCloneGroup\n ? prevCloneGroup[beforeIdx]\n : newPanels[afterIdx].clone(groupIndex, false);\n\n newCloneGroup[afterIdx].setIndex(afterIdx);\n });\n\n added.forEach(addIndex => {\n const newPanel = newPanels[addIndex];\n\n newCloneGroup[addIndex] = newPanel.clone(groupIndex, false);\n });\n });\n }\n\n added.forEach(index => { viewport.updateCheckedIndexes({ min: index, max: index }); });\n removed.forEach(index => { viewport.updateCheckedIndexes({ min: index - 1, max: index + 1 }); });\n\n const checkedIndexes = viewport.getCheckedIndexes();\n checkedIndexes.forEach(([min, max], idx) => {\n // Push checked indexes backward\n const pushedIndex = added.filter(index => index < min && panelManager.has(index)).length\n - removed.filter(index => index < min).length;\n checkedIndexes.splice(idx, 1, [min + pushedIndex, max + pushedIndex]);\n });\n\n // Only effective only when there are least one panel which have changed its index\n if (changed.length > 0) {\n // Removed checked index by changed ones after pushing\n maintained.forEach(([, next]) => { viewport.updateCheckedIndexes({ min: next, max: next }); });\n }\n panelManager.replacePanels(newPanels, newClones);\n this.isPanelChangedAtBeforeSync = true;\n }\n\n /**\n * Synchronize info of panels with DOM info given by external rendering.\n * @ko 외부 렌더링 방식에 의해 입력받은 DOM의 정보와 현재 플리킹이 갖는 패널 정보를 동기화 한다.\n * @private\n * @param - Info object of how panel elements are changed.패널의 DOM 요소들의 변경 정보를 담는 오브젝트.\n */\n public sync(diffInfo: SyncResult): this {\n const { list, maintained, added, changed, removed } = diffInfo;\n\n // Did not changed at all\n if (added.length <= 0 && removed.length <= 0 && changed.length <= 0) {\n return this;\n }\n const viewport = this.viewport;\n const { renderOnlyVisible, circular } = this.options;\n const panelManager = viewport.panelManager;\n\n if (!renderOnlyVisible) {\n const indexRange = panelManager.getRange();\n let beforeDiffInfo: BeforeSyncResult = diffInfo;\n\n if (circular) {\n const prevOriginalPanelCount = indexRange.max;\n const originalPanelCount = (list.length / (panelManager.getCloneCount() + 1)) >> 0;\n const originalAdded = added.filter(index => index < originalPanelCount);\n const originalRemoved = removed.filter(index => index <= prevOriginalPanelCount);\n const originalMaintained = maintained.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n const originalChanged = changed.filter(([beforeIdx]) => beforeIdx <= prevOriginalPanelCount);\n\n beforeDiffInfo = {\n added: originalAdded,\n maintained: originalMaintained,\n removed: originalRemoved,\n changed: originalChanged,\n };\n }\n this.beforeSync(beforeDiffInfo);\n }\n\n const visiblePanels = renderOnlyVisible\n ? viewport.getVisiblePanels()\n : this.getAllPanels(true);\n\n added.forEach(addedIndex => {\n const addedElement = list[addedIndex];\n const beforePanel = visiblePanels[addedIndex] as Panel;\n\n beforePanel.setElement(addedElement);\n // As it can be 0\n beforePanel.unCacheBbox();\n });\n if (this.isPanelChangedAtBeforeSync) {\n // Reset visible panels\n viewport.setVisiblePanels([]);\n this.isPanelChangedAtBeforeSync = false;\n }\n viewport.resize();\n\n return this;\n }\n\n private listenInput(): void {\n const flicking = this;\n const viewport = flicking.viewport;\n const stateMachine = viewport.stateMachine;\n\n // Set event context\n flicking.eventContext = {\n flicking,\n viewport: flicking.viewport,\n transitTo: stateMachine.transitTo,\n triggerEvent: flicking.triggerEvent,\n moveCamera: flicking.moveCamera,\n stopCamera: viewport.stopCamera,\n };\n\n const handlers = {};\n for (const key in AXES_EVENTS) {\n const eventType = AXES_EVENTS[key];\n\n handlers[eventType] = (e: any) => stateMachine.fire(eventType, e, flicking.eventContext);\n }\n\n // Connect Axes instance with PanInput\n flicking.viewport.connectAxesHandler(handlers);\n }\n\n private listenResize(): void {\n const options = this.options;\n\n if (options.autoResize) {\n window.addEventListener(\"resize\", this.resize);\n }\n\n if (options.resizeOnContentsReady) {\n const contentsReadyChecker = new ImReady();\n\n contentsReadyChecker.on(\"preReady\", () => {\n this.resize();\n });\n contentsReadyChecker.on(\"readyElement\", e => {\n if (e.hasLoading && e.isPreReadyOver) {\n this.resize();\n }\n });\n contentsReadyChecker.on(\"error\", e => {\n this.trigger(EVENTS.CONTENT_ERROR, {\n type: EVENTS.CONTENT_ERROR,\n element: e.element,\n });\n });\n contentsReadyChecker.check([this.wrapper]);\n\n this.contentsReadyChecker = contentsReadyChecker;\n }\n }\n\n private triggerEvent = (\n eventName: ValueOf>, // visibleChange event has no common event definition from other events\n axesEvent: any,\n isTrusted: boolean,\n params: Partial = {},\n ): TriggerCallback => {\n const viewport = this.viewport;\n\n let canceled: boolean = true;\n\n // Ignore events before viewport is initialized\n if (viewport) {\n const state = viewport.stateMachine.getState();\n const { prev, next } = viewport.getScrollArea();\n const pos = viewport.getCameraPosition();\n let progress = getProgress(pos, [prev, prev, next]);\n\n if (this.options.circular) {\n progress %= 1;\n }\n canceled = !super.trigger(eventName, merge({\n type: eventName,\n index: this.getIndex(),\n panel: this.getCurrentPanel(),\n direction: state.direction,\n holding: state.holding,\n progress,\n axesEvent,\n isTrusted,\n }, params) as FlickingEvent);\n }\n\n return {\n onSuccess(callback: () => void): TriggerCallback {\n if (!canceled) {\n callback();\n }\n return this;\n },\n onStopped(callback: () => void): TriggerCallback {\n if (canceled) {\n callback();\n }\n return this;\n },\n } as TriggerCallback;\n }\n\n // Return result of \"move\" event triggered\n private moveCamera = (axesEvent: any): TriggerCallback => {\n const viewport = this.viewport;\n const state = viewport.stateMachine.getState();\n const options = this.options;\n\n const pos = axesEvent.pos.flick;\n const previousPosition = viewport.getCameraPosition();\n\n if (axesEvent.isTrusted && state.holding) {\n const inputOffset = options.horizontal\n ? axesEvent.inputEvent.offsetX\n : axesEvent.inputEvent.offsetY;\n\n const isNextDirection = inputOffset < 0;\n\n let cameraChange = pos - previousPosition;\n const looped = isNextDirection === (pos < previousPosition);\n if (options.circular && looped) {\n // Reached at max/min range of axes\n const scrollAreaSize = viewport.getScrollAreaSize();\n cameraChange = (cameraChange > 0 ? -1 : 1) * (scrollAreaSize - Math.abs(cameraChange));\n }\n\n const currentDirection = cameraChange === 0\n ? state.direction\n : cameraChange > 0\n ? DIRECTION.NEXT\n : DIRECTION.PREV;\n\n state.direction = currentDirection;\n }\n state.delta += axesEvent.delta.flick;\n\n viewport.moveCamera(pos, axesEvent);\n return this.triggerEvent(EVENTS.MOVE, axesEvent, axesEvent.isTrusted)\n .onStopped(() => {\n // Undo camera movement\n viewport.moveCamera(previousPosition, axesEvent);\n });\n }\n\n private checkContentsReady(panels: FlickingPanel[]) {\n this.contentsReadyChecker?.check(panels.map(panel => panel.getElement()));\n }\n}\n\nexport default Flicking;\n","import Flicking from \"./Flicking\";\nimport { withFlickingMethods } from \"./utils\";\nimport { DEFAULT_OPTIONS, MOVE_TYPE } from \"./consts\";\n\n(Flicking as any).withFlickingMethods = withFlickingMethods;\n(Flicking as any).DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n(Flicking as any).MOVE_TYPE = MOVE_TYPE;\nexport default Flicking;\n"],"names":["MOVE_TYPE","SNAP","FREE_SCROLL","DEFAULT_MOVE_TYPE_OPTIONS","snap","type","count","freeScroll","isBrowser","document","DEFAULT_OPTIONS","classPrefix","deceleration","horizontal","circular","infinite","infiniteThreshold","lastIndex","Infinity","threshold","duration","panelEffect","x","Math","pow","defaultIndex","inputType","thresholdAngle","bounce","autoResize","adaptive","zIndex","bound","overflow","hanger","anchor","gap","moveType","useOffset","isEqualSize","isConstantSize","renderOnlyVisible","renderExternal","resizeOnContentsReady","iOSEdgeSwipeThreshold","collectStatistics","DEFAULT_VIEWPORT_CSS","position","DEFAULT_CAMERA_CSS","width","height","willChange","DEFAULT_PANEL_CSS","EVENTS","HOLD_START","HOLD_END","MOVE_START","MOVE","MOVE_END","CHANGE","RESTORE","SELECT","NEED_PANEL","VISIBLE_CHANGE","CONTENT_ERROR","AXES_EVENTS","HOLD","RELEASE","ANIMATION_END","FINISH","STATE_TYPE","DIRECTION","PREV","NEXT","FLICKING_METHODS","prev","next","moveTo","getIndex","getAllPanels","getCurrentPanel","getElement","getSize","getPanel","getPanelCount","getStatus","getVisiblePanels","enableInput","disableInput","destroy","resize","setStatus","isPlaying","checkTranslateSupport","transforms","webkitTransform","msTransform","MozTransform","OTransform","transform","name","has3d","supportedStyle","documentElement","style","transformName","prefixedTransform","Error","el","createElement","insertBefore","styleVal","window","getComputedStyle","getPropertyValue","parentElement","removeChild","transformInfo","length","TRANSFORM","merge","target","_i","srcs","forEach","source","Object","keys","key","value","parseElement","element","Array","isArray","elements","isString","tempDiv","innerHTML","push","toArray","children","firstChild","hasClass","className","classList","contains","split","indexOf","applyCSS","cssObj","property","clamp","val","min","max","isBetween","iterable","slice","call","parseArithmeticExpression","cssValue","base","defaultVal","defaultValue","cssRegex","idx","calculatedValue","matchResult","exec","sign","unit","parsedValue","parseFloat","getProgress","pos","range","center","findIndex","callback","i","counter","counterArray","circulate","indexed","size","restoreStyle","originalStyle","setAttribute","removeAttribute","getBbox","clientRect","y","offsetWidth","offsetHeight","getBoundingClientRect","left","top","index","viewport","prevSibling","nextSibling","clonedPanels","state","relativeAnchorPosition","isClone","isVirtual","cloneIndex","cachedBbox","setElement","givenBbox","this","options","bbox","prevSize","panel","cloneState","panelCount","panelManager","scrollAreaSize","getScrollAreaSize","floor","getPosition","getCurrentProgress","outsetRange","getRelativeHangerPosition","getRelativeAnchorPosition","getCameraPosition","panelSize","relativePanelPosition","rightRelativePanelPosition","visibleSize","eventType","currentPanel","getHangerPosition","getAnchorPosition","findEstimatedPosition","updateFunction","shouldResize","identicalPanels","getIdenticalPanels","eachPanel","unCacheBbox","addVisiblePanel","currentIndex","currentPosition","prevPanelIndex","prevPanelPosition","prevPanelSize","hasEmptyPanelBetween","notYetMinPanel","newPosition","prevPanel","clone","getCloneIndex","setPosition","getLastIndex","nextPanelIndex","nextPanelPosition","notYetMaxPanel","nextPanel","parsedElements","firstPanel","targetIndex","insert","remove","option","preserveUI","wasVisible","cameraElement","Boolean","parentNode","getCameraElement","appendChild","classes","classes_1","original","getClonedPanels","offset","elementStyle","currentElementStyle","styleToApply","cloneElement","cloneNode","clonedPanel","Panel","clonedState","removeClonedPanelsAfter","start","removingPanels","splice","removeElement","currentElement","getAttribute","add","replace","panels","clones","cloneCount","reduce","allClones","newPanels","newClones","filter","possibleLastPanel","lastPanel","shouldRender","isCircular","findFirstPanelFrom","siblingElement","insertNewPanels","panelsAfterIndex","emptyPanelCount","removedPanels","newLastIndex","panelCount_1","pushedIndex","concat","reverse","setIndex","updateIndex","addNewClones","cloneSet","replacedPanels","wasNonEmptyCount","deleteCount","deletedPanels","nonEmptyIndexFromLast","allPanels","allPanelsCount","insertTarget_1","newClones_1","allPanels_1","_a","originalPanels","getCloneCount","lastPanelClones","nextSiblingClones","cloneNextSibling","lastPanelSibling","cloneSiblingElement","nextElementSibling","map","_this","this_1","insertClones","insertingIndex","fragment_1","createDocumentFragment","prevState","delta","direction","targetPanel","lastPosition","nextState","e","context","__extends","flicking","triggerEvent","transitTo","moveCamera","onSuccess","onStopped","onChange","State","inputEvent","offsetX","offsetY","flick","setTo","releaseEvent","srcEvent","touch","clickedElement","clickedPanel","cameraPosition","clickedPanelPosition","changedTouches","elementFromPoint","clientX","clientY","findPanelOf","stopCamera","absDelta","abs","velocity","velocityX","velocityY","inputDelta","deltaX","deltaY","isNextDirection","swipeDistance","swipeAngle","atan","PI","belowAngleThreshold","overThreshold","moveTypeContext","axesEvent","interruptDestInfo","findPanelWhenInterrupted","destPos","nearestPanel","getNearestPanel","stop","destInfo","findTargetPanel","findRestorePanel","originalTargetPosition","newCloneIndex","newTargetPosition","newTargetPanel","scrollArea","getScrollArea","loopCount","setCurrentPanel","isTrusted","updateAdaptiveSize","updateCameraPosition","updateAxesPosition","IdleState","nextStateType","currentState","HoldingState","DraggingState","AnimatingState","DisabledState","onExit","onEnter","onHold","onRelease","onAnimationEnd","onFinish","_super","ctx","snapCount","eventDelta","minimumDistanceToChange","calcBrinkOfChange","nearestIsCurrent","shouldMoveWhenBounceIs0","canSetBoundMode","shouldMoveToAdjacent","isOutOfBound","findSnappedPanel","findAdjacentPanel","halfGap","estimatedHangerPos","panelToMove","cycleIndex","passedPanelCount","originalPanel","getOriginalPanel","panelPosition","siblingPanel","panelIndex","siblingIndex","originalPosition","defaultDuration","getCurrentIndex","get","hangerPosition","firstClonedPanel","basePanel","basePosition","adjacentPanel","targetRelativeAnchorPosition","estimatedPosition","findRestorePanelInCircularMode","lapped","findNearestPanelAt","stateMachine","getState","currentPanelPosition","lastHangerPosition","Snap","panelMaintainRatio","relativeHangerPosition","positionOffset","translate","checkedIndexes","isAdaptiveCached","isViewportGiven","isCameraGiven","originalViewportStyle","originalCameraStyle","StateMachine","visiblePanels","panelBboxes","build","eventResult","axes","findNearestPanel","originalNearestPosition","checkNeedPanel","updateVisiblePanels","posOffset","moveCoord","coord","round","join","viewportElement","updateSize","updateOriginalPanelPositions","updateScrollArea","updateClonePanels","updateVisiblePanelPositions","updatePlugins","minimumDistance","prevPosition","nextPosition","distance","nearest","shortestDistance","identical","anchorPosition","getVisibleIndexOf","panInput","createPanInput","newCenterPanel","newPanelPosition","resizePanels","updateCheckedIndexes","indexes","visibleIndex","newCurrentIndex","getRange","undefined","shouldApplyAdaptive","viewportStyle","panelBbox","sizeToApply","viewportBbox","viewportSize","maximum","updateBbox","positionBounded","isFreeScroll","is","holding","playing","plugins","plugin","update","topmostElement_1","deletingElement","wrapper","removePlugins","status","html","refreshPanels","createdPanels","orderedPanels","createdPanel","replacePanels","setCloneCount","cameraPos_1","viewportSize_1","getNext","isOutOfViewport","getAbsIndex_1","__spreadArrays","sort","panel1","panel2","outsetProgress","getOutsetProgress","NaN","prevRange","nextRange","nearestAnchorPos","nearestIndex","nearestSize","hangerIsNextToNearestPanel","targetPosition","progressBetween","off","on","axesHandlers","setLastIndex","handlers","newPlugins","init","currentPlugins","changedRange","removed","prevVisiblePanels","equalSizeClasses_1","cached_1","fragment","overlappedClass","getOverlappedClass","clonePanels","updateClonedPanelPositions","chainAllPanels","visiblePanel","setElements","applyCSSValue","setMoveType","setAxesInstance","setDefaultPanel","moveToDefaultPanel","viewportCandidate","hasViewportElement","cameraCandidate","hasCameraElement","child","minHeight","minWidth","PanelManager","FreeScroll","Axes","easing","interruptable","indexRange","panelAtLeftBoundary","reversedPanels","sumOriginalPanelSize","areaPrev","sizeSum","reversedPanels_1","panelAtRightBoundary","areaNext","panels_1","needCloneOnPrev","ceil","prevCloneCount","origPanel","removeClonesAfter","defaultPanel","defaultPosition","maintainingPanel","accumulatedSize","nextPanelPos","total","setPositionCSS","clonedPanels_1","clonedPanelPos","lastReplacePosition","_b","replacePosition","relAnchorPosOfCombined","anchorPos","parsedVal","parsedBounce","arr","constructor","axis","maxLastIndex","checkingPanel","firstIndex","nextIndex","currentNearestPosition","triggerNeedPanel","lastPanelAfterNeed","cameraPrev","checkingIndex","prevIndex","firstPanelAfterNeed","params","alreadyTriggered","some","hasHandler","hasOn","fill","insertAfter","firstVisiblePanelPos","firstVisiblePanel","lastVisiblePanel","getAbsIndex","newVisibleRange","newVisiblePanels","calcVisiblePanels","checkVisiblePanelChange","addedPanels","panelElement","trigger","prevRefCount","newRefCount","newPanel","newIndex","added","equalSizeClasses_2","defaultBbox_1","default","PanInput","scale","connect","shouldResetElements","parent","origStyle","appendUncachedPanelElements","eventName","progress","canceled","inputOffset","looped","cameraChange","currentDirection","previousPosition","querySelector","nodeName","nodeType","currentOptions","Viewport","listenInput","listenResize","focus","nearestPosition","identicals","current","includeClone","enable","disable","outerHTML","restore","addPlugins","removeEventListener","contentsReadyChecker","prependedPanels","checkContentsReady","appendedPanels","diffResult","maintained","values","before","list","renderingPanels","setVisiblePanels","diffInfo","changed","prevClonedPanels","prevOriginalPanels","beforeIdx","afterIdx","addIndex","groupIndex","prevCloneGroup","newCloneGroup","getCheckedIndexes","has","isPanelChangedAtBeforeSync","prevOriginalPanelCount_1","originalPanelCount_1","originalAdded","originalRemoved","beforeDiffInfo","beforeSync","addedIndex","addedElement","beforePanel","eventContext","fire","connectAxesHandler","addEventListener","ImReady","hasLoading","isPreReadyOver","check","Flicking","Component","withFlickingMethods","prototype","flickingName","args","result"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 77b474331d..103613c11b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@egjs/flicking", - "version": "3.7.1-snapshot", + "version": "3.7.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 68d234b555..34f689b787 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@egjs/flicking", - "version": "3.7.1-snapshot", + "version": "3.7.2", "description": "Everyday 30 million people experience. It's reliable, flexible and extendable carousel.", "main": "dist/flicking.js", "module": "dist/flicking.esm.js", diff --git a/packages/ngx-flicking/projects/ngx-flicking/package-lock.json b/packages/ngx-flicking/projects/ngx-flicking/package-lock.json index b2493d33c0..9726e4c282 100644 --- a/packages/ngx-flicking/projects/ngx-flicking/package-lock.json +++ b/packages/ngx-flicking/projects/ngx-flicking/package-lock.json @@ -1,6 +1,6 @@ { "name": "@egjs/ngx-flicking", - "version": "3.4.2", + "version": "3.4.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -33,13 +33,13 @@ "integrity": "sha512-2m6nu6/Mbs6VnoT4IHFGUBX6V82Zp01zDmlWpIJ3fMatHpe7BB1qUYFgMmSWGY0uOvOl4plvflwbCRUAGMfwWQ==" }, "@egjs/flicking": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.0.tgz", - "integrity": "sha512-NFrsnrSbkVrdiaJGhrbh0iE51v/5OMZD83e9qEPbObsZ/xn2AbCJRHbDnPRT0zDx8nb8Y8gC4+9j/DAMnVjG4g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.1.tgz", + "integrity": "sha512-Y+pg0zmqDMemqQipy2W9bOYBilekRTQX0hflQupFzgPuvAL/zcHUtd44Sc9H24nPI9PjCfrorS0yrvBYDponLw==", "requires": { "@egjs/axes": "^2.7.0", "@egjs/component": "^2.2.2", - "@egjs/imready": "^1.1.0", + "@egjs/imready": "^1.1.2", "@egjs/list-differ": "^1.0.0" } }, @@ -74,9 +74,9 @@ } }, "@types/hammerjs": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", - "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.38.tgz", + "integrity": "sha512-wuwDzWW1JWh3BZoRftBlKcctjNzR75QFY4/b4zAz7sH1EesA8HBJzke+bF5dxCATNdHHs3X1P5UWanbbUT6chw==" }, "tslib": { "version": "1.10.0", diff --git a/packages/ngx-flicking/projects/ngx-flicking/package.json b/packages/ngx-flicking/projects/ngx-flicking/package.json index af3a6b9c8b..4deb726495 100644 --- a/packages/ngx-flicking/projects/ngx-flicking/package.json +++ b/packages/ngx-flicking/projects/ngx-flicking/package.json @@ -1,13 +1,13 @@ { "name": "@egjs/ngx-flicking", - "version": "3.4.2", + "version": "3.4.3", "description": "Everyday 30 million people experience. It's reliable, flexible and extendable carousel.", "peerDependencies": { "@angular/common": "^7.2.0", "@angular/core": "^7.2.15" }, "dependencies": { - "@egjs/flicking": "^3.7.0", + "@egjs/flicking": "^3.7.1", "@egjs/ngx-children-differ": "^1.0.0" }, "repository": { diff --git a/packages/preact-flicking/package-lock.json b/packages/preact-flicking/package-lock.json index f4dd95e59e..dd3624efdb 100644 --- a/packages/preact-flicking/package-lock.json +++ b/packages/preact-flicking/package-lock.json @@ -1,6 +1,6 @@ { "name": "@egjs/preact-flicking", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -174,6 +174,11 @@ "@egjs/list-differ": "^1.0.0" } }, + "@egjs/component": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@egjs/component/-/component-2.2.2.tgz", + "integrity": "sha512-2m6nu6/Mbs6VnoT4IHFGUBX6V82Zp01zDmlWpIJ3fMatHpe7BB1qUYFgMmSWGY0uOvOl4plvflwbCRUAGMfwWQ==" + }, "@egjs/flicking": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.0.tgz", @@ -232,28 +237,23 @@ "integrity": "sha512-HsbMKc0ZAQH+EUeCmI/2PvTYSybmkaWwakU8QGDYYgMVIg9BQ5sM0A0Nnombjxo2+JzXHxmH+jw//yGX+y6GYw==" }, "@egjs/react-flicking": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@egjs/react-flicking/-/react-flicking-3.5.1.tgz", - "integrity": "sha512-LkNCGLqA1aVurbPPuery+yXEHsF1JC2tKZYSySjzAnxTYk+4fqvrahYR9nmMnTu7BNvdpHpDnpiCJY3kdzpArQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@egjs/react-flicking/-/react-flicking-3.5.3.tgz", + "integrity": "sha512-wG3pqLoVhP8oWFxUsQVoX4+iUuRD9150igu+ALa5MBp8ErFr8LBfRBeYOCOp2LnNChvwywY5wRLbKpY0IGP4eQ==", "requires": { "@egjs/children-differ": "^1.0.1", - "@egjs/flicking": "^3.7.0", + "@egjs/flicking": "^3.7.1", "@egjs/list-differ": "^1.0.0" }, "dependencies": { - "@egjs/component": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@egjs/component/-/component-2.2.2.tgz", - "integrity": "sha512-2m6nu6/Mbs6VnoT4IHFGUBX6V82Zp01zDmlWpIJ3fMatHpe7BB1qUYFgMmSWGY0uOvOl4plvflwbCRUAGMfwWQ==" - }, "@egjs/flicking": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.0.tgz", - "integrity": "sha512-NFrsnrSbkVrdiaJGhrbh0iE51v/5OMZD83e9qEPbObsZ/xn2AbCJRHbDnPRT0zDx8nb8Y8gC4+9j/DAMnVjG4g==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.2.tgz", + "integrity": "sha512-rFiGlSC5WDs/9L+f28vUmPANtomJzDuBjFdnWj4v12ddlgd5SLlUw0rQQqYg78drOM+t545uL+HquMVqmklbgw==", "requires": { "@egjs/axes": "^2.7.0", "@egjs/component": "^2.2.2", - "@egjs/imready": "^1.1.0", + "@egjs/imready": "^1.1.2", "@egjs/list-differ": "^1.0.0" } } diff --git a/packages/preact-flicking/package.json b/packages/preact-flicking/package.json index 7fb02f0db7..323639fce1 100644 --- a/packages/preact-flicking/package.json +++ b/packages/preact-flicking/package.json @@ -1,6 +1,6 @@ { "name": "@egjs/preact-flicking", - "version": "3.0.0", + "version": "3.0.1", "description": "Everyday 30 million people experience. It's reliable, flexible and extendable carousel.", "main": "./dist/flicking.cjs.js", "module": "./dist/flicking.esm.js", @@ -50,6 +50,6 @@ }, "dependencies": { "@egjs/build-helper": "^0.1.2", - "@egjs/react-flicking": "^3.5.1" + "@egjs/react-flicking": "^3.5.3" } } diff --git a/packages/react-flicking/package-lock.json b/packages/react-flicking/package-lock.json index 0791ceecac..65e28093a7 100644 --- a/packages/react-flicking/package-lock.json +++ b/packages/react-flicking/package-lock.json @@ -1,6 +1,6 @@ { "name": "@egjs/react-flicking", - "version": "3.5.2", + "version": "3.5.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1295,13 +1295,13 @@ "integrity": "sha512-2m6nu6/Mbs6VnoT4IHFGUBX6V82Zp01zDmlWpIJ3fMatHpe7BB1qUYFgMmSWGY0uOvOl4plvflwbCRUAGMfwWQ==" }, "@egjs/flicking": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.0.tgz", - "integrity": "sha512-NFrsnrSbkVrdiaJGhrbh0iE51v/5OMZD83e9qEPbObsZ/xn2AbCJRHbDnPRT0zDx8nb8Y8gC4+9j/DAMnVjG4g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.1.tgz", + "integrity": "sha512-Y+pg0zmqDMemqQipy2W9bOYBilekRTQX0hflQupFzgPuvAL/zcHUtd44Sc9H24nPI9PjCfrorS0yrvBYDponLw==", "requires": { "@egjs/axes": "^2.7.0", "@egjs/component": "^2.2.2", - "@egjs/imready": "^1.1.0", + "@egjs/imready": "^1.1.2", "@egjs/list-differ": "^1.0.0" } }, @@ -1802,9 +1802,9 @@ "dev": true }, "@types/hammerjs": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", - "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.38.tgz", + "integrity": "sha512-wuwDzWW1JWh3BZoRftBlKcctjNzR75QFY4/b4zAz7sH1EesA8HBJzke+bF5dxCATNdHHs3X1P5UWanbbUT6chw==" }, "@types/highlight.js": { "version": "9.12.3", diff --git a/packages/react-flicking/package.json b/packages/react-flicking/package.json index 19de7b23a9..847b666320 100644 --- a/packages/react-flicking/package.json +++ b/packages/react-flicking/package.json @@ -1,6 +1,6 @@ { "name": "@egjs/react-flicking", - "version": "3.5.2", + "version": "3.5.3", "description": "Everyday 30 million people experience. It's reliable, flexible and extendable carousel.", "main": "dist/flicking.cjs.js", "module": "dist/flicking.esm.js", @@ -9,7 +9,7 @@ "types": "declaration/index.d.ts", "dependencies": { "@egjs/children-differ": "^1.0.1", - "@egjs/flicking": "^3.7.0", + "@egjs/flicking": "^3.7.1", "@egjs/list-differ": "^1.0.0" }, "devDependencies": { diff --git a/packages/vue-flicking/package-lock.json b/packages/vue-flicking/package-lock.json index 4cb650789d..20b8fdc715 100644 --- a/packages/vue-flicking/package-lock.json +++ b/packages/vue-flicking/package-lock.json @@ -1,6 +1,6 @@ { "name": "@egjs/vue-flicking", - "version": "3.5.2", + "version": "3.5.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1053,13 +1053,13 @@ "integrity": "sha512-2m6nu6/Mbs6VnoT4IHFGUBX6V82Zp01zDmlWpIJ3fMatHpe7BB1qUYFgMmSWGY0uOvOl4plvflwbCRUAGMfwWQ==" }, "@egjs/flicking": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.0.tgz", - "integrity": "sha512-NFrsnrSbkVrdiaJGhrbh0iE51v/5OMZD83e9qEPbObsZ/xn2AbCJRHbDnPRT0zDx8nb8Y8gC4+9j/DAMnVjG4g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@egjs/flicking/-/flicking-3.7.1.tgz", + "integrity": "sha512-Y+pg0zmqDMemqQipy2W9bOYBilekRTQX0hflQupFzgPuvAL/zcHUtd44Sc9H24nPI9PjCfrorS0yrvBYDponLw==", "requires": { "@egjs/axes": "^2.7.0", "@egjs/component": "^2.2.2", - "@egjs/imready": "^1.1.0", + "@egjs/imready": "^1.1.2", "@egjs/list-differ": "^1.0.0" } }, @@ -1267,9 +1267,9 @@ } }, "@types/hammerjs": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", - "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.38.tgz", + "integrity": "sha512-wuwDzWW1JWh3BZoRftBlKcctjNzR75QFY4/b4zAz7sH1EesA8HBJzke+bF5dxCATNdHHs3X1P5UWanbbUT6chw==" }, "@types/minimatch": { "version": "3.0.3", diff --git a/packages/vue-flicking/package.json b/packages/vue-flicking/package.json index 0989cd7681..734525bee4 100644 --- a/packages/vue-flicking/package.json +++ b/packages/vue-flicking/package.json @@ -1,6 +1,6 @@ { "name": "@egjs/vue-flicking", - "version": "3.5.2", + "version": "3.5.3", "description": "Everyday 30 million people experience. It's reliable, flexible and extendable carousel.", "main": "dist/flicking.cjs.js", "module": "dist/flicking.esm.js", @@ -30,7 +30,7 @@ }, "license": "MIT", "dependencies": { - "@egjs/flicking": "^3.7.0", + "@egjs/flicking": "^3.7.1", "@egjs/list-differ": "^1.0.0", "@egjs/vue-children-differ": "^1.0.0", "vue-property-decorator": "^8.1.0"