@egjs/flicking 4.16.0 → 4.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flicking.cjs.js +271 -190
- package/dist/flicking.cjs.js.map +1 -1
- package/dist/flicking.esm.js +271 -190
- package/dist/flicking.esm.js.map +1 -1
- package/dist/flicking.js +273 -192
- package/dist/flicking.js.map +1 -1
- package/dist/flicking.min.js +1 -1
- package/dist/flicking.min.js.map +1 -1
- package/dist/flicking.pkgd.js +273 -192
- package/dist/flicking.pkgd.js.map +1 -1
- package/dist/flicking.pkgd.min.js +1 -1
- package/dist/flicking.pkgd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/flicking.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flicking.cjs.js","sources":["../src/constants/values.ts","../src/core/AnchorPoint.ts","../src/error/codes.ts","../src/utils.ts","../src/error/FlickingError.ts","../src/event/names.ts","../src/camera/mode/CameraMode.ts","../src/camera/mode/BoundCameraMode.ts","../src/camera/mode/CircularCameraMode.ts","../src/camera/mode/LinearCameraMode.ts","../src/camera/Camera.ts","../src/constants/internal.ts","../src/control/states/State.ts","../src/control/states/AnimatingState.ts","../src/control/states/DisabledState.ts","../src/control/states/DraggingState.ts","../src/control/states/HoldingState.ts","../src/control/states/IdleState.ts","../src/control/StateMachine.ts","../src/control/AxesController.ts","../src/control/Control.ts","../src/control/FreeControl.ts","../src/control/SnapControl.ts","../src/control/StrictControl.ts","../src/core/AutoResizer.ts","../src/core/panel/provider/VanillaElementProvider.ts","../src/core/panel/provider/VirtualElementProvider.ts","../src/core/Viewport.ts","../src/core/VirtualManager.ts","../src/renderer/Renderer.ts","../src/renderer/ExternalRenderer.ts","../src/renderer/VanillaRenderer.ts","../src/core/panel/Panel.ts","../src/renderer/strategy/NormalRenderingStrategy.ts","../src/core/panel/VirtualPanel.ts","../src/renderer/strategy/VirtualRenderingStrategy.ts","../src/Flicking.ts","../src/CrossFlicking.ts","../src/cfc/getDefaultCameraTransform.ts","../src/cfc/getRenderingPanels.ts","../src/cfc/sync.ts","../src/cfc/withFlickingMethods.ts","../../../node_modules/.pnpm/@cfcs+core@0.1.0/node_modules/@cfcs/core/dist/cfcs.esm.js","../src/reactive/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * An object with all possible predefined literal string for the {@link Flicking.align | align} option\n */\nexport const ALIGN = {\n /** left/top align */\n PREV: \"prev\",\n /** center align */\n CENTER: \"center\",\n /** right/bottom align */\n NEXT: \"next\"\n} as const;\n\n/**\n * An object of directions\n */\nexport const DIRECTION = {\n /** \"left\" when {@link Flicking.horizontal | horizontal} is true, and \"top\" when {@link Flicking.horizontal | horizontal} is false */\n PREV: \"PREV\",\n /** \"right\" when {@link Flicking.horizontal | horizontal} is true, and \"bottom\" when {@link Flicking.horizontal | horizontal} is false */\n NEXT: \"NEXT\",\n /** This value usually means it's the same position */\n NONE: null\n} as const;\n\n/**\n * An object with all possible {@link Flicking.moveType | moveType}s\n */\nexport const MOVE_TYPE = {\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link SnapControl} as a Flicking's {@link Flicking.control | control} */\n SNAP: \"snap\",\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link FreeControl} as a Flicking's {@link Flicking.control | control} */\n FREE_SCROLL: \"freeScroll\",\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link StrictControl} as a Flicking's {@link Flicking.control | control} */\n STRICT: \"strict\"\n} as const;\n\nexport const CLASS = {\n VIEWPORT: \"flicking-viewport\",\n CAMERA: \"flicking-camera\",\n VERTICAL: \"vertical\",\n HIDDEN: \"flicking-hidden\",\n DEFAULT_VIRTUAL: \"flicking-panel\"\n};\n\n/**\n * An object with all possible {@link Flicking.circularFallback | circularFallback}s\n */\nexport const CIRCULAR_FALLBACK = {\n /** \"linear\" */\n LINEAR: \"linear\",\n /** \"bound\" */\n BOUND: \"bound\"\n} as const;\n\n/**\n * An object for identifying {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element(`.flicking-camera`)\n */\nexport const ORDER = {\n /** \"ltr\" */\n LTR: \"ltr\",\n /** \"rtl\" */\n RTL: \"rtl\"\n} as const;\n\n/**\n * An object that contains the direction that {@link Flicking} is moving\n */\nexport const MOVE_DIRECTION = {\n /** horizontal */\n HORIZONTAL: \"horizontal\",\n /** vertical */\n VERTICAL: \"vertical\"\n} as const;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Panel from \"./panel/Panel\";\n\n/**\n * Options for creating an AnchorPoint\n */\nexport interface AnchorPointOptions {\n /** Index of AnchorPoint */\n index: number;\n /** Position of AnchorPoint */\n position: number;\n /** A {@link Panel} instance AnchorPoint is referencing to */\n panel: Panel;\n}\n\n/**\n * A data component that has actual position where the camera should be stopped at\n */\nclass AnchorPoint {\n private _index: number;\n private _pos: number;\n private _panel: Panel;\n\n /**\n * Index of AnchorPoint\n * @readonly\n */\n public get index(): number {\n return this._index;\n }\n /**\n * Position of AnchorPoint\n * @readonly\n */\n public get position(): number {\n return this._pos;\n }\n /**\n * A {@link Panel} instance AnchorPoint is referencing to\n * @readonly\n */\n public get panel(): Panel {\n return this._panel;\n }\n\n /**\n * @param options - {@link AnchorPointOptions}\n */\n public constructor(options: AnchorPointOptions) {\n const { index, position, panel } = options;\n\n this._index = index;\n this._pos = position;\n this._panel = panel;\n }\n}\n\nexport default AnchorPoint;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n/* eslint-disable @typescript-eslint/restrict-template-expressions */\n\nimport type { FlickingErrors } from \"./types\";\n\ntype ErrorKey = keyof FlickingErrors;\n\n/**\n * Internal error catalog containing all error information.\n * @remarks\n * This is the single source of truth for all error codes and messages.\n * Use {@link ERROR_CODE} and {@link MESSAGE} exports for public access.\n * @privateRemarks\n * ## How to add a new error code\n *\n * 1. **Add to this `errors` object:**\n * ```typescript\n * NEW_ERROR_NAME: {\n * code: 15, // next available number\n * message: \"Error message\" // or function for parameterized messages\n * }\n * ```\n *\n * 2. **Document in FlickingErrors** (types.ts):\n * - Add property with same name and type signature\n * - Write comprehensive TSDoc with @remarks, @example, @see tags\n * - Include: description, common causes, solutions, wrong/correct examples\n *\n * 3. **Verify:**\n * - `pnpm build` - check TypeScript compilation\n * - `pnpm api-docs:docusaurus` - generate documentation\n * - Check packages/docs/docs/api/interfaces/FlickingErrors.mdx\n *\n * Note: `CODE` and `MESSAGE` exports are auto-generated via reduce, no manual updates needed.\n * @internal\n */\nconst errors: FlickingErrors = {\n WRONG_TYPE: {\n code: 0,\n message: (wrongVal, correctTypes) =>\n `${wrongVal}(${typeof wrongVal}) is not a ${correctTypes.map(type => `\"${type}\"`).join(\" or \")}.`\n },\n ELEMENT_NOT_FOUND: {\n code: 1,\n message: selector => `Element with selector \"${selector}\" not found.`\n },\n VAL_MUST_NOT_NULL: {\n code: 2,\n message: (val, name) => `${name} should be provided. Given: ${val}`\n },\n NOT_ATTACHED_TO_FLICKING: {\n code: 3,\n message: 'This module is not attached to the Flicking instance. \"init()\" should be called first.'\n },\n WRONG_OPTION: {\n code: 4,\n message: (optionName, val) => `Option \"${optionName}\" is not in correct format, given: ${val}`\n },\n INDEX_OUT_OF_RANGE: {\n code: 5,\n message: (val, min, max) => `Index \"${val}\" is out of range: should be between ${min} and ${max}.`\n },\n POSITION_NOT_REACHABLE: {\n code: 6,\n message: position => `Position \"${position}\" is not reachable.`\n },\n TRANSFORM_NOT_SUPPORTED: {\n code: 7,\n message: \"Browser does not support CSS transform.\"\n },\n STOP_CALLED_BY_USER: {\n code: 8,\n message: \"Event stop() is called by user.\"\n },\n ANIMATION_INTERRUPTED: {\n code: 9,\n message: \"Animation is interrupted by user input.\"\n },\n ANIMATION_ALREADY_PLAYING: {\n code: 10,\n message: \"Animation is already playing.\"\n },\n NOT_ALLOWED_IN_FRAMEWORK: {\n code: 11,\n message: \"This behavior is not allowed in the frameworks like React, Vue, or Angular.\"\n },\n NOT_INITIALIZED: {\n code: 12,\n message: \"Flicking is not initialized yet, call init() first.\"\n },\n NO_ACTIVE: {\n code: 13,\n message: \"There's no active panel that Flicking has selected. This may be due to the absence of any panels.\"\n },\n NOT_ALLOWED_IN_VIRTUAL: {\n code: 14,\n message: \"This behavior is not allowed when the virtual option is enabled\"\n }\n};\n\n/**\n * Error codes of {@link FlickingError}.\n * @remarks\n * Each error code represents a specific error condition that can occur during Flicking's lifecycle.\n * Use these codes to identify and handle errors programmatically.\n *\n * For detailed documentation of each error code, see {@link FlickingErrors}.\n * @example\n * ```typescript\n * import {FlickingError, ERROR_CODE} from \"@egjs/flicking\";\n *\n * try {\n * flicking.moveTo(999);\n * } catch (err) {\n * if (err instancof FlickingError && err.code === ERROR_CODE.INDEX_OUT_OF_RANGE) {\n * console.log(err.message);\n * }\n * }\n * ```\n * @public\n * @see {@link FlickingErrors} for detailed documentation of each error code\n */\nexport const CODE = (Object.keys(errors) as ErrorKey[]).reduce(\n (acc, key) => {\n acc[key] = errors[key].code;\n return acc;\n },\n {} as Record<ErrorKey, number>\n) as { [K in ErrorKey]: FlickingErrors[K][\"code\"] };\n\n/**\n * Error message generators for {@link FlickingError}.\n * @remarks\n * These functions generate human-readable error messages for each error code.\n * Used internally by Flicking to create {@link FlickingError} instances with\n * contextual information.\n * @internal\n */\nexport const MESSAGE = (Object.keys(errors) as ErrorKey[]).reduce(\n (acc, key) => {\n acc[key] = errors[key].message;\n return acc;\n },\n {} as Record<string, any>\n) as { [K in ErrorKey]: FlickingErrors[K][\"message\"] };\n\n/**\n * Alias for {@link CODE}.\n * @remarks\n * Exported as `ERROR_CODE` for semantic clarity when importing.\n * @example\n * ```typescript\n * import { ERROR_CODE } from \"@egjs/flicking\";\n *\n * if (err.code === ERROR_CODE.INDEX_OUT_OF_RANGE) {\n * // Handle index error\n * }\n * ```\n * @public\n */\nexport { CODE as ERROR_CODE };\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ALIGN, DIRECTION } from \"./constants/values\";\nimport * as ERROR from \"./error/codes\";\nimport FlickingError from \"./error/FlickingError\";\nimport Flicking, { FlickingOptions } from \"./Flicking\";\nimport { ElementLike } from \"./types/external\";\nimport { LiteralUnion, Merged, ValueOf } from \"./types/internal\";\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const merge = <From extends object, To extends object>(target: From, ...sources: To[]): Merged<From, To> => {\n sources.forEach(source => {\n Object.keys(source).forEach(key => {\n target[key] = source[key] as unknown;\n });\n });\n\n return target as Merged<From, To>;\n};\n\nexport const getElement = (el: HTMLElement | string | null, parent?: HTMLElement): HTMLElement => {\n let targetEl: HTMLElement | null = null;\n\n if (isString(el)) {\n const parentEl = parent ? parent : document;\n const queryResult = parentEl.querySelector(el);\n if (!queryResult) {\n throw new FlickingError(ERROR.MESSAGE.ELEMENT_NOT_FOUND(el), ERROR.CODE.ELEMENT_NOT_FOUND);\n }\n targetEl = queryResult as HTMLElement;\n } else if (el && el.nodeType === Node.ELEMENT_NODE) {\n targetEl = el;\n }\n\n if (!targetEl) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_TYPE(el, [\"HTMLElement\", \"string\"]), ERROR.CODE.WRONG_TYPE);\n }\n\n return targetEl;\n};\n\nexport const checkExistence = (value: any, nameOnErrMsg: string) => {\n if (value == null) {\n throw new FlickingError(ERROR.MESSAGE.VAL_MUST_NOT_NULL(value, nameOnErrMsg), ERROR.CODE.VAL_MUST_NOT_NULL);\n }\n};\n\nexport const clamp = (x: number, min: number, max: number) => Math.max(Math.min(x, max), min);\n\nexport const getFlickingAttached = (val: Flicking | null): Flicking => {\n if (!val) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ATTACHED_TO_FLICKING, ERROR.CODE.NOT_ATTACHED_TO_FLICKING);\n }\n\n return val;\n};\n\nexport const toArray = <T>(iterable: ArrayLike<T>): T[] => [].slice.call(iterable) as T[];\n\nexport const parseAlign = (align: LiteralUnion<ValueOf<typeof ALIGN>> | number, size: number): number => {\n let alignPoint: number | null;\n if (isString(align)) {\n switch (align) {\n case ALIGN.PREV:\n alignPoint = 0;\n break;\n case ALIGN.CENTER:\n alignPoint = 0.5 * size;\n break;\n case ALIGN.NEXT:\n alignPoint = size;\n break;\n default:\n alignPoint = parseArithmeticSize(align, size);\n if (alignPoint == null) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"align\", align), ERROR.CODE.WRONG_OPTION);\n }\n }\n } else {\n alignPoint = align as number;\n }\n\n return alignPoint;\n};\n\nexport const parseBounce = (bounce: FlickingOptions[\"bounce\"], size: number): number[] => {\n let parsedBounce: Array<number | null>;\n\n if (Array.isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticSize(val, size));\n } else {\n const parsedVal = parseArithmeticSize(bounce, size);\n\n parsedBounce = [parsedVal, parsedVal];\n }\n\n return parsedBounce.map(val => {\n if (val == null) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"bounce\", bounce), ERROR.CODE.WRONG_OPTION);\n }\n return val;\n });\n};\n\nexport const parseArithmeticSize = (cssValue: number | string, base: number): number | null => {\n const parsed = parseArithmeticExpression(cssValue);\n\n if (parsed == null) return null;\n\n return parsed.percentage * base + parsed.absolute;\n};\n\nexport const parseArithmeticExpression = (\n cssValue: number | string\n): { percentage: number; absolute: number } | null => {\n const cssRegex = /(?:(\\+|-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return { percentage: 0, absolute: cssValue };\n }\n\n const parsed = {\n percentage: 0,\n absolute: 0\n };\n let idx = 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 const 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 null;\n }\n\n const signMultiplier = sign === \"+\" ? 1 : -1;\n\n if (unit === \"%\") {\n parsed.percentage += signMultiplier * (parsedValue / 100);\n } else {\n parsed.absolute += signMultiplier * parsedValue;\n }\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return null;\n }\n\n return parsed;\n};\n\nexport const parseCSSSizeValue = (val: string | number): string => (isString(val) ? val : `${val}px`);\n\nexport const parsePanelAlign = (align: FlickingOptions[\"align\"]) =>\n typeof align === \"object\" ? (align as { panel: string | number }).panel : align;\n\nexport const getDirection = (start: number, end: number): ValueOf<typeof DIRECTION> => {\n if (start === end) return DIRECTION.NONE;\n return start < end ? DIRECTION.NEXT : DIRECTION.PREV;\n};\n\nexport const 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 if (el && el.nodeType === Node.ELEMENT_NODE) {\n elements.push(el);\n } else {\n throw new FlickingError(ERROR.MESSAGE.WRONG_TYPE(el, [\"HTMLElement\", \"string\"]), ERROR.CODE.WRONG_TYPE);\n }\n });\n\n return elements;\n};\n\nexport const getMinusCompensatedIndex = (idx: number, max: number) =>\n idx < 0 ? clamp(idx + max, 0, max) : clamp(idx, 0, max);\n\nexport const includes = <T>(array: T[], target: any): target is T => {\n for (const val of array) {\n if (val === target) return true;\n }\n return false;\n};\n\nexport const isString = (val: any): val is string => typeof val === \"string\";\n\nexport const circulatePosition = (pos: number, min: number, max: number) => {\n const size = max - min;\n\n if (pos < min) {\n const offset = (min - pos) % size;\n pos = max - offset;\n } else if (pos > max) {\n const offset = (pos - max) % size;\n pos = min + offset;\n }\n\n return pos;\n};\n\nexport const find = <T>(array: T[], checker: (val: T) => boolean): T | null => {\n for (const val of array) {\n if (checker(val)) {\n return val;\n }\n }\n\n return null;\n};\n\nexport const findRight = <T>(array: T[], checker: (val: T) => boolean): T | null => {\n for (let idx = array.length - 1; idx >= 0; idx--) {\n const val = array[idx];\n if (checker(val)) {\n return val;\n }\n }\n\n return null;\n};\n\nexport const findIndex = <T>(array: T[], checker: (val: T) => boolean): number => {\n for (let idx = 0; idx < array.length; idx++) {\n if (checker(array[idx])) {\n return idx;\n }\n }\n\n return -1;\n};\n\nexport const getProgress = (pos: number, prev: number, next: number) => (pos - prev) / (next - prev);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\nexport const getStyle = (el: HTMLElement): CSSStyleDeclaration => {\n if (!el) {\n return {} as CSSStyleDeclaration;\n }\n return window.getComputedStyle(el) || ((el as any).currentStyle as CSSStyleDeclaration);\n};\n\nexport const setSize = (\n el: HTMLElement,\n {\n width,\n height\n }: Partial<{\n width: number | string;\n height: number | string;\n }>\n) => {\n if (!el) {\n return;\n }\n\n if (width != null) {\n if (isString(width)) {\n el.style.width = width;\n } else {\n el.style.width = `${width}px`;\n }\n }\n if (height != null) {\n if (isString(height)) {\n el.style.height = height;\n } else {\n el.style.height = `${height}px`;\n }\n }\n};\n\nexport const isBetween = (val: number, min: number, max: number) => val >= min && val <= max;\n\nexport const circulateIndex = (index: number, max: number): number => {\n if (index >= max) {\n return index % max;\n } else if (index < 0) {\n return getMinusCompensatedIndex(((index + 1) % max) - 1, max);\n } else {\n return index;\n }\n};\n\nexport const range = (end: number): number[] => {\n const arr = new Array(end);\n\n for (let i = 0; i < end; i++) {\n arr[i] = i;\n }\n\n return arr;\n};\n\nexport const getElementSize = ({\n el,\n horizontal,\n useFractionalSize,\n useOffset,\n style\n}: {\n el: HTMLElement;\n horizontal: boolean;\n useFractionalSize: boolean;\n useOffset: boolean;\n style: CSSStyleDeclaration;\n}): number => {\n let size = 0;\n if (useFractionalSize) {\n const baseSize = parseFloat(horizontal ? style.width : style.height) || 0;\n const isBorderBoxSizing = style.boxSizing === \"border-box\";\n const border = horizontal\n ? parseFloat(style.borderLeftWidth || \"0\") + parseFloat(style.borderRightWidth || \"0\")\n : parseFloat(style.borderTopWidth || \"0\") + parseFloat(style.borderBottomWidth || \"0\");\n\n if (isBorderBoxSizing) {\n size = useOffset ? baseSize : baseSize - border;\n } else {\n const padding = horizontal\n ? parseFloat(style.paddingLeft || \"0\") + parseFloat(style.paddingRight || \"0\")\n : parseFloat(style.paddingTop || \"0\") + parseFloat(style.paddingBottom || \"0\");\n\n size = useOffset ? baseSize + padding + border : baseSize + padding;\n }\n } else {\n const sizeStr = horizontal ? \"Width\" : \"Height\";\n\n size = useOffset ? el[`offset${sizeStr}`] : el[`client${sizeStr}`];\n }\n\n return Math.max(size, 0);\n};\n\nexport const setPrototypeOf =\n Object.setPrototypeOf ||\n ((obj, proto) => {\n obj.__proto__ = proto;\n return obj;\n });\n\nexport const camelize = (str: string): string => {\n return str.replace(/[\\s-_]([a-z])/g, (all, letter) => letter.toUpperCase());\n};\n\nexport const getDataAttributes = (element: HTMLElement, attributePrefix: string): Record<string, string> => {\n const dataAttributes: Record<string, string> = {};\n const attributes = element.attributes;\n const length = attributes.length;\n\n for (let i = 0; i < length; ++i) {\n const attribute = attributes[i];\n const { name, value } = attribute;\n if (name.indexOf(attributePrefix) === -1) {\n continue;\n }\n dataAttributes[camelize(name.replace(attributePrefix, \"\"))] = value;\n }\n\n return dataAttributes;\n};\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { setPrototypeOf } from \"../utils\";\n\n/**\n * Special type of known error that {@link Flicking} throws.\n * @remarks\n * see {@link FlickingErrors} for possible error codes and explantaion\n * @example\n * ```ts\n * import Flicking, { FlickingError, ERROR_CODES } from \"@egjs/flicking\";\n * try {\n * const flicking = new Flicking(\".flicking-viewport\")\n * } catch (e) {\n * if (e instanceof FlickingError && e.code === ERROR_CODES.ELEMENT_NOT_FOUND) {\n * console.error(e.message)\n * }\n * }\n * ```\n */\nclass FlickingError extends Error {\n public code: number;\n\n /**\n * @param message - Error message\n * @param code - Error code\n */\n public constructor(message: string, code: number) {\n super(message);\n\n setPrototypeOf(this, FlickingError.prototype);\n this.name = \"FlickingError\";\n this.code = code;\n }\n}\n\nexport default FlickingError;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * Event type object with event name strings of {@link Flicking}\n * @example\n * ```ts\n * import { EVENTS } from \"@egjs/flicking\";\n * EVENTS.MOVE_START; // \"moveStart\"\n * ```\n */\nexport const EVENTS = {\n /** ready event */\n READY: \"ready\",\n /** beforeResize event */\n BEFORE_RESIZE: \"beforeResize\",\n /** afterResize event */\n AFTER_RESIZE: \"afterResize\",\n /** holdStart event */\n HOLD_START: \"holdStart\",\n /** holdEnd event */\n HOLD_END: \"holdEnd\",\n /** moveStart event */\n MOVE_START: \"moveStart\",\n /** move event */\n MOVE: \"move\",\n /** moveEnd event */\n MOVE_END: \"moveEnd\",\n /** willChange event */\n WILL_CHANGE: \"willChange\",\n /** changed event */\n CHANGED: \"changed\",\n /** willRestore event */\n WILL_RESTORE: \"willRestore\",\n /** restored event */\n RESTORED: \"restored\",\n /** select event */\n SELECT: \"select\",\n /** needPanel event */\n NEED_PANEL: \"needPanel\",\n /** visibleChange event */\n VISIBLE_CHANGE: \"visibleChange\",\n /** reachEdge event */\n REACH_EDGE: \"reachEdge\",\n /**\n * panelChange event\n * @since 4.1.0\n */\n PANEL_CHANGE: \"panelChange\"\n} as const;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport Flicking from \"../../Flicking\";\nimport { clamp } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\n/**\n * A mode of camera\n */\nabstract class CameraMode {\n protected _flicking: Flicking;\n\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n }\n\n public abstract checkAvailability(): boolean;\n public abstract getRange(): CameraRange;\n\n public getAnchors(): AnchorPoint[] {\n const panels = this._flicking.renderer.panels;\n\n return panels.map(\n (panel, index) =>\n new AnchorPoint({\n index,\n position: panel.position,\n panel\n })\n );\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const anchors = this._flicking.camera.anchorPoints;\n const anchorsIncludingPosition = anchors.filter(anchor => anchor.panel.includePosition(position, true));\n\n return anchorsIncludingPosition.reduce((nearest: AnchorPoint | null, anchor) => {\n if (!nearest) return anchor;\n\n return Math.abs(nearest.position - position) < Math.abs(anchor.position - position) ? nearest : anchor;\n }, null);\n }\n\n public findNearestAnchor(position: number): AnchorPoint | null {\n const anchors = this._flicking.camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n let prevDist = Infinity;\n for (let anchorIdx = 0; anchorIdx < anchors.length; anchorIdx++) {\n const anchor = anchors[anchorIdx];\n const dist = Math.abs(anchor.position - position);\n\n if (dist > prevDist) {\n // Return previous anchor\n return anchors[anchorIdx - 1];\n }\n\n prevDist = dist;\n }\n\n // Return last anchor\n return anchors[anchors.length - 1];\n }\n\n public clampToReachablePosition(position: number): number {\n const camera = this._flicking.camera;\n const range = camera.range;\n\n return clamp(position, range.min, range.max);\n }\n\n public getCircularOffset(): number {\n return 0;\n }\n\n public canReach(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const range = camera.range;\n\n if (panel.removed) return false;\n\n const panelPos = panel.position;\n\n return panelPos >= range.min && panelPos <= range.max;\n }\n\n public canSee(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const visibleRange = camera.visibleRange;\n // Should not include margin, as we don't declare what the margin is visible as what the panel is visible.\n return panel.isVisibleOnRange(visibleRange.min, visibleRange.max);\n }\n}\n\nexport default CameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport { parseAlign } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\nclass BoundCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n if (!firstPanel || !lastPanel) {\n return false;\n }\n\n const viewportSize = flicking.camera.size;\n const firstPanelPrev = firstPanel.range.min;\n const lastPanelNext = lastPanel.range.max;\n const panelAreaSize = lastPanelNext - firstPanelPrev;\n const isBiggerThanViewport = viewportSize < panelAreaSize;\n\n return isBiggerThanViewport;\n }\n\n public getRange(): CameraRange {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const alignPos = flicking.camera.alignPosition;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n if (!firstPanel || !lastPanel) {\n return { min: 0, max: 0 };\n }\n\n const viewportSize = flicking.camera.size;\n const firstPanelPrev = firstPanel.range.min;\n const lastPanelNext = lastPanel.range.max;\n const panelAreaSize = lastPanelNext - firstPanelPrev;\n const isBiggerThanViewport = viewportSize < panelAreaSize;\n\n const firstPos = firstPanelPrev + alignPos;\n const lastPos = lastPanelNext - viewportSize + alignPos;\n\n if (isBiggerThanViewport) {\n return { min: firstPos, max: lastPos };\n } else {\n const align = flicking.camera.align;\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n const pos = firstPos + parseAlign(alignVal, lastPos - firstPos);\n\n return { min: pos, max: pos };\n }\n }\n\n public getAnchors(): AnchorPoint[] {\n const flicking = this._flicking;\n const camera = flicking.camera;\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n return [];\n }\n\n const range = flicking.camera.range;\n const reachablePanels = panels.filter(panel => camera.canReach(panel));\n\n if (reachablePanels.length > 0) {\n const shouldPrependBoundAnchor = reachablePanels[0].position !== range.min;\n const shouldAppendBoundAnchor = reachablePanels[reachablePanels.length - 1].position !== range.max;\n const indexOffset = shouldPrependBoundAnchor ? 1 : 0;\n\n const newAnchors = reachablePanels.map(\n (panel, idx) =>\n new AnchorPoint({\n index: idx + indexOffset,\n position: panel.position,\n panel\n })\n );\n\n if (shouldPrependBoundAnchor) {\n newAnchors.splice(\n 0,\n 0,\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: panels[reachablePanels[0].index - 1]\n })\n );\n }\n\n if (shouldAppendBoundAnchor) {\n newAnchors.push(\n new AnchorPoint({\n index: newAnchors.length,\n position: range.max,\n panel: panels[reachablePanels[reachablePanels.length - 1].index + 1]\n })\n );\n }\n\n return newAnchors;\n } else if (range.min !== range.max) {\n // There're more than 2 panels\n const nearestPanelAtMin = this._findNearestPanel(range.min, panels);\n const panelAtMin = nearestPanelAtMin.index === panels.length - 1 ? nearestPanelAtMin.prev()! : nearestPanelAtMin;\n const panelAtMax = panelAtMin.next()!;\n\n return [\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: panelAtMin\n }),\n new AnchorPoint({\n index: 1,\n position: range.max,\n panel: panelAtMax\n })\n ];\n } else {\n return [\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: this._findNearestPanel(range.min, panels)\n })\n ];\n }\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const range = camera.range;\n const anchors = camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n if (position <= range.min) {\n return anchors[0];\n } else if (position >= range.max) {\n return anchors[anchors.length - 1];\n } else {\n return super.findAnchorIncludePosition(position);\n }\n }\n\n /**\n * @internal\n */\n private _findNearestPanel(pos: number, panels: Panel[]): Panel {\n let prevDist = Infinity;\n for (let panelIdx = 0; panelIdx < panels.length; panelIdx++) {\n const panel = panels[panelIdx];\n const dist = Math.abs(panel.position - pos);\n\n if (dist > prevDist) {\n // Return previous anchor\n return panels[panelIdx - 1];\n }\n\n prevDist = dist;\n }\n\n // Return last anchor\n return panels[panels.length - 1];\n }\n}\n\nexport default BoundCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { DIRECTION } from \"../../constants/values\";\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport { circulatePosition } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\n/**\n * A {@link Camera} mode that connects the last panel and the first panel, enabling continuous loop\n */\nclass CircularCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n\n if (panels.length <= 0) {\n return false;\n }\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n const firstPanelPrev = firstPanel.range.min - firstPanel.margin.prev;\n const lastPanelNext = lastPanel.range.max + lastPanel.margin.next;\n\n const visibleSize = flicking.camera.size;\n const panelSizeSum = lastPanelNext - firstPanelPrev;\n\n const canSetCircularMode = panels.every(panel => panelSizeSum - panel.size >= visibleSize);\n\n return canSetCircularMode;\n }\n\n public getRange(): CameraRange {\n const flicking = this._flicking;\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n return { min: 0, max: 0 };\n }\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n const firstPanelPrev = firstPanel.range.min - firstPanel.margin.prev;\n const lastPanelNext = lastPanel.range.max + lastPanel.margin.next;\n\n return { min: firstPanelPrev, max: lastPanelNext };\n }\n\n public getAnchors(): AnchorPoint[] {\n const flicking = this._flicking;\n const panels = flicking.renderer.panels;\n\n return panels.map(\n (panel, index) =>\n new AnchorPoint({\n index,\n position: panel.position,\n panel\n })\n );\n }\n\n public findNearestAnchor(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const anchors = camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n const camRange = camera.range;\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let anchorIdx = 0; anchorIdx < anchors.length; anchorIdx++) {\n const anchor = anchors[anchorIdx];\n const dist = Math.min(\n Math.abs(anchor.position - position),\n Math.abs(anchor.position - camRange.min + camRange.max - position),\n Math.abs(position - camRange.min + camRange.max - anchor.position)\n );\n\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = anchorIdx;\n }\n }\n\n // Return last anchor\n return anchors[minDistIndex];\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const range = camera.range;\n const anchors = camera.anchorPoints;\n const rangeDiff = camera.rangeDiff;\n const anchorCount = anchors.length;\n const positionInRange = circulatePosition(position, range.min, range.max);\n\n let anchorInRange: AnchorPoint | null = super.findAnchorIncludePosition(positionInRange);\n\n if (anchorCount > 0 && (position === range.min || position === range.max)) {\n const possibleAnchors = [\n anchorInRange,\n new AnchorPoint({\n index: 0,\n position: anchors[0].position + rangeDiff,\n panel: anchors[0].panel\n }),\n new AnchorPoint({\n index: anchorCount - 1,\n position: anchors[anchorCount - 1].position - rangeDiff,\n panel: anchors[anchorCount - 1].panel\n })\n ].filter(anchor => !!anchor) as AnchorPoint[];\n\n anchorInRange = possibleAnchors.reduce((nearest: AnchorPoint | null, anchor) => {\n if (!nearest) return anchor;\n\n return Math.abs(nearest.position - position) < Math.abs(anchor.position - position) ? nearest : anchor;\n }, null);\n }\n\n if (!anchorInRange) return null;\n\n if (position < range.min) {\n const loopCount = -Math.floor((range.min - position) / rangeDiff) - 1;\n\n return new AnchorPoint({\n index: anchorInRange.index,\n position: anchorInRange.position + rangeDiff * loopCount,\n panel: anchorInRange.panel\n });\n } else if (position > range.max) {\n const loopCount = Math.floor((position - range.max) / rangeDiff) + 1;\n\n return new AnchorPoint({\n index: anchorInRange.index,\n position: anchorInRange.position + rangeDiff * loopCount,\n panel: anchorInRange.panel\n });\n }\n\n return anchorInRange;\n }\n\n public getCircularOffset(): number {\n const flicking = this._flicking;\n const camera = flicking.camera;\n\n if (!camera.circularEnabled) return 0;\n\n const toggled = flicking.panels.filter(panel => panel.toggled);\n const toggledPrev = toggled.filter(panel => panel.toggleDirection === DIRECTION.PREV);\n const toggledNext = toggled.filter(panel => panel.toggleDirection === DIRECTION.NEXT);\n\n return this._calcPanelAreaSum(toggledPrev) - this._calcPanelAreaSum(toggledNext);\n }\n\n public clampToReachablePosition(position: number): number {\n // Basically all position is reachable for circular camera\n return position;\n }\n\n public canReach(panel: Panel): boolean {\n if (panel.removed) return false;\n\n // Always reachable on circular mode\n return true;\n }\n\n public canSee(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const range = camera.range;\n const rangeDiff = camera.rangeDiff;\n const visibleRange = camera.visibleRange;\n const visibleInCurrentRange = super.canSee(panel);\n\n // Check looped visible area for circular case\n if (visibleRange.min < range.min) {\n return (\n visibleInCurrentRange || panel.isVisibleOnRange(visibleRange.min + rangeDiff, visibleRange.max + rangeDiff)\n );\n } else if (visibleRange.max > range.max) {\n return (\n visibleInCurrentRange || panel.isVisibleOnRange(visibleRange.min - rangeDiff, visibleRange.max - rangeDiff)\n );\n }\n\n return visibleInCurrentRange;\n }\n\n /**\n * @internal\n */\n private _calcPanelAreaSum(panels: Panel[]) {\n return panels.reduce((sum: number, panel: Panel) => sum + panel.sizeIncludingMargin, 0);\n }\n}\n\nexport default CircularCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\nclass LinearCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n // It's always available\n return true;\n }\n\n public getRange(): CameraRange {\n const renderer = this._flicking.renderer;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n return { min: firstPanel?.position ?? 0, max: lastPanel?.position ?? 0 };\n }\n}\n\nexport default LinearCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport { ALIGN, CIRCULAR_FALLBACK, DIRECTION, ORDER } from \"../constants/values\";\nimport AnchorPoint from \"../core/AnchorPoint\";\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking, { FlickingOptions } from \"../Flicking\";\nimport { ValueOf } from \"../types/internal\";\nimport {\n checkExistence,\n find,\n getFlickingAttached,\n getProgress,\n getStyle,\n includes,\n parseAlign,\n toArray\n} from \"../utils\";\n\nimport { BoundCameraMode, CameraMode, CircularCameraMode, LinearCameraMode } from \"./mode\";\n\nexport interface CameraOptions {\n align: FlickingOptions[\"align\"];\n}\n\n/**\n * A range with minimum and maximum values\n */\nexport interface CameraRange {\n /** A minimum position */\n min: number;\n /** A maximum position */\n max: number;\n}\n\n/**\n * A component that manages actual movement inside the viewport\n * @public\n */\nclass Camera {\n // Options\n private _align: FlickingOptions[\"align\"];\n\n // Internal states\n private _flicking: Flicking;\n private _mode: CameraMode;\n private _el: HTMLElement;\n private _transform: string;\n private _lookedOffset = 0;\n private _position: number;\n private _alignPos: number;\n private _offset: number;\n private _circularOffset: number;\n private _circularEnabled: boolean;\n private _range: CameraRange;\n private _visiblePanels: Panel[];\n private _anchors: AnchorPoint[];\n private _needPanelTriggered: { prev: boolean; next: boolean };\n private _panelOrder: ValueOf<typeof ORDER>;\n\n // Internal states getter\n /**\n * The camera element(`.flicking-camera`)\n * @readonly\n */\n public get element(): HTMLElement {\n return this._el;\n }\n /**\n * An array of the child elements of the camera element(`.flicking-camera`)\n * @readonly\n */\n public get children(): HTMLElement[] {\n return toArray(this._el.children) as HTMLElement[];\n }\n /**\n * Current position of the camera\n * @readonly\n */\n public get position(): number {\n return this._position;\n }\n /**\n * Align position inside the viewport where {@link Panel}'s {@link Panel.alignPosition | alignPosition} should be located at\n * @readonly\n */\n public get alignPosition(): number {\n return this._alignPos;\n }\n /**\n * Position offset, used for the {@link Flicking.renderOnlyVisible | renderOnlyVisible} option\n * @defaultValue 0\n * @readonly\n */\n public get offset(): number {\n return this._offset - this._circularOffset;\n }\n /**\n * Whether the `circular` option is enabled.\n * @remarks\n * The {@link Flicking.circular | circular} option can't be enabled when sum of the panel sizes are too small.\n * @defaultValue false\n * @readonly\n */\n public get circularEnabled(): boolean {\n return this._circularEnabled;\n }\n /**\n * A current camera mode\n * @readonly\n */\n public get mode(): CameraMode {\n return this._mode;\n }\n /**\n * A range that Camera's {@link Camera.position | position} can reach\n * @readonly\n */\n public get range(): CameraRange {\n return this._range;\n }\n /**\n * A difference between Camera's minimum and maximum position that can reach\n * @readonly\n */\n public get rangeDiff(): number {\n return this._range.max - this._range.min;\n }\n /**\n * An array of visible panels from the current position\n * @readonly\n */\n public get visiblePanels(): Panel[] {\n return this._visiblePanels;\n }\n /**\n * A range of the visible area from the current position\n * @readonly\n */\n public get visibleRange(): CameraRange {\n return { min: this._position - this._alignPos, max: this._position - this._alignPos + this.size };\n }\n /**\n * An array of {@link AnchorPoint}s that Camera can be stopped at\n * @readonly\n */\n public get anchorPoints(): AnchorPoint[] {\n return this._anchors;\n }\n /**\n * A current parameters of the Camera for updating {@link AxesController}\n * @readonly\n */\n public get controlParams(): { range: CameraRange; position: number; circular: boolean } {\n return { range: this._range, position: this._position, circular: this._circularEnabled };\n }\n /**\n * A Boolean value indicating whether Camera's over the minimum or maximum position reachable\n * @readonly\n */\n public get atEdge(): boolean {\n return this._position <= this._range.min || this._position >= this._range.max;\n }\n /**\n * Return the size of the viewport\n * @readonly\n */\n public get size(): number {\n const flicking = this._flicking;\n return flicking ? (flicking.horizontal ? flicking.viewport.width : flicking.viewport.height) : 0;\n }\n\n /**\n * Return the camera's position progress from the first panel to last panel\n * @remarks\n * Range is from 0 to last panel's index\n * @readonly\n */\n public get progress(): number {\n const flicking = this._flicking;\n const position = this._position + this._offset;\n const nearestAnchor = this.findNearestAnchor(this._position);\n\n if (!flicking || !nearestAnchor) {\n return NaN;\n }\n\n const nearestPanel = nearestAnchor.panel;\n const panelPos = nearestPanel.position + nearestPanel.offset;\n const bounceSize = flicking.control.controller.bounce!;\n\n const { min: prevRange, max: nextRange } = this.range;\n const rangeDiff = this.rangeDiff;\n\n if (position === panelPos) {\n return nearestPanel.index;\n }\n\n if (position < panelPos) {\n const prevPanel = nearestPanel.prev();\n let prevPosition = prevPanel ? prevPanel.position + prevPanel.offset : prevRange - bounceSize[0];\n\n // Looped\n if (prevPosition > panelPos) {\n prevPosition -= rangeDiff;\n }\n\n return nearestPanel.index - 1 + getProgress(position, prevPosition, panelPos);\n } else {\n const nextPanel = nearestPanel.next();\n let nextPosition = nextPanel ? nextPanel.position + nextPanel.offset : nextRange + bounceSize[1];\n\n // Looped\n if (nextPosition < panelPos) {\n nextPosition += rangeDiff;\n }\n\n return nearestPanel.index + getProgress(position, panelPos, nextPosition);\n }\n }\n\n /**\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element(`.flicking-camera`)\n * @readonly\n */\n public get panelOrder(): ValueOf<typeof ORDER> {\n return this._panelOrder;\n }\n\n // Options Getter\n /**\n * A value indicating where the {@link Camera.alignPosition | alignPosition} should be located at inside the viewport element\n */\n public get align(): FlickingOptions[\"align\"] {\n return this._align;\n }\n\n // Options Setter\n public set align(val: FlickingOptions[\"align\"]) {\n this._align = val;\n }\n\n /**\n * Creates a new Camera instance\n * @param flicking - An instance of {@link Flicking}\n * @param options - Options for the Camera\n */\n public constructor(flicking: Flicking, { align = ALIGN.CENTER }: Partial<CameraOptions> = {}) {\n this._flicking = flicking;\n this._resetInternalValues();\n\n // Options\n this._align = align;\n }\n\n /**\n * Initialize Camera\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It finds the camera element inside the viewport.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public init(): this {\n const viewportEl = this._flicking.viewport.element;\n\n checkExistence(viewportEl.firstElementChild, \"First element child of the viewport element\");\n this._el = viewportEl.firstElementChild as HTMLElement;\n this._checkTranslateSupport();\n\n this._updateMode();\n this.updatePanelOrder();\n\n return this;\n }\n\n /**\n * Destroy Camera and return to initial state\n * @remarks\n * This method resets all internal values to their initial state.\n * @returns The current instance for method chaining\n */\n public destroy(): this {\n this._resetInternalValues();\n return this;\n }\n\n /**\n * Move to the given position and apply CSS transform\n * @remarks\n * This method updates the camera position, toggles panels for circular mode, and refreshes visible panels.\n * @param pos - A new position\n * @throws {@link InitializationErrors}\n */\n public lookAt(pos: number): void {\n const prevOffset = this._offset;\n const isChangedOffset = this._lookedOffset !== prevOffset;\n const flicking = getFlickingAttached(this._flicking);\n const prevPos = this._position;\n\n this._position = pos;\n const toggled = this._togglePanels(prevPos, pos);\n this._refreshVisiblePanels();\n this._checkNeedPanel();\n this._checkReachEnd(prevPos, pos);\n\n if (toggled) {\n void flicking.renderer.render().then(() => {\n this.updateOffset();\n this._lookedOffset = this._offset;\n });\n } else if (isChangedOffset) {\n // sync offset for renderOnlyVisible on resize\n this.updateOffset();\n this._lookedOffset = this._offset;\n } else {\n this.applyTransform();\n }\n }\n\n /**\n * Return a previous {@link AnchorPoint} of given {@link AnchorPoint}\n * @remarks\n * If it does not exist, return `null` instead\n * @param anchor - A reference {@link AnchorPoint}\n * @returns The previous {@link AnchorPoint}\n */\n public getPrevAnchor(anchor: AnchorPoint): AnchorPoint | null {\n if (!this._circularEnabled || anchor.index !== 0) {\n return this._anchors[anchor.index - 1] || null;\n } else {\n const anchors = this._anchors;\n const rangeDiff = this.rangeDiff;\n const lastAnchor = anchors[anchors.length - 1];\n\n return new AnchorPoint({\n index: lastAnchor.index,\n position: lastAnchor.position - rangeDiff,\n panel: lastAnchor.panel\n });\n }\n }\n\n /**\n * Return a next {@link AnchorPoint} of given {@link AnchorPoint}\n * @remarks\n * If it does not exist, return `null` instead\n * @param anchor - A reference {@link AnchorPoint}\n * @returns The next {@link AnchorPoint}\n */\n public getNextAnchor(anchor: AnchorPoint): AnchorPoint | null {\n const anchors = this._anchors;\n\n if (!this._circularEnabled || anchor.index !== anchors.length - 1) {\n return anchors[anchor.index + 1] || null;\n } else {\n const rangeDiff = this.rangeDiff;\n const firstAnchor = anchors[0];\n\n return new AnchorPoint({\n index: firstAnchor.index,\n position: firstAnchor.position + rangeDiff,\n panel: firstAnchor.panel\n });\n }\n }\n\n /**\n * Return the camera's position progress in the panel below\n * @remarks\n * Value is from 0 to 1 when the camera's inside panel.\n * Value can be lower than 0 or bigger than 1 when it's in the margin area\n * @param panel - A panel to check\n * @returns Progress value from 0 to 1 (or outside this range when in margin area)\n */\n public getProgressInPanel(panel: Panel): number {\n const panelRange = panel.range;\n\n return (this._position - panelRange.min) / (panelRange.max - panelRange.min);\n }\n\n /**\n * Return {@link AnchorPoint} that includes given position\n * @remarks\n * If there's no {@link AnchorPoint} that includes the given position, return `null` instead\n * @param position - A position to check\n * @returns The {@link AnchorPoint} that includes the given position\n */\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n return this._mode.findAnchorIncludePosition(position);\n }\n\n /**\n * Return {@link AnchorPoint} nearest to given position\n * @remarks\n * If there're no {@link AnchorPoint}s, return `null` instead\n * @param position - A position to check\n * @returns The {@link AnchorPoint} nearest to the given position\n */\n public findNearestAnchor(position: number): AnchorPoint | null {\n return this._mode.findNearestAnchor(position);\n }\n\n /**\n * Return {@link AnchorPoint} that matches {@link Flicking.currentPanel}\n * @returns The {@link AnchorPoint} that matches current panel\n */\n public findActiveAnchor(): AnchorPoint | null {\n const flicking = getFlickingAttached(this._flicking);\n const activePanel = flicking.control.activePanel;\n\n if (!activePanel) return null;\n\n return (\n find(this._anchors, anchor => anchor.panel.index === activePanel.index) ??\n this.findNearestAnchor(activePanel.position)\n );\n }\n\n /**\n * Clamp the given position between camera's range\n * @param position - A position to clamp\n * @returns A clamped position\n */\n public clampToReachablePosition(position: number): number {\n return this._mode.clampToReachablePosition(position);\n }\n\n /**\n * Check whether the given panel is inside of the Camera's range\n * @param panel - An instance of {@link Panel} to check\n * @returns Whether the panel's inside Camera's range\n */\n public canReach(panel: Panel): boolean {\n return this._mode.canReach(panel);\n }\n\n /**\n * Check whether the given panel element is visible at the current position\n * @param panel - An instance of {@link Panel} to check\n * @returns Whether the panel element is visible at the current position\n */\n public canSee(panel: Panel): boolean {\n return this._mode.canSee(panel);\n }\n\n /**\n * Update {@link Camera.range | range} of Camera\n * @remarks\n * This method recalculates the camera range based on the current panel positions and circular mode settings.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public updateRange(): this {\n const flicking = getFlickingAttached(this._flicking);\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n\n this._updateMode();\n this._range = this._mode.getRange();\n\n panels.forEach(panel => panel.updateCircularToggleDirection());\n\n return this;\n }\n\n /**\n * Update Camera's {@link Camera.alignPosition | alignPosition}\n * @returns The current instance for method chaining\n */\n public updateAlignPos(): this {\n const align = this._align;\n\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n this._alignPos = parseAlign(alignVal, this.size);\n\n return this;\n }\n\n /**\n * Update Camera's {@link Camera.anchorPoints | anchorPoints}\n * @remarks\n * Anchor points are positions where the camera can stop. This method recalculates them based on the current mode.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public updateAnchors(): this {\n this._anchors = this._mode.getAnchors();\n\n return this;\n }\n\n /**\n * Update Viewport's height to visible panel's max height\n * @remarks\n * This method only takes effect when {@link FlickingOptions.horizontal | horizontal} is `true` and {@link FlickingOptions.adaptive | adaptive} is enabled.\n * @throws {@link InitializationErrors}\n */\n public updateAdaptiveHeight(): void {\n const flicking = getFlickingAttached(this._flicking);\n const activePanel = flicking.control.activePanel;\n const visiblePanels = flicking.visiblePanels;\n\n const selectedPanels = [...visiblePanels];\n\n if (activePanel) {\n selectedPanels.push(activePanel);\n }\n\n if (!flicking.horizontal || !flicking.adaptive || !selectedPanels.length) return;\n\n const maxHeight = Math.max(...selectedPanels.map(panel => panel.height));\n\n flicking.viewport.setSize({\n height: maxHeight\n });\n }\n\n /**\n * Update current offset of the camera\n * @returns The current instance for method chaining\n */\n public updateOffset(): this {\n const flicking = getFlickingAttached(this._flicking);\n const position = this._position;\n const unRenderedPanels = flicking.panels.filter(panel => !panel.rendered);\n\n this._offset = unRenderedPanels\n .filter(panel => panel.position + panel.offset < position)\n .reduce((offset, panel) => offset + panel.sizeIncludingMargin, 0);\n\n this._circularOffset = this._mode.getCircularOffset();\n\n this.applyTransform();\n\n return this;\n }\n\n /**\n * Update direction to match the {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element\n * @returns The current instance for method chaining\n */\n public updatePanelOrder(): this {\n const flicking = getFlickingAttached(this._flicking);\n\n if (!flicking.horizontal) return this;\n\n const el = this._el;\n const direction = getStyle(el).direction;\n if (direction !== this._panelOrder) {\n this._panelOrder = direction === ORDER.RTL ? ORDER.RTL : ORDER.LTR;\n if (flicking.initialized) {\n flicking.control.controller.updateDirection();\n }\n }\n\n return this;\n }\n\n /**\n * Reset the history of {@link Flicking.event:needPanel | needPanel} events so it can be triggered again\n * @returns The current instance for method chaining\n */\n public resetNeedPanelHistory(): this {\n this._needPanelTriggered = { prev: false, next: false };\n return this;\n }\n\n /**\n * Apply \"transform\" style with the current position to camera element\n * @returns The current instance for method chaining\n */\n public applyTransform(): this {\n const el = this._el;\n const flicking = getFlickingAttached(this._flicking);\n const renderer = flicking.renderer;\n\n if (renderer.rendering || !flicking.initialized) return this;\n\n const actualPosition = this._position - this._alignPos - this._offset + this._circularOffset;\n\n el.style[this._transform] = flicking.horizontal\n ? `translate(${this._panelOrder === ORDER.RTL ? actualPosition : -actualPosition}px)`\n : `translate(0, ${-actualPosition}px)`;\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal state values to their defaults. Called during construction and destruction.\n */\n private _resetInternalValues() {\n this._position = 0;\n this._lookedOffset = 0;\n this._alignPos = 0;\n this._offset = 0;\n this._circularOffset = 0;\n this._circularEnabled = false;\n this._range = { min: 0, max: 0 };\n this._visiblePanels = [];\n this._anchors = [];\n this._needPanelTriggered = { prev: false, next: false };\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates the list of visible panels and triggers {@link VisibleChangeEvent} if panels were added or removed.\n */\n private _refreshVisiblePanels() {\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n\n const newVisiblePanels = panels.filter(panel => this.canSee(panel));\n const prevVisiblePanels = this._visiblePanels;\n this._visiblePanels = newVisiblePanels;\n\n const added: Panel[] = newVisiblePanels.filter(panel => !includes(prevVisiblePanels, panel));\n const removed: Panel[] = prevVisiblePanels.filter(panel => !includes(newVisiblePanels, panel));\n\n if (added.length > 0 || removed.length > 0) {\n void flicking.renderer.render().then(() => {\n flicking.trigger(\n new ComponentEvent(EVENTS.VISIBLE_CHANGE, {\n added,\n removed,\n visiblePanels: newVisiblePanels\n })\n );\n });\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if the camera is near the edges and triggers {@link NeedPanelEvent} for infinite scrolling implementations.\n */\n private _checkNeedPanel(): void {\n const needPanelTriggered = this._needPanelTriggered;\n\n if (needPanelTriggered.prev && needPanelTriggered.next) return;\n\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n if (!needPanelTriggered.prev) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.PREV }));\n needPanelTriggered.prev = true;\n }\n if (!needPanelTriggered.next) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.NEXT }));\n needPanelTriggered.next = true;\n }\n\n return;\n }\n\n const cameraPosition = this._position;\n const cameraSize = this.size;\n const cameraRange = this._range;\n const needPanelThreshold = flicking.needPanelThreshold;\n\n const cameraPrev = cameraPosition - this._alignPos;\n const cameraNext = cameraPrev + cameraSize;\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n\n if (!needPanelTriggered.prev) {\n const firstPanelPrev = firstPanel.range.min;\n\n if (cameraPrev <= firstPanelPrev + needPanelThreshold || cameraPosition <= cameraRange.min + needPanelThreshold) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.PREV }));\n needPanelTriggered.prev = true;\n }\n }\n\n if (!needPanelTriggered.next) {\n const lastPanelNext = lastPanel.range.max;\n\n if (cameraNext >= lastPanelNext - needPanelThreshold || cameraPosition >= cameraRange.max - needPanelThreshold) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.NEXT }));\n needPanelTriggered.next = true;\n }\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if the camera has reached the edge of the range and triggers {@link ReachEdgeEvent}.\n */\n private _checkReachEnd(prevPos: number, newPos: number): void {\n const flicking = getFlickingAttached(this._flicking);\n const range = this._range;\n\n const wasBetweenRange = prevPos > range.min && prevPos < range.max;\n const isBetweenRange = newPos > range.min && newPos < range.max;\n\n if (!wasBetweenRange || isBetweenRange) return;\n\n const direction = newPos <= range.min ? DIRECTION.PREV : DIRECTION.NEXT;\n\n flicking.trigger(\n new ComponentEvent(EVENTS.REACH_EDGE, {\n direction\n })\n );\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks for CSS transform support and stores the vendor-prefixed property name. Throws if transforms are not supported.\n */\n private _checkTranslateSupport = () => {\n const transforms = [\"webkitTransform\", \"msTransform\", \"MozTransform\", \"OTransform\", \"transform\"];\n\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform of transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new FlickingError(ERROR.MESSAGE.TRANSFORM_NOT_SUPPORTED, ERROR.CODE.TRANSFORM_NOT_SUPPORTED);\n }\n\n this._transform = transformName;\n };\n\n /**\n * @internal\n * @privateRemarks\n * Updates the camera mode based on {@link FlickingOptions.circular | circular} and {@link FlickingOptions.bound | bound} options.\n */\n private _updateMode() {\n const flicking = getFlickingAttached(this._flicking);\n\n if (flicking.circular) {\n const circularMode = new CircularCameraMode(flicking);\n const canSetCircularMode = circularMode.checkAvailability();\n\n if (canSetCircularMode) {\n this._mode = circularMode;\n } else {\n const fallbackMode = flicking.circularFallback;\n\n this._mode =\n fallbackMode === CIRCULAR_FALLBACK.BOUND ? new BoundCameraMode(flicking) : new LinearCameraMode(flicking);\n }\n\n this._circularEnabled = canSetCircularMode;\n } else {\n this._mode = flicking.bound ? new BoundCameraMode(flicking) : new LinearCameraMode(flicking);\n this._circularEnabled = false;\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Toggles panel positions for circular mode. Returns true if any panel was toggled.\n */\n private _togglePanels(prevPos: number, pos: number): boolean {\n if (pos === prevPos) return false;\n\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n const toggled = panels.map(panel => panel.toggle(prevPos, pos));\n\n return toggled.some(isToggled => isToggled);\n }\n}\n\nexport default Camera;\n","/* @internal */\n/**\n * All possible @egjs/axes event keys\n * @internal\n */\nexport const EVENT = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\"\n} as const;\n\n/**\n * An Axis key that Flicking uses\n * @internal\n */\nexport const POSITION_KEY = \"flick\";\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { OnAnimationEnd, OnChange, OnFinish, OnHold, OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\nimport * as AXES from \"../../constants/internal\";\nimport Panel from \"../../core/panel/Panel\";\nimport { EVENTS } from \"../../event/names\";\nimport Flicking from \"../../Flicking\";\nimport { circulatePosition, getDirection } from \"../../utils\";\n\nexport enum STATE_TYPE {\n IDLE,\n HOLDING,\n DRAGGING,\n ANIMATING,\n DISABLED\n}\n\n/**\n * Event context for State event handlers\n * @internal\n */\nexport interface StateContext<T> {\n /** An instance of Flicking */\n flicking: Flicking;\n /** An Axes event */\n axesEvent: T;\n /** A function for changing current state to other state */\n transitTo: (nextState: STATE_TYPE) => State;\n}\n\n/**\n * A component that shows the current status of the user input or the animation\n * @internal\n */\nabstract class State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public abstract readonly holding: boolean;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public abstract readonly animating: boolean;\n\n protected _delta: number = 0;\n protected _targetPanel: Panel | null = null;\n\n /**\n * A sum of delta values of change events from the last hold event of Axes\n * @readonly\n */\n public get delta(): number {\n return this._delta;\n }\n\n /**\n * A panel to set as {@link Control.activePanel} after the animation is finished\n * @readonly\n */\n public get targetPanel(): Panel | null {\n return this._targetPanel;\n }\n\n public set targetPanel(val: Panel | null) {\n this._targetPanel = val;\n }\n\n /**\n * An callback which is called when state has changed to this state\n * @param prevState - An previous state\n */\n public onEnter(prevState: State): void {\n this._delta = prevState._delta;\n this._targetPanel = prevState._targetPanel;\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-hold | hold} event\n * @param ctx - {@link StateContext}\n */\n public onHold(ctx: StateContext<OnHold>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-change | change} event\n * @param ctx - {@link StateContext}\n */\n public onChange(ctx: StateContext<OnChange>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event\n * @param ctx - {@link StateContext}\n */\n public onRelease(ctx: StateContext<OnRelease>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-animationEnd | animationEnd} event\n * @param ctx - {@link StateContext}\n */\n public onAnimationEnd(ctx: StateContext<OnAnimationEnd>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-finish | finish} event\n * @param ctx - {@link StateContext}\n */\n public onFinish(ctx: StateContext<OnFinish>): void {\n // DO NOTHING\n }\n\n /**\n * @internal\n */\n protected _moveToChangedPosition(ctx: StateContext<OnChange>): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const delta = axesEvent.delta[AXES.POSITION_KEY];\n\n if (!delta) {\n return;\n }\n\n this._delta += delta;\n\n const camera = flicking.camera;\n const prevPosition = camera.position;\n const position = axesEvent.pos[AXES.POSITION_KEY];\n const newPosition = flicking.circularEnabled\n ? circulatePosition(position, camera.range.min, camera.range.max)\n : position;\n\n camera.lookAt(newPosition);\n\n const moveEvent = new ComponentEvent(EVENTS.MOVE, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(0, axesEvent.delta[AXES.POSITION_KEY]),\n axesEvent\n });\n\n flicking.trigger(moveEvent);\n\n if (moveEvent.isCanceled()) {\n // Return to previous position\n camera.lookAt(prevPosition);\n transitTo(STATE_TYPE.DISABLED);\n }\n }\n}\n\nexport default State;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when Flicking's animating by user input or method call\n * @internal\n */\nclass AnimatingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onHold(ctx: Parameters<State[\"onHold\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const targetPanel = this._targetPanel;\n const control = flicking.control;\n\n this._delta = 0;\n flicking.control.updateInput();\n\n if (flicking.changeOnHold && targetPanel) {\n control.setActive(targetPanel, control.activePanel, axesEvent.isTrusted);\n }\n\n const holdStartEvent = new ComponentEvent(EVENTS.HOLD_START, { axesEvent });\n flicking.trigger(holdStartEvent);\n\n if (holdStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n transitTo(STATE_TYPE.DRAGGING);\n }\n }\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n this._moveToChangedPosition(ctx);\n }\n\n public onFinish(ctx: Parameters<State[\"onFinish\"]>[0]) {\n const { flicking, axesEvent, transitTo } = ctx;\n\n const control = flicking.control;\n const controller = control.controller;\n const animatingContext = controller.animatingContext;\n\n transitTo(STATE_TYPE.IDLE);\n\n flicking.trigger(\n new ComponentEvent(EVENTS.MOVE_END, {\n isTrusted: axesEvent.isTrusted,\n direction: getDirection(animatingContext.start, animatingContext.end),\n axesEvent\n })\n );\n\n const targetPanel = this._targetPanel;\n if (targetPanel) {\n control.setActive(targetPanel, control.activePanel, axesEvent.isTrusted);\n }\n }\n}\n\nexport default AnimatingState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when Flicking is stopped by event's `stop` method\n * @internal\n */\nclass DisabledState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onAnimationEnd(ctx: Parameters<State[\"onAnimationEnd\"]>[0]): void {\n const { transitTo } = ctx;\n\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { axesEvent, transitTo } = ctx;\n\n // Can stop Axes's change event\n axesEvent.stop();\n\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]): void {\n const { axesEvent, transitTo } = ctx;\n\n // This is needed when stopped hold start event\n if (axesEvent.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 */\nimport { ComponentEvent } from \"@egjs/component\";\nimport * as AXES from \"../../constants/internal\";\nimport { EVENTS } from \"../../event/names\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when user's dragging the Flicking area\n * @internal\n */\nclass DraggingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = true;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n this._moveToChangedPosition(ctx);\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]) {\n const { flicking, axesEvent, transitTo } = ctx;\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n flicking.trigger(\n new ComponentEvent(EVENTS.HOLD_END, {\n axesEvent\n })\n );\n\n if (flicking.renderer.panelCount <= 0) {\n // There're no panels\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n transitTo(STATE_TYPE.ANIMATING);\n\n const control = flicking.control;\n const position = axesEvent.destPos[AXES.POSITION_KEY];\n const duration = Math.max(axesEvent.duration, flicking.duration);\n\n try {\n void control.moveToPosition(position, duration, axesEvent);\n } catch (_err) {\n transitTo(STATE_TYPE.IDLE);\n axesEvent.setTo({ [AXES.POSITION_KEY]: flicking.camera.position }, 0);\n }\n }\n}\n\nexport default DraggingState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport Panel from \"../../core/panel/Panel\";\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when user's holding the Flicking area, but not moved a single pixel yet\n * @internal\n */\nclass HoldingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = true;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = false;\n\n private _releaseEvent: OnRelease | null = null;\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n\n const inputEvent = axesEvent.inputEvent as { offsetX: number; offsetY: number };\n\n if (!inputEvent) {\n return;\n }\n\n const offset = flicking.horizontal ? inputEvent.offsetX : inputEvent.offsetY;\n\n const moveStartEvent = new ComponentEvent(EVENTS.MOVE_START, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(0, -offset),\n axesEvent\n });\n flicking.trigger(moveStartEvent);\n\n if (moveStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING).onChange(ctx);\n }\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n\n flicking.trigger(new ComponentEvent(EVENTS.HOLD_END, { axesEvent }));\n\n if (axesEvent.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 axesEvent.setTo({ flick: flicking.camera.position }, 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 = axesEvent;\n }\n\n public onFinish(ctx: Parameters<State[\"onFinish\"]>[0]): void {\n const { flicking, transitTo } = ctx;\n\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 /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access */\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 /* eslint-enable */\n\n const panels = flicking.renderer.panels;\n let clickedPanel: Panel | null = null;\n\n for (const panel of panels) {\n if (panel.contains(clickedElement)) {\n clickedPanel = panel;\n break;\n }\n }\n\n if (clickedPanel) {\n const cameraPosition = flicking.camera.position;\n const clickedPanelPosition = clickedPanel.position;\n\n flicking.trigger(\n new ComponentEvent(EVENTS.SELECT, {\n index: clickedPanel.index,\n panel: clickedPanel,\n // Direction to the clicked panel\n direction: getDirection(cameraPosition, clickedPanelPosition)\n })\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 */\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A default state when there's no user input and no animation's playing\n * @internal\n */\nclass IdleState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = false;\n\n public onEnter() {\n this._delta = 0;\n this._targetPanel = null;\n }\n\n public onHold(ctx: Parameters<State[\"onHold\"]>[0]): void {\n // Shouldn't do any action until any panels on flicking area\n const { flicking, axesEvent, transitTo } = ctx;\n\n if (flicking.renderer.panelCount <= 0) {\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n const holdStartEvent = new ComponentEvent(EVENTS.HOLD_START, {\n axesEvent\n });\n\n flicking.trigger(holdStartEvent);\n\n if (holdStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n transitTo(STATE_TYPE.HOLDING);\n }\n }\n\n // By methods call\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const controller = flicking.control.controller;\n const animatingContext = controller.animatingContext;\n\n const moveStartEvent = new ComponentEvent(EVENTS.MOVE_START, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(animatingContext.start, animatingContext.end),\n axesEvent\n });\n flicking.trigger(moveStartEvent);\n\n if (moveStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING).onChange(ctx);\n }\n }\n}\n\nexport default IdleState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { AxesEvents } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport Flicking from \"../Flicking\";\nimport AnimatingState from \"./states/AnimatingState\";\nimport DisabledState from \"./states/DisabledState\";\nimport DraggingState from \"./states/DraggingState\";\nimport HoldingState from \"./states/HoldingState\";\nimport IdleState from \"./states/IdleState\";\nimport State, { STATE_TYPE } from \"./states/State\";\n\n/**\n * @internal\n */\nclass StateMachine {\n private _state: State;\n\n public get state(): State {\n return this._state;\n }\n\n public constructor() {\n this._state = new IdleState();\n }\n\n public fire(\n eventType: keyof AxesEvents,\n externalCtx: {\n flicking: Flicking;\n axesEvent: any;\n }\n ) {\n const currentState = this._state;\n const ctx = { ...externalCtx, transitTo: this.transitTo };\n\n switch (eventType) {\n case AXES.EVENT.HOLD:\n currentState.onHold(ctx);\n break;\n case AXES.EVENT.CHANGE:\n currentState.onChange(ctx);\n break;\n case AXES.EVENT.RELEASE:\n currentState.onRelease(ctx);\n break;\n case AXES.EVENT.ANIMATION_END:\n currentState.onAnimationEnd(ctx);\n break;\n case AXES.EVENT.FINISH:\n currentState.onFinish(ctx);\n break;\n }\n }\n\n public transitTo = (nextStateType: STATE_TYPE): State => {\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 nextState.onEnter(this._state);\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 */\nimport Axes, { AxesEvents, OnRelease, PanInput } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport { ORDER } from \"../constants/values\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport Flicking from \"../Flicking\";\nimport { ControlParams } from \"../types/external\";\nimport { getFlickingAttached, parseBounce } from \"../utils\";\n\nimport StateMachine from \"./StateMachine\";\nimport State from \"./states/State\";\n\n/**\n * A controller that handles the {@link https://naver.github.io/egjs-axes/ | @egjs/axes} events\n * @internal\n */\nclass AxesController {\n private _flicking: Flicking | null;\n private _axes: Axes | null;\n private _panInput: PanInput | null;\n private _stateMachine: StateMachine;\n\n private _animatingContext: { start: number; end: number; offset: number };\n private _dragged: boolean;\n\n /**\n * An {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @see https://naver.github.io/egjs-axes/docs/api/Axes\n * @readonly\n */\n public get axes(): Axes | null {\n return this._axes;\n }\n /**\n * An {@link https://naver.github.io/egjs-axes/docs/api/PanInput | PanInput} instance\n * @see https://naver.github.io/egjs-axes/docs/api/PanInput\n * @readonly\n */\n public get panInput(): PanInput | null {\n return this._panInput;\n }\n /**\n * @internal\n */\n public get stateMachine(): StateMachine {\n return this._stateMachine;\n }\n /**\n * A activated {@link State} that shows the current status of the user input or the animation\n */\n public get state(): State {\n return this._stateMachine.state;\n }\n /**\n * A context of the current animation playing\n * @readonly\n */\n public get animatingContext(): { start: number; end: number; offset: number } {\n return this._animatingContext;\n }\n /**\n * A current control parameters of the Axes instance\n */\n public get controlParams(): ControlParams {\n const axes = this._axes;\n\n if (!axes) {\n return {\n range: { min: 0, max: 0 },\n position: 0,\n circular: false\n };\n }\n\n const axis = axes.axis[AXES.POSITION_KEY];\n\n return {\n range: { min: axis.range![0], max: axis.range![1] },\n circular: (axis.circular as boolean[])[0],\n position: this.position\n };\n }\n\n /**\n * A Boolean indicating whether the user input is enabled\n * @readonly\n */\n public get enabled(): boolean {\n return this._panInput?.isEnabled() ?? false;\n }\n /**\n * Current position value in {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @readonly\n */\n public get position(): number {\n return this._axes?.get([AXES.POSITION_KEY])[AXES.POSITION_KEY] ?? 0;\n }\n /**\n * Current range value in {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @readonly\n */\n public get range(): number[] {\n return this._axes?.axis[AXES.POSITION_KEY].range ?? [0, 0];\n }\n /**\n * Actual bounce size(px)\n * @readonly\n */\n public get bounce(): number[] | undefined {\n return this._axes?.axis[AXES.POSITION_KEY].bounce as number[] | undefined;\n }\n\n public constructor() {\n this._resetInternalValues();\n this._stateMachine = new StateMachine();\n }\n\n /**\n * Initialize AxesController\n * @remarks\n * This method creates and configures the Axes and PanInput instances.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n\n this._axes = new Axes(\n {\n [AXES.POSITION_KEY]: {\n range: [0, 0],\n circular: false,\n bounce: [0, 0]\n }\n },\n {\n deceleration: flicking.deceleration,\n interruptable: flicking.interruptable,\n nested: flicking.nested,\n easing: flicking.easing\n }\n );\n this._panInput = new PanInput(flicking.viewport.element, {\n inputType: flicking.inputType,\n threshold: flicking.dragThreshold,\n iOSEdgeSwipeThreshold: flicking.iOSEdgeSwipeThreshold,\n preventDefaultOnDrag: flicking.preventDefaultOnDrag,\n scale: flicking.horizontal ? [flicking.camera.panelOrder === ORDER.RTL ? 1 : -1, 0] : [0, -1],\n releaseOnScroll: true\n });\n\n const axes = this._axes;\n\n axes.connect(flicking.horizontal ? [AXES.POSITION_KEY, \"\"] : [\"\", AXES.POSITION_KEY], this._panInput);\n\n for (const key in AXES.EVENT) {\n const eventType = AXES.EVENT[key] as keyof AxesEvents;\n\n axes.on(eventType, (e: AxesEvents[typeof eventType]) => {\n this._stateMachine.fire(eventType, {\n flicking,\n axesEvent: e\n });\n });\n }\n\n return this;\n }\n\n /**\n * Destroy AxesController and return to initial state\n * @remarks\n * This method destroys the Axes and PanInput instances and removes all event handlers.\n */\n public destroy(): void {\n if (this._axes) {\n this.removePreventClickHandler();\n this._axes.destroy();\n }\n\n this._panInput?.destroy();\n\n this._resetInternalValues();\n }\n\n /**\n * Enable input from the user (mouse/touch)\n * @remarks\n * Enables the PanInput to receive user interactions.\n * @returns The current instance for method chaining\n */\n public enable(): this {\n this._panInput?.enable();\n\n return this;\n }\n\n /**\n * Disable input from the user (mouse/touch)\n * @remarks\n * Disables the PanInput to ignore user interactions.\n * @returns The current instance for method chaining\n */\n public disable(): this {\n this._panInput?.disable();\n\n return this;\n }\n\n /**\n * Releases ongoing user input (mouse/touch)\n * @remarks\n * Immediately releases the PanInput, simulating the user lifting their finger.\n * @returns The current instance for method chaining\n */\n public release(): this {\n this._panInput?.release();\n\n return this;\n }\n\n /**\n * Change the destination and duration of the animation currently playing\n * @remarks\n * This method updates the Axes animation target position and optionally the duration.\n * @param position - A position to move\n * @param duration - Duration of the animation (unit: ms)\n * @returns The current instance for method chaining\n */\n public updateAnimation(position: number, duration?: number): this {\n this._animatingContext = {\n ...this._animatingContext,\n end: position\n };\n this._axes?.updateAnimation({\n destPos: { [AXES.POSITION_KEY]: position },\n duration\n });\n\n return this;\n }\n\n /**\n * Stops the animation currently playing\n * @remarks\n * This method immediately stops the Axes animation at the current position.\n * @returns The current instance for method chaining\n */\n public stopAnimation(): this {\n this._axes?.stopAnimation();\n\n return this;\n }\n\n /**\n * Update {@link https://naver.github.io/egjs-axes/ | @egjs/axes}'s state\n * @remarks\n * This method synchronizes the Axes state with the given control parameters.\n * @param controlParams - Control parameters\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public update(controlParams: ControlParams): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const axes = this._axes!;\n const axis = axes.axis[AXES.POSITION_KEY];\n\n axis.circular = [controlParams.circular, controlParams.circular];\n axis.range = [controlParams.range.min, controlParams.range.max];\n axis.bounce = parseBounce(flicking.bounce, camera.size);\n\n axes.axisManager.set({ [AXES.POSITION_KEY]: controlParams.position });\n\n return this;\n }\n\n /**\n * Attach a handler to the camera element to prevent click events during animation\n * @remarks\n * This is used when {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} is enabled.\n * @returns The current instance for method chaining\n */\n public addPreventClickHandler(): this {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const cameraEl = flicking.camera.element;\n\n axes.on(AXES.EVENT.HOLD, this._onAxesHold);\n axes.on(AXES.EVENT.CHANGE, this._onAxesChange);\n cameraEl.addEventListener(\"click\", this._preventClickWhenDragged, true);\n\n return this;\n }\n\n /**\n * Detach a handler to the camera element to prevent click events during animation\n * @remarks\n * This is used when {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} is disabled.\n * @returns The current instance for method chaining\n */\n public removePreventClickHandler(): this {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const cameraEl = flicking.camera.element;\n\n axes.off(AXES.EVENT.HOLD, this._onAxesHold);\n axes.off(AXES.EVENT.CHANGE, this._onAxesChange);\n cameraEl.removeEventListener(\"click\", this._preventClickWhenDragged, true);\n\n return this;\n }\n\n /**\n * Run Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#setTo | setTo} using the given position\n * @remarks\n * If the target position equals the current position, the promise resolves immediately without animation.\n * @param position - A position to move\n * @param duration - Duration of the animation (unit: ms)\n * @param axesEvent - If provided, it'll use its {@link https://naver.github.io/egjs-axes/docs/api/Axes#setTo | setTo} method instead\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public animateTo(position: number, duration: number, axesEvent?: OnRelease): Promise<void> {\n const axes = this._axes;\n const state = this._stateMachine.state;\n\n if (!axes) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.NOT_ATTACHED_TO_FLICKING, ERROR.CODE.NOT_ATTACHED_TO_FLICKING)\n );\n }\n\n const startPos = this.getCurrentPosition();\n\n if (startPos === position) {\n const flicking = getFlickingAttached(this._flicking);\n\n flicking.camera.lookAt(position);\n\n if (state.targetPanel) {\n flicking.control.setActive(state.targetPanel, flicking.control.activePanel, axesEvent?.isTrusted ?? false);\n }\n return Promise.resolve();\n }\n\n this._animatingContext = {\n start: startPos,\n end: position,\n offset: 0\n };\n\n const animate = () => {\n const resetContext = () => {\n this._animatingContext = { start: 0, end: 0, offset: 0 };\n };\n\n axes.once(AXES.EVENT.FINISH, resetContext);\n\n if (axesEvent) {\n axesEvent.setTo({ [AXES.POSITION_KEY]: position }, duration);\n } else {\n axes.setTo({ [AXES.POSITION_KEY]: position }, duration);\n }\n };\n\n return new Promise((resolve, reject) => {\n const animationFinishHandler = () => {\n axes.off(AXES.EVENT.HOLD, interruptionHandler);\n resolve();\n };\n\n const interruptionHandler = () => {\n axes.off(AXES.EVENT.FINISH, animationFinishHandler);\n reject(new FlickingError(ERROR.MESSAGE.ANIMATION_INTERRUPTED, ERROR.CODE.ANIMATION_INTERRUPTED));\n };\n\n axes.once(AXES.EVENT.FINISH, animationFinishHandler);\n axes.once(AXES.EVENT.HOLD, interruptionHandler);\n\n animate();\n });\n }\n\n /**\n * Returns the current axes position\n */\n public getCurrentPosition() {\n return this._axes?.get([AXES.POSITION_KEY])[AXES.POSITION_KEY] ?? 0;\n }\n\n public updateDirection() {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const panInput = this._panInput!;\n\n axes.disconnect(panInput);\n axes.connect(flicking.horizontal ? [AXES.POSITION_KEY, \"\"] : [\"\", AXES.POSITION_KEY], panInput);\n\n panInput.options.scale = flicking.horizontal ? [flicking.camera.panelOrder === ORDER.RTL ? 1 : -1, 0] : [0, -1];\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal values to their defaults. Called during construction and destruction.\n */\n private _resetInternalValues() {\n this._flicking = null;\n this._axes = null;\n this._panInput = null;\n this._animatingContext = { start: 0, end: 0, offset: 0 };\n this._dragged = false;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Handles the Axes hold event to reset the dragged state.\n */\n private _onAxesHold = () => {\n this._dragged = false;\n };\n\n /**\n * @internal\n * @privateRemarks\n * Handles the Axes change event to update the dragged state.\n */\n private _onAxesChange = () => {\n this._dragged = !!this._panInput?.isEnabled();\n };\n\n /**\n * @internal\n * @privateRemarks\n * Prevents click events when the user has dragged. Used for {@link FlickingOptions.preventClickOnDrag}.\n */\n private _preventClickWhenDragged = (e: MouseEvent) => {\n if (this._dragged) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n this._dragged = false;\n };\n}\n\nexport default AxesController;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\nimport { DIRECTION } from \"../constants/values\";\nimport AxesController from \"../control/AxesController\";\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking from \"../Flicking\";\nimport { ValueOf } from \"../types/internal\";\nimport { getDirection, getFlickingAttached } from \"../utils\";\n\n/**\n * Parameters for {@link Control.moveToPanel}\n * @public\n */\nexport interface MoveToPanelParams {\n /** Duration of the animation (unit: ms) */\n duration: number;\n /** Direction to move, only available in the {@link Flicking.circular | circular} mode */\n direction?: ValueOf<typeof DIRECTION>;\n /** {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes} */\n axesEvent?: OnRelease;\n}\n\n/**\n * A component that manages inputs and animation of Flicking\n * @public\n */\nabstract class Control {\n // Internal States\n protected _flicking: Flicking | null;\n protected _controller: AxesController;\n protected _activePanel: Panel | null;\n protected _nextPanel: Panel | null;\n\n /**\n * A controller that handles the {@link https://naver.github.io/egjs-axes/ | @egjs/axes} events\n * @readonly\n */\n public get controller(): AxesController {\n return this._controller;\n }\n /**\n * Index number of the {@link Flicking.currentPanel | currentPanel}\n * @defaultValue 0\n * @readonly\n */\n public get activeIndex(): number {\n return this._activePanel?.index ?? -1;\n }\n /**\n * An active panel\n * @readonly\n */\n public get activePanel(): Panel | null {\n return this._activePanel;\n }\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public get animating(): boolean {\n return this._controller.state.animating;\n }\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public get holding(): boolean {\n return this._controller.state.holding;\n }\n\n public constructor() {\n this._flicking = null;\n this._controller = new AxesController();\n this._activePanel = null;\n }\n\n /**\n * Move {@link Camera} to the given position\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public abstract moveToPosition(position: number, duration: number, axesEvent?: OnRelease): Promise<void>;\n\n /**\n * Initialize Control\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It initializes the internal controller.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n this._controller.init(flicking);\n\n return this;\n }\n\n /**\n * Destroy Control and return to initial state\n * @remarks\n * This method destroys the internal controller and resets all internal values.\n */\n public destroy(): void {\n this._controller.destroy();\n\n this._flicking = null;\n this._activePanel = null;\n }\n\n /**\n * Enable input from the user (mouse/touch)\n * @remarks\n * This is a shorthand for `Flicking.enableInput`.\n * @returns The current instance for method chaining\n */\n public enable(): this {\n this._controller.enable();\n\n return this;\n }\n\n /**\n * Disable input from the user (mouse/touch)\n * @remarks\n * This is a shorthand for `Flicking.disableInput`.\n * @returns The current instance for method chaining\n */\n public disable(): this {\n this._controller.disable();\n\n return this;\n }\n\n /**\n * Releases ongoing user input (mouse/touch)\n * @remarks\n * This method immediately releases the user's input, similar to the user lifting their finger.\n * @returns The current instance for method chaining\n */\n public release(): this {\n this._controller.release();\n\n return this;\n }\n\n /**\n * Change the destination and duration of the animation currently playing\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @param panel - The target panel to move\n * @param duration - Duration of the animation (unit: ms)\n * @param direction - Direction to move, only available in the {@link Flicking.circular | circular} mode\n * @throws {@link AnimationUpdateErrors}\n * @returns The current instance for method chaining\n */\n public updateAnimation(panel: Panel, duration?: number, direction?: ValueOf<typeof DIRECTION>): this {\n const state = this._controller.state;\n const position = this._getPosition(panel, direction ?? DIRECTION.NONE);\n\n state.targetPanel = panel;\n this._controller.updateAnimation(position, duration);\n\n return this;\n }\n\n /**\n * Stops the animation currently playing\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @returns The current instance for method chaining\n */\n public stopAnimation(): this {\n const state = this._controller.state;\n\n state.targetPanel = null;\n this._controller.stopAnimation();\n\n return this;\n }\n\n /**\n * Update position after resizing\n * @remarks\n * This method moves the camera to the active panel's position after a resize operation.\n * @param progressInPanel - Previous camera's progress in active panel before resize\n * @throws {@link InitializationErrors}\n */\n public updatePosition(progressInPanel: number): void {\n // eslint-disable-line @typescript-eslint/no-unused-vars\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n if (activePanel) {\n camera.lookAt(camera.clampToReachablePosition(activePanel.position));\n }\n }\n\n /**\n * Update {@link Control.controller | controller}'s state\n * @remarks\n * This method synchronizes the controller state with the current camera parameters.\n * @returns The current instance for method chaining\n */\n public updateInput(): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n this._controller.update(camera.controlParams);\n\n return this;\n }\n\n /**\n * Reset {@link Control.activePanel | activePanel} to `null`\n * @remarks\n * This method is called when the active panel is removed from the renderer.\n * @returns The current instance for method chaining\n */\n public resetActive(): this {\n this._activePanel = null;\n\n return this;\n }\n\n /**\n * Move {@link Camera} to the given panel\n * @param panel - The target panel to move\n * @param options - {@link MoveToPanelParams}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target panel\n */\n public async moveToPanel(\n panel: Panel,\n { duration, direction = DIRECTION.NONE, axesEvent }: MoveToPanelParams\n ): Promise<void> {\n const position = this._getPosition(panel, direction);\n this._triggerIndexChangeEvent(panel, panel.position, axesEvent, direction);\n\n return this._animateToPosition({ position, duration, newActivePanel: panel, axesEvent });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Sets the active panel and triggers {@link ChangedEvent} or {@link RestoredEvent} based on whether the panel changed.\n */\n public setActive(newActivePanel: Panel, prevActivePanel: Panel | null, isTrusted: boolean) {\n const flicking = getFlickingAttached(this._flicking);\n\n this._activePanel = newActivePanel;\n this._nextPanel = null;\n\n flicking.camera.updateAdaptiveHeight();\n\n if (newActivePanel !== prevActivePanel) {\n flicking.trigger(\n new ComponentEvent(EVENTS.CHANGED, {\n index: newActivePanel.index,\n panel: newActivePanel,\n prevIndex: prevActivePanel?.index ?? -1,\n prevPanel: prevActivePanel,\n isTrusted,\n direction: prevActivePanel ? getDirection(prevActivePanel.position, newActivePanel.position) : DIRECTION.NONE\n })\n );\n } else {\n flicking.trigger(\n new ComponentEvent(EVENTS.RESTORED, {\n isTrusted\n })\n );\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Copies internal state from another Control instance. Used when changing moveType option.\n */\n public copy(control: Control) {\n this._flicking = control._flicking;\n this._activePanel = control._activePanel;\n this._controller = control._controller;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Triggers {@link WillChangeEvent} or {@link WillRestoreEvent} based on whether the target panel differs from the active panel.\n */\n protected _triggerIndexChangeEvent(\n panel: Panel,\n position: number,\n axesEvent?: OnRelease,\n direction?: ValueOf<typeof DIRECTION>\n ) {\n const flicking = getFlickingAttached(this._flicking);\n const triggeringEvent = panel !== this._activePanel ? EVENTS.WILL_CHANGE : EVENTS.WILL_RESTORE;\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n const event = new ComponentEvent(triggeringEvent, {\n index: panel.index,\n panel,\n isTrusted: axesEvent?.isTrusted || false,\n direction: direction ?? getDirection(activePanel?.position ?? camera.position, position)\n });\n\n this._nextPanel = panel;\n flicking.trigger(event);\n\n if (event.isCanceled()) {\n throw new FlickingError(ERROR.MESSAGE.STOP_CALLED_BY_USER, ERROR.CODE.STOP_CALLED_BY_USER);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Animates the camera to the target position and handles animation completion or interruption.\n */\n protected async _animateToPosition({\n position,\n duration,\n newActivePanel,\n axesEvent\n }: {\n position: number;\n duration: number;\n newActivePanel: Panel;\n axesEvent?: OnRelease;\n }) {\n const flicking = getFlickingAttached(this._flicking);\n // 거리(1px 미만)가 매우 짧은 경우 duration이 늘어지는걸 방지하기 위해 0으로 바꿔 즉시 변경\n let nextDuration = duration;\n\n if (Math.abs(nextDuration - position) < flicking.animationThreshold) {\n nextDuration = 0;\n }\n const animate = () => this._controller.animateTo(position, nextDuration, axesEvent);\n const state = this._controller.state;\n\n state.targetPanel = newActivePanel;\n\n if (nextDuration <= 0) {\n return animate();\n } else {\n return animate()\n .then(async () => {\n if (flicking.initialized) {\n await flicking.renderer.render();\n }\n })\n .catch(err => {\n if (axesEvent && err instanceof FlickingError && err.code === ERROR.CODE.ANIMATION_INTERRUPTED) return;\n throw err;\n });\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates the target position for a panel, considering circular mode and direction constraints.\n */\n private _getPosition(panel: Panel, direction: ValueOf<typeof DIRECTION> = DIRECTION.NONE) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n let position = panel.position;\n const nearestAnchor = camera.findNearestAnchor(position);\n\n if (panel.removed || !nearestAnchor) {\n throw new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(panel.position), ERROR.CODE.POSITION_NOT_REACHABLE);\n }\n if (!camera.canReach(panel)) {\n // Override position & panel if that panel is not reachable\n position = nearestAnchor.position;\n panel = nearestAnchor.panel;\n } else if (flicking.circularEnabled) {\n // Circular mode is enabled, find nearest distance to panel\n const camPos = this._controller.position; // Actual position of the Axes\n const camRangeDiff = camera.rangeDiff;\n const possiblePositions = [position, position + camRangeDiff, position - camRangeDiff].filter(pos => {\n if (direction === DIRECTION.NONE) return true;\n\n return direction === DIRECTION.PREV ? pos <= camPos : pos >= camPos;\n });\n\n position = possiblePositions.reduce((nearestPosition, pos) => {\n if (Math.abs(camPos - pos) < Math.abs(camPos - nearestPosition)) {\n return pos;\n } else {\n return nearestPosition;\n }\n }, Infinity);\n }\n\n return position;\n }\n}\n\nexport default Control;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { getFlickingAttached } from \"../utils\";\n\nimport Control from \"./Control\";\n\n/**\n * Options for the {@link FreeControl}\n */\nexport interface FreeControlOptions {\n /** Make scroll animation to stop at the start/end of the scroll area, not going out the bounce area */\n stopAtEdge: boolean;\n}\n\n/**\n * A {@link Control} that can be scrolled freely without alignment\n * @public\n */\nclass FreeControl extends Control {\n private _stopAtEdge: FreeControlOptions[\"stopAtEdge\"];\n\n /**\n * Make scroll animation to stop at the start/end of the scroll area, not going out the bounce area\n * @defaultValue true\n */\n public get stopAtEdge(): boolean {\n return this._stopAtEdge;\n }\n\n public set stopAtEdge(val: FreeControlOptions[\"stopAtEdge\"]) {\n this._stopAtEdge = val;\n }\n\n public constructor(options: Partial<FreeControlOptions> = {}) {\n super();\n\n const { stopAtEdge = true } = options;\n\n this._stopAtEdge = stopAtEdge;\n }\n\n /**\n * Update position after resizing\n * @remarks\n * Unlike the base Control, FreeControl preserves the progress within the panel instead of snapping to the panel position.\n * @param progressInPanel - Previous camera's progress in active panel before resize\n * @throws {@link InitializationErrors}\n */\n public updatePosition(progressInPanel: number): void {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n if (activePanel) {\n const panelRange = activePanel.range;\n const newPosition = panelRange.min + (panelRange.max - panelRange.min) * progressInPanel;\n\n camera.lookAt(camera.clampToReachablePosition(newPosition));\n }\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * Unlike SnapControl, FreeControl moves to the exact position without snapping to panel boundaries.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease) {\n const flicking = getFlickingAttached(this._flicking);\n\n const camera = flicking.camera;\n const targetPos = camera.clampToReachablePosition(position);\n\n const anchorAtPosition = camera.findAnchorIncludePosition(targetPos);\n\n if (!anchorAtPosition) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const targetPanel = anchorAtPosition.panel;\n\n // Trigger only change event\n if (targetPanel !== this._activePanel) {\n this._triggerIndexChangeEvent(targetPanel, position, axesEvent);\n }\n\n return this._animateToPosition({\n position: this._stopAtEdge ? targetPos : position,\n duration,\n newActivePanel: targetPanel,\n axesEvent\n });\n }\n}\n\nexport default FreeControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport AnchorPoint from \"../core/AnchorPoint\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { circulateIndex, clamp, getFlickingAttached } from \"../utils\";\n\nimport Control from \"./Control\";\n\n/**\n * Options for the {@link SnapControl}\n */\nexport interface SnapControlOptions {\n /** Maximum number of panels can go after release */\n count: number;\n}\n\n/**\n * A {@link Control} that uses a release momentum to choose destination panel\n * @public\n */\nclass SnapControl extends Control {\n private _count: SnapControlOptions[\"count\"];\n\n /**\n * Maximum number of panels can go after release\n * @defaultValue Infinity\n */\n public get count(): number {\n return this._count;\n }\n\n public set count(val: SnapControlOptions[\"count\"]) {\n this._count = val;\n }\n\n public constructor(options: Partial<SnapControlOptions> = {}) {\n super();\n\n const { count = Infinity } = options;\n\n this._count = count;\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * This method calculates the snap target based on the release momentum and threshold settings.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activeAnchor = camera.findActiveAnchor();\n const anchorAtCamera = camera.findNearestAnchor(camera.position);\n const state = this._controller.state;\n\n if (!activeAnchor || !anchorAtCamera) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const snapThreshold = this._calcSnapThreshold(flicking.threshold, position, activeAnchor);\n\n const posDelta = flicking.animating ? state.delta : position - camera.position;\n const absPosDelta = Math.abs(posDelta);\n const snapDelta =\n axesEvent && axesEvent.delta[AXES.POSITION_KEY] !== 0\n ? Math.abs(axesEvent.delta[AXES.POSITION_KEY])\n : absPosDelta;\n let targetAnchor: AnchorPoint;\n\n if (snapDelta >= snapThreshold && snapDelta > 0) {\n // Move to anchor at position\n targetAnchor = this._findSnappedAnchor(position, anchorAtCamera);\n } else if (absPosDelta >= flicking.threshold && absPosDelta > 0) {\n // Move to the adjacent panel\n targetAnchor = this._findAdjacentAnchor(position, posDelta, anchorAtCamera);\n } else {\n // Fallback to nearest panel from current camera\n return this.moveToPanel(anchorAtCamera.panel, {\n duration,\n axesEvent\n });\n }\n\n this._triggerIndexChangeEvent(targetAnchor.panel, position, axesEvent);\n\n return this._animateToPosition({\n position: camera.clampToReachablePosition(targetAnchor.position),\n duration,\n newActivePanel: targetAnchor.panel,\n axesEvent\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Finds the anchor point to snap to based on the target position and count option.\n */\n private _findSnappedAnchor(position: number, anchorAtCamera: AnchorPoint): AnchorPoint {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const count = this._count;\n\n const currentPos = camera.position;\n\n const clampedPosition = camera.clampToReachablePosition(position);\n const anchorAtPosition = camera.findAnchorIncludePosition(clampedPosition);\n\n if (!anchorAtCamera || !anchorAtPosition) {\n throw new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE);\n }\n\n if (!Number.isFinite(count)) {\n return anchorAtPosition;\n }\n\n const panelCount = flicking.panelCount;\n const anchors = camera.anchorPoints;\n\n let loopCount = Math.sign(position - currentPos) * Math.floor(Math.abs(position - currentPos) / camera.rangeDiff);\n if (\n (position > currentPos && anchorAtPosition.index < anchorAtCamera.index) ||\n (anchorAtPosition.position > anchorAtCamera.position && anchorAtPosition.index === anchorAtCamera.index)\n ) {\n loopCount += 1;\n } else if (\n (position < currentPos && anchorAtPosition.index > anchorAtCamera.index) ||\n (anchorAtPosition.position < anchorAtCamera.position && anchorAtPosition.index === anchorAtCamera.index)\n ) {\n loopCount -= 1;\n }\n\n const circularIndexOffset = loopCount * panelCount;\n const anchorAtPositionIndex = anchorAtPosition.index + circularIndexOffset;\n\n if (Math.abs(anchorAtPositionIndex - anchorAtCamera.index) <= count) {\n const anchor = anchors[anchorAtPosition.index];\n\n return new AnchorPoint({\n index: anchor.index,\n position: anchor.position + loopCount * camera.rangeDiff,\n panel: anchor.panel\n });\n }\n\n if (flicking.circularEnabled) {\n const targetAnchor =\n anchors[circulateIndex(anchorAtCamera.index + Math.sign(position - currentPos) * count, panelCount)];\n let loop = Math.floor(count / panelCount);\n\n if (position > currentPos && targetAnchor.index < anchorAtCamera.index) {\n loop += 1;\n } else if (position < currentPos && targetAnchor.index > anchorAtCamera.index) {\n loop -= 1;\n }\n\n return new AnchorPoint({\n index: targetAnchor.index,\n position: targetAnchor.position + loop * camera.rangeDiff,\n panel: targetAnchor.panel\n });\n } else {\n return anchors[clamp(anchorAtCamera.index + Math.sign(position - currentPos) * count, 0, anchors.length - 1)];\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Finds the adjacent anchor point based on the movement direction.\n */\n private _findAdjacentAnchor(position: number, posDelta: number, anchorAtCamera: AnchorPoint): AnchorPoint {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n if (camera.circularEnabled) {\n const anchorIncludePosition = camera.findAnchorIncludePosition(position);\n\n if (anchorIncludePosition && anchorIncludePosition.position !== anchorAtCamera.position) {\n return anchorIncludePosition;\n }\n }\n\n const adjacentAnchor =\n (posDelta > 0 ? camera.getNextAnchor(anchorAtCamera) : camera.getPrevAnchor(anchorAtCamera)) ?? anchorAtCamera;\n\n return adjacentAnchor;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates the snap threshold based on the panel size and alignment.\n */\n private _calcSnapThreshold(threshold: number, position: number, activeAnchor: AnchorPoint): number {\n const isNextDirection = position > activeAnchor.position;\n const panel = activeAnchor.panel;\n const panelSize = panel.size;\n const alignPos = panel.alignPosition;\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |<------>|<------------>|\n * [ |<-Anchor ]\n */\n return Math.max(\n threshold,\n isNextDirection ? panelSize - alignPos + panel.margin.next : alignPos + panel.margin.prev\n );\n }\n}\n\nexport default SnapControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\n\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { clamp, getFlickingAttached, getMinusCompensatedIndex, isBetween } from \"../utils\";\n\nimport Control, { MoveToPanelParams } from \"./Control\";\n/**\n * Options for the {@link StrictControl}\n */\nexport interface StrictControlOptions {\n /** Maximum number of panels that can be moved at a time */\n count: number;\n}\n\n/**\n * A {@link Control} that allows you to select the maximum number of panels to move at a time\n * @since 4.2.0\n * @public\n */\nclass StrictControl extends Control {\n private _count: number;\n private _indexRange: { min: number; max: number };\n\n /**\n * Maximum number of panels that can be moved at a time\n * @defaultValue 1\n */\n public get count(): number {\n return this._count;\n }\n\n public set count(val: StrictControlOptions[\"count\"]) {\n this._count = val;\n }\n\n public constructor(options: Partial<StrictControlOptions> = {}) {\n super();\n\n const { count = 1 } = options;\n\n this._count = count;\n this._resetIndexRange();\n }\n\n /**\n * Destroy Control and return to initial state\n * @remarks\n * This method also resets the index range used for movement constraints.\n */\n public destroy() {\n super.destroy();\n\n this._resetIndexRange();\n }\n\n /**\n * Update {@link Control.controller | controller}'s state\n * @remarks\n * StrictControl limits the movement range based on the {@link StrictControlOptions.count | count} option.\n * @returns The current instance for method chaining\n */\n public updateInput(): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const renderer = flicking.renderer;\n const controller = this._controller;\n const controlParams = camera.controlParams;\n const count = this._count;\n\n const activePanel = controller.state.animating\n ? camera.findNearestAnchor(camera.position)?.panel\n : this._activePanel;\n\n if (!activePanel) {\n controller.update(controlParams);\n this._resetIndexRange();\n return this;\n }\n\n const cameraRange = controlParams.range;\n const currentPos = activePanel.position;\n const currentIndex = activePanel.index;\n const panelCount = renderer.panelCount;\n\n let prevPanelIndex = currentIndex - count;\n let nextPanelIndex = currentIndex + count;\n\n if (prevPanelIndex < 0) {\n prevPanelIndex = flicking.circularEnabled\n ? getMinusCompensatedIndex(((prevPanelIndex + 1) % panelCount) - 1, panelCount)\n : clamp(prevPanelIndex, 0, panelCount - 1);\n }\n if (nextPanelIndex >= panelCount) {\n nextPanelIndex = flicking.circularEnabled\n ? nextPanelIndex % panelCount\n : clamp(nextPanelIndex, 0, panelCount - 1);\n }\n\n const prevPanel = renderer.panels[prevPanelIndex];\n const nextPanel = renderer.panels[nextPanelIndex];\n\n let prevPos = Math.max(prevPanel.position, cameraRange.min);\n let nextPos = Math.min(nextPanel.position, cameraRange.max);\n\n if (prevPos > currentPos) {\n prevPos -= camera.rangeDiff;\n }\n if (nextPos < currentPos) {\n nextPos += camera.rangeDiff;\n }\n\n controlParams.range = {\n min: prevPos,\n max: nextPos\n };\n\n if (controlParams.circular) {\n if (controlParams.position < prevPos) {\n controlParams.position += camera.rangeDiff;\n }\n\n if (controlParams.position > nextPos) {\n controlParams.position -= camera.rangeDiff;\n }\n }\n\n controlParams.circular = false;\n controller.update(controlParams);\n\n this._indexRange = {\n min: prevPanel.index,\n max: nextPanel.index\n };\n\n return this;\n }\n\n public async moveToPanel(panel: Panel, options: MoveToPanelParams): Promise<void> {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const controller = this._controller;\n\n controller.update(camera.controlParams);\n\n return super.moveToPanel(panel, options);\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * StrictControl restricts movement to panels within the allowed index range based on the count option.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease): Promise<void> {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const currentPanel = this._nextPanel ?? this._activePanel;\n const axesRange = this._controller.range;\n const indexRange = this._indexRange;\n const cameraRange = camera.range;\n const state = this._controller.state;\n\n const clampedPosition = clamp(camera.clampToReachablePosition(position), axesRange[0], axesRange[1]);\n const anchorAtPosition = camera.findAnchorIncludePosition(clampedPosition);\n\n if (!anchorAtPosition || !currentPanel) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const prevPos = currentPanel.position;\n const posDelta = flicking.animating ? state.delta : position - camera.position;\n\n const isOverThreshold = Math.abs(posDelta) >= flicking.threshold;\n const adjacentAnchor =\n position > prevPos ? camera.getNextAnchor(anchorAtPosition) : camera.getPrevAnchor(anchorAtPosition);\n\n let targetPos: number;\n let targetPanel: Panel;\n\n const anchors = camera.anchorPoints;\n const firstAnchor = anchors[0];\n const lastAnchor = anchors[anchors.length - 1];\n\n // position이 bounce으로 인하여 범위를 넘어가야 동작하도록 변경\n const shouldBounceToFirst =\n position < cameraRange.min && isBetween(firstAnchor.panel.index, indexRange.min, indexRange.max);\n const shouldBounceToLast =\n position > cameraRange.max && isBetween(lastAnchor.panel.index, indexRange.min, indexRange.max);\n\n const isAdjacent =\n adjacentAnchor &&\n (indexRange.min <= indexRange.max\n ? isBetween(adjacentAnchor.index, indexRange.min, indexRange.max)\n : adjacentAnchor.index >= indexRange.min || adjacentAnchor.index <= indexRange.max);\n\n if (shouldBounceToFirst || shouldBounceToLast) {\n // In bounce area\n const targetAnchor = position < cameraRange.min ? firstAnchor : lastAnchor;\n\n targetPanel = targetAnchor.panel;\n targetPos = targetAnchor.position;\n } else if (isOverThreshold && anchorAtPosition.position !== currentPanel.position) {\n // Move to anchor at position\n targetPanel = anchorAtPosition.panel;\n targetPos = anchorAtPosition.position;\n } else if (isOverThreshold && isAdjacent) {\n // Move to adjacent anchor\n targetPanel = adjacentAnchor!.panel;\n targetPos = adjacentAnchor!.position;\n } else {\n // Fallback to nearest panel from current camera\n const anchorAtCamera = camera.findNearestAnchor(camera.position);\n if (!anchorAtCamera) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n return this.moveToPanel(anchorAtCamera.panel, {\n duration,\n axesEvent\n });\n }\n\n this._triggerIndexChangeEvent(targetPanel, position, axesEvent);\n\n return this._animateToPosition({\n position: targetPos,\n duration,\n newActivePanel: targetPanel,\n axesEvent\n });\n }\n\n public setActive = (newActivePanel: Panel, prevActivePanel: Panel | null, isTrusted: boolean) => {\n super.setActive(newActivePanel, prevActivePanel, isTrusted);\n this.updateInput();\n };\n\n /**\n * @internal\n * @privateRemarks\n * Resets the index range to default values.\n */\n private _resetIndexRange() {\n this._indexRange = { min: 0, max: 0 };\n }\n}\n\nexport default StrictControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Flicking from \"../Flicking\";\nimport { getElementSize, getStyle } from \"../utils\";\n\n/**\n * A component that detects size change and trigger resize method when the autoResize option is used\n */\nclass AutoResizer {\n private _flicking: Flicking;\n private _enabled: boolean;\n private _resizeObserver: ResizeObserver | null;\n private _resizeTimer: number;\n private _maxResizeDebounceTimer: number;\n\n public get enabled() {\n return this._enabled;\n }\n\n /**\n * @param flicking\n */\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n this._enabled = false;\n this._resizeObserver = null;\n this._resizeTimer = -1;\n this._maxResizeDebounceTimer = -1;\n }\n\n public enable(): this {\n const flicking = this._flicking;\n const viewport = flicking.viewport;\n\n if (this._enabled) {\n this.disable();\n }\n\n if (flicking.useResizeObserver && !!window.ResizeObserver) {\n const viewportSizeNot0 = viewport.width !== 0 || viewport.height !== 0;\n\n const resizeObserver = viewportSizeNot0\n ? new ResizeObserver(this._skipFirstResize)\n : new ResizeObserver(this._onResize);\n\n this._resizeObserver = resizeObserver;\n\n this.observe(flicking.viewport.element);\n\n if (flicking.observePanelResize) {\n this.observePanels();\n }\n } else {\n window.addEventListener(\"resize\", this._onResizeWrapper);\n }\n\n this._enabled = true;\n\n return this;\n }\n\n public observePanels(): this {\n this._flicking.panels.forEach(panel => {\n this.observe(panel.element);\n });\n return this;\n }\n\n public unobservePanels(): this {\n this._flicking.panels.forEach(panel => {\n this.unobserve(panel.element);\n });\n return this;\n }\n\n public observe(element: HTMLElement): this {\n const resizeObserver = this._resizeObserver;\n\n if (!resizeObserver) return this;\n\n resizeObserver.observe(element);\n\n return this;\n }\n\n public unobserve(element: HTMLElement): this {\n const resizeObserver = this._resizeObserver;\n\n if (!resizeObserver) return this;\n\n resizeObserver.unobserve(element);\n\n if (this._flicking.observePanelResize) {\n this.unobservePanels();\n }\n\n return this;\n }\n\n public disable(): this {\n if (!this._enabled) return this;\n\n const resizeObserver = this._resizeObserver;\n if (resizeObserver) {\n resizeObserver.disconnect();\n this._resizeObserver = null;\n } else {\n window.removeEventListener(\"resize\", this._onResizeWrapper);\n }\n\n this._enabled = false;\n\n return this;\n }\n\n private _onResizeWrapper = () => {\n this._onResize([]);\n };\n\n private _onResize = (entries: ResizeObserverEntry[]) => {\n const flicking = this._flicking;\n const resizeDebounce = flicking.resizeDebounce;\n const maxResizeDebounce = flicking.maxResizeDebounce;\n\n const resizedViewportElement = flicking.element;\n // 현재 구현에서 리사이즈 옵저빙 대상은 패널과 뷰포트 2개만 존재.\n // 아래는 뷰포트만 변경되었을 때 동작해야하는 로직이 있으므로 아래와 같이 조건문을 건다.\n // 패널 쪽에서는 리사이즈 감지에 resizeObserver를 사용하지 않는 경우가 없으므로 이 조건은 곧 뷰포트만 리사이즈가 된 경우를 의미한다.\n const isResizedViewportOnly = entries.find(e => e.target === flicking.element) && entries.length === 1;\n\n // 참고: resizeObserver를 사용하지 않은 경우에는 entries.length가 0으로 오는데 이 경우에는 그냥 항상 리사이즈가 진행되도록 한다.\n // (vw, vh 등을 사용하는 경우 이상 동작이 발생할 여지가 있기 때문이다)\n if (isResizedViewportOnly) {\n // resize 이벤트가 발생했으나 이전과 width, height의 변화가 없다면 이후 로직을 진행하지 않는다.\n const beforeSize = {\n width: flicking.viewport.width,\n height: flicking.viewport.height\n };\n\n const afterSize = {\n width: getElementSize({\n el: resizedViewportElement,\n horizontal: true,\n useFractionalSize: this._flicking.useFractionalSize,\n useOffset: false,\n style: getStyle(resizedViewportElement)\n }),\n height: getElementSize({\n el: resizedViewportElement,\n horizontal: false,\n useFractionalSize: this._flicking.useFractionalSize,\n useOffset: false,\n style: getStyle(resizedViewportElement)\n })\n };\n\n if (beforeSize.height === afterSize.height && beforeSize.width === afterSize.width) {\n return;\n }\n }\n\n if (resizeDebounce <= 0) {\n void flicking.resize();\n } else {\n if (this._maxResizeDebounceTimer <= 0) {\n if (maxResizeDebounce > 0 && maxResizeDebounce >= resizeDebounce) {\n this._maxResizeDebounceTimer = window.setTimeout(this._doScheduledResize, maxResizeDebounce);\n }\n }\n\n if (this._resizeTimer > 0) {\n clearTimeout(this._resizeTimer);\n this._resizeTimer = 0;\n }\n\n this._resizeTimer = window.setTimeout(this._doScheduledResize, resizeDebounce);\n }\n };\n\n private _doScheduledResize = () => {\n clearTimeout(this._resizeTimer);\n clearTimeout(this._maxResizeDebounceTimer);\n\n this._maxResizeDebounceTimer = -1;\n this._resizeTimer = -1;\n\n void this._flicking.resize();\n };\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private _skipFirstResize = (() => {\n let isFirstResize = true;\n\n return entries => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n this._onResize(entries);\n };\n })();\n}\n\nexport default AutoResizer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Flicking from \"../../../Flicking\";\n\nimport ElementProvider from \"./ElementProvider\";\n\n/**\n * @internal\n */\nclass VanillaElementProvider implements ElementProvider {\n private _element: HTMLElement;\n private _rendered: boolean;\n\n public get element() {\n return this._element;\n }\n public get rendered() {\n return this._rendered;\n }\n\n public constructor(element: HTMLElement) {\n this._element = element;\n this._rendered = true;\n }\n\n public show(flicking: Flicking): void {\n const el = this.element;\n const cameraEl = flicking.camera.element;\n\n if (el.parentElement !== cameraEl) {\n cameraEl.appendChild(el);\n this._rendered = true;\n }\n }\n\n public hide(flicking: Flicking): void {\n const el = this.element;\n const cameraEl = flicking.camera.element;\n\n if (el.parentElement === cameraEl) {\n cameraEl.removeChild(el);\n this._rendered = false;\n }\n }\n}\n\nexport default VanillaElementProvider;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Flicking from \"../../../Flicking\";\nimport VirtualPanel from \"../VirtualPanel\";\n\nimport ElementProvider from \"./ElementProvider\";\n\n/**\n * @internal\n */\nclass VirtualElementProvider implements ElementProvider {\n private _flicking: Flicking;\n private _panel: VirtualPanel;\n\n public get element() {\n return this._virtualElement.nativeElement;\n }\n public get rendered() {\n return this._virtualElement.visible;\n }\n\n private get _virtualElement() {\n const flicking = this._flicking;\n const elIndex = this._panel.elementIndex;\n const virtualElements = flicking.virtual.elements;\n\n return virtualElements[elIndex];\n }\n\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n }\n\n public init(panel: VirtualPanel) {\n this._panel = panel;\n }\n\n public show(): void {\n // DO_NOTHING\n // Actual element visibility is controlled by VirtualManager\n }\n\n public hide(): void {\n // DO_NOTHING\n // Actual element visibility is controlled by VirtualManager\n }\n}\n\nexport default VirtualElementProvider;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Flicking from \"../Flicking\";\nimport { SetSizeParams } from \"../types/params\";\nimport { getElementSize, getStyle, isString } from \"../utils\";\n\nexport interface ViewportPadding {\n /** CSS `padding-left` */\n left: number;\n /** CSS `padding-right` */\n right: number;\n /** CSS `padding-top` */\n top: number;\n /** CSS `padding-bottom` */\n bottom: number;\n}\n\n/**\n * A component that manages viewport size\n */\nclass Viewport {\n private _flicking: Flicking;\n private _el: HTMLElement;\n private _width: number;\n private _height: number;\n private _isBorderBoxSizing: boolean;\n private _padding: ViewportPadding;\n\n /**\n * A viewport(root) element\n * @readonly\n */\n public get element(): HTMLElement {\n return this._el;\n }\n\n /**\n * Viewport width, without paddings\n * @readonly\n */\n public get width(): number {\n return this._width - this._padding.left - this._padding.right;\n }\n /**\n * Viewport height, without paddings\n * @readonly\n */\n public get height(): number {\n return this._height - this._padding.top - this._padding.bottom;\n }\n /**\n * Viewport paddings\n * @readonly\n */\n public get padding(): ViewportPadding {\n return this._padding;\n }\n\n /**\n * @param flicking - Flicking instance\n * @param el - A viewport element\n */\n public constructor(flicking: Flicking, el: HTMLElement) {\n this._flicking = flicking;\n this._el = el;\n this._width = 0;\n this._height = 0;\n this._padding = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this._isBorderBoxSizing = false;\n }\n\n /**\n * Change viewport's size.\n * @remarks\n * This will change the actual size of `.flicking-viewport` element by changing its CSS width/height property\n * @param size - {@link SetSizeParams}\n */\n public setSize(size: SetSizeParams) {\n const { width, height } = size;\n\n const el = this._el;\n const padding = this._padding;\n const isBorderBoxSizing = this._isBorderBoxSizing;\n\n if (width != null) {\n if (isString(width)) {\n el.style.width = width;\n } else {\n const newWidth = isBorderBoxSizing ? width + padding.left + padding.right : width;\n el.style.width = `${newWidth}px`;\n }\n }\n if (height != null) {\n if (isString(height)) {\n el.style.height = height;\n } else {\n const newHeight = isBorderBoxSizing ? height + padding.top + padding.bottom : height;\n el.style.height = `${newHeight}px`;\n }\n }\n this.resize();\n }\n\n /**\n * Update width/height to the current viewport element's size\n */\n public resize() {\n const el = this._el;\n const elStyle = getStyle(el);\n const { useFractionalSize } = this._flicking;\n\n this._width = getElementSize({\n el,\n horizontal: true,\n useFractionalSize,\n useOffset: false,\n style: elStyle\n });\n this._height = getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: false,\n style: elStyle\n });\n\n this._padding = {\n left: elStyle.paddingLeft ? parseFloat(elStyle.paddingLeft) : 0,\n right: elStyle.paddingRight ? parseFloat(elStyle.paddingRight) : 0,\n top: elStyle.paddingTop ? parseFloat(elStyle.paddingTop) : 0,\n bottom: elStyle.paddingBottom ? parseFloat(elStyle.paddingBottom) : 0\n };\n this._isBorderBoxSizing = elStyle.boxSizing === \"border-box\";\n }\n}\n\nexport default Viewport;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { CLASS } from \"../constants/values\";\nimport Flicking from \"../Flicking\";\nimport { range } from \"../utils\";\n\nimport VirtualPanel from \"./panel/VirtualPanel\";\n\nexport type PanelRenderCallback =\n | ((\n /** Virtual panel to render */\n panel: VirtualPanel,\n /** Index of the panel */\n index: number\n ) => string)\n | (() => string);\n\nexport interface VirtualOptions {\n renderPanel: PanelRenderCallback;\n initialPanelCount: number;\n cache?: boolean;\n panelClass?: string;\n}\n\n/**\n * A manager class to add / remove virtual panels\n */\nclass VirtualManager {\n private _flicking: Flicking;\n\n private _renderPanel: PanelRenderCallback;\n private _initialPanelCount: number;\n private _cache: boolean;\n private _panelClass: string;\n\n private _elements: Array<{ nativeElement: HTMLElement; visible: boolean }>;\n\n public get elements() {\n return this._elements;\n }\n\n // Options\n /**\n * A rendering function for the panel element's innerHTML\n */\n public get renderPanel(): PanelRenderCallback {\n return this._renderPanel;\n }\n /**\n * Initial panel count to render\n * @readonly\n * @defaultValue -1\n */\n public get initialPanelCount(): number {\n return this._initialPanelCount;\n }\n /**\n * Whether to cache rendered panel's innerHTML\n * @defaultValue false\n */\n public get cache(): boolean {\n return this._cache;\n }\n /**\n * The class name that will be applied to rendered panel elements\n * @defaultValue \"flicking-panel\"\n */\n public get panelClass(): string {\n return this._panelClass;\n }\n\n public set renderPanel(val: VirtualOptions[\"renderPanel\"]) {\n this._renderPanel = val;\n this._flicking.renderer.panels.forEach((panel: VirtualPanel) => panel.uncacheRenderResult());\n }\n\n public set cache(val: NonNullable<VirtualOptions[\"cache\"]>) {\n this._cache = val;\n }\n public set panelClass(val: NonNullable<VirtualOptions[\"panelClass\"]>) {\n this._panelClass = val;\n }\n\n public constructor(flicking: Flicking, options: VirtualOptions | null) {\n this._flicking = flicking;\n\n this._renderPanel = options?.renderPanel ?? (() => \"\");\n this._initialPanelCount = options?.initialPanelCount ?? -1;\n this._cache = options?.cache ?? false;\n this._panelClass = options?.panelClass ?? CLASS.DEFAULT_VIRTUAL;\n\n this._elements = [];\n }\n\n public init() {\n const flicking = this._flicking;\n\n if (!flicking.virtualEnabled) return;\n\n if (!flicking.externalRenderer && !flicking.renderExternal) {\n this._initVirtualElements();\n }\n\n const virtualElements = flicking.camera.children;\n this._elements = virtualElements.map(el => ({ nativeElement: el, visible: true }));\n }\n\n public show(index: number) {\n const el = this._elements[index];\n const nativeEl = el.nativeElement;\n\n el.visible = true;\n\n if (nativeEl.style.display) {\n nativeEl.style.display = \"\";\n }\n }\n\n public hide(index: number) {\n const el = this._elements[index];\n const nativeEl = el.nativeElement;\n\n el.visible = false;\n nativeEl.style.display = \"none\";\n }\n\n /**\n * Add new virtual panels at the end of the list\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public append(count: number = 1): VirtualPanel[] {\n const flicking = this._flicking;\n\n return this.insert(flicking.panels.length, count);\n }\n\n /**\n * Add new virtual panels at the start of the list\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public prepend(count: number = 1): VirtualPanel[] {\n return this.insert(0, count);\n }\n\n /**\n * Add new virtual panels at the given index\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public insert(index: number, count: number = 1): VirtualPanel[] {\n if (count <= 0) return [];\n\n const flicking = this._flicking;\n\n return flicking.renderer.batchInsert({ index, elements: range(count), hasDOMInElements: false }) as VirtualPanel[];\n }\n\n /**\n * Remove panels at the given index\n * @param count - The number of panels to remove\n * @returns The panels removed\n */\n public remove(index: number, count: number): VirtualPanel[] {\n if (count <= 0) return [];\n\n const flicking = this._flicking;\n\n return flicking.renderer.batchRemove({ index, deleteCount: count, hasDOMInElements: false }) as VirtualPanel[];\n }\n\n /**\n * @internal\n */\n private _initVirtualElements() {\n const flicking = this._flicking;\n const cameraElement = flicking.camera.element;\n const panelsPerView = flicking.panelsPerView;\n const fragment = document.createDocumentFragment();\n\n const newElements = range(panelsPerView + 1).map(idx => {\n const panelEl = document.createElement(\"div\");\n panelEl.className = this._panelClass;\n panelEl.dataset.elementIndex = idx.toString();\n return panelEl;\n });\n\n newElements.forEach(el => {\n fragment.appendChild(el);\n });\n\n cameraElement.appendChild(fragment);\n }\n}\n\nexport default VirtualManager;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport { ALIGN } from \"../constants/values\";\nimport Panel, { PanelOptions } from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking, { FlickingOptions } from \"../Flicking\";\nimport { getFlickingAttached, getMinusCompensatedIndex, includes, parsePanelAlign } from \"../utils\";\n\nimport RenderingStrategy from \"./strategy/RenderingStrategy\";\n\n/**\n * Options for creating a {@link Renderer}\n */\nexport interface RendererOptions {\n /** An {@link Flicking.align | align} value that will be applied to all panels */\n align?: FlickingOptions[\"align\"];\n /** An instance of RenderingStrategy(internal module) */\n strategy: RenderingStrategy;\n}\n\n/**\n * Parameters for {@link Renderer.batchInsert}\n * @public\n */\nexport interface BatchInsertParams {\n /** Index to insert new panels at */\n index: number;\n /** An array of element or framework component with element in it */\n elements: any[];\n /** Whether it contains actual DOM elements. If set to true, renderer will add them to the camera element */\n hasDOMInElements: boolean;\n}\n\n/**\n * Parameters for {@link Renderer.batchRemove}\n * @public\n */\nexport interface BatchRemoveParams {\n /** Index of panel to remove */\n index: number;\n /** Number of panels to remove from index */\n deleteCount: number;\n /** Whether it contains actual DOM elements. If set to true, renderer will remove them from the camera element */\n hasDOMInElements: boolean;\n}\n\n/**\n * A component that manages {@link Panel} and its elements\n * @public\n */\nabstract class Renderer {\n // Internal States\n protected _flicking: Flicking | null;\n protected _panels: Panel[];\n protected _rendering: boolean;\n\n // Options\n protected _align: NonNullable<RendererOptions[\"align\"]>;\n protected _strategy: RendererOptions[\"strategy\"];\n\n // Internal states Getter\n /**\n * Array of panels\n * @readonly\n * @see Panel\n */\n public get panels(): Panel[] {\n return this._panels;\n }\n /**\n * A boolean value indicating whether rendering is in progress\n * @readonly\n * @internal\n */\n public get rendering(): boolean {\n return this._rendering;\n }\n /**\n * Count of panels\n * @readonly\n */\n public get panelCount(): number {\n return this._panels.length;\n }\n /**\n * @internal\n */\n public get strategy(): RendererOptions[\"strategy\"] {\n return this._strategy;\n }\n\n // Options Getter\n /**\n * A {@link Panel}'s {@link Panel.align | align} value that applied to all panels\n */\n public get align(): NonNullable<RendererOptions[\"align\"]> {\n return this._align;\n }\n\n // Options Setter\n public set align(val: NonNullable<RendererOptions[\"align\"]>) {\n this._align = val;\n\n const panelAlign = parsePanelAlign(val);\n this._panels.forEach(panel => {\n panel.align = panelAlign;\n });\n }\n\n /**\n * @param options - {@link RendererOptions}\n */\n public constructor(options: RendererOptions) {\n // Destructure options with default values\n const { align = ALIGN.CENTER, strategy } = options;\n\n this._flicking = null;\n this._panels = [];\n this._rendering = false;\n\n // Bind options\n this._align = align;\n this._strategy = strategy;\n }\n\n /**\n * Render panel elements inside the camera element\n * @remarks\n * This method updates the DOM to reflect the current panel state.\n * @returns A Promise that resolves when rendering is complete\n */\n public abstract render(): Promise<void>;\n\n /**\n * @internal\n * @privateRemarks\n * Collects panel elements from the camera element and creates Panel instances.\n */\n protected abstract _collectPanels(): void;\n /**\n * @internal\n * @privateRemarks\n * Creates a Panel instance from an element with the given options.\n */\n protected abstract _createPanel(el: any, options: Omit<PanelOptions, \"elementProvider\">): Panel;\n\n /**\n * Initialize Renderer\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It collects existing panel elements.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n this._collectPanels();\n\n return this;\n }\n\n /**\n * Destroy Renderer and return to initial state\n * @remarks\n * This method clears all panel references and resets the internal state.\n */\n public destroy(): void {\n this._flicking = null;\n this._panels = [];\n }\n\n /**\n * Return the {@link Panel} at the given index. `null` if it doesn't exist.\n * @remarks\n * This is equivalent to accessing `Flicking.panels[index]`.\n * @param index - Index of the panel to get\n * @returns Panel at the given index\n * @see Panel\n */\n public getPanel(index: number): Panel | null {\n return this._panels[index] || null;\n }\n\n public forceRenderAllPanels(): Promise<void> {\n this._panels.forEach(panel => panel.markForShow());\n\n return Promise.resolve();\n }\n\n /**\n * Return Rendered Panels\n * @returns Rendered Panels\n */\n public getRenderedPanels(): Panel[] {\n const flicking = getFlickingAttached(this._flicking);\n\n return flicking.renderer.panels.filter(panel => panel.rendered);\n }\n\n /**\n * Update all panel sizes\n * @returns The current instance for method chaining\n */\n public updatePanelSize(): this {\n const flicking = getFlickingAttached(this._flicking);\n const panels = this._panels;\n\n if (panels.length <= 0) return this;\n\n if (flicking.panelsPerView > 0) {\n const firstPanel = panels[0];\n firstPanel.resize();\n\n this._updatePanelSizeByGrid(firstPanel, panels);\n } else {\n flicking.panels.forEach(panel => panel.resize());\n }\n\n return this;\n }\n\n /**\n * Insert new panels at given index\n * @remarks\n * This will increase index of panels after by the number of panels added.\n * @param items - An array of {@link BatchInsertParams}\n * @throws {@link DOMManipulationErrors}\n * @returns An array of inserted panels\n */\n public batchInsert(...items: BatchInsertParams[]): Panel[] {\n const allPanelsInserted = this.batchInsertDefer(...items);\n\n if (allPanelsInserted.length <= 0) return [];\n\n this.updateAfterPanelChange(allPanelsInserted, []);\n\n return allPanelsInserted;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Defers update. Camera position & others will be updated after calling updateAfterPanelChange.\n */\n public batchInsertDefer(...items: BatchInsertParams[]) {\n const panels = this._panels;\n const flicking = getFlickingAttached(this._flicking);\n\n const prevFirstPanel = panels[0];\n const align = parsePanelAlign(this._align);\n\n const allPanelsInserted = items.reduce((addedPanels, item) => {\n const insertingIdx = getMinusCompensatedIndex(item.index, panels.length);\n const panelsPushed = panels.slice(insertingIdx);\n const panelsInserted = item.elements.map((el, idx) =>\n this._createPanel(el, { index: insertingIdx + idx, align, flicking })\n );\n\n panels.splice(insertingIdx, 0, ...panelsInserted);\n\n if (item.hasDOMInElements) {\n // Insert the actual elements as camera element's children\n this._insertPanelElements(panelsInserted, panelsPushed[0] ?? null);\n }\n\n // Resize the newly added panels\n if (flicking.panelsPerView > 0) {\n const firstPanel = prevFirstPanel || panelsInserted[0].resize();\n\n this._updatePanelSizeByGrid(firstPanel, panelsInserted);\n } else {\n panelsInserted.forEach(panel => panel.resize());\n }\n\n // Update panel indexes & positions\n panelsPushed.forEach(panel => {\n panel.increaseIndex(panelsInserted.length);\n panel.updatePosition();\n });\n\n return [...addedPanels, ...panelsInserted];\n }, []);\n\n return allPanelsInserted;\n }\n\n /**\n * Remove the panel at the given index\n * @remarks\n * This will decrease index of panels after by the number of panels removed.\n * @param items - An array of {@link BatchRemoveParams}\n * @throws {@link DOMManipulationErrors}\n * @returns An array of removed panels\n */\n public batchRemove(...items: BatchRemoveParams[]): Panel[] {\n const allPanelsRemoved = this.batchRemoveDefer(...items);\n\n if (allPanelsRemoved.length <= 0) return [];\n\n this.updateAfterPanelChange([], allPanelsRemoved);\n\n return allPanelsRemoved;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Defers update. Camera position & others will be updated after calling updateAfterPanelChange.\n */\n public batchRemoveDefer(...items: BatchRemoveParams[]) {\n const panels = this._panels;\n const flicking = getFlickingAttached(this._flicking);\n\n const { control } = flicking;\n const activePanel = control.activePanel;\n\n const allPanelsRemoved = items.reduce((removed, item) => {\n const { index, deleteCount } = item;\n const removingIdx = getMinusCompensatedIndex(index, panels.length);\n\n const panelsPulled = panels.slice(removingIdx + deleteCount);\n const panelsRemoved = panels.splice(removingIdx, deleteCount);\n\n if (panelsRemoved.length <= 0) return [];\n\n // Update panel indexes & positions\n panelsPulled.forEach(panel => {\n panel.decreaseIndex(panelsRemoved.length);\n panel.updatePosition();\n });\n\n if (item.hasDOMInElements) {\n this._removePanelElements(panelsRemoved);\n }\n\n // Remove panel elements\n panelsRemoved.forEach(panel => panel.destroy());\n\n if (includes(panelsRemoved, activePanel)) {\n control.resetActive();\n }\n\n return [...removed, ...panelsRemoved];\n }, []);\n\n return allPanelsRemoved;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates camera, control, and triggers {@link PanelChangeEvent} after panels are added or removed.\n */\n public updateAfterPanelChange(panelsAdded: Panel[], panelsRemoved: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const { camera, control } = flicking;\n const panels = this._panels;\n const activePanel = control.activePanel;\n\n // Update camera & control\n this._updateCameraAndControl();\n\n if (flicking.autoResize && flicking.useResizeObserver) {\n panelsAdded.forEach(panel => {\n if (panel.element) {\n flicking.autoResizer.observe(panel.element);\n }\n });\n panelsRemoved.forEach(panel => {\n if (panel.element) {\n flicking.autoResizer.unobserve(panel.element);\n }\n });\n }\n\n void this.render();\n\n if (!flicking.animating) {\n if (!activePanel || activePanel.removed) {\n if (panels.length <= 0) {\n // All panels removed\n camera.lookAt(0);\n } else {\n let targetIndex = activePanel?.index ?? 0;\n if (targetIndex > panels.length - 1) {\n targetIndex = panels.length - 1;\n }\n\n void control\n .moveToPanel(panels[targetIndex], {\n duration: 0\n })\n .catch(() => void 0);\n }\n } else {\n void control\n .moveToPanel(activePanel, {\n duration: 0\n })\n .catch(() => void 0);\n }\n }\n\n flicking.camera.updateOffset();\n\n if (panelsAdded.length > 0 || panelsRemoved.length > 0) {\n flicking.trigger(\n new ComponentEvent(EVENTS.PANEL_CHANGE, {\n added: panelsAdded,\n removed: panelsRemoved\n })\n );\n\n this.checkPanelContentsReady([...panelsAdded, ...panelsRemoved]);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if panel contents (images/videos) are ready and triggers resize when loaded.\n */\n public checkPanelContentsReady(checkingPanels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const resizeOnContentsReady = flicking.resizeOnContentsReady;\n const panels = this._panels;\n\n if (!resizeOnContentsReady || flicking.virtualEnabled) return;\n\n const hasContents = (panel: Panel) => panel.element && !!panel.element.querySelector(\"img, video\");\n checkingPanels = checkingPanels.filter(panel => hasContents(panel));\n\n if (checkingPanels.length <= 0) return;\n\n const contentsReadyChecker = new ImReady();\n\n checkingPanels.forEach(panel => {\n panel.loading = true;\n });\n\n contentsReadyChecker.on(\"readyElement\", e => {\n if (!this._flicking) {\n // Renderer's destroy() is called before\n contentsReadyChecker.destroy();\n return;\n }\n\n const panel = checkingPanels[e.index];\n const camera = flicking.camera;\n const control = flicking.control;\n const prevProgressInPanel = control.activePanel ? camera.getProgressInPanel(control.activePanel) : 0;\n\n panel.loading = false;\n panel.resize();\n panels.slice(panel.index + 1).forEach(panelBehind => panelBehind.updatePosition());\n\n if (!flicking.initialized) return;\n\n camera.updateRange();\n camera.updateOffset();\n camera.updateAnchors();\n\n if (control.animating) {\n // TODO: Need Axes update\n } else {\n control.updatePosition(prevProgressInPanel);\n control.updateInput();\n }\n });\n\n contentsReadyChecker.on(\"preReady\", e => {\n if (this._flicking) {\n void this.render();\n }\n\n if (e.readyCount === e.totalCount) {\n contentsReadyChecker.destroy();\n }\n });\n\n contentsReadyChecker.on(\"ready\", () => {\n if (this._flicking) {\n void this.render();\n }\n contentsReadyChecker.destroy();\n });\n\n contentsReadyChecker.check(checkingPanels.map(panel => panel.element));\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates camera range, anchors, and control input after panel changes.\n */\n protected _updateCameraAndControl() {\n const flicking = getFlickingAttached(this._flicking);\n const { camera, control } = flicking;\n\n camera.updateRange();\n camera.updateOffset();\n camera.updateAnchors();\n camera.resetNeedPanelHistory();\n control.updateInput();\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks only visible panels for rendering when {@link FlickingOptions.renderOnlyVisible | renderOnlyVisible} is enabled.\n */\n protected _showOnlyVisiblePanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else if (!flicking.holding) {\n // During the input sequence,\n // Do not remove panel elements as it won't trigger touchend event.\n panel.markForHide();\n }\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates and applies panel sizes when {@link FlickingOptions.panelsPerView | panelsPerView} is enabled.\n */\n protected _updatePanelSizeByGrid(referencePanel: Panel, panels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const panelsPerView = flicking.panelsPerView;\n\n if (panelsPerView <= 0) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"panelsPerView\", panelsPerView), ERROR.CODE.WRONG_OPTION);\n }\n if (panels.length <= 0) return;\n\n const viewportSize = flicking.camera.size;\n const gap = referencePanel.margin.prev + referencePanel.margin.next;\n\n const panelSize = (viewportSize - gap * (panelsPerView - 1)) / panelsPerView;\n const panelSizeObj = flicking.horizontal ? { width: panelSize } : { height: panelSize };\n const firstPanelSizeObj = {\n size: panelSize,\n margin: referencePanel.margin,\n ...(!flicking.horizontal && { height: referencePanel.height })\n };\n\n if (!flicking.noPanelStyleOverride) {\n this._strategy.updatePanelSizes(flicking, panelSizeObj);\n }\n\n flicking.panels.forEach(panel => panel.resize(firstPanelSizeObj));\n }\n\n /**\n * @internal\n * @privateRemarks\n * Removes all child elements from the camera element.\n */\n protected _removeAllChildsFromCamera() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n // Remove other elements\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Inserts panel elements into the camera element at the specified position.\n */\n protected _insertPanelElements(panels: Panel[], nextSibling: Panel | null = null) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const cameraElement = camera.element;\n const nextSiblingElement = nextSibling?.element || null;\n const fragment = document.createDocumentFragment();\n\n panels.forEach(panel => fragment.appendChild(panel.element));\n cameraElement.insertBefore(fragment, nextSiblingElement);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Removes panel elements from the camera element.\n */\n protected _removePanelElements(panels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n panels.forEach(panel => {\n cameraElement.removeChild(panel.element);\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Called after rendering to apply the camera transform.\n */\n protected _afterRender() {\n const flicking = getFlickingAttached(this._flicking);\n\n flicking.camera.applyTransform();\n\n if (flicking.useCSSOrder) {\n // `useCSSOrder`를 사용하는 경우 DOM은 변화가 없지만 대신 css `order`값을 주입\n const renderedPanels = flicking.renderer.panels.filter(panel => panel.rendered);\n\n this._strategy.getRenderingIndexesByOrder(flicking).forEach((domIndex, index) => {\n if (renderedPanels[domIndex].element) {\n // 방어 코드 추가\n renderedPanels[domIndex].element.style.order = `${index}`;\n }\n });\n }\n }\n}\n\nexport default Renderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Panel from \"../core/panel/Panel\";\n\nimport Renderer from \"./Renderer\";\n\n/**\n * @internal\n */\nabstract class ExternalRenderer extends Renderer {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n protected _removePanelElements(panels: Panel[]): void {\n // DO NOTHING, overrided to prevent an unexpected error\n }\n\n protected _removeAllChildsFromCamera(): void {\n // DO NOTHING, overrided to prevent an unexpected error\n }\n /* eslint-enable @typescript-eslint/no-unused-vars */\n}\n\nexport default ExternalRenderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel, { PanelOptions } from \"../core/panel/Panel\";\nimport { getFlickingAttached, toArray } from \"../utils\";\n\nimport Renderer from \"./Renderer\";\n\nclass VanillaRenderer extends Renderer {\n // eslint-disable-next-line @typescript-eslint/require-await\n public async render() {\n const flicking = getFlickingAttached(this._flicking);\n const strategy = this._strategy;\n\n strategy.updateRenderingPanels(flicking);\n strategy.renderPanels(flicking);\n\n this._resetPanelElementOrder();\n this._afterRender();\n }\n\n protected _collectPanels() {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n this._removeAllTextNodes();\n this._panels = this._strategy.collectPanels(flicking, camera.children);\n }\n\n protected _createPanel(el: HTMLElement, options: Omit<PanelOptions, \"elementProvider\">): Panel {\n return this._strategy.createPanel(el, options);\n }\n\n /**\n * @internal\n */\n private _resetPanelElementOrder() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraEl = flicking.camera.element;\n\n // We're using reversed panels here as last panel should be the last element of camera element\n let reversedElements: HTMLElement[] = [];\n\n if (flicking.useCSSOrder) {\n // useCSSOrder를 사용하는 경우 DOM은 변화가 없지만 대신 css `order`값을 주입\n reversedElements = this.getRenderedPanels()\n .map(panel => panel.element)\n .reverse();\n } else {\n reversedElements = this._strategy.getRenderingElementsByOrder(flicking).reverse();\n }\n\n reversedElements.forEach((el, idx) => {\n const nextEl = reversedElements[idx - 1] ? reversedElements[idx - 1] : null;\n\n if (el.nextElementSibling !== nextEl) {\n cameraEl.insertBefore(el, nextEl);\n }\n });\n }\n\n /**\n * @internal\n */\n private _removeAllTextNodes() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n // Remove all text nodes in the camera element\n toArray(cameraElement.childNodes).forEach(node => {\n if (node.nodeType === Node.TEXT_NODE) {\n cameraElement.removeChild(node);\n }\n });\n }\n}\n\nexport default VanillaRenderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ALIGN, DIRECTION } from \"../../constants/values\";\nimport Flicking from \"../../Flicking\";\nimport { LiteralUnion, ValueOf } from \"../../types/internal\";\nimport { SetSizeParams } from \"../../types/params\";\nimport { getElementSize, getProgress, getStyle, parseAlign, setSize } from \"../../utils\";\n\nimport ElementProvider from \"./provider/ElementProvider\";\n\nexport interface PanelOptions {\n /** An initial index of the panel */\n index: number;\n /** An initial {@link Flicking.align | align} value of the panel */\n align: LiteralUnion<ValueOf<typeof ALIGN>> | number;\n /** The Flicking instance that this panel belongs to */\n flicking: Flicking;\n /** A provider instance that returns the actual html element */\n elementProvider: ElementProvider;\n}\n\nexport interface PanelMarginInfo {\n /** CSS `margin-left` when the {@link Flicking.horizontal | horizontal} is `true`, and `margin-top` else */\n prev: number;\n /** CSS `margin-right` when the {@link Flicking.horizontal | horizontal} is `true`, and `margin-bottom` else */\n next: number;\n}\n\nexport interface PanelBoundingBoxRange {\n /** Bounding box's left({@link Flicking.horizontal | horizontal}: true) / top({@link Flicking.horizontal | horizontal}: false) */\n min: number;\n /** Bounding box's right({@link Flicking.horizontal | horizontal}: true) / bottom({@link Flicking.horizontal | horizontal}: false) */\n max: number;\n}\n\n/**\n * A slide data component that holds information of a single HTMLElement\n * @public\n */\nclass Panel {\n // Internal States\n protected _flicking: Flicking;\n protected _elProvider: ElementProvider;\n protected _index: number;\n protected _pos: number;\n protected _size: number;\n protected _height: number;\n protected _margin: PanelMarginInfo;\n protected _alignPos: number; // Actual align pos\n protected _rendered: boolean;\n protected _removed: boolean;\n protected _loading: boolean;\n protected _toggleDirection: ValueOf<typeof DIRECTION>;\n protected _toggled: boolean;\n protected _togglePosition: number;\n\n // Options\n protected _align: PanelOptions[\"align\"];\n\n // Internal States Getter\n /**\n * `HTMLElement` that panel's referencing\n * @readonly\n */\n public get element(): HTMLElement {\n return this._elProvider.element;\n }\n /**\n * @internal\n * @readonly\n */\n public get elementProvider(): ElementProvider {\n return this._elProvider;\n }\n /**\n * Index of the panel\n * @readonly\n */\n public get index(): number {\n return this._index;\n }\n /**\n * Position of the panel, including {@link Panel.alignPosition | alignPosition}\n * @readonly\n */\n public get position(): number {\n return this._pos + this._alignPos;\n }\n /**\n * Cached size of the panel element\n * @remarks\n * This is equal to {@link Panel.element | element}'s `offsetWidth` if {@link Flicking.horizontal | horizontal} is `true`, and `offsetHeight` else\n * @readonly\n */\n public get size(): number {\n return this._size;\n }\n /**\n * Panel's size including CSS `margin`\n * @remarks\n * This value includes {@link Panel.element | element}'s margin left/right if {@link Flicking.horizontal | horizontal} is `true`, and margin top/bottom else\n * @readonly\n */\n public get sizeIncludingMargin(): number {\n return this._size + this._margin.prev + this._margin.next;\n }\n /**\n * Height of the panel element\n * @readonly\n */\n public get height(): number {\n return this._height;\n }\n /**\n * Cached CSS `margin` value of the panel element\n * @readonly\n */\n public get margin(): PanelMarginInfo {\n return this._margin;\n }\n /**\n * Align position inside the panel where {@link Camera}'s {@link Camera.alignPosition | alignPosition} inside viewport should be located at\n * @readonly\n */\n public get alignPosition(): number {\n return this._alignPos;\n }\n /**\n * A value indicating whether the panel's {@link Flicking.remove | remove}d\n * @readonly\n */\n public get removed(): boolean {\n return this._removed;\n }\n /**\n * A value indicating whether the panel's element is being rendered on the screen\n * @readonly\n */\n public get rendered(): boolean {\n return this._rendered;\n }\n /**\n * A value indicating whether the panel's image/video is not loaded and waiting for resize\n * @readonly\n */\n public get loading(): boolean {\n return this._loading;\n }\n /**\n * Panel element's range of the bounding box\n * @readonly\n */\n public get range(): PanelBoundingBoxRange {\n return { min: this._pos, max: this._pos + this._size };\n }\n /**\n * A value indicating whether the panel's position is toggled by circular behavior\n * @readonly\n */\n public get toggled(): boolean {\n return this._toggled;\n }\n /**\n * A direction where the panel's position is toggled\n * @readonly\n */\n public get toggleDirection(): ValueOf<typeof DIRECTION> {\n return this._toggleDirection;\n }\n /**\n * Actual position offset determined by {@link Panel.order}\n * @readonly\n */\n public get offset(): number {\n const toggleDirection = this._toggleDirection;\n const cameraRangeDiff = this._flicking.camera.rangeDiff;\n\n return toggleDirection === DIRECTION.NONE || !this._toggled\n ? 0\n : toggleDirection === DIRECTION.PREV\n ? -cameraRangeDiff\n : cameraRangeDiff;\n }\n\n /**\n * Progress of movement between previous or next panel relative to current panel\n * @readonly\n */\n public get progress(): number {\n const flicking = this._flicking;\n\n return this.index - flicking.camera.progress;\n }\n\n /**\n * Progress of movement between points that panel is completely invisible outside of viewport(prev direction: -1, selected point: 0, next direction: 1)\n * @readonly\n */\n public get outsetProgress(): number {\n const position = this.position + this.offset;\n const alignPosition = this._alignPos;\n const camera = this._flicking.camera;\n const camPos = camera.position;\n\n if (camPos === position) {\n return 0;\n }\n\n if (camPos < position) {\n const disappearPosNext = position + (camera.size - camera.alignPosition) + alignPosition;\n\n return -getProgress(camPos, position, disappearPosNext);\n } else {\n const disappearPosPrev = position - (camera.alignPosition + this._size - alignPosition);\n\n return 1 - getProgress(camPos, disappearPosPrev, position);\n }\n }\n\n /**\n * Percentage of area where panel is visible in the viewport\n * @readonly\n */\n public get visibleRatio(): number {\n const range = this.range;\n const size = this._size;\n const offset = this.offset;\n const visibleRange = this._flicking.camera.visibleRange;\n\n const checkingRange = {\n min: range.min + offset,\n max: range.max + offset\n };\n\n if (checkingRange.max <= visibleRange.min || checkingRange.min >= visibleRange.max) {\n return 0;\n }\n\n let visibleSize = size;\n\n if (visibleRange.min > checkingRange.min) {\n visibleSize -= visibleRange.min - checkingRange.min;\n }\n if (visibleRange.max < checkingRange.max) {\n visibleSize -= checkingRange.max - visibleRange.max;\n }\n\n return visibleSize / size;\n }\n\n public set loading(val: boolean) {\n this._loading = val;\n }\n\n // Options Getter\n /**\n * A value indicating where the {@link Panel.alignPosition | alignPosition} should be located at inside the panel element\n */\n public get align(): PanelOptions[\"align\"] {\n return this._align;\n }\n\n // Options Setter\n public set align(val: PanelOptions[\"align\"]) {\n this._align = val;\n this._updateAlignPos();\n }\n\n /**\n * Creates a new Panel instance\n * @param panelOptions - Options for creating the panel\n */\n public constructor(panelOptions: PanelOptions) {\n const { index, align, flicking, elementProvider } = panelOptions;\n\n this._index = index;\n this._flicking = flicking;\n this._elProvider = elementProvider;\n\n this._align = align;\n\n this._removed = false;\n this._rendered = true;\n this._loading = false;\n this._resetInternalStates();\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks this panel to be rendered on the camera element.\n */\n public markForShow() {\n this._rendered = true;\n this._elProvider.show(this._flicking);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks this panel to be hidden from the camera element.\n */\n public markForHide() {\n this._rendered = false;\n this._elProvider.hide(this._flicking);\n }\n\n /**\n * Update size of the panel\n * @remarks\n * This method recalculates the panel's size, margin, and position based on the current DOM state.\n * @param cached - Predefined cached size of the panel\n * @returns The current instance for method chaining\n */\n public resize(cached?: { size: number; height?: number; margin: { prev: number; next: number } }): this {\n const el = this.element;\n const flicking = this._flicking;\n const { horizontal, useFractionalSize } = flicking;\n\n if (!el) {\n return this;\n }\n\n if (cached) {\n this._size = cached.size;\n this._margin = { ...cached.margin };\n this._height =\n cached.height ??\n getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: true,\n style: getStyle(el)\n });\n } else {\n const elStyle = getStyle(el);\n\n this._size = getElementSize({\n el,\n horizontal,\n useFractionalSize,\n useOffset: true,\n style: elStyle\n });\n\n this._margin = horizontal\n ? {\n prev: parseFloat(elStyle.marginLeft || \"0\"),\n next: parseFloat(elStyle.marginRight || \"0\")\n }\n : {\n prev: parseFloat(elStyle.marginTop || \"0\"),\n next: parseFloat(elStyle.marginBottom || \"0\")\n };\n\n this._height = horizontal\n ? getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: true,\n style: elStyle\n })\n : this._size;\n }\n\n this.updatePosition();\n this._updateAlignPos();\n\n return this;\n }\n\n /**\n * Change panel's size\n * @remarks\n * This will change the actual size of the panel element by changing its CSS width/height property.\n * @param size - {@link SetSizeParams}\n * @returns The current instance for method chaining\n */\n public setSize(size: SetSizeParams): this {\n setSize(this.element, size);\n\n return this;\n }\n\n /**\n * Check whether the given element is inside of this panel's {@link Panel.element | element}\n * @remarks\n * This is useful for determining which panel contains a clicked element.\n * @param element - The HTMLElement to check\n * @returns A Boolean value indicating the element is inside of this panel {@link Panel.element | element}\n */\n public contains(element: HTMLElement): boolean {\n return !!this.element?.contains(element);\n }\n\n /**\n * Reset internal state and set {@link Panel.removed | removed} to `true`\n * @remarks\n * After calling this method, the panel should no longer be used.\n */\n public destroy(): void {\n this._resetInternalStates();\n this._removed = true;\n }\n\n /**\n * Check whether the given position is inside of this panel's {@link Panel.range | range}\n * @param pos - A position to check\n * @param includeMargin - Include {@link Panel.margin | margin} to the range\n * @returns A Boolean value indicating whether the given position is included in the panel range\n */\n public includePosition(pos: number, includeMargin: boolean = false): boolean {\n return this.includeRange(pos, pos, includeMargin);\n }\n\n /**\n * Check whether the given range is fully included in this panel's area (inclusive)\n * @param min - Minimum value of the range to check\n * @param max - Maximum value of the range to check\n * @param includeMargin - Include {@link Panel.margin | margin} to the range\n * @returns A Boolean value indicating whether the given range is fully included in the panel range\n */\n public includeRange(min: number, max: number, includeMargin: boolean = false): boolean {\n const margin = this._margin;\n const panelRange = this.range;\n\n if (includeMargin) {\n panelRange.min -= margin.prev;\n panelRange.max += margin.next;\n }\n\n return max >= panelRange.min && min <= panelRange.max;\n }\n\n /**\n * Check whether the panel is visble in the given range (exclusive)\n * @param min - Minimum value of the range to check\n * @param max - Maximum value of the range to check\n * @returns A Boolean value indicating whether the panel is visible\n */\n public isVisibleOnRange(min: number, max: number): boolean {\n const panelRange = this.range;\n\n return max > panelRange.min && min < panelRange.max;\n }\n\n /**\n * Move {@link Camera} to this panel\n * @remarks\n * This is equivalent to calling `Flicking.moveTo(panel.index, duration)`.\n * @param duration - Duration of the animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the panel\n */\n public focus(duration?: number): Promise<void> {\n return this._flicking.moveTo(this._index, duration);\n }\n\n /**\n * Get previous(`index - 1`) panel.\n * @remarks\n * When the previous panel does not exist, this will return `null` instead\n * If the {@link Flicking.circularEnabled | circular} is enabled, this will return the last panel if called from the first panel\n * @returns The previous panel\n */\n public prev(): Panel | null {\n const index = this._index;\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panelCount = renderer.panelCount;\n\n if (panelCount === 1) return null;\n\n return flicking.circularEnabled\n ? renderer.getPanel(index === 0 ? panelCount - 1 : index - 1)\n : renderer.getPanel(index - 1);\n }\n\n /**\n * Get next(`index + 1`) panel.\n * @remarks\n * When the next panel does not exist, this will return `null` instead\n * If the {@link Flicking.circularEnabled | circular} is enabled, this will return the first panel if called from the last panel\n * @returns The next panel\n */\n public next(): Panel | null {\n const index = this._index;\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panelCount = renderer.panelCount;\n\n if (panelCount === 1) return null;\n\n return flicking.circularEnabled\n ? renderer.getPanel(index === panelCount - 1 ? 0 : index + 1)\n : renderer.getPanel(index + 1);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Increases the panel's index by the given value. Called when panels are inserted before this panel.\n */\n public increaseIndex(val: number): this {\n this._index += Math.max(val, 0);\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Decreases the panel's index by the given value. Called when panels are removed before this panel.\n */\n public decreaseIndex(val: number): this {\n this._index -= Math.max(val, 0);\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Recalculates the panel's position based on the previous panel's position and margins.\n */\n public updatePosition(): this {\n const prevPanel = this._flicking.renderer.panels[this._index - 1];\n\n this._pos = prevPanel ? prevPanel.range.max + prevPanel.margin.next + this._margin.prev : this._margin.prev;\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Toggles the panel's position for circular mode. Returns true if the panel was toggled.\n */\n public toggle(prevPos: number, newPos: number): boolean {\n const toggleDirection = this._toggleDirection;\n const togglePosition = this._togglePosition;\n\n if (toggleDirection === DIRECTION.NONE || newPos === prevPos) return false;\n\n const prevToggled = this._toggled;\n\n if (newPos > prevPos) {\n if (togglePosition >= prevPos && togglePosition <= newPos) {\n this._toggled = toggleDirection === DIRECTION.NEXT;\n }\n } else {\n if (togglePosition <= prevPos && togglePosition >= newPos) {\n this._toggled = toggleDirection !== DIRECTION.NEXT;\n }\n }\n\n return prevToggled !== this._toggled;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates the toggle direction for circular mode based on the panel's visibility at the camera range edges.\n */\n public updateCircularToggleDirection(): this {\n const flicking = this._flicking;\n\n if (!flicking.circularEnabled) {\n this._toggleDirection = DIRECTION.NONE;\n this._togglePosition = 0;\n this._toggled = false;\n return this;\n }\n\n const camera = flicking.camera;\n const camRange = camera.range;\n const camAlignPosition = camera.alignPosition;\n const camVisibleRange = camera.visibleRange;\n const camVisibleSize = camVisibleRange.max - camVisibleRange.min;\n\n const minimumVisible = camRange.min - camAlignPosition;\n const maximumVisible = camRange.max - camAlignPosition + camVisibleSize;\n\n const shouldBeVisibleAtMin = this.includeRange(maximumVisible - camVisibleSize, maximumVisible, false);\n const shouldBeVisibleAtMax = this.includeRange(minimumVisible, minimumVisible + camVisibleSize, false);\n\n this._toggled = false;\n if (shouldBeVisibleAtMin) {\n this._toggleDirection = DIRECTION.PREV;\n this._togglePosition = this.range.max + camRange.min - camRange.max + camAlignPosition;\n this.toggle(Infinity, camera.position);\n } else if (shouldBeVisibleAtMax) {\n this._toggleDirection = DIRECTION.NEXT;\n this._togglePosition = this.range.min + camRange.max - camVisibleSize + camAlignPosition;\n this.toggle(-Infinity, camera.position);\n } else {\n this._toggleDirection = DIRECTION.NONE;\n this._togglePosition = 0;\n }\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Recalculates the align position based on the align option and panel size.\n */\n private _updateAlignPos() {\n this._alignPos = parseAlign(this._align, this._size);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal state values to their defaults.\n */\n private _resetInternalStates() {\n this._size = 0;\n this._pos = 0;\n this._margin = { prev: 0, next: 0 };\n this._height = 0;\n this._alignPos = 0;\n this._toggled = false;\n this._togglePosition = 0;\n this._toggleDirection = DIRECTION.NONE;\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 { DIRECTION } from \"../../constants/values\";\nimport Panel, { PanelOptions } from \"../../core/panel/Panel\";\nimport ElementProvider from \"../../core/panel/provider/ElementProvider\";\nimport Flicking from \"../../Flicking\";\nimport { parsePanelAlign } from \"../../utils\";\n\nimport RenderingStrategy from \"./RenderingStrategy\";\n\nexport interface NormalRenderingStrategyOptions {\n providerCtor: new (...args: any) => ElementProvider;\n}\n\nclass NormalRenderingStrategy implements RenderingStrategy {\n private _providerCtor: NormalRenderingStrategyOptions[\"providerCtor\"];\n\n public constructor(options: NormalRenderingStrategyOptions) {\n const { providerCtor } = options;\n this._providerCtor = providerCtor;\n }\n\n public renderPanels() {\n // DO_NOTHING\n }\n\n public getRenderingIndexesByOrder(flicking: Flicking) {\n const renderedPanels = flicking.renderer.panels.filter(panel => panel.rendered);\n const toggledPrev = renderedPanels.filter(panel => panel.toggled && panel.toggleDirection === DIRECTION.PREV);\n const toggledNext = renderedPanels.filter(panel => panel.toggled && panel.toggleDirection === DIRECTION.NEXT);\n const notToggled = renderedPanels.filter(panel => !panel.toggled);\n\n return [...toggledPrev, ...notToggled, ...toggledNext].map(panel => panel.index);\n }\n\n public getRenderingElementsByOrder(flicking: Flicking) {\n const panels = flicking.panels;\n\n return this.getRenderingIndexesByOrder(flicking).map(index => panels[index].element);\n }\n\n public updateRenderingPanels(flicking: Flicking) {\n if (flicking.renderOnlyVisible) {\n this._showOnlyVisiblePanels(flicking);\n } else {\n flicking.panels.forEach(panel => panel.markForShow());\n }\n }\n\n public collectPanels(flicking: Flicking, elements: any[]) {\n const align = parsePanelAlign(flicking.renderer.align);\n\n return elements.map(\n (el, index) =>\n new Panel({\n index,\n elementProvider: new this._providerCtor(el),\n align,\n flicking\n })\n );\n }\n\n public createPanel(element: any, options: Omit<PanelOptions, \"elementProvider\">) {\n return new Panel({\n ...options,\n elementProvider: new this._providerCtor(element)\n });\n }\n\n public updatePanelSizes(\n flicking: Flicking,\n size: Partial<{\n width: number | string;\n height: number | string;\n }>\n ) {\n flicking.panels.forEach(panel => panel.setSize(size));\n }\n\n /**\n * @internal\n */\n private _showOnlyVisiblePanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else if (!flicking.holding) {\n // During the input sequence,\n // Do not remove panel elements as it won't trigger touchend event.\n panel.markForHide();\n }\n });\n\n camera.updateOffset();\n }\n}\n\nexport default NormalRenderingStrategy;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { DIRECTION } from \"../../constants/values\";\nimport { circulateIndex } from \"../../utils\";\n\nimport Panel, { PanelOptions } from \"./Panel\";\nimport VirtualElementProvider from \"./provider/VirtualElementProvider\";\n\n/**\n * Options for creating a {@link VirtualPanel}\n */\nexport interface VirtualPanelOptions extends PanelOptions {\n /** A provider instance that returns the actual html element */\n elementProvider: VirtualElementProvider;\n}\n\n/**\n * A slide data component that holds information of a single HTMLElement\n */\nclass VirtualPanel extends Panel {\n protected _elProvider: VirtualElementProvider;\n protected _cachedInnerHTML: string | null;\n\n /**\n * `HTMLElement` that panel's referencing\n * @readonly\n */\n public get element(): HTMLElement {\n return this._elProvider.element;\n }\n\n /**\n * Cached innerHTML by the previous render function\n * @readonly\n */\n public get cachedInnerHTML(): string | null {\n return this._cachedInnerHTML;\n }\n\n /**\n * A number for indexing which element it will be rendered on\n * @readonly\n */\n public get elementIndex(): number {\n const flicking = this._flicking;\n const virtualElCount = flicking.panelsPerView + 1;\n const panelCount = flicking.panelCount;\n let index = this._index;\n\n if (this._toggled) {\n // To prevent element duplication\n index = this._toggleDirection === DIRECTION.NEXT ? index + panelCount : index - panelCount;\n }\n\n return circulateIndex(index, virtualElCount);\n }\n\n /**\n * @param options - {@link VirtualPanelOptions}\n */\n public constructor(options: VirtualPanelOptions) {\n super(options);\n\n options.elementProvider.init(this);\n this._elProvider = options.elementProvider;\n this._cachedInnerHTML = null;\n }\n\n public cacheRenderResult(result: string) {\n this._cachedInnerHTML = result;\n }\n\n public uncacheRenderResult() {\n this._cachedInnerHTML = null;\n }\n\n public render() {\n const flicking = this._flicking;\n const { renderPanel, cache } = flicking.virtual;\n\n const element = this._elProvider.element;\n const newInnerHTML = this._cachedInnerHTML || renderPanel(this, this._index);\n\n if (newInnerHTML === element.innerHTML) return;\n\n element.innerHTML = newInnerHTML;\n\n if (cache) {\n this.cacheRenderResult(newInnerHTML);\n }\n }\n\n public increaseIndex(val: number) {\n this.uncacheRenderResult();\n return super.increaseIndex(val);\n }\n\n public decreaseIndex(val: number) {\n this.uncacheRenderResult();\n return super.decreaseIndex(val);\n }\n}\n\nexport default VirtualPanel;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { PanelOptions } from \"../../core/panel/Panel\";\nimport VirtualElementProvider from \"../../core/panel/provider/VirtualElementProvider\";\nimport VirtualPanel from \"../../core/panel/VirtualPanel\";\nimport Flicking from \"../../Flicking\";\nimport { parsePanelAlign, range, setSize } from \"../../utils\";\n\nimport RenderingStrategy from \"./RenderingStrategy\";\n\nclass VirtualRenderingStrategy implements RenderingStrategy {\n public renderPanels(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const visiblePanels = flicking.visiblePanels as VirtualPanel[];\n const invisibleIndexes = range(flicking.panelsPerView + 1);\n\n visiblePanels.forEach(panel => {\n const elementIndex = panel.elementIndex;\n\n panel.render();\n\n virtualManager.show(elementIndex);\n invisibleIndexes[elementIndex] = -1;\n });\n\n invisibleIndexes\n .filter(val => val >= 0)\n .forEach(idx => {\n virtualManager.hide(idx);\n });\n }\n\n public getRenderingIndexesByOrder(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const visiblePanels = [...flicking.visiblePanels]\n .filter(panel => panel.rendered)\n .sort((panel1, panel2) => {\n return panel1.position + panel1.offset - (panel2.position + panel2.offset);\n }) as VirtualPanel[];\n\n if (visiblePanels.length <= 0) return virtualManager.elements.map((_, idx) => idx);\n\n const visibleIndexes = visiblePanels.map(panel => panel.elementIndex);\n const invisibleIndexes = virtualManager.elements\n .map((el, idx) => ({ ...el, idx }))\n .filter(el => !el.visible)\n .map(el => el.idx);\n\n return [...visibleIndexes, ...invisibleIndexes];\n }\n\n public getRenderingElementsByOrder(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const elements = virtualManager.elements;\n\n return this.getRenderingIndexesByOrder(flicking).map(index => elements[index].nativeElement);\n }\n\n public updateRenderingPanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else {\n panel.markForHide();\n }\n });\n\n camera.updateOffset();\n }\n\n public collectPanels(flicking: Flicking) {\n const align = parsePanelAlign(flicking.renderer.align);\n\n return range(flicking.virtual.initialPanelCount).map(\n index =>\n new VirtualPanel({\n index,\n elementProvider: new VirtualElementProvider(flicking),\n align,\n flicking\n })\n );\n }\n\n public createPanel(_el: any, options: PanelOptions) {\n return new VirtualPanel({\n ...options,\n elementProvider: new VirtualElementProvider(options.flicking)\n });\n }\n\n public updatePanelSizes(\n flicking: Flicking,\n size: Partial<{\n width: number | string;\n height: number | string;\n }>\n ) {\n flicking.virtual.elements.forEach(el => {\n setSize(el.nativeElement, size);\n });\n flicking.panels.forEach(panel => panel.setSize(size));\n }\n}\n\nexport default VirtualRenderingStrategy;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Component, { ComponentEvent } from \"@egjs/component\";\nimport { Camera } from \"./camera\";\nimport { ALIGN, CIRCULAR_FALLBACK, DIRECTION, MOVE_TYPE } from \"./constants/values\";\nimport {\n Control,\n FreeControl,\n FreeControlOptions,\n SnapControl,\n SnapControlOptions,\n StrictControl,\n StrictControlOptions\n} from \"./control\";\nimport AutoResizer from \"./core/AutoResizer\";\nimport { Panel } from \"./core/panel\";\nimport { VanillaElementProvider } from \"./core/panel/provider\";\nimport Viewport from \"./core/Viewport\";\nimport VirtualManager, { VirtualOptions } from \"./core/VirtualManager\";\nimport * as ERROR from \"./error/codes\";\nimport FlickingError from \"./error/FlickingError\";\nimport { EVENTS } from \"./event/names\";\nimport { FlickingEvents } from \"./event/types\";\nimport {\n ExternalRenderer,\n NormalRenderingStrategy,\n Renderer,\n RendererOptions,\n VanillaRenderer,\n VirtualRenderingStrategy\n} from \"./renderer\";\nimport { ElementLike, MoveTypeOptions, Plugin, Status } from \"./types/external\";\nimport { LiteralUnion, ValueOf } from \"./types/internal\";\nimport { findIndex, getElement, includes, parseElement } from \"./utils\";\n\n/**\n * Options for the Flicking component\n * @public\n */\nexport interface FlickingOptions {\n // UI / LAYOUT\n /**\n * Align position of the panels within viewport. You can set different values each for the panel and camera.\n * @remarks\n * Possible values include\n *\n * - literal strings (\"prev\", \"center\", \"next\")\n *\n * - percentage values (\"0%\", \"25%\")\n *\n * - pixel values (\"0px\", \"100px\")\n *\n * - arithmetic expressions (\"50% - 25px\")\n *\n * - numbers\n *\n * - an object with separate `panel` and `camera` alignment values\n *\n * @example\n * ```ts\n * const possibleOptions = [\n * // Literal strings\n * \"prev\", \"center\", \"next\",\n * // % values, applied to both panel & camera\n * \"0%\", \"25%\", \"42%\",\n * // px values, arithmetic calculation with (+/-) is also allowed.\n * \"0px\", \"100px\", \"50% - 25px\",\n * // numbers, same to number + px (\"0px\", \"100px\")\n * 0, 100, 1000,\n * // Setting a different value for panel & camera\n * { panel: \"10%\", camera: \"25%\" }\n * ];\n *\n * possibleOptions.forEach(align => {\n * new Flicking(\"#el\", { align });\n * });\n * ```\n * @accepts {@link ALIGN}\n * @defaultValue \"center\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/alignment | Demo: Alignment}\n */\n align: LiteralUnion<ValueOf<typeof ALIGN>> | number | { panel: number | string; camera: number | string };\n\n /**\n * Index of the panel to move when Flicking's {@link Flicking.init | init()} is called. A zero-based integer.\n * @defaultValue 0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/default-index | Demo: Default Index}\n */\n defaultIndex: number;\n\n /**\n * Direction of panel movement. `true` for horizontal, `false` for vertical.\n *\n * @remarks\n * In vanilla JS, you must manually add the `vertical` class to the viewport element when using vertical mode.\n * React and Vue wrappers add this class automatically.\n *\n * @example\n * ```ts\n * // Vanilla JS: add \"vertical\" class to the viewport element\n * // <div class=\"flicking-viewport vertical\">\n * // <div class=\"flicking-camera\">...</div>\n * // </div>\n * const flicking = new Flicking(\"#my-flicking\", {\n * horizontal: false\n * });\n * ```\n *\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/vertical | Demo: Vertical}\n */\n horizontal: boolean;\n\n /**\n * Enables circular (continuous loop) mode, which connects first/last panel for continuous scrolling.\n * @dependency Mutual Exclusive - {@link FlickingOptions.bound | bound}. When both are true, circular takes precedence and bound will be ignored.\n * @dependency Conditional - Total panel size must be ≥ viewport size. If not met, automatically falls back to {@link FlickingOptions.circularFallback | circularFallback} mode.\n * @dependency Related - {@link FlickingOptions.circularFallback | circularFallback} determines fallback behavior when circular cannot be enabled\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/circular | Demo: Circular}\n */\n circular: boolean;\n\n /**\n * Set panel control mode for the case when circular cannot be enabled.\n * @dependency Requires - Only takes effect when {@link FlickingOptions.circular | circular} is true but activation requirements are not met (total panel size < viewport size)\n *\n * @remarks\n * - \"linear\": The view's range is set from the top of the first panel to the top of the last panel.\n * - \"bound\": Prevents the view from going out of the first/last panel, hiding empty spaces.\n *\n * @accepts {@link CIRCULAR_FALLBACK}\n * @defaultValue \"linear\"\n *\n * @since 4.5.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/circular | Demo: Circular}\n */\n circularFallback: LiteralUnion<ValueOf<typeof CIRCULAR_FALLBACK>>;\n\n /**\n * Prevent the view (camera element) from going out of the first/last panel.\n * @dependency Mutual Exclusive - {@link FlickingOptions.circular | circular}. When circular is true, this option is ignored.\n * @dependency Related - Works with {@link FlickingOptions.bounce | bounce} for bounce effect at boundaries\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/bound | Demo: Bound}\n */\n bound: boolean;\n\n /**\n * Update height of the viewport element after movement same to the height of the panel below.\n * @dependency Conditional - Only works when {@link FlickingOptions.horizontal | horizontal} is true. When horizontal is false, this option has no effect.\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/adaptive | Demo: Adaptive}\n */\n adaptive: boolean;\n\n /**\n * A visible number of panels on viewport. Enabling this option will force the panel to resize.\n * @remarks\n * When set to -1, automatically calculates based on panel sizes.\n *\n * @dependency Related - Affects how {@link FlickingOptions.align | align} calculates panel positions\n * @dependency Requires - Required for {@link FlickingOptions.virtual | virtual} to work (must be > 0)\n * @dependency Related - Works with {@link FlickingOptions.noPanelStyleOverride | noPanelStyleOverride} to prevent style modifications\n *\n * @defaultValue -1\n *\n * @since 4.2.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/panels-per-view | Demo: Panels Per View}\n */\n panelsPerView: number;\n\n /**\n * When enabled, prevents modifying the panel's `width/height` styles when {@link Flicking.panelsPerView | panelsPerView} is enabled.\n * Enabling this option can improve performance if you are manually managing all panel sizes.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/panels-per-view | Demo: Panels Per View}\n */\n noPanelStyleOverride: boolean;\n\n /**\n * When enabled, automatically calls {@link Flicking.resize} when images/videos inside Flicking panels are loaded.\n * This is useful when Flicking contains content that changes size before and after loading.\n * @defaultValue false\n * @since 4.3.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-on-contents-ready | Demo: Resize On Contents Ready}\n */\n resizeOnContentsReady: boolean;\n\n /**\n * Enable nested Flicking mode to allow parent Flicking to move when reaching boundaries.\n * @remarks\n * When Flicking is nested inside another Flicking, enabling this option allows the parent\n * Flicking to move in the same direction after the nested Flicking reaches the first or last panel.\n *\n * This option is not required if the parent and nested Flicking have different horizontal options.\n *\n * @defaultValue false\n *\n * @since 4.7.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/nested | Demo: Nested}\n */\n nested: boolean;\n\n // EVENT\n /**\n * A threshold from the viewport edge to trigger the `needPanel` event.\n * @defaultValue 0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/infinite-scroll | Demo: Infinite Scroll}\n */\n needPanelThreshold: number;\n\n /**\n * When enabled, disables events before the `ready` event during initialization.\n * @defaultValue true\n * @since 4.2.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/auto-init | Demo: Auto Init}\n */\n preventEventsBeforeInit: boolean;\n\n // ANIMATION\n /**\n * Deceleration of panel movement animation with momentum applied by user interaction (input).\n * Higher values result in a shorter animation duration.\n * @defaultValue 0.0075\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/deceleration | Demo: Deceleration}\n */\n deceleration: number;\n\n /**\n * Default duration of the animation in milliseconds.\n * @defaultValue 500\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/duration | Demo: Duration}\n */\n duration: number;\n\n /**\n * An easing function applied to the panel movement animation.\n * @defaultValue \"easeOutCubic\" (x => 1 - Math.pow(1 - x, 3))\n * @see {@link http://easings.net/ | Easing Functions Cheat Sheet}\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/easing | Demo: Easing}\n */\n easing: (x: number) => number;\n\n // INPUT\n /**\n * Types of input devices to enable.\n * @defaultValue [\"touch\", \"mouse\"]\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/input-type | Demo: Input Type}\n */\n inputType: string[];\n\n /**\n * Movement style by user input. Determines the instance type of {@link Flicking.control | control}.\n * @remarks\n * - \"snap\": Uses {@link SnapControl}\n *\n * - \"freeScroll\": Uses {@link FreeControl} with {@link FreeControlOptions}\n *\n * - \"strict\": Uses {@link StrictControl} with {@link StrictControlOptions}\n * @accepts {@link MOVE_TYPE}\n * @example\n * ```ts\n * import Flicking, { MOVE_TYPE } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking({\n * moveType: MOVE_TYPE.SNAP\n * });\n * ```\n *\n * ```ts\n * const flicking = new Flicking({\n * // If you want more specific settings for the moveType\n * // [moveType, options for that moveType]\n * // In this case, it's [\"freeScroll\", FreeControlOptions]\n * moveType: [MOVE_TYPE.FREE_SCROLL, { stopAtEdge: true }]\n * });\n * ```\n * @defaultValue \"snap\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/movement-types | Demo: Movement Types}\n */\n moveType: ValueOf<typeof MOVE_TYPE> | MoveTypeOptions<ValueOf<typeof MOVE_TYPE>>;\n\n /**\n * Movement threshold to change panels (unit: px). Panels will only change after scrolling beyond this value.\n * @defaultValue 40\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/threshold | Demo: Threshold}\n */\n threshold: number;\n\n /**\n * Minimum distance to recognize user input (unit: px). Panels will only move after scrolling beyond this value.\n * @defaultValue 1\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/threshold | Demo: Threshold}\n */\n dragThreshold: number;\n\n /**\n * The minimum distance for animation to proceed.\n * @remarks\n * If the distance to be moved is less than `animationThreshold`, the movement proceeds immediately without animation (duration: 0).\n * @defaultValue 0.5\n * @since 4.15.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/animation-threshold | Demo: Animation Threshold}\n */\n animationThreshold: number;\n\n /**\n * Using `useCSSOrder` does not change the DOM order, but the `order` CSS property changes the order on the screen.\n * @remarks\n * When `circular` is used, the DOM order changes depending on the position.\n * When using `iframe`, you can prevent reloading when the DOM order changes.\n * In svelte, CSS order is always used.\n * @defaultValue false\n * @since 4.15.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/use-css-order | Demo: CSS Order}\n */\n useCSSOrder: boolean;\n\n /**\n * Allows stopping animations with user click/touch input.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/interruptable | Demo: Interruptable}\n */\n interruptable: boolean;\n\n /**\n * The size value of the bounce area.\n * @dependency Conditional - Only can be enabled when {@link FlickingOptions.circular | circular} is false\n * @dependency Related - Works with {@link FlickingOptions.bound | bound} to provide bounce effect at panel boundaries\n *\n * @remarks\n * You can set different bounce value for prev/next direction by using array.\n * Use `number` for px value, and `string` for px or % value relative to viewport size.\n * You have to call {@link Control.updateInput | updateInput()} after changing this value to take effect.\n *\n * @example\n * ```ts\n * const possibleOptions = [\n * \"0%\", \"25%\", \"42%\", // % values\n * \"0px\", \"100px\", \"50% - 25px\", // px values with arithmetic\n * 0, 100, 1000 // numbers (same as px)\n * ];\n * ```\n *\n * @defaultValue \"20%\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/bound | Demo: Bound}\n */\n bounce: number | string | [number | string, number | string];\n\n /**\n * Size of the area from the right edge in iOS Safari (in px) that enables swipe-back or swipe-forward.\n * @defaultValue 30\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/input-type | Demo: Input Type}\n */\n iOSEdgeSwipeThreshold: number;\n\n /**\n * Automatically cancels {@link https://developer.mozilla.org/ko/docs/Web/API/Element/click_event | click} events when the user drags the viewport by any amount.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/prevent-click | Demo: Prevent Click}\n */\n preventClickOnDrag: boolean;\n\n /**\n * Whether to use the {@link https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault | preventDefault} when the user starts dragging\n * @defaultValue false\n * @since 4.11.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/prevent-click | Demo: Prevent Click}\n */\n preventDefaultOnDrag: boolean;\n\n /**\n * Automatically call {@link Flicking.disableInput | disableInput()} during initialization.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/disable-input | Demo: Disable Input}\n */\n disableOnInit: boolean;\n\n /**\n * Change active panel index on mouse/touch hold while animating.\n * @remarks\n * `index` of the `willChange`/`willRestore` event will be used as new index.\n * @defaultValue false\n * @since 4.8.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/interruptable | Demo: Interruptable}\n */\n changeOnHold: boolean;\n\n // PERFORMANCE\n /**\n * When enabled, only renders visible panels. Can significantly improve performance with many panels.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/render-only-visible | Demo: Render Only Visible}\n */\n renderOnlyVisible: boolean;\n\n /**\n * When enabled, restricts the number of panel elements to `panelsPerView + 1` to reduce memory usage.\n * @dependency Requires - Must be used with {@link FlickingOptions.panelsPerView | panelsPerView}. When panelsPerView is -1 (auto), this option is ignored.\n *\n * @remarks\n * After Flicking initialization, this property can be used to add or remove the number of rendered panels.\n *\n * The option object contains:\n * - `renderPanel`: A rendering function for the panel element's innerHTML\n * - `initialPanelCount`: Initial panel count to render\n * - `cache` (optional, default: false): Whether to cache rendered panel's innerHTML\n * - `panelClass` (optional, default: \"flicking-panel\"): The class name for rendered panel elements\n *\n * @example\n * ```ts\n * import Flicking, { VirtualPanel } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking(\"#some_el\", {\n * panelsPerView: 3,\n * virtual: {\n * renderPanel: (panel: VirtualPanel, index: number) => `Panel ${index}`,\n * initialPanelCount: 100\n * }\n * });\n *\n * // Add 100 virtual panels (at the end)\n * flicking.virtual.append(100);\n *\n * // Remove 100 virtual panels from 0 to 100\n * flicking.virtual.remove(0, 100);\n * ```\n *\n * @defaultValue null\n *\n * @since 4.4.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/virtual-scroll | Demo: Virtual Scroll}\n */\n virtual: VirtualOptions | null;\n\n // OTHERS\n /**\n * Call {@link Flicking.init | init()} automatically when creating Flicking's instance.\n * @defaultValue true\n * @readonly\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/auto-init | Demo: Auto Init}\n */\n autoInit: boolean;\n\n /**\n * Whether to automatically call {@link Flicking.resize | resize()} when the viewport element (.flicking-viewport) size is changed.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/auto-resize | Demo: Auto Resize}\n */\n autoResize: boolean;\n\n /**\n * Whether to listen {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver | ResizeObserver}'s event instead of Window's {@link https://developer.mozilla.org/ko/docs/Web/API/Window/resize_event | resize} event when using the `autoResize` option\n * @defaultValue true\n * @since 4.4.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/auto-resize | Demo: Auto Resize}\n */\n useResizeObserver: boolean;\n\n /**\n * Delays size recalculation from `autoResize` by the given time in milliseconds.\n * @remarks\n * If the size is changed again while being delayed, it cancels the previous one and delays from the beginning again.\n * This can increase performance by preventing `resize` being called too often.\n * @defaultValue 0\n * @since 4.6.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-debounce | Demo: Resize Debounce}\n */\n resizeDebounce: number;\n\n /**\n * Whether to use ResizeObserver to observe the size of the panel element.\n * @dependency Conditional - Only available when {@link FlickingOptions.useResizeObserver | useResizeObserver} is enabled\n *\n * @remarks\n * This option guarantees that the resize event is triggered when the size of the panel element is changed.\n *\n * @since 4.13.1\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/observe-panel-resize | Demo: Observe Panel Resize}\n */\n observePanelResize: boolean;\n\n /**\n * The maximum time for size recalculation delay when using `resizeDebounce`, in milliseconds.\n * @remarks\n * This guarantees that size recalculation is performed at least once every (n)ms.\n * @defaultValue 100\n * @since 4.6.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-debounce | Demo: Resize Debounce}\n */\n maxResizeDebounce: number;\n\n /**\n * By enabling this, Flicking will calculate all internal size with CSS width computed with getComputedStyle.\n * @remarks\n * This can prevent 1px offset issue in some cases where panel size has the fractional part.\n * All sizes will have the original size before CSS {@link https://developer.mozilla.org/en-US/docs/Web/CSS/transform | transform} is applied on the element.\n * @defaultValue false\n * @since 4.9.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/fractional-size | Demo: Fractional Size}\n */\n useFractionalSize: boolean;\n\n /**\n * This is an option for the frameworks (React, Vue, Angular, ...).\n * Don't set it as it's automatically managed by Flicking.\n * @defaultValue null\n * @internal\n * @readonly\n */\n externalRenderer: ExternalRenderer | null;\n\n /**\n * This option works only when autoResize is set to true.\n * @internal\n * @defaultValue false\n */\n optimizeSizeUpdate: boolean;\n\n /**\n * @deprecated Use {@link FlickingOptions.externalRenderer | externalRenderer} instead\n */\n renderExternal: {\n renderer: new (options: RendererOptions) => ExternalRenderer;\n rendererOptions: RendererOptions;\n } | null;\n}\n\n/**\n * Parameters for {@link Flicking.getStatus}\n * @public\n */\nexport interface GetStatusParams {\n /**\n * Include current panel index\n * @defaultValue true\n */\n index?: boolean;\n /**\n * Include camera position. Only works when {@link FlickingOptions.moveType | moveType} is `freeScroll`\n * @defaultValue true\n */\n position?: boolean;\n /**\n * Include panel's `outerHTML`\n * @defaultValue false\n */\n includePanelHTML?: boolean;\n /**\n * Include only visible panels' HTML. Only available when `includePanelHTML` is `true`\n * @defaultValue false\n */\n visiblePanelsOnly?: boolean;\n}\n\nclass Flicking extends Component<FlickingEvents> {\n /**\n * Version info string\n * @example\n * ```ts\n * Flicking.VERSION; // ex) 4.0.0\n * ```\n */\n public static readonly VERSION: string = \"#__VERSION__#\";\n\n // Core components\n private _viewport: Viewport;\n private _autoResizer: AutoResizer;\n private _camera: Camera;\n private _control: Control;\n private _renderer: Renderer;\n private _virtualManager: VirtualManager;\n\n // Options\n private _align: FlickingOptions[\"align\"];\n private _defaultIndex: FlickingOptions[\"defaultIndex\"];\n private _horizontal: FlickingOptions[\"horizontal\"];\n private _circular: FlickingOptions[\"circular\"];\n private _circularFallback: FlickingOptions[\"circularFallback\"];\n private _bound: FlickingOptions[\"bound\"];\n private _adaptive: FlickingOptions[\"adaptive\"];\n private _panelsPerView: FlickingOptions[\"panelsPerView\"];\n private _noPanelStyleOverride: FlickingOptions[\"noPanelStyleOverride\"];\n private _resizeOnContentsReady: FlickingOptions[\"resizeOnContentsReady\"];\n private _virtual: FlickingOptions[\"virtual\"];\n private _nested: FlickingOptions[\"nested\"];\n\n private _needPanelThreshold: FlickingOptions[\"needPanelThreshold\"];\n private _preventEventsBeforeInit: FlickingOptions[\"preventEventsBeforeInit\"];\n\n private _deceleration: FlickingOptions[\"deceleration\"];\n private _duration: FlickingOptions[\"duration\"];\n private _easing: FlickingOptions[\"easing\"];\n\n private _inputType: FlickingOptions[\"inputType\"];\n private _moveType: FlickingOptions[\"moveType\"];\n private _threshold: FlickingOptions[\"threshold\"];\n private _dragThreshold: FlickingOptions[\"dragThreshold\"];\n private _animationThreshold: FlickingOptions[\"animationThreshold\"];\n private _useCSSOrder: FlickingOptions[\"useCSSOrder\"];\n private _interruptable: FlickingOptions[\"interruptable\"];\n private _bounce: FlickingOptions[\"bounce\"];\n private _iOSEdgeSwipeThreshold: FlickingOptions[\"iOSEdgeSwipeThreshold\"];\n private _preventClickOnDrag: FlickingOptions[\"preventClickOnDrag\"];\n private _preventDefaultOnDrag: FlickingOptions[\"preventDefaultOnDrag\"];\n private _disableOnInit: FlickingOptions[\"disableOnInit\"];\n private _changeOnHold: FlickingOptions[\"changeOnHold\"];\n\n private _renderOnlyVisible: FlickingOptions[\"renderOnlyVisible\"];\n\n private _autoInit: FlickingOptions[\"autoInit\"];\n private _autoResize: FlickingOptions[\"autoResize\"];\n private _useResizeObserver: FlickingOptions[\"useResizeObserver\"];\n private _resizeDebounce: FlickingOptions[\"resizeDebounce\"];\n private _observePanelResize: FlickingOptions[\"observePanelResize\"];\n private _maxResizeDebounce: FlickingOptions[\"maxResizeDebounce\"];\n private _useFractionalSize: FlickingOptions[\"useFractionalSize\"];\n private _externalRenderer: FlickingOptions[\"externalRenderer\"];\n private _renderExternal: FlickingOptions[\"renderExternal\"];\n private _optimizeSizeUpdate: FlickingOptions[\"optimizeSizeUpdate\"];\n\n // Internal State\n private _initialized: boolean;\n private _plugins: Plugin[];\n private _isResizing: boolean;\n private _scheduleResize = false;\n\n // Components\n /**\n * {@link Control} instance that manages user input and panel movement animations\n * @remarks\n * The concrete Control implementation is selected based on {@link FlickingOptions.moveType | moveType} option.\n * @privateRemarks\n * The control instance is created during construction by {@link Flicking._createControl}.\n * @readonly\n */\n public get control(): Control {\n return this._control;\n }\n\n /**\n * {@link Camera} instance that manages actual movement and positioning inside the viewport\n * @remarks\n * The concrete Camera implementation is selected based on {@link FlickingOptions.circular} and {@link FlickingOptions.bound} options.\n * @privateRemarks\n * The camera instance is created during construction by {@link Flicking._createCamera}.\n * @readonly\n */\n public get camera(): Camera {\n return this._camera;\n }\n\n /**\n * {@link Renderer} instance that manages panels and their elements\n * @remarks\n * The concrete Renderer implementation is selected based on {@link Flicking.externalRenderer} and {@link FlickingOptions.virtual} options.\n * @privateRemarks\n * The renderer instance is created during construction by {@link Flicking._createRenderer}.\n * @readonly\n */\n public get renderer(): Renderer {\n return this._renderer;\n }\n\n /**\n * {@link Viewport} instance that manages viewport size and element\n * @privateRemarks\n * The viewport instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get viewport(): Viewport {\n return this._viewport;\n }\n\n /**\n * {@link AutoResizer} instance that detects size changes and triggers resize when {@link FlickingOptions.autoResize | autoResize} option is enabled\n * @privateRemarks\n * The autoResizer instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get autoResizer(): AutoResizer {\n return this._autoResizer;\n }\n\n // Internal States\n /**\n * Whether Flicking's {@link Flicking.init} is called.\n * @remarks\n * This is `true` when {@link Flicking.init} is called, and is `false` after calling {@link Flicking.destroy}.\n * Use this to check if Flicking is ready before calling certain methods that require initialization.\n * @defaultValue false\n * @readonly\n * @example\n * ```ts\n * if (flicking.initialized) {\n * flicking.setStatus(status);\n * } else {\n * await flicking.init();\n * flicking.setStatus(status);\n * }\n * ```\n */\n public get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Whether the circular mode is actually enabled.\n * @remarks\n * The {@link FlickingOptions.circular} option may not be enabled when the sum of panel sizes is too small.\n * This property reflects the actual enabled state, which may differ from the {@link FlickingOptions.circular} option value.\n * @defaultValue false\n * @readonly\n */\n public get circularEnabled(): boolean {\n return this._camera.circularEnabled;\n }\n\n /**\n * Whether the virtual mode is actually enabled.\n * @remarks\n * The {@link FlickingOptions.virtual} option may not be enabled when {@link FlickingOptions.panelsPerView} is less than or equal to zero.\n * This property reflects the actual enabled state, which may differ from the {@link FlickingOptions.virtual} option value.\n * @defaultValue false\n * @readonly\n */\n public get virtualEnabled(): boolean {\n return this._panelsPerView > 0 && this._virtual != null;\n }\n\n /**\n * Index of the currently active panel.\n * @remarks\n * Returns -1 when there is no active panel. This is a shorthand for `Flicking.currentPanel.index`.\n * @readonly\n */\n public get index(): number {\n return this._control.activeIndex;\n }\n\n /**\n * The root viewport element (`.flicking-viewport`).\n * @remarks\n * This is the element passed to the Flicking constructor. It is a shorthand for `Flicking.viewport.element`.\n * @readonly\n */\n public get element(): HTMLElement {\n return this._viewport.element;\n }\n\n /**\n * The currently active panel.\n * @remarks\n * Returns `null` when there is no active panel. This is a shorthand for `Flicking.control.activePanel`.\n * @readonly\n */\n public get currentPanel(): Panel | null {\n return this._control.activePanel;\n }\n\n /**\n * Array of all panels.\n * @remarks\n * This is a shorthand for `Flicking.renderer.panels`.\n * @readonly\n */\n public get panels(): Panel[] {\n return this._renderer.panels;\n }\n\n /**\n * Total number of panels.\n * @remarks\n * This is a shorthand for `Flicking.renderer.panelCount`.\n * @readonly\n */\n public get panelCount(): number {\n return this._renderer.panelCount;\n }\n\n /**\n * Array of panels that are currently visible in the viewport.\n * @remarks\n * This is a shorthand for `Flicking.camera.visiblePanels`.\n * @readonly\n */\n public get visiblePanels(): Panel[] {\n return this._camera.visiblePanels;\n }\n\n /**\n * Whether Flicking is currently animating.\n * @remarks\n * This is a shorthand for `Flicking.control.animating`.\n * @readonly\n */\n public get animating(): boolean {\n return this._control.animating;\n }\n\n /**\n * Whether the user is currently clicking or touching the viewport.\n * @remarks\n * This is a shorthand for `Flicking.control.holding`.\n * @readonly\n */\n public get holding(): boolean {\n return this._control.holding;\n }\n\n /**\n * Array of currently activated plugins.\n * @remarks\n * Plugins are added via {@link Flicking.addPlugins} and removed via {@link Flicking.removePlugins}.\n * @readonly\n */\n public get activePlugins(): Plugin[] {\n return this._plugins;\n }\n\n // Options Getter\n // UI / LAYOUT\n /** Current value of the {@link FlickingOptions.align | align} option. */\n public get align(): FlickingOptions[\"align\"] {\n return this._align;\n }\n\n /** Current value of the {@link FlickingOptions.defaultIndex | defaultIndex} option. */\n public get defaultIndex(): FlickingOptions[\"defaultIndex\"] {\n return this._defaultIndex;\n }\n\n /** Current value of the {@link FlickingOptions.horizontal | horizontal} option. */\n public get horizontal(): FlickingOptions[\"horizontal\"] {\n return this._horizontal;\n }\n\n /** Current value of the {@link FlickingOptions.circular | circular} option. */\n public get circular(): FlickingOptions[\"circular\"] {\n return this._circular;\n }\n\n /**\n * Current value of the {@link FlickingOptions.circularFallback | circularFallback} option.\n * @since 4.5.0\n */\n public get circularFallback(): FlickingOptions[\"circularFallback\"] {\n return this._circularFallback;\n }\n\n /** Current value of the {@link FlickingOptions.bound | bound} option. */\n public get bound(): FlickingOptions[\"bound\"] {\n return this._bound;\n }\n\n /** Current value of the {@link FlickingOptions.adaptive | adaptive} option. */\n public get adaptive(): FlickingOptions[\"adaptive\"] {\n return this._adaptive;\n }\n\n /**\n * Current value of the {@link FlickingOptions.panelsPerView | panelsPerView} option.\n * @since 4.2.0\n */\n public get panelsPerView(): FlickingOptions[\"panelsPerView\"] {\n return this._panelsPerView;\n }\n\n /** Current value of the {@link FlickingOptions.noPanelStyleOverride | noPanelStyleOverride} option. */\n public get noPanelStyleOverride(): FlickingOptions[\"noPanelStyleOverride\"] {\n return this._noPanelStyleOverride;\n }\n\n /**\n * Current value of the {@link FlickingOptions.resizeOnContentsReady | resizeOnContentsReady} option.\n * @since 4.3.0\n */\n public get resizeOnContentsReady(): FlickingOptions[\"resizeOnContentsReady\"] {\n return this._resizeOnContentsReady;\n }\n\n /**\n * Current value of the {@link FlickingOptions.nested | nested} option.\n * @since 4.7.0\n */\n public get nested(): FlickingOptions[\"nested\"] {\n return this._nested;\n }\n\n // EVENTS\n /** Current value of the {@link FlickingOptions.needPanelThreshold | needPanelThreshold} option. */\n public get needPanelThreshold(): FlickingOptions[\"needPanelThreshold\"] {\n return this._needPanelThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.preventEventsBeforeInit | preventEventsBeforeInit} option.\n * @since 4.2.0\n */\n public get preventEventsBeforeInit(): FlickingOptions[\"preventEventsBeforeInit\"] {\n return this._preventEventsBeforeInit;\n }\n\n // ANIMATION\n /** Current value of the {@link FlickingOptions.deceleration | deceleration} option. */\n public get deceleration(): FlickingOptions[\"deceleration\"] {\n return this._deceleration;\n }\n\n /** Current value of the {@link FlickingOptions.easing | easing} option. */\n public get easing(): FlickingOptions[\"easing\"] {\n return this._easing;\n }\n\n /** Current value of the {@link FlickingOptions.duration | duration} option. */\n public get duration(): FlickingOptions[\"duration\"] {\n return this._duration;\n }\n\n // INPUT\n /** Current value of the {@link FlickingOptions.inputType | inputType} option. */\n public get inputType(): FlickingOptions[\"inputType\"] {\n return this._inputType;\n }\n\n /** Current value of the {@link FlickingOptions.moveType | moveType} option. */\n public get moveType(): FlickingOptions[\"moveType\"] {\n return this._moveType;\n }\n\n /** Current value of the {@link FlickingOptions.threshold | threshold} option. */\n public get threshold(): FlickingOptions[\"threshold\"] {\n return this._threshold;\n }\n\n /** Current value of the {@link FlickingOptions.dragThreshold | dragThreshold} option. */\n public get dragThreshold(): FlickingOptions[\"dragThreshold\"] {\n return this._dragThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.animationThreshold | animationThreshold} option.\n * @since 4.15.0\n */\n public get animationThreshold() {\n return this._animationThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useCSSOrder | useCSSOrder} option.\n * @since 4.15.0\n */\n public get useCSSOrder() {\n return this._useCSSOrder;\n }\n\n /** Current value of the {@link FlickingOptions.interruptable | interruptable} option. */\n public get interruptable(): FlickingOptions[\"interruptable\"] {\n return this._interruptable;\n }\n\n /** Current value of the {@link FlickingOptions.bounce | bounce} option. */\n public get bounce(): FlickingOptions[\"bounce\"] {\n return this._bounce;\n }\n\n /** Current value of the {@link FlickingOptions.iOSEdgeSwipeThreshold | iOSEdgeSwipeThreshold} option. */\n public get iOSEdgeSwipeThreshold(): FlickingOptions[\"iOSEdgeSwipeThreshold\"] {\n return this._iOSEdgeSwipeThreshold;\n }\n\n /** Current value of the {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} option. */\n public get preventClickOnDrag(): FlickingOptions[\"preventClickOnDrag\"] {\n return this._preventClickOnDrag;\n }\n\n /**\n * Current value of the {@link FlickingOptions.preventDefaultOnDrag | preventDefaultOnDrag} option.\n * @since 4.11.0\n */\n public get preventDefaultOnDrag(): FlickingOptions[\"preventDefaultOnDrag\"] {\n return this._preventDefaultOnDrag;\n }\n\n /** Current value of the {@link FlickingOptions.disableOnInit | disableOnInit} option. */\n public get disableOnInit(): FlickingOptions[\"disableOnInit\"] {\n return this._disableOnInit;\n }\n\n /**\n * Current value of the {@link FlickingOptions.changeOnHold | changeOnHold} option.\n * @since 4.8.0\n */\n public get changeOnHold(): FlickingOptions[\"changeOnHold\"] {\n return this._changeOnHold;\n }\n\n // PERFORMANCE\n /** Current value of the {@link FlickingOptions.renderOnlyVisible | renderOnlyVisible} option. */\n public get renderOnlyVisible(): FlickingOptions[\"renderOnlyVisible\"] {\n return this._renderOnlyVisible;\n }\n\n /**\n * {@link VirtualManager} instance that manages virtual panels\n * @privateRemarks\n * The virtualManager instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get virtual(): VirtualManager {\n return this._virtualManager;\n }\n\n // OTHERS\n /** Current value of the {@link FlickingOptions.autoInit | autoInit} option. */\n public get autoInit(): FlickingOptions[\"autoInit\"] {\n return this._autoInit;\n }\n\n /** Current value of the {@link FlickingOptions.autoResize | autoResize} option. */\n public get autoResize(): FlickingOptions[\"autoResize\"] {\n return this._autoResize;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useResizeObserver | useResizeObserver} option.\n * @since 4.4.0\n */\n public get useResizeObserver(): FlickingOptions[\"useResizeObserver\"] {\n return this._useResizeObserver;\n }\n\n /**\n * Current value of the {@link FlickingOptions.observePanelResize | observePanelResize} option.\n * @since 4.13.1\n */\n public get observePanelResize(): FlickingOptions[\"observePanelResize\"] {\n return this._observePanelResize;\n }\n\n /**\n * Current value of the {@link FlickingOptions.resizeDebounce | resizeDebounce} option.\n * @since 4.6.0\n */\n public get resizeDebounce(): FlickingOptions[\"resizeDebounce\"] {\n return this._resizeDebounce;\n }\n\n /**\n * Current value of the {@link FlickingOptions.maxResizeDebounce | maxResizeDebounce} option.\n * @since 4.6.0\n */\n public get maxResizeDebounce(): FlickingOptions[\"maxResizeDebounce\"] {\n return this._maxResizeDebounce;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useFractionalSize | useFractionalSize} option.\n * @since 4.9.0\n */\n public get useFractionalSize(): FlickingOptions[\"useFractionalSize\"] {\n return this._useFractionalSize;\n }\n\n /** Current value of the {@link FlickingOptions.externalRenderer | externalRenderer} option. */\n public get externalRenderer(): FlickingOptions[\"externalRenderer\"] {\n return this._externalRenderer;\n }\n\n /**\n * @deprecated Use {@link Flicking.externalRenderer | externalRenderer} instead.\n * Current value of the {@link FlickingOptions.renderExternal | renderExternal} option.\n */\n public get renderExternal(): FlickingOptions[\"renderExternal\"] {\n return this._renderExternal;\n }\n\n /** @internal */\n public get optimizeSizeUpdate(): FlickingOptions[\"optimizeSizeUpdate\"] {\n return this._optimizeSizeUpdate;\n }\n\n // Options Setter\n // UI / LAYOUT\n /**\n * Sets {@link FlickingOptions.align}.\n * @privateRemarks\n * Setting this value updates the renderer and camera alignment, and triggers a resize operation.\n */\n public set align(val: FlickingOptions[\"align\"]) {\n this._align = val;\n this._renderer.align = val;\n this._camera.align = val;\n void this.resize();\n }\n\n public set defaultIndex(val: FlickingOptions[\"defaultIndex\"]) {\n this._defaultIndex = val;\n }\n\n /**\n * Sets {@link FlickingOptions.horizontal}.\n * @privateRemarks\n * Setting this value updates the control direction and triggers a resize operation.\n */\n public set horizontal(val: FlickingOptions[\"horizontal\"]) {\n this._horizontal = val;\n this._control.controller.updateDirection();\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.circular}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel positions.\n */\n public set circular(val: FlickingOptions[\"circular\"]) {\n this._circular = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.bound}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel positions.\n */\n public set bound(val: FlickingOptions[\"bound\"]) {\n this._bound = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.adaptive}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel sizes.\n */\n public set adaptive(val: FlickingOptions[\"adaptive\"]) {\n this._adaptive = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.panelsPerView}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel sizes.\n */\n public set panelsPerView(val: FlickingOptions[\"panelsPerView\"]) {\n this._panelsPerView = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.noPanelStyleOverride}.\n * @privateRemarks\n * Setting this value triggers a resize operation to update panel styles.\n */\n public set noPanelStyleOverride(val: FlickingOptions[\"noPanelStyleOverride\"]) {\n this._noPanelStyleOverride = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.resizeOnContentsReady}.\n * @privateRemarks\n * When set to `true`, immediately checks all panels for content readiness.\n */\n public set resizeOnContentsReady(val: FlickingOptions[\"resizeOnContentsReady\"]) {\n this._resizeOnContentsReady = val;\n if (val) {\n this._renderer.checkPanelContentsReady(this._renderer.panels);\n }\n }\n\n /**\n * Sets {@link FlickingOptions.nested}.\n * @privateRemarks\n * Setting this value updates the control's axes options.\n */\n public set nested(val: FlickingOptions[\"nested\"]) {\n this._nested = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.nested = val;\n }\n }\n\n // EVENTS\n public set needPanelThreshold(val: FlickingOptions[\"needPanelThreshold\"]) {\n this._needPanelThreshold = val;\n }\n\n public set preventEventsBeforeInit(val: FlickingOptions[\"preventEventsBeforeInit\"]) {\n this._preventEventsBeforeInit = val;\n }\n\n // ANIMATION\n /**\n * Sets {@link FlickingOptions.deceleration}.\n * @privateRemarks\n * Setting this value updates the control's axes deceleration option.\n */\n public set deceleration(val: FlickingOptions[\"deceleration\"]) {\n this._deceleration = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.deceleration = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.easing}.\n * @privateRemarks\n * Setting this value updates the control's axes easing option.\n */\n public set easing(val: FlickingOptions[\"easing\"]) {\n this._easing = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.easing = val;\n }\n }\n\n public set duration(val: FlickingOptions[\"duration\"]) {\n this._duration = val;\n }\n\n // INPUT\n /**\n * Sets {@link FlickingOptions.inputType}.\n * @privateRemarks\n * Setting this value updates the control's pan input options.\n */\n public set inputType(val: FlickingOptions[\"inputType\"]) {\n this._inputType = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.inputType = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.moveType}.\n * @privateRemarks\n * Setting this value creates a new Control instance based on the moveType and preserves the current panel position and progress.\n */\n public set moveType(val: FlickingOptions[\"moveType\"]) {\n this._moveType = val;\n\n const prevControl = this._control;\n const newControl = this._createControl();\n const activePanel = prevControl.activePanel;\n newControl.copy(prevControl);\n\n const prevProgressInPanel = activePanel ? this._camera.getProgressInPanel(activePanel) : 0;\n\n this._control = newControl;\n this._control.updatePosition(prevProgressInPanel);\n this._control.updateInput();\n }\n\n public set threshold(val: FlickingOptions[\"threshold\"]) {\n this._threshold = val;\n }\n\n /**\n * Sets {@link FlickingOptions.dragThreshold}.\n * @privateRemarks\n * Setting this value updates the control's pan input threshold option.\n */\n public set dragThreshold(val: FlickingOptions[\"dragThreshold\"]) {\n this._dragThreshold = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.threshold = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.animationThreshold}.\n */\n public set animationThreshold(val: FlickingOptions[\"animationThreshold\"]) {\n this._animationThreshold = val;\n }\n\n /**\n * Sets {@link FlickingOptions.useCSSOrder}.\n */\n public set useCSSOrder(val: FlickingOptions[\"useCSSOrder\"]) {\n this._useCSSOrder = val;\n }\n\n /**\n * Sets {@link FlickingOptions.interruptable}.\n * @privateRemarks\n * Setting this value updates the control's axes interruptable option.\n */\n public set interruptable(val: FlickingOptions[\"interruptable\"]) {\n this._interruptable = val;\n\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.interruptable = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.bounce}.\n * @privateRemarks\n * Setting this value updates the control input configuration.\n */\n public set bounce(val: FlickingOptions[\"bounce\"]) {\n this._bounce = val;\n this._control.updateInput();\n }\n\n /**\n * Sets {@link FlickingOptions.iOSEdgeSwipeThreshold}.\n * @privateRemarks\n * Setting this value updates the control's pan input iOS edge swipe threshold option.\n */\n public set iOSEdgeSwipeThreshold(val: FlickingOptions[\"iOSEdgeSwipeThreshold\"]) {\n this._iOSEdgeSwipeThreshold = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.iOSEdgeSwipeThreshold = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.preventClickOnDrag}.\n * @privateRemarks\n * Setting this value adds or removes the prevent click handler from the control.\n */\n public set preventClickOnDrag(val: FlickingOptions[\"preventClickOnDrag\"]) {\n const prevVal = this._preventClickOnDrag;\n\n if (val === prevVal) return;\n\n const controller = this._control.controller;\n\n if (val) {\n controller.addPreventClickHandler();\n } else {\n controller.removePreventClickHandler();\n }\n\n this._preventClickOnDrag = val;\n }\n\n /**\n * Sets {@link FlickingOptions.preventDefaultOnDrag}.\n * @privateRemarks\n * Setting this value updates the control's pan input preventDefaultOnDrag option.\n */\n public set preventDefaultOnDrag(val: FlickingOptions[\"preventDefaultOnDrag\"]) {\n this._preventDefaultOnDrag = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.preventDefaultOnDrag = val;\n }\n }\n\n public set disableOnInit(val: FlickingOptions[\"disableOnInit\"]) {\n this._disableOnInit = val;\n }\n\n public set changeOnHold(val: FlickingOptions[\"changeOnHold\"]) {\n this._changeOnHold = val;\n }\n\n // PERFORMANCE\n /**\n * Sets {@link FlickingOptions.renderOnlyVisible}.\n * @privateRemarks\n * Setting this value triggers an immediate render operation.\n */\n public set renderOnlyVisible(val: FlickingOptions[\"renderOnlyVisible\"]) {\n this._renderOnlyVisible = val;\n void this._renderer.render();\n }\n\n // OTHERS\n /**\n * Sets {@link FlickingOptions.autoResize}.\n * @privateRemarks\n * Setting this value enables or disables the auto resizer if Flicking is already initialized.\n */\n public set autoResize(val: FlickingOptions[\"autoResize\"]) {\n this._autoResize = val;\n\n if (!this._initialized) {\n return;\n }\n\n if (val) {\n this._autoResizer.enable();\n } else {\n this._autoResizer.disable();\n }\n }\n\n /**\n * Sets {@link FlickingOptions.useResizeObserver}.\n * @privateRemarks\n * Setting this value re-enables the auto resizer if Flicking is initialized and autoResize is enabled.\n */\n public set useResizeObserver(val: FlickingOptions[\"useResizeObserver\"]) {\n this._useResizeObserver = val;\n\n if (this._initialized && this._autoResize) {\n this._autoResizer.enable();\n }\n }\n\n /**\n * Sets {@link FlickingOptions.observePanelResize}.\n * @privateRemarks\n * Setting this value starts or stops observing panel sizes if Flicking is initialized and autoResize is enabled.\n */\n public set observePanelResize(val: FlickingOptions[\"observePanelResize\"]) {\n this._observePanelResize = val;\n\n if (this._initialized && this._autoResize) {\n if (val) {\n this._autoResizer.observePanels();\n } else {\n this._autoResizer.unobservePanels();\n }\n }\n }\n\n public set optimizeSizeUpdate(val: FlickingOptions[\"optimizeSizeUpdate\"]) {\n this._optimizeSizeUpdate = val;\n }\n\n /** Creates a new Flicking instance\n * @param root - A root HTMLElement to initialize Flicking on it. When it's a typeof `string`, it should be a css selector string\n * @param options - A {@link FlickingOptions} object\n * @throws {@link InitializationErrors}\n * @example\n * ```ts\n * import Flicking from \"@egjs/flicking\";\n *\n * // Creating new instance of Flicking with HTMLElement\n * const flicking = new Flicking(document.querySelector(\".flicking-viewport\"), { circular: true });\n *\n * // Creating new instance of Flicking with CSS selector\n * const flicking2 = new Flicking(\".flicking-viewport\", { circular: true });\n * ```\n */\n public constructor(root: HTMLElement | string, options: Partial<FlickingOptions> = {}) {\n super();\n\n // Destructure options with default values\n const {\n align = ALIGN.CENTER,\n defaultIndex = 0,\n horizontal = true,\n circular = false,\n circularFallback = CIRCULAR_FALLBACK.LINEAR,\n bound = false,\n adaptive = false,\n panelsPerView = -1,\n noPanelStyleOverride = false,\n resizeOnContentsReady = false,\n nested = false,\n needPanelThreshold = 0,\n preventEventsBeforeInit = true,\n deceleration = 0.0075,\n duration = 500,\n easing = x => 1 - (1 - x) ** 3,\n inputType = [\"mouse\", \"touch\"],\n moveType = \"snap\",\n threshold = 40,\n dragThreshold = 1,\n interruptable = true,\n bounce = \"20%\",\n iOSEdgeSwipeThreshold = 30,\n preventClickOnDrag = true,\n preventDefaultOnDrag = false,\n disableOnInit = false,\n changeOnHold = false,\n renderOnlyVisible = false,\n virtual = null,\n autoInit = true,\n autoResize = true,\n useResizeObserver = true,\n resizeDebounce = 0,\n observePanelResize = false,\n maxResizeDebounce = 100,\n useFractionalSize = false,\n externalRenderer = null,\n renderExternal = null,\n optimizeSizeUpdate = false,\n animationThreshold = 0.5,\n useCSSOrder = false\n } = options;\n\n // Internal states\n this._initialized = false;\n this._plugins = [];\n this._isResizing = false;\n\n // Bind options\n this._align = align;\n this._defaultIndex = defaultIndex;\n this._horizontal = horizontal;\n this._circular = circular;\n this._circularFallback = circularFallback;\n this._bound = bound;\n this._adaptive = adaptive;\n this._panelsPerView = panelsPerView;\n this._noPanelStyleOverride = noPanelStyleOverride;\n this._resizeOnContentsReady = resizeOnContentsReady;\n this._nested = nested;\n this._virtual = virtual;\n this._needPanelThreshold = needPanelThreshold;\n this._preventEventsBeforeInit = preventEventsBeforeInit;\n this._deceleration = deceleration;\n this._duration = duration;\n this._easing = easing;\n this._inputType = inputType;\n this._moveType = moveType;\n this._threshold = threshold;\n this._dragThreshold = dragThreshold;\n this._interruptable = interruptable;\n this._bounce = bounce;\n this._iOSEdgeSwipeThreshold = iOSEdgeSwipeThreshold;\n this._preventClickOnDrag = preventClickOnDrag;\n this._preventDefaultOnDrag = preventDefaultOnDrag;\n this._disableOnInit = disableOnInit;\n this._changeOnHold = changeOnHold;\n this._renderOnlyVisible = renderOnlyVisible;\n this._autoInit = autoInit;\n this._autoResize = autoResize;\n this._useResizeObserver = useResizeObserver;\n this._resizeDebounce = resizeDebounce;\n this._maxResizeDebounce = maxResizeDebounce;\n this._observePanelResize = observePanelResize;\n this._useFractionalSize = useFractionalSize;\n this._externalRenderer = externalRenderer;\n this._renderExternal = renderExternal;\n this._optimizeSizeUpdate = optimizeSizeUpdate;\n this._animationThreshold = animationThreshold;\n this._useCSSOrder = useCSSOrder;\n\n // Create core components\n this._viewport = new Viewport(this, getElement(root));\n this._autoResizer = new AutoResizer(this);\n this._renderer = this._createRenderer();\n this._camera = this._createCamera();\n this._control = this._createControl();\n this._virtualManager = new VirtualManager(this, virtual);\n\n if (this._autoInit) {\n void this.init();\n }\n }\n\n /**\n * Initialize Flicking and move to the default index.\n * @remarks\n * This method is automatically called in the constructor when {@link FlickingOptions.autoInit | autoInit} is `true` (default).\n * If Flicking is already initialized, this method returns immediately without doing anything.\n * @fires {@link ReadyEvent}\n * @returns Promise that resolves when initialization is complete\n */\n public init(): Promise<void> {\n if (this._initialized) return Promise.resolve();\n\n const camera = this._camera;\n const renderer = this._renderer;\n const control = this._control;\n const virtualManager = this._virtualManager;\n const originalTrigger = this.trigger;\n const preventEventsBeforeInit = this._preventEventsBeforeInit;\n\n camera.init();\n virtualManager.init();\n renderer.init(this);\n control.init(this);\n\n if (preventEventsBeforeInit) {\n this.trigger = () => this;\n }\n\n this._initialResize();\n\n // Look at initial panel\n this._moveToInitialPanel();\n if (this._autoResize) {\n this._autoResizer.enable();\n }\n if (this._preventClickOnDrag) {\n control.controller.addPreventClickHandler();\n }\n if (this._disableOnInit) {\n this.disableInput();\n }\n renderer.checkPanelContentsReady(renderer.panels);\n this._initialized = true;\n\n return renderer.render().then(() => {\n // Done initializing & emit ready event\n this._plugins.forEach(plugin => plugin.init(this));\n\n if (preventEventsBeforeInit) {\n this.trigger = originalTrigger;\n }\n this.trigger(new ComponentEvent(EVENTS.READY));\n });\n }\n\n /**\n * Destroy Flicking and remove all event handlers.\n * @remarks\n * This method cleans up all resources including event handlers, components, and plugins.\n * After calling this method, {@link Flicking.initialized} will be `false` and the instance should not be used.\n */\n public destroy(): void {\n this.off();\n\n this._autoResizer.disable();\n this._control.destroy();\n this._camera.destroy();\n this._renderer.destroy();\n\n this._plugins.forEach(plugin => plugin.destroy());\n\n this._scheduleResize = false;\n this._initialized = false;\n this._isResizing = false;\n }\n\n /**\n * Move to the previous panel (current index - 1).\n * @param duration - Duration of the panel movement animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the previous panel\n */\n public prev(duration: number = this._duration): Promise<void> {\n return this.moveTo(this._control.activePanel?.prev()?.index ?? -1, duration, DIRECTION.PREV);\n }\n\n /**\n * Move to the next panel (current index + 1).\n * @param duration - Duration of the panel movement animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the next panel\n */\n public next(duration: number = this._duration): Promise<void> {\n return this.moveTo(this._control.activePanel?.next()?.index ?? this._renderer.panelCount, duration, DIRECTION.NEXT);\n }\n\n /**\n * Move to the panel with the given index.\n * @param index - The index of the panel to move to\n * @param duration - Duration of the animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @param direction - Direction to move (circular mode only). Defaults to {@link DIRECTION.NONE}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the target panel\n */\n public moveTo(\n index: number,\n duration: number = this._duration,\n direction: ValueOf<typeof DIRECTION> = DIRECTION.NONE\n ): Promise<void> {\n const renderer = this._renderer;\n const panelCount = renderer.panelCount;\n\n const panel = renderer.getPanel(index);\n\n if (!panel) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.INDEX_OUT_OF_RANGE(index, 0, panelCount - 1), ERROR.CODE.INDEX_OUT_OF_RANGE)\n );\n }\n\n if (this._control.animating) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.ANIMATION_ALREADY_PLAYING, ERROR.CODE.ANIMATION_ALREADY_PLAYING)\n );\n }\n\n if (this._control.holding) {\n this._control.controller.release();\n }\n\n return this._control.moveToPanel(panel, {\n duration,\n direction\n });\n }\n\n /**\n * Change the destination and duration of the animation currently playing.\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @param index - The index of the panel to move to\n * @param duration - Duration of the animation (unit: ms)\n * @param direction - Direction to move. Only available when {@link FlickingOptions.circular} is enabled\n * @since 4.10.0\n * @throws {@link AnimationUpdateErrors}\n */\n public updateAnimation(index: number, duration?: number, direction?: ValueOf<typeof DIRECTION>): void {\n if (!this._control.animating) {\n return;\n }\n\n const renderer = this._renderer;\n const panelCount = renderer.panelCount;\n\n const panel = renderer.getPanel(index);\n\n if (!panel) {\n throw new FlickingError(\n ERROR.MESSAGE.INDEX_OUT_OF_RANGE(index, 0, panelCount - 1),\n ERROR.CODE.INDEX_OUT_OF_RANGE\n );\n }\n\n this._control.updateAnimation(panel, duration, direction);\n }\n\n /**\n * Stop the animation currently playing.\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @since 4.10.0\n * @fires {@link MoveEndEvent}\n */\n public stopAnimation(): void {\n if (!this._control.animating) {\n return;\n }\n\n this._control.stopAnimation();\n }\n\n /**\n * Get the panel at the given index.\n * @param index - The index of the panel to get\n * @returns The panel at the given index, or `null` if it doesn't exist. This is a shorthand for `Flicking.renderer.getPanel(index)`.\n * @example\n * ```ts\n * const panel = flicking.getPanel(0);\n * // Which is a shorthand to...\n * const samePanel = flicking.panels[0];\n * ```\n */\n public getPanel(index: number): Panel | null {\n return this._renderer.getPanel(index);\n }\n\n /**\n * Enable user input (mouse/touch).\n * @remarks\n * This is a shorthand for `Flicking.control.enable`.\n * @returns The current instance for method chaining\n */\n public enableInput(): this {\n this._control.enable();\n return this;\n }\n\n /**\n * Disable user input (mouse/touch).\n * @remarks\n * This is a shorthand for `Flicking.control.disable`.\n * @returns The current instance for method chaining\n */\n public disableInput(): this {\n this._control.disable();\n return this;\n }\n\n /**\n * Get the current Flicking status.\n * @param options - {@link GetStatusParams}\n * @returns Status object that can be used with {@link Flicking.setStatus} to restore the state\n */\n public getStatus(options: GetStatusParams = {}): Status {\n // Destructure options with default values\n const { index = true, position = true, includePanelHTML = false, visiblePanelsOnly = false } = options;\n\n const camera = this._camera;\n const panels = visiblePanelsOnly ? this.visiblePanels : this.panels;\n\n const status: Status = {\n panels: panels.map(panel => {\n const panelInfo: Status[\"panels\"][0] = { index: panel.index };\n\n if (includePanelHTML) {\n panelInfo.html = panel.element.outerHTML;\n }\n\n return panelInfo;\n })\n };\n\n if (index) {\n status.index = this.index;\n }\n if (position) {\n const nearestAnchor = camera.findNearestAnchor(camera.position);\n\n if (nearestAnchor) {\n status.position = {\n panel: nearestAnchor.panel.index,\n progressInPanel: camera.getProgressInPanel(nearestAnchor.panel)\n };\n }\n }\n\n if (visiblePanelsOnly) {\n const visiblePanels = this.visiblePanels;\n\n status.visibleOffset = visiblePanels[0]?.index ?? 0;\n }\n\n return status;\n }\n\n /**\n * Restore Flicking to the state of the given {@link Status}.\n * @param status - {@link Status}\n * @throws {@link StatusRestoreErrors}\n */\n public setStatus(status: Status): void {\n if (!this._initialized) {\n throw new FlickingError(ERROR.MESSAGE.NOT_INITIALIZED, ERROR.CODE.NOT_INITIALIZED);\n }\n\n const { index, position, visibleOffset, panels } = status;\n\n const renderer = this._renderer;\n const control = this._control;\n\n // Can't add/remove panels on external rendering\n if (panels[0]?.html && !this._renderExternal) {\n renderer.batchRemove({\n index: 0,\n deleteCount: this.panels.length,\n hasDOMInElements: true\n });\n renderer.batchInsert({\n index: 0,\n elements: parseElement(panels.map(panel => panel.html!)),\n hasDOMInElements: true\n });\n }\n\n if (index != null) {\n const panelIndex = visibleOffset ? index - visibleOffset : index;\n\n void this.moveTo(panelIndex, 0).catch(() => void 0);\n }\n\n if (position && this._moveType === MOVE_TYPE.FREE_SCROLL) {\n const { panel, progressInPanel } = position;\n const panelIndex = visibleOffset ? panel - visibleOffset : panel;\n const panelRange = renderer.panels[panelIndex].range;\n const newCameraPos = panelRange.min + (panelRange.max - panelRange.min) * progressInPanel;\n\n void control.moveToPosition(newCameraPos, 0).catch(() => void 0);\n }\n }\n\n /**\n * Add plugins to Flicking.\n * @remarks\n * Plugins are automatically initialized if Flicking is already initialized.\n * @param plugins - {@link Plugin}\n * @returns The current instance for method chaining\n * @see https://github.com/naver/egjs-flicking-plugins\n */\n public addPlugins(...plugins: Plugin[]): this {\n if (this._initialized) {\n plugins.forEach(item => item.init(this));\n }\n\n this._plugins.push(...plugins);\n\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @param plugins - {@link Plugin}\n * @returns The current instance for method chaining\n * @see https://github.com/naver/egjs-flicking-plugins\n */\n public removePlugins(...plugins: Plugin[]): this {\n plugins.forEach(item => {\n const foundIndex = findIndex(this._plugins, val => val === item);\n\n if (foundIndex >= 0) {\n item.destroy();\n this._plugins.splice(foundIndex, 1);\n }\n });\n\n return this;\n }\n\n /**\n * Update viewport and panel sizes.\n * @remarks\n * This method does nothing if a resize is already in progress.\n * @fires {@link ResizeEvents}\n * @returns Promise that resolves when resize is complete\n */\n public async resize(): Promise<void> {\n if (!this._initialized) {\n return;\n }\n if (this._isResizing) {\n // resize를 연속으로 발생하면 무시하기에 마지막 viewport를 사이즈를 알 수 없음.\n // resize를 1번 더 실행할 수 잇는 스케줄링 등록\n this._scheduleResize = true;\n return;\n }\n\n this._scheduleResize = false;\n this._isResizing = true;\n\n const viewport = this._viewport;\n const renderer = this._renderer;\n const camera = this._camera;\n const control = this._control;\n\n const activePanel = control.activePanel;\n const prevWidth = viewport.width;\n const prevHeight = viewport.height;\n const prevProgressInPanel = activePanel ? camera.getProgressInPanel(activePanel) : 0;\n\n this.trigger(\n new ComponentEvent(EVENTS.BEFORE_RESIZE, {\n width: prevWidth,\n height: prevHeight,\n element: viewport.element\n })\n );\n\n viewport.resize();\n\n // 뷰포트 사이즈가 변경되었을 때 내부의 패널 사이즈들도 전부 업데이트 되어야 하므로 패널들을 전부 리렌더링한다.\n // optimizeSizeUpdate가 true일 경우에는 플리킹 방향에 대응되는 뷰포트 사이즈 요소가 변경되었을 때만 패널들을 리렌더링한다.\n // 자세한 사항은 optimizeSizeUpdate 옵션의 설명을 참고.\n if (this._optimizeSizeUpdate) {\n if ((this.horizontal && viewport.width !== prevWidth) || (!this.horizontal && viewport.height !== prevHeight)) {\n await renderer.forceRenderAllPanels();\n }\n } else {\n await renderer.forceRenderAllPanels(); // Render all panel elements, to update sizes\n }\n\n if (!this._initialized) {\n return;\n }\n renderer.updatePanelSize();\n camera.updateAlignPos();\n camera.updateRange();\n camera.updateAnchors();\n camera.updateAdaptiveHeight();\n camera.updatePanelOrder();\n camera.updateOffset();\n await renderer.render();\n\n if (!this._initialized) {\n return;\n }\n\n if (control.animating) {\n // TODO:\n } else {\n control.updatePosition(prevProgressInPanel);\n control.updateInput();\n }\n\n const newWidth = viewport.width;\n const newHeight = viewport.height;\n const sizeChanged = newWidth !== prevWidth || newHeight !== prevHeight;\n\n this.trigger(\n new ComponentEvent(EVENTS.AFTER_RESIZE, {\n width: viewport.width,\n height: viewport.height,\n prev: {\n width: prevWidth,\n height: prevHeight\n },\n sizeChanged,\n element: viewport.element\n })\n );\n\n this._isResizing = false;\n\n // 연속으로 resize를 호출하는 경우를 대비하기 위해서 스케줄링 반영\n if (this._scheduleResize) {\n void this.resize();\n }\n return;\n }\n\n /**\n * Add new panels after the last panel.\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of appended panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\"));\n * flicking.append(\"<div>Panel</div>\");\n * flicking.append([\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public append(element: ElementLike | ElementLike[]): Panel[] {\n return this.insert(this._renderer.panelCount, element);\n }\n\n /**\n * Add new panels before the first panel.\n * @remarks\n * This will increase the index of existing panels by the number of panels added.\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of prepended panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.prepend(document.createElement(\"div\"));\n * flicking.prepend(\"<div>Panel</div>\");\n * flicking.prepend([\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public prepend(element: ElementLike | ElementLike[]): Panel[] {\n return this.insert(0, element);\n }\n\n /**\n * Insert new panels at the given index.\n * @remarks\n * This will increase the index of panels at or after the given index by the number of panels added.\n * @param index - Index to insert new panels at\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of inserted panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.insert(0, document.createElement(\"div\"));\n * flicking.insert(2, \"<div>Panel</div>\");\n * flicking.insert(1, [\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public insert(index: number, element: ElementLike | ElementLike[]): Panel[] {\n if (this._renderExternal) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ALLOWED_IN_FRAMEWORK, ERROR.CODE.NOT_ALLOWED_IN_FRAMEWORK);\n }\n\n return this._renderer.batchInsert({\n index,\n elements: parseElement(element),\n hasDOMInElements: true\n });\n }\n\n /**\n * Remove panels starting from the given index.\n * @remarks\n * This will decrease the index of panels after the removed ones by the number of panels removed.\n * @param index - Index of the first panel to remove\n * @param deleteCount - Number of panels to remove. Defaults to `1`\n * @throws {@link DOMManipulationErrors}\n * @returns Array of removed panels\n */\n public remove(index: number, deleteCount: number = 1): Panel[] {\n if (this._renderExternal) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ALLOWED_IN_FRAMEWORK, ERROR.CODE.NOT_ALLOWED_IN_FRAMEWORK);\n }\n\n return this._renderer.batchRemove({\n index,\n deleteCount,\n hasDOMInElements: true\n });\n }\n\n /**\n * Factory method to create the appropriate Control implementation based on moveType option.\n * @internal\n * @privateRemarks\n * Called during constructor and when moveType option is changed. The moveType option must be set before calling this method.\n * Throws error if moveType is invalid.\n */\n private _createControl(): Control {\n const moveType = this._moveType;\n const moveTypes = Object.keys(MOVE_TYPE).map(key => MOVE_TYPE[key] as ValueOf<typeof MOVE_TYPE>);\n\n const moveTypeStr = Array.isArray(moveType) ? moveType[0] : moveType;\n\n const moveTypeOptions = Array.isArray(moveType) ? (moveType[1] ?? {}) : {};\n\n if (!includes(moveTypes, moveTypeStr)) {\n throw new FlickingError(\n ERROR.MESSAGE.WRONG_OPTION(\"moveType\", JSON.stringify(moveType)),\n ERROR.CODE.WRONG_OPTION\n );\n }\n\n switch (moveTypeStr) {\n case MOVE_TYPE.SNAP:\n return new SnapControl(moveTypeOptions as SnapControlOptions);\n case MOVE_TYPE.FREE_SCROLL:\n return new FreeControl(moveTypeOptions as FreeControlOptions);\n case MOVE_TYPE.STRICT:\n return new StrictControl(moveTypeOptions as StrictControlOptions);\n }\n }\n\n /**\n * Factory method to create Camera instance for managing viewport movement and positioning.\n * @internal\n * @privateRemarks\n * Called during constructor. The align option must be set before calling this method.\n * Warns if both circular and bound options are enabled (bound is ignored).\n */\n private _createCamera(): Camera {\n if (this._circular && this._bound) {\n // eslint-disable-next-line no-console\n console.warn('\"circular\" and \"bound\" option cannot be used together, ignoring bound.');\n }\n\n return new Camera(this, {\n align: this._align\n });\n }\n\n /**\n * Factory method to create the appropriate Renderer implementation based on externalRenderer and virtual options.\n * @internal\n * @privateRemarks\n * Called during constructor. Selects ExternalRenderer if externalRenderer is provided, otherwise creates VanillaRenderer or ExternalRenderer based on renderExternal option.\n * Warns if virtual is enabled without panelsPerView.\n */\n private _createRenderer(): Renderer {\n const externalRenderer = this._externalRenderer;\n if (this._virtual && this._panelsPerView <= 0) {\n // eslint-disable-next-line no-console\n console.warn('\"virtual\" and \"panelsPerView\" option should be used together, ignoring virtual.');\n }\n\n return externalRenderer\n ? externalRenderer\n : this._renderExternal\n ? this._createExternalRenderer()\n : this._createVanillaRenderer();\n }\n\n /**\n * Factory method to create ExternalRenderer from renderExternal option (deprecated).\n * @internal\n * @privateRemarks\n * Called by _createRenderer when renderExternal option is set. The renderExternal option must not be null and must contain renderer class and options.\n */\n private _createExternalRenderer(): ExternalRenderer {\n const { renderer, rendererOptions } = this._renderExternal!;\n\n return new renderer({ align: this._align, ...rendererOptions });\n }\n\n /**\n * Factory method to create VanillaRenderer for vanilla JavaScript rendering.\n * @internal\n * @privateRemarks\n * Called by _createRenderer when neither externalRenderer nor renderExternal is set.\n * Uses VirtualRenderingStrategy if virtual is enabled, otherwise NormalRenderingStrategy.\n */\n private _createVanillaRenderer(): VanillaRenderer {\n const virtual = this.virtualEnabled;\n\n return new VanillaRenderer({\n align: this._align,\n strategy: virtual\n ? new VirtualRenderingStrategy()\n : new NormalRenderingStrategy({\n providerCtor: VanillaElementProvider\n })\n });\n }\n\n /**\n * Move camera to the initial panel position based on defaultIndex option.\n * @internal\n * @privateRemarks\n * Called during init() method, after _initialResize(). Requires camera, renderer, and control to be already initialized.\n * Throws error if the initial panel position is not reachable.\n */\n private _moveToInitialPanel(): void {\n const renderer = this._renderer;\n const control = this._control;\n const camera = this._camera;\n const defaultPanel = renderer.getPanel(this._defaultIndex) || renderer.getPanel(0);\n\n if (!defaultPanel) return;\n\n const nearestAnchor = camera.findNearestAnchor(defaultPanel.position);\n const initialPanel =\n nearestAnchor &&\n defaultPanel.position !== nearestAnchor.panel.position &&\n defaultPanel.index !== nearestAnchor.panel.index\n ? nearestAnchor.panel\n : defaultPanel;\n control.setActive(initialPanel, null, false);\n\n if (!nearestAnchor) {\n throw new FlickingError(\n ERROR.MESSAGE.POSITION_NOT_REACHABLE(initialPanel.position),\n ERROR.CODE.POSITION_NOT_REACHABLE\n );\n }\n\n let position = initialPanel.position;\n\n if (!camera.canReach(initialPanel)) {\n position = nearestAnchor.position;\n }\n\n camera.lookAt(position);\n control.updateInput();\n camera.updateOffset();\n }\n\n /**\n * Calculate initial viewport and panel sizes during initialization.\n * @internal\n * @privateRemarks\n * Called during init() method, before _moveToInitialPanel(). This is separate from the regular resize() to avoid triggering events before initialization is complete.\n * Requires viewport, renderer, camera, and control to be already initialized. Triggers BEFORE_RESIZE and AFTER_RESIZE events.\n */\n private _initialResize() {\n const viewport = this._viewport;\n const renderer = this._renderer;\n const camera = this._camera;\n const control = this._control;\n\n this.trigger(\n new ComponentEvent(EVENTS.BEFORE_RESIZE, {\n width: 0,\n height: 0,\n element: viewport.element\n })\n );\n\n viewport.resize();\n renderer.updatePanelSize();\n camera.updateAlignPos();\n camera.updateRange();\n camera.updateAnchors();\n camera.updateOffset();\n control.updateInput();\n\n const newWidth = viewport.width;\n const newHeight = viewport.height;\n const sizeChanged = newWidth !== 0 || newHeight !== 0;\n\n this.trigger(\n new ComponentEvent(EVENTS.AFTER_RESIZE, {\n width: viewport.width,\n height: viewport.height,\n prev: {\n width: 0,\n height: 0\n },\n sizeChanged,\n element: viewport.element\n })\n );\n }\n}\n\nexport default Flicking;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport { EventKey } from \"@egjs/component/declaration/types\";\nimport { CLASS, MOVE_DIRECTION } from \"./constants/values\";\nimport { EVENTS } from \"./event/names\";\nimport {\n ChangedEvent,\n FlickingEvents,\n HoldEndEvent,\n HoldStartEvent,\n MoveEndEvent,\n MoveEvent,\n MoveStartEvent,\n RestoredEvent,\n WillChangeEvent,\n WillRestoreEvent\n} from \"./event/types\";\nimport Flicking, { FlickingOptions } from \"./Flicking\";\nimport { LiteralUnion, ValueOf } from \"./types/internal\";\nimport { getDataAttributes, includes, toArray } from \"./utils\";\n\nexport const SIDE_EVENTS = {\n HOLD_START: \"sideHoldStart\",\n HOLD_END: \"sideHoldEnd\",\n MOVE_START: \"sideMoveStart\",\n MOVE: \"sideMove\",\n MOVE_END: \"sideMoveEnd\",\n WILL_CHANGE: \"sideWillChange\",\n CHANGED: \"sideChanged\",\n WILL_RESTORE: \"sideWillRestore\",\n RESTORED: \"sideRestored\"\n} as const;\n\nexport type CrossFlickingEvent<T> = { mainIndex: number } & T;\n\nexport interface CrossFlickingEvents extends FlickingEvents {\n [SIDE_EVENTS.HOLD_START]: CrossFlickingEvent<HoldStartEvent>;\n [SIDE_EVENTS.HOLD_END]: CrossFlickingEvent<HoldEndEvent>;\n [SIDE_EVENTS.MOVE_START]: CrossFlickingEvent<MoveStartEvent>;\n [SIDE_EVENTS.MOVE]: CrossFlickingEvent<MoveEvent>;\n [SIDE_EVENTS.MOVE_END]: CrossFlickingEvent<MoveEndEvent>;\n [SIDE_EVENTS.WILL_CHANGE]: CrossFlickingEvent<WillChangeEvent>;\n [SIDE_EVENTS.CHANGED]: CrossFlickingEvent<ChangedEvent>;\n [SIDE_EVENTS.WILL_RESTORE]: CrossFlickingEvent<WillRestoreEvent>;\n [SIDE_EVENTS.RESTORED]: CrossFlickingEvent<RestoredEvent>;\n}\n\nexport interface CrossFlickingOptions extends FlickingOptions {\n sideOptions: Partial<FlickingOptions> | undefined;\n preserveIndex: boolean | undefined;\n disableSlideOnHold: boolean | undefined;\n disableIndexSync: boolean | undefined;\n}\n\nexport interface SideState {\n key: string;\n start: number;\n end: number;\n element: HTMLElement;\n}\n\nexport interface CrossFlickingChangedEvent extends ChangedEvent {\n sideIndex?: number;\n}\n\nexport interface CrossFlickingWillChangeEvent extends WillChangeEvent {\n sideIndex?: number;\n}\n\n/**\n * A preset for cross-directional carousel that combines horizontal and vertical Flicking instances\n * @since 4.12.0\n * @public\n */\nexport class CrossFlicking extends Flicking {\n // Core components\n private _sideFlicking: Flicking[];\n\n // Options\n private _sideOptions: CrossFlickingOptions[\"sideOptions\"];\n private _preserveIndex: CrossFlickingOptions[\"preserveIndex\"];\n private _disableSlideOnHold: CrossFlickingOptions[\"disableSlideOnHold\"];\n private _disableIndexSync: CrossFlickingOptions[\"disableIndexSync\"];\n\n // Internal State\n private _sideState: SideState[];\n private _moveDirection: LiteralUnion<ValueOf<typeof MOVE_DIRECTION>> | null;\n private _originalDragThreshold: number;\n private _nextIndex: number;\n\n // Components\n public get sideFlicking() {\n return this._sideFlicking;\n }\n\n public get sideIndex() {\n return this._sideFlicking.map(i => i.index);\n }\n\n public get sideState() {\n return this._sideState;\n }\n\n // Options Getter\n public get sideOptions() {\n return this._sideOptions;\n }\n\n public get preserveIndex() {\n return this._preserveIndex;\n }\n\n public get disableSlideOnHold() {\n return this._disableSlideOnHold;\n }\n\n public get disableIndexSync() {\n return this._disableIndexSync;\n }\n\n // Options Setter\n public set sideOptions(val: CrossFlickingOptions[\"sideOptions\"]) {\n this._sideOptions = val;\n }\n\n public set preserveIndex(val: CrossFlickingOptions[\"preserveIndex\"]) {\n this._preserveIndex = val;\n }\n\n public set disableSlideOnHold(val: CrossFlickingOptions[\"disableSlideOnHold\"]) {\n this._disableSlideOnHold = val;\n }\n\n public set disableIndexSync(val: CrossFlickingOptions[\"disableIndexSync\"]) {\n this._disableIndexSync = val;\n }\n\n public constructor(root: HTMLElement | string, options: Partial<CrossFlickingOptions>) {\n super(root, options);\n const { sideOptions = {}, preserveIndex = true, disableSlideOnHold = true, disableIndexSync = false } = options;\n\n // Internal states\n this._moveDirection = null;\n this._nextIndex = 0;\n this._originalDragThreshold = this.dragThreshold;\n\n // Bind options\n this._sideOptions = sideOptions;\n this._preserveIndex = preserveIndex;\n this._disableSlideOnHold = disableSlideOnHold;\n this._disableIndexSync = disableIndexSync;\n }\n\n public init(): Promise<void> {\n return super.init().then(() => {\n this._sideState = this._createSideState();\n this._sideFlicking = this._createSideFlicking();\n this._addComponentEvents();\n });\n }\n\n public destroy(): void {\n this._sideFlicking.forEach(flicking => {\n flicking.destroy();\n });\n super.destroy();\n }\n\n private _addComponentEvents(): void {\n this.on(EVENTS.HOLD_START, this._onHorizontalHoldStart);\n this.on(EVENTS.MOVE, this._onHorizontalMove);\n this.on(EVENTS.MOVE_END, this._onHorizontalMoveEnd);\n [EVENTS.CHANGED, EVENTS.WILL_CHANGE].forEach(event => {\n this.on(event, this._addSideIndex);\n });\n\n this._sideFlicking.forEach((flicking, mainIndex) => {\n flicking.on(EVENTS.HOLD_START, this._onSideHoldStart);\n flicking.on(EVENTS.MOVE, this._onSideMove);\n flicking.on(EVENTS.MOVE_END, this._onSideMoveEnd);\n flicking.on(EVENTS.CHANGED, this._onSideChanged);\n\n Object.keys(SIDE_EVENTS).forEach((name: EventKey<FlickingEvents>) => {\n flicking.on(EVENTS[name], event => {\n this.trigger(\n new ComponentEvent(SIDE_EVENTS[name], {\n mainIndex,\n ...event\n })\n );\n });\n });\n });\n }\n\n private _createSideState(): SideState[] {\n const viewportEl = this.element;\n const cameraEl = this.camera.element;\n const panels = toArray(cameraEl.children) as HTMLElement[];\n const isCrossStructure = getDataAttributes(viewportEl, \"data-cross-\").structure;\n let sideState: SideState[] = [];\n\n if (!isCrossStructure) {\n const groupPanels = this._getGroupFromAttribute(panels);\n const groupKeys = Object.keys(groupPanels);\n\n if (groupKeys.length) {\n sideState = this._getSideStateFromGroup(groupPanels);\n this.remove(0, this.panelCount - groupKeys.length);\n } else {\n sideState = this._getSideStateFromPanels(panels);\n }\n\n this._createCrossStructure(sideState);\n } else {\n sideState = this._getSideStateFromCrossStructure(panels);\n }\n\n void this.resize();\n\n return sideState;\n }\n\n private _createCrossStructure(sideState: SideState[]) {\n const sideCamera = document.createElement(\"div\");\n let sidePanels: string = \"\";\n\n sideCamera.classList.add(CLASS.CAMERA);\n sideState.forEach((state, i) => {\n const panel = this.camera.children[i];\n sidePanels += state.element.innerHTML;\n Array.from(panel.attributes).forEach(attribute => panel.removeAttribute(attribute.name));\n });\n\n sideCamera.innerHTML = sidePanels;\n\n sideState.forEach((_, i) => {\n const panel = this.camera.children[i];\n [CLASS.VIEWPORT, CLASS.VERTICAL].forEach(className => {\n if (!panel.classList.contains(className)) {\n panel.classList.add(className);\n }\n });\n panel.innerHTML = sideCamera.outerHTML;\n });\n\n this.element.setAttribute(\"data-cross-structure\", \"true\");\n }\n\n private _getGroupFromAttribute(panels: HTMLElement[]): Record<string, HTMLElement[]> {\n const groupKeys: string[] = [];\n const groupPanels: Record<string, HTMLElement[]> = {};\n\n panels.forEach(panel => {\n const groupKey = getDataAttributes(panel, \"data-cross-\").groupkey;\n if (groupKey && !includes(groupKeys, groupKey)) {\n groupKeys.push(groupKey);\n groupPanels[groupKey] = [panel];\n } else if (groupKey) {\n groupPanels[groupKey].push(panel);\n }\n });\n\n return groupPanels;\n }\n\n private _getSideStateFromGroup(groupPanels: Record<string, HTMLElement[]>): SideState[] {\n return Object.keys(groupPanels).reduce((state: SideState[], key: string) => {\n const start = state.length ? +state[state.length - 1].end + 1 : 0;\n const element = groupPanels[key].reduce((el: HTMLElement, panel: HTMLElement) => {\n el.innerHTML += panel.outerHTML;\n return el;\n }, document.createElement(\"div\"));\n return [\n ...state,\n {\n key,\n start,\n end: start + groupPanels[key].length - 1,\n element: element\n }\n ];\n }, []);\n }\n\n private _getSideStateFromPanels(panels: HTMLElement[]): SideState[] {\n return panels.reduce((state: SideState[], panel: HTMLElement, i: number) => {\n const start = state.length ? +state[state.length - 1].end + 1 : 0;\n return [\n ...state,\n {\n key: i.toString(),\n start,\n end: start + panel.children.length - 1,\n element: panel\n }\n ];\n }, []);\n }\n\n private _getSideStateFromCrossStructure(panels: HTMLElement[]): SideState[] {\n const groupPanels = this._getGroupFromAttribute(panels);\n return this._getSideStateFromGroup(groupPanels);\n }\n\n private _createSideFlicking(): Flicking[] {\n return this.sideState.map((state, i) => {\n return new Flicking(this.camera.children[i], {\n ...this.sideOptions,\n horizontal: false,\n panelsPerView: 1,\n defaultIndex: state.start\n });\n });\n }\n\n private _syncToCategory = (index: number, outerIndex: number): void => {\n if (this._disableIndexSync) {\n return;\n }\n\n this.stopAnimation();\n this._sideFlicking.forEach((child, i) => {\n const { start, end } = this._sideState[i];\n\n if (start <= index && end >= index && outerIndex !== i) {\n child.stopAnimation();\n void child.moveTo(index, 0);\n void this.moveTo(i, 0);\n }\n });\n };\n\n private _setDraggable = (direction: ValueOf<typeof MOVE_DIRECTION>, draggable: boolean): void => {\n if (!this._disableSlideOnHold) {\n return;\n }\n\n const dragThreshold = this._originalDragThreshold;\n const threshold = draggable ? (dragThreshold && dragThreshold >= 10 ? dragThreshold : 10) : Infinity;\n\n if ((direction === MOVE_DIRECTION.HORIZONTAL) === this.horizontal) {\n this.dragThreshold = threshold;\n } else if ((direction === MOVE_DIRECTION.VERTICAL) === this.horizontal) {\n this._sideFlicking.forEach(child => {\n child.dragThreshold = threshold;\n });\n }\n };\n\n private _setPreviousSideIndex = () => {\n this._sideFlicking.forEach((child, i) => {\n const { start, end } = this._sideState[i];\n\n if (this._preserveIndex) {\n if (this._nextIndex !== i) {\n if (child.index < start) {\n child.stopAnimation();\n void child.moveTo(start, 0);\n } else if (child.index > end) {\n child.stopAnimation();\n void child.moveTo(end, 0);\n }\n }\n } else {\n if (this._nextIndex !== i) {\n void child.moveTo(start, 0);\n }\n }\n });\n };\n\n private _addSideIndex = (e: ChangedEvent | WillChangeEvent): void => {\n (e as CrossFlickingChangedEvent | CrossFlickingWillChangeEvent).sideIndex = this._sideFlicking[e.index].index;\n };\n\n private _onHorizontalHoldStart = (): void => {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, true);\n this._moveDirection = null;\n };\n\n private _onHorizontalMove = (e: MoveEvent): void => {\n if (e.isTrusted && !this._moveDirection) {\n this._setDraggable(MOVE_DIRECTION.VERTICAL, false);\n this._moveDirection = MOVE_DIRECTION.HORIZONTAL;\n }\n };\n\n private _onHorizontalMoveEnd = (e: MoveEndEvent): void => {\n const visiblePanels = this.visiblePanels;\n\n if (visiblePanels.length > 1) {\n this._nextIndex = e.direction === \"NEXT\" ? visiblePanels[1].index : visiblePanels[0].index;\n } else {\n this._nextIndex = visiblePanels[0].index;\n }\n\n this._setDraggable(MOVE_DIRECTION.VERTICAL, true);\n this._moveDirection = null;\n\n // _syncToCategory에서 완전히 가로 이동이 이루어지기 전에 세로 방향 index가 변하는 경우가 있어 requestAnimationFrame 처리\n requestAnimationFrame(() => this._setPreviousSideIndex());\n\n if (e.isTrusted) {\n this._syncToCategory(this._sideFlicking[this._nextIndex].index, this._nextIndex);\n }\n };\n\n private _onSideHoldStart = (): void => {\n this._setDraggable(MOVE_DIRECTION.VERTICAL, true);\n this._moveDirection = null;\n };\n\n private _onSideMove = (e: MoveEvent): void => {\n if (e.isTrusted && !this._moveDirection) {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, false);\n this._moveDirection = MOVE_DIRECTION.VERTICAL;\n }\n };\n\n private _onSideMoveEnd = (): void => {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, true);\n this._moveDirection = null;\n };\n\n private _onSideChanged = (e: ChangedEvent): void => {\n // If this.visiblePanels.length >= 2, it means that horizontal flicking is being dragged.\n // In this case, syncToCategory in _onHorizontalMoveEnd will fire after moving finishes, so we don't fire it here.\n if (this.visiblePanels.length < 2 && this._sideFlicking[this.index] === e.currentTarget) {\n this._syncToCategory(e.index, this.index);\n }\n };\n}\n","import { ALIGN } from \"../constants/values\";\nimport { FlickingOptions } from \"../Flicking\";\nimport { parseArithmeticExpression } from \"../utils\";\n\nexport default (\n align: FlickingOptions[\"align\"] = ALIGN.CENTER,\n horizontal: boolean = true,\n firstPanelSize?: string\n) => {\n const cameraAlign = getCameraAlign(align);\n const panelAlign = getPanelAlign(align);\n\n if (panelAlign == null) return \"\";\n\n const camPosition = `calc(${cameraAlign} - (${firstPanelSize || \"0px\"} * ${panelAlign.percentage}) - ${panelAlign.absolute}px)`;\n\n return horizontal ? `translate(${camPosition})` : `translate(0, ${camPosition})`;\n};\n\nconst getCameraAlign = (align: FlickingOptions[\"align\"]) => {\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n return parseAlign(alignVal);\n};\n\nconst getPanelAlign = (align: FlickingOptions[\"align\"]) => {\n const alignVal = typeof align === \"object\" ? (align as { panel: string | number }).panel : align;\n\n return parseArithmeticExpression(parseAlign(alignVal));\n};\n\nconst parseAlign = (alignVal: number | string) => {\n if (typeof alignVal === \"number\") {\n return `${alignVal}px`;\n }\n\n switch (alignVal) {\n case ALIGN.CENTER:\n return \"50%\";\n case ALIGN.NEXT:\n return \"100%\";\n case ALIGN.PREV:\n return \"0%\";\n default:\n return alignVal;\n }\n};\n","import { DiffResult } from \"@egjs/list-differ\";\n\nimport Flicking from \"../Flicking\";\n\nexport default <T>(flicking: Flicking, diffResult: DiffResult<T>) => {\n const removedPanels = diffResult.removed.reduce((map, idx) => {\n map[idx] = true;\n return map;\n }, {});\n\n const maintainedMap = diffResult.maintained.reduce((map, [prev, current]) => {\n map[prev] = current;\n return map;\n }, {});\n const renderingPanels = flicking.panels.filter(panel => !removedPanels[panel.index]);\n\n if (!flicking.useCSSOrder) {\n // useCSSOrder를 사용하게 되는 경우 sort를 하지 않는다.\n renderingPanels.sort((panel1, panel2) => panel1.position + panel1.offset - (panel2.position + panel2.offset));\n }\n\n return [\n ...renderingPanels.map(panel => diffResult.list[maintainedMap[panel.index]]),\n ...diffResult.added.map(idx => diffResult.list[idx])\n ];\n};\n","import { DiffResult } from \"@egjs/list-differ\";\nimport Panel from \"../core/panel/Panel\";\nimport Flicking from \"../Flicking\";\nimport Renderer from \"../renderer/Renderer\";\n\nexport default (flicking: Flicking, diffResult: DiffResult<any>, rendered: any[]) => {\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n const prevList = [...diffResult.prevList];\n\n const added: Panel[] = [];\n const removed: Panel[] = [];\n\n if (diffResult.removed.length > 0) {\n let endIdx = -1;\n let prevIdx = -1;\n\n diffResult.removed.forEach(removedIdx => {\n if (endIdx < 0) {\n endIdx = removedIdx;\n }\n\n if (prevIdx >= 0 && removedIdx !== prevIdx - 1) {\n removed.push(...batchRemove(renderer, prevIdx, endIdx + 1));\n\n endIdx = removedIdx;\n prevIdx = removedIdx;\n } else {\n prevIdx = removedIdx;\n }\n\n prevList.splice(removedIdx, 1);\n });\n\n removed.push(...batchRemove(renderer, prevIdx, endIdx + 1));\n }\n\n diffResult.ordered.forEach(([from, to]) => {\n const prevPanel = panels.splice(from, 1)[0];\n panels.splice(to, 0, prevPanel);\n });\n\n if (diffResult.ordered.length > 0) {\n panels.forEach((panel, idx) => {\n const indexDiff = idx - panel.index;\n\n if (indexDiff > 0) {\n panel.increaseIndex(indexDiff);\n } else {\n panel.decreaseIndex(-indexDiff);\n }\n });\n\n panels.sort((panel1, panel2) => panel1.index - panel2.index);\n\n panels.forEach(panel => {\n panel.updatePosition();\n });\n }\n\n if (diffResult.added.length > 0) {\n let startIdx = -1;\n let prevIdx = -1;\n\n const addedElements = rendered.slice(prevList.length);\n\n diffResult.added.forEach((addedIdx, idx) => {\n if (startIdx < 0) {\n startIdx = idx;\n }\n\n if (prevIdx >= 0 && addedIdx !== prevIdx + 1) {\n added.push(...batchInsert(renderer, diffResult, addedElements, startIdx, idx + 1));\n\n startIdx = -1;\n prevIdx = -1;\n } else {\n prevIdx = addedIdx;\n }\n });\n\n if (startIdx >= 0) {\n added.push(...batchInsert(renderer, diffResult, addedElements, startIdx));\n }\n }\n\n if (diffResult.added.length > 0 || diffResult.removed.length > 0) {\n renderer.updateAfterPanelChange(added, removed);\n } else if (diffResult.ordered.length > 0) {\n const camera = flicking.camera;\n // 순서 변경으로 인한 index 변경 및 range 값 변경\n camera.updateRange();\n // index 변경으로 인한 카메라 위치 즉시 변경\n camera.updateOffset();\n // 순서 변경으로 인한 anchors 전부 업데이트\n camera.updateAnchors();\n // need panel 여부 재확인 필요\n camera.resetNeedPanelHistory();\n }\n};\n\nconst batchInsert = (\n renderer: Renderer,\n diffResult: DiffResult<any>,\n addedElements: any[],\n startIdx: number,\n endIdx?: number\n) => {\n return renderer.batchInsertDefer(\n ...diffResult.added\n .slice(startIdx, endIdx)\n .map((index, elIdx) => ({ index, elements: [addedElements[elIdx]], hasDOMInElements: false }))\n );\n};\n\nconst batchRemove = (renderer: Renderer, startIdx: number, endIdx?: number) => {\n const removed = renderer.panels.slice(startIdx, endIdx);\n\n return renderer.batchRemoveDefer({ index: startIdx, deleteCount: removed.length, hasDOMInElements: false });\n};\n","import Component from \"@egjs/component\";\n\nimport Flicking from \"../Flicking\";\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @internal\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component<Partial<FlickingProps & FlickingOptions>> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nconst withFlickingMethods = (prototype: any, flickingName: string) => {\n [Component.prototype, Flicking.prototype].forEach(proto => {\n Object.getOwnPropertyNames(proto)\n .filter(name => !prototype[name] && name.indexOf(\"_\") !== 0 && name !== \"constructor\")\n .forEach((name: string) => {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name)!;\n\n if (descriptor.value) {\n // Public Function\n Object.defineProperty(prototype, name, {\n value: function (...args) {\n return descriptor.value.call(this[flickingName], ...args);\n }\n });\n } else {\n const getterDescriptor: { get?: () => any; set?: (val: any) => void } = {};\n if (descriptor.get) {\n getterDescriptor.get = function () {\n const flicking = this[flickingName];\n return flicking && descriptor.get?.call(flicking);\n };\n }\n if (descriptor.set) {\n getterDescriptor.set = function (...args) {\n return descriptor.set?.call(this[flickingName], ...args);\n };\n }\n\n Object.defineProperty(prototype, name, getterDescriptor);\n }\n });\n });\n};\n\nexport default withFlickingMethods;\n","/*\nCopyright (c) 2022-present NAVER Corp.\nname: @cfcs/core\nlicense: MIT\nauthor: NAVER Crop.\nrepository: https://github.com/naver/cfcs/tree/main/packages/core\nversion: 0.1.0\n*/\nimport Component from '@egjs/component';\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\n/**\n * @hidden\n */\nfunction keys(obj) {\n return Object.keys(obj);\n}\n/**\n * @hidden\n */\n\nfunction camelize(str) {\n return str.replace(/[\\s-_]([a-z])/g, function (all, letter) {\n return letter.toUpperCase();\n });\n}\n/**\n * @hidden\n */\n\nfunction isString(val) {\n return typeof val === \"string\";\n}\n/**\n * @hidden\n */\n\nfunction isObject(val) {\n return typeof val === \"object\";\n}\n/**\n * @hidden\n */\n\nfunction isFunction(val) {\n return typeof val === \"function\";\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction findTarget(target) {\n var el;\n\n if (!target) {\n return null;\n }\n\n if (isString(target)) {\n el = document.querySelector(target);\n } else if (target instanceof Element) {\n el = target;\n } else if (\"value\" in target || \"current\" in target) {\n el = target.value || target.current;\n }\n\n return el;\n}\n/**\n * @description Sets the name of the class method to be exposed to the outside.\n * @category DOM\n * @return Property Decorator\n * @example\n * ```ts\n * import { withClassMethods } from \"@cfcs/core\";\n *\n * class YourFrameworkComponent {\n * @withClassMethod(METHOD_NAMES)\n * inst = new YourComponent();\n * }\n * ```\n */\n\nfunction withClassMethods(methods) {\n return function (prototype, memberName) {\n methods.forEach(function (name) {\n if (name in prototype) {\n return;\n }\n\n prototype[name] = function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var result = (_a = this[memberName])[name].apply(_a, args); // fix `this` type to return your own `class` instance to the instance using the decorator.\n\n\n if (result === this[memberName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n };\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\nvar OBSERVERS_PATH = \"__observers__\";\nvar COMPUTED_PATH = \"__computed__\";\nvar CFCS_DETECTED_DEPENDENCIES_VERSION = 1;\nvar CFCS_DETECTED_DEPENDENCIES = \"__CFCS_DETECTED_DEPENDENCIES__\";\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n };\n\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\nfunction getDetectedStack() {\n // Version issues do not occur when you access the native object in the global.\n Object[CFCS_DETECTED_DEPENDENCIES] = Object[CFCS_DETECTED_DEPENDENCIES] || {};\n var versionList = Object[CFCS_DETECTED_DEPENDENCIES];\n versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] = versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] || [];\n return versionList[CFCS_DETECTED_DEPENDENCIES_VERSION];\n}\nfunction getCurrentDetected() {\n var stack = getDetectedStack();\n return stack[stack.length - 1];\n}\nfunction detectDependencies(host) {\n var stack = getDetectedStack();\n var observers = [];\n var detected = {\n host: host,\n observers: observers,\n push: function (observer) {\n if (host !== observer && observers.indexOf(observer) === -1) {\n observers.push(observer);\n }\n }\n };\n stack.push(detected);\n return detected;\n}\nfunction endDetectDependencies() {\n var stack = getDetectedStack();\n return stack.pop();\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * Creates a mutable ref object. You can access the `.current` value and detect the value change through `.subscribe`.\n * @category Reactive\n * @see observe\n */\n\nvar Observer =\n/*#__PURE__*/\nfunction () {\n /**\n *\n */\n function Observer(value) {\n this._emitter = new Component();\n this._current = value;\n }\n\n var __proto = Observer.prototype;\n Object.defineProperty(__proto, \"current\", {\n /**\n * return the current value.\n */\n get: function () {\n var currentDetected = getCurrentDetected();\n currentDetected === null || currentDetected === void 0 ? void 0 : currentDetected.push(this);\n return this._current;\n },\n set: function (value) {\n this._setCurrent(value);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * When the current value changes, the callback function is called.\n */\n\n __proto.subscribe = function (callback) {\n this.current;\n\n this._emitter.on(\"update\", callback);\n\n return this;\n };\n /**\n * Cancel the registered subscription through callback.\n */\n\n\n __proto.unsubscribe = function (callback) {\n this._emitter.off(\"update\", callback);\n\n return this;\n };\n\n __proto._setCurrent = function (value) {\n var prevValue = this._current;\n var isUpdate = value !== prevValue;\n this._current = value;\n\n if (isUpdate) {\n this._emitter.trigger(\"update\", value, prevValue);\n }\n };\n /**\n * @hidden\n */\n\n\n __proto.toString = function () {\n return \"\".concat(this.current);\n };\n /**\n * @hidden\n */\n\n\n __proto.valueOf = function () {\n return this.current;\n };\n\n return Observer;\n}();\n\n/**\n * @category Reactive\n * @hidden\n */\n\nvar ComputedObserver =\n/*#__PURE__*/\nfunction (_super) {\n __extends(ComputedObserver, _super);\n /**\n * @description Creates a new computed observer from the values of other observers.\n * It is read-only and if you change the value of the observer used inside the callback, its value will be automatically updated.\n * @param _computedCallback A function for observers to be computed.\n */\n\n\n function ComputedObserver(_computedCallback) {\n var _this = _super.call(this) || this;\n\n _this._computedCallback = _computedCallback;\n _this._registered = [];\n\n _this._onCheckUpdate = function () {\n _this._setCurrent(_this.current);\n };\n\n _this._current = _this.current;\n return _this;\n }\n\n var __proto = ComputedObserver.prototype;\n Object.defineProperty(__proto, \"current\", {\n get: function () {\n var _this = this;\n\n detectDependencies(this);\n\n var value = this._computedCallback();\n\n var results = endDetectDependencies();\n\n this._registered.forEach(function (observer) {\n observer.unsubscribe(_this._onCheckUpdate);\n });\n\n results.observers.forEach(function (observer) {\n observer.subscribe(_this._onCheckUpdate);\n });\n this._registered = results.observers;\n return value;\n },\n enumerable: false,\n configurable: true\n });\n return ComputedObserver;\n}(Observer);\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\nfunction injectObserve(prototype, memberName, publicName) {\n if (publicName === void 0) {\n publicName = memberName;\n }\n\n var nextAttributes = {\n configurable: true,\n get: function () {\n return getObserver(this, publicName).current;\n },\n set: function (value) {\n getObserver(this, publicName, value).current = value;\n }\n };\n Object.defineProperty(prototype, memberName, nextAttributes);\n\n if (publicName !== memberName) {\n Object.defineProperty(prototype, publicName, {\n configurable: true,\n get: function () {\n return getObserver(this, publicName).current;\n }\n });\n }\n}\n/**\n * @description `Observe` is a property decorator and converts the property into a `reactive state`. You can detect its status through `.subscribe`.\n * @category Reactive-Decorator\n * @see ReactiveSubscribe\n * @example\n* ```ts\nimport { ReactiveSubscribe, Observe } from \"@cfcs/core\";\n\n@ReactiveSubscribe\nclass Component {\n // The public name and state name are the same.\n @Observe value1 = 1;\n // If you want to set public name and private properties separately\n @Observe(\"value2\") _value2 = 1;\n\n constructor() {\n requestAnimationFrame(() => {\n this.value1 = 2;\n });\n }\n}\ninterface C\n```\n */\n\n\nfunction Observe() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (args.length > 1) {\n return injectObserve(args[0], args[1]);\n }\n\n return function (prototype, memberName) {\n return injectObserve(prototype, memberName, args[0]);\n };\n}\n/**\n * @hidden\n */\n\nfunction Reactive() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return Observe.apply(void 0, args);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction injectReactiveSubscribe(object) {\n object[\"subscribe\"] = function (name, callback) {\n this[name];\n getObserver(this, name).subscribe(callback);\n };\n\n object[\"unsubscribe\"] = function (name, callback) {\n var _this = this;\n\n if (!name) {\n keys(getObservers(this)).forEach(function (observerName) {\n _this.unsubscribe(observerName);\n });\n return;\n }\n\n if (!(name in this)) {\n return;\n }\n\n getObserver(this, name).unsubscribe(callback);\n };\n}\n/**\n * @description `ReactiveSubscribe` is a class decorator and adds `.subscribe` and `.unsubscribe` methods.\n * @category Reactive-Decorator\n * @see Observe\n * @example\n * ```ts\nimport { ReactiveSubscribe, Observe } from \"@cfcs/core\";\n\n@ReactiveSubscribe\nclass Component {\n @Observe value1 = 1;\n\n constructor() {\n requestAnimationFrame(() => {\n this.value1 = 2;\n });\n }\n}\n\ninterface Component extends ReactiveSubscribe<{\n value1: number;\n value2: number;\n}> {}\n\nconst component = new Component();\n\n// 1\nconsole.log(component.value1);\n\ncomponent.subscribe(\"value1\", nextValue => {\n // When the change event occurs => (2, 2)\n console.log(nextValue, component.value2);\n});\n```\n */\n\nfunction ReactiveSubscribe(Constructor) {\n var prototype = Constructor.prototype;\n injectReactiveSubscribe(prototype);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\nfunction makeReactiveObject(setup, all) {\n var result = isFunction(setup) ? setup() : setup;\n var reactiveObject = {};\n defineObservers(reactiveObject);\n keys(result).forEach(function (name) {\n var value = result[name];\n\n if (isObserver(value)) {\n setObserver(reactiveObject, name, value);\n } else {\n setObserver(reactiveObject, name, observe(value));\n }\n\n Observe(name)(reactiveObject, name);\n });\n injectReactiveSubscribe(reactiveObject);\n return reactiveObject;\n}\n/**\n * @description Make the return value of the corresponding object or function a reactive object.\n * @category Reactive\n * @param setup - The target object or function to which reactive is applied\n * @returns Makes all values into reactive objects.\n * @example\n * ```ts\n * import { reactive } from \"@cfcs/core\";\n *\n * const obj = reactive({\n * value1: 1,\n * value2: 2,\n * });\n *\n * obj.subscribe(\"value1\", value1 => {\n * console.log(value1);\n * });\n * obj.value1 = 2;\n * ```\n */\n\n\nfunction reactive(setup) {\n return makeReactiveObject(setup);\n}\n/**\n * @description Make the return value of the corresponding object or function a reactive object.\n * @category Reactive\n * @param setup - The target object or function to which reactive is applied\n * @returns Only the values to which observer is applied are objects to which reactive is applied.\n * @example\n * ```ts\n * import { partialReactive, observe } from \"@cfcs/core\";\n *\n * const value1 = observe(1);\n * const value2 = observe(2);\n * const obj = partialReactive({\n * value1,\n * value2,\n * });\n *\n * obj.subscribe(\"value1\", value1 => {\n * console.log(value1);\n * });\n * value1.current = 2;\n * ```\n */\n\nfunction partialReactive(setup) {\n return makeReactiveObject(setup);\n}\n/**\n * @description Creates a mutable ref object. You can access the `.current` value and detect the value change through `.subscribe`.\n * @category Reactive\n * @example\n * ```ts\n * import { observe } from \"@cfcs/core\";\n *\n * const ob1 = observe(1);\n *\n * ob1.subscribe(nextValue => {\n * console.log(nextValue);\n * });\n *\n * ob1.current = 2;\n * ```\n */\n\nfunction observe(defaultValue) {\n return new Observer(defaultValue);\n}\n/**\n * @hidden\n */\n\nfunction computed(computedCallback) {\n return new ComputedObserver(computedCallback);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction withReactiveMethods(ref, methods) {\n var obj = {};\n\n if (!methods) {\n return obj;\n }\n\n methods.forEach(function (name) {\n obj[name] = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var current = ref.current || ref.value;\n return current[name].apply(current, args);\n };\n });\n return obj;\n}\n/**\n * @hidden\n */\n\nfunction defineObservers(instance) {\n var observers = {};\n Object.defineProperty(instance, OBSERVERS_PATH, {\n get: function () {\n return observers;\n }\n });\n return observers;\n}\n/**\n * @hidden\n */\n\nfunction getObservers(instance, isComputed) {\n var _a, _b;\n\n if (!instance[OBSERVERS_PATH]) {\n defineObservers(instance);\n }\n\n var observers = instance[OBSERVERS_PATH];\n\n if (!isComputed) {\n var computedList = (_b = (_a = instance === null || instance === void 0 ? void 0 : instance.constructor) === null || _a === void 0 ? void 0 : _a.prototype) === null || _b === void 0 ? void 0 : _b[COMPUTED_PATH];\n\n if (computedList) {\n computedList.forEach(function (name) {\n if (!(name in observers) && name in instance) {\n instance[name];\n }\n });\n }\n }\n\n return observers;\n}\n/**\n * @hidden\n */\n\nfunction getObserver(instance, name, defaultValue) {\n var observers = getObservers(instance);\n\n if (!observers[name]) {\n observers[name] = observe(defaultValue);\n }\n\n return observers[name];\n}\n/**\n * @hidden\n */\n\nfunction setObserver(instance, name, observer) {\n var observers = getObservers(instance);\n observers[name] = observer;\n}\n/**\n * @description Whether that object is an observer instance\n * @category Reactive\n */\n\nfunction isObserver(val) {\n return val && isObject(val) && \"current\" in val && \"subscribe\" in val && \"unsubscribe\" in val;\n}\n/**\n * @description Whether the object is reactive\n * @category Reactive\n */\n\nfunction isReactive(val) {\n return val && !isObserver(val) && \"subscribe\" in val && \"unsubscribe\" in val;\n}\n\n/**\n * @category Reactive\n * @hidden\n */\n\nfunction adaptReactive(adapter, props) {\n var objectAdapter = isFunction(adapter) ? {\n setup: adapter\n } : adapter;\n\n function getProps() {\n var _a, _b, _c, _d, _e;\n\n return (_e = (_c = (_a = props === null || props === void 0 ? void 0 : props()) !== null && _a !== void 0 ? _a : (_b = objectAdapter.props) === null || _b === void 0 ? void 0 : _b.call(objectAdapter)) !== null && _c !== void 0 ? _c : (_d = objectAdapter.data) === null || _d === void 0 ? void 0 : _d.call(objectAdapter)) !== null && _e !== void 0 ? _e : {};\n }\n\n var eventEmitter = new Component();\n var mountedHooks = [];\n var initHooks = [];\n var destroyHooks = [];\n var onHooks = [];\n var instanceRef = {\n current: null\n };\n var offHooksList = [];\n var initialState = null;\n var eventNames = [];\n var methodNames = [];\n\n var onMounted = function (callback) {\n mountedHooks.push(callback);\n };\n\n var onInit = function (callback) {\n initHooks.push(callback);\n };\n\n var onDestroy = function (callback) {\n destroyHooks.push(callback);\n };\n\n var on = function (callback) {\n onHooks.push(callback);\n };\n\n var emit = function (eventName) {\n var params = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n params[_i - 1] = arguments[_i];\n }\n\n eventEmitter.trigger.apply(eventEmitter, __spreadArray([eventName], params, false));\n };\n\n var setInitialState = function (state) {\n initialState = state;\n };\n\n var setEvents = function (events) {\n eventNames = events;\n };\n\n var setMethods = function (methods) {\n methodNames = methods;\n };\n\n if (objectAdapter.setup) {\n instanceRef.current = objectAdapter.setup({\n getProps: getProps,\n setInitialState: setInitialState,\n setEvents: setEvents,\n setMethods: setMethods,\n onMounted: onMounted,\n onDestroy: onDestroy,\n onInit: onInit,\n emit: emit,\n on: on\n }) || null;\n }\n\n if (objectAdapter.created) {\n instanceRef.current = objectAdapter.created(getProps()) || null;\n }\n\n if (objectAdapter.events) {\n setEvents(objectAdapter.events);\n }\n\n if (objectAdapter.state) {\n setInitialState(objectAdapter.state);\n }\n\n if (objectAdapter.methods) {\n setMethods(objectAdapter.methods);\n }\n\n if (objectAdapter.mounted) {\n onMounted(objectAdapter.mounted);\n }\n\n if (objectAdapter.destroy) {\n destroyHooks.push(objectAdapter.destroy);\n }\n\n if (objectAdapter.init) {\n initHooks.push(objectAdapter.init);\n }\n\n if (objectAdapter.on) {\n onHooks.push(function (instance, eventName, listener) {\n var off = objectAdapter.on(instance, eventName, listener);\n return function () {\n var _a;\n\n off && off();\n (_a = objectAdapter.off) === null || _a === void 0 ? void 0 : _a.call(objectAdapter, instance, eventName, listener);\n };\n });\n }\n\n return {\n events: function () {\n return eventNames;\n },\n state: function () {\n var inst = instanceRef.current;\n\n if (initialState) {\n return initialState;\n }\n\n if (inst) {\n var observers_1 = getObservers(inst);\n setInitialState(keys(observers_1).reduce(function (prev, cur) {\n prev[cur] = observers_1[cur].current;\n return prev;\n }, {}));\n }\n\n return initialState || {};\n },\n instance: function () {\n return instanceRef.current;\n },\n mounted: function () {\n var props = getProps();\n mountedHooks.forEach(function (hook) {\n instanceRef.current = hook(props, instanceRef.current) || instanceRef.current;\n });\n },\n init: function () {\n // on events\n var instance = instanceRef.current;\n var props = getProps();\n offHooksList = eventNames.map(function (eventName) {\n var listener = function () {\n var _a;\n\n var params = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n\n (_a = eventEmitter).trigger.apply(_a, __spreadArray([eventName], params, false));\n };\n\n var instance = instanceRef.current;\n return onHooks.map(function (hook) {\n return hook(instance, eventName, listener);\n }).filter(Boolean);\n }); // init\n\n initHooks.forEach(function (hook) {\n hook(instance, props);\n });\n },\n destroy: function () {\n // off events\n offHooksList.forEach(function (offHooks) {\n offHooks.forEach(function (hook) {\n hook();\n });\n }); // destroy\n\n eventEmitter.off();\n var instance = instanceRef.current;\n var props = getProps();\n destroyHooks.forEach(function (hook) {\n hook(instance, props);\n });\n },\n methods: function () {\n return withReactiveMethods(instanceRef, methodNames);\n },\n on: function (eventName, listener) {\n eventEmitter.on(eventName, listener);\n },\n off: function (eventName, listener) {\n eventEmitter.off(eventName, listener);\n }\n };\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @description `Computed` is a property decorator.\n * Changes in computed state values are also recognized according to changes in observers used within the getter function.\n * You can detect its status through `.subscribe`.\n * @hidden\n * @category Reactive-Decorator\n * @see ReactiveSubscribe\n * @example\n * ```ts\nconst ob1 = observe(0);\nconst ob2 = observe(1);\n\n// When\n@ReactiveSubscribe\nclass TestComputed {\n @Computed\n get ob3() {\n return ob1.current + ob2.current;\n }\n}\nconst inst = new TestComputed();\n\ninst.subscribe(\"ob3\", ob3 => {\n console.log(ob3);\n});\n\nob1.current = 1;\n```\n */\n\nfunction Computed(prototype, memberName, attributes) {\n var get = attributes.get;\n\n function getComputed() {\n var observers = getObservers(this, true);\n\n if (!(memberName in observers)) {\n observers[memberName] = computed(get.bind(this));\n }\n\n return getObserver(this, memberName).current;\n }\n\n var nextAttributes = {\n configurable: true,\n get: getComputed\n };\n prototype[COMPUTED_PATH] || (prototype[COMPUTED_PATH] = []);\n var computedList = prototype[COMPUTED_PATH];\n\n if (computedList.indexOf(memberName) === -1) {\n computedList.push(memberName);\n }\n\n Object.defineProperty(prototype, memberName, nextAttributes);\n return nextAttributes;\n}\n\nexport { Computed, ComputedObserver, Observe, Observer, Reactive, ReactiveSubscribe, adaptReactive, camelize, computed, defineObservers, findTarget, getObserver, getObservers, injectReactiveSubscribe, isFunction, isObject, isObserver, isReactive, isString, keys, observe, partialReactive, reactive, setObserver, withClassMethods, withReactiveMethods };\n//# sourceMappingURL=cfcs.esm.js.map\n","import { adaptReactive, ReactiveObject, ReactiveSetupAdapter, reactive } from \"@cfcs/core\";\n\nimport Flicking from \"../Flicking\";\n\n// Check if Flicking has reached the first panel\nconst getIsReachStart = (flicking: Flicking) => !flicking.circular && flicking.index === 0;\n\n// Check if Flicking has reached the last panel\nconst getIsReachEnd = (flicking: Flicking) => !flicking.circular && flicking.index === flicking.panelCount - 1;\n\n// Get the total number of panels\nconst getTotalPanelCount = (flicking: Flicking) => flicking.panelCount;\n\n// Get the current active panel index\nconst getCurrentPanelIndex = (flicking: Flicking) => flicking.index;\n\n// Calculate the overall scroll progress percentage based on the current camera position\nconst getProgress = (flicking: Flicking) => {\n const cam = flicking.camera;\n\n const progressRatio = (cam.position - cam.range.min) / (cam.range.max - cam.range.min);\n\n const percent = Math.min(Math.max(progressRatio, 0), 1) * 100;\n\n return percent;\n};\n\n// Calculate the progress between panels including decimal values\nconst getIndexProgress = (flicking: Flicking) => {\n const cam = flicking.camera;\n const anchorPoints = cam.anchorPoints;\n const length = anchorPoints.length;\n const cameraPosition = cam.position;\n const isCircular = flicking.circularEnabled;\n let indexProgress = 0;\n\n const { min, max } = cam.range;\n const firstAnchorPoint = anchorPoints[0];\n const lastAnchorPoint = anchorPoints[length - 1];\n const distanceLastToFirst = max - lastAnchorPoint.position + (firstAnchorPoint.position - min);\n\n anchorPoints.some((anchorPoint, index) => {\n const anchorPosition = anchorPoint.position;\n const nextAnchorPoint = anchorPoints[index + 1];\n\n if (index === 0 && cameraPosition <= anchorPosition) {\n if (isCircular) {\n indexProgress = (cameraPosition - anchorPosition) / distanceLastToFirst;\n } else {\n indexProgress = (cameraPosition - anchorPosition) / anchorPoint.panel.size;\n }\n } else if (index === length - 1 && cameraPosition >= anchorPosition) {\n if (isCircular) {\n indexProgress = index + (cameraPosition - anchorPosition) / distanceLastToFirst;\n } else {\n indexProgress = index + (cameraPosition - anchorPosition) / anchorPoint.panel.size;\n }\n } else if (nextAnchorPoint && anchorPosition <= cameraPosition && cameraPosition <= nextAnchorPoint.position) {\n indexProgress = index + (cameraPosition - anchorPosition) / (nextAnchorPoint.position - anchorPosition);\n } else {\n return false;\n }\n return true;\n });\n\n return indexProgress;\n};\n\n/**\n * Reactive object type that combines state and methods for Flicking\n * @remarks\n * This type provides reactive state properties and methods that automatically update\n * when the Flicking instance state changes.\n * @see {@link https://naver.github.io/egjs-flicking/Demos#reactive-api-demo}\n * @example\n * ```jsx\n * const flickingRef = React.useRef(null);\n * const {\n * progress\n * } = useFlickingReactiveAPI(flickingRef);\n * ```\n */\nexport type FlickingReactiveObject = ReactiveObject<FlickingReactiveState & FlickingReactiveMethod>;\n\n/**\n * Reactive state properties for Flicking\n */\nexport interface FlickingReactiveState {\n /** Whether Flicking has reached the first panel */\n isReachStart: boolean;\n /** Whether Flicking has reached the last panel */\n isReachEnd: boolean;\n /** Total number of panels */\n totalPanelCount: number;\n /** Current active panel index */\n currentPanelIndex: number;\n /** Overall scroll progress percentage (0-100) */\n progress: number;\n /** Panel progress with decimal values */\n indexProgress: number;\n}\n\n/**\n * Reactive methods for Flicking\n */\nexport interface FlickingReactiveMethod {\n /**\n * Move to a specific panel index\n * @param i - Target panel index\n * @returns Promise that resolves when movement is complete\n */\n moveTo: (i: number) => Promise<void>;\n}\n\n/**\n * Data required for reactive API setup\n */\nexport interface FlickingReactiveData {\n /** Flicking instance to connect */\n flicking?: Flicking;\n /** Flicking options used for initialization */\n options?: FlickingReactiveAPIOptions;\n}\n\n/**\n * Options for Flicking reactive API that help optimize initial rendering in SSR scenarios\n * @remarks\n * These options allow you to set initial state values before the Flicking instance is fully initialized,\n * preventing unnecessary re-renders when the actual Flicking state is applied.\n * @example\n * ```js\n * const options = {\n * defaultIndex: 2,\n * totalPanelCount: 5\n * };\n * const reactiveObj = connectFlickingReactiveAPI(flicking, options);\n * ```\n */\nexport interface FlickingReactiveAPIOptions {\n /**\n * Initial panel index to start with. This sets the currentPanelIndex and indexProgress initial values.\n * @remarks\n * Also affects isReachStart and isReachEnd initial value setting.\n * @defaultValue 0\n */\n defaultIndex?: number;\n /**\n * Total number of panels in the Flicking instance. This sets the totalPanelCount initial value\n * @remarks\n * Helps prevent layout shifts during SSR hydration.\n * @defaultValue 0\n */\n totalPanelCount?: number;\n}\n\n/**\n * Internal reactive API adapter for Flicking that manages state and event listeners\n * @remarks\n * This adapter is used internally by framework-specific packages (react-flicking, vue-flicking, etc.)\n * to provide reactive API support. Users rarely need to use this directly.\n * @param onInit - Callback when reactive object is initialized\n * @param onDestroy - Callback when reactive object is destroyed\n * @param setMethods - Function to set available methods\n * @returns Reactive object with Flicking state and methods\n */\nconst flickingReactiveAPIAdapter: ReactiveSetupAdapter<\n FlickingReactiveObject,\n FlickingReactiveState,\n \"moveTo\",\n FlickingReactiveData\n> = ({ onInit, onDestroy, setMethods, getProps }) => {\n let flicking: Flicking | undefined;\n\n // Move to a specific panel index\n const moveTo = (i: number) => {\n if (flicking == null) {\n return Promise.reject(new Error(\"Flicking instance is not available\"));\n }\n if (flicking?.animating) {\n return Promise.resolve();\n }\n return flicking.moveTo(i);\n };\n setMethods([\"moveTo\"]);\n\n const options = getProps().options;\n\n // options를 고려하지 않고 초기값을 설정해도 동작에는 아무런 문제가 없으나, 이 시점의 초기값과 컴포넌트 init 단계에서의 초기값이 다르면 화면 리렌더링이 발생할 수 있으므로\n // 이렇게 미리 옵션을 통해서 예측할 수 있는 부분들은 맞춰둔다.\n const reactiveObj: FlickingReactiveObject = reactive({\n isReachStart: options?.defaultIndex ? options?.defaultIndex === 0 : true,\n isReachEnd:\n options?.totalPanelCount && options?.defaultIndex ? options.defaultIndex === options.totalPanelCount - 1 : false,\n totalPanelCount: options?.totalPanelCount ?? 0,\n currentPanelIndex: options?.defaultIndex ?? 0,\n progress: 0,\n indexProgress: options?.defaultIndex ?? 0,\n moveTo\n });\n\n // Update state when panel changes\n const onChanged = () => {\n if (flicking === undefined) return;\n\n reactiveObj.isReachStart = getIsReachStart(flicking);\n reactiveObj.isReachEnd = getIsReachEnd(flicking);\n reactiveObj.currentPanelIndex = getCurrentPanelIndex(flicking);\n };\n\n // Update state when panel count changes\n const onPanelChange = () => {\n if (flicking === undefined) return;\n\n onChanged();\n reactiveObj.totalPanelCount = getTotalPanelCount(flicking);\n };\n\n // Update progress when camera moves\n const onMove = () => {\n if (flicking === undefined) return;\n\n reactiveObj.progress = getProgress(flicking);\n reactiveObj.indexProgress = getIndexProgress(flicking);\n };\n\n onInit((inst, data) => {\n flicking = data.flicking;\n if (flicking === undefined) return;\n\n reactiveObj.isReachStart = getIsReachStart(flicking);\n reactiveObj.isReachEnd = getIsReachEnd(flicking);\n reactiveObj.currentPanelIndex = getCurrentPanelIndex(flicking);\n reactiveObj.progress = getProgress(flicking);\n\n reactiveObj.totalPanelCount = getTotalPanelCount(flicking);\n\n flicking?.on(\"changed\", onChanged);\n flicking?.on(\"panelChange\", onPanelChange);\n flicking?.on(\"move\", onMove);\n });\n\n onDestroy(() => {\n flicking?.off(\"changed\", onChanged);\n flicking?.off(\"panelChange\", onPanelChange);\n flicking?.off(\"move\", onMove);\n });\n\n return reactiveObj;\n};\n\n/**\n * Connect Flicking instance to reactive API\n * @param flicking - Flicking instance to connect\n * @param options - Flicking options\n * @returns Reactive object with Flicking state and methods\n * @example\n * ```js\n * import Flicking, { connectFlickingReactiveAPI } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking(\"#el\");\n * const reactiveObj = connectFlickingReactiveAPI(flicking);\n *\n * // Access reactive state\n * console.log(\"Current panel:\", reactiveObj.currentPanelIndex);\n * console.log(\"Progress:\", reactiveObj.progress + \"%\");\n * console.log(\"Is at start:\", reactiveObj.isReachStart);\n * console.log(\"Is at end:\", reactiveObj.isReachEnd);\n * console.log(\"Total panels:\", reactiveObj.totalPanelCount);\n * console.log(\"Index progress:\", reactiveObj.indexProgress);\n *\n * // Subscribe to state changes\n * reactiveObj.subscribe(\"currentPanelIndex\", (nextValue) => {\n * console.log(\"Panel changed to:\", nextValue);\n * });\n *\n * // Use reactive methods\n * reactiveObj.moveTo(2); // Move to third panel\n * ```\n */\nconst connectFlickingReactiveAPI = (\n flicking: Flicking,\n options?: FlickingReactiveAPIOptions\n): FlickingReactiveObject => {\n const obj = adaptReactive(flickingReactiveAPIAdapter, () => ({ flicking, options }));\n obj.mounted();\n const instance = obj.instance();\n obj.init();\n return instance;\n};\n\nexport { flickingReactiveAPIAdapter, connectFlickingReactiveAPI };\n"],"names":["ERROR.MESSAGE","ERROR.CODE","parseAlign","getProgress","range","ComponentEvent","STATE_TYPE","AXES.POSITION_KEY","AXES.EVENT","PanInput","flicking","Observer","props","instance"],"mappings":"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","x_google_ignoreList":[42]}
|
|
1
|
+
{"version":3,"file":"flicking.cjs.js","sources":["../src/constants/values.ts","../src/core/AnchorPoint.ts","../src/error/codes.ts","../src/utils.ts","../src/error/FlickingError.ts","../src/event/names.ts","../src/camera/mode/CameraMode.ts","../src/camera/mode/BoundCameraMode.ts","../src/camera/mode/CircularCameraMode.ts","../src/camera/mode/LinearCameraMode.ts","../src/camera/Camera.ts","../src/constants/internal.ts","../src/control/states/State.ts","../src/control/states/AnimatingState.ts","../src/control/states/DisabledState.ts","../src/control/states/DraggingState.ts","../src/control/states/HoldingState.ts","../src/control/states/IdleState.ts","../src/control/StateMachine.ts","../src/control/AxesController.ts","../src/control/Control.ts","../src/control/FreeControl.ts","../src/control/SnapControl.ts","../src/control/StrictControl.ts","../src/core/AutoResizer.ts","../src/core/panel/provider/VanillaElementProvider.ts","../src/core/panel/provider/VirtualElementProvider.ts","../src/core/Viewport.ts","../src/core/VirtualManager.ts","../src/renderer/Renderer.ts","../src/renderer/ExternalRenderer.ts","../src/renderer/VanillaRenderer.ts","../src/core/panel/Panel.ts","../src/renderer/strategy/NormalRenderingStrategy.ts","../src/core/panel/VirtualPanel.ts","../src/renderer/strategy/VirtualRenderingStrategy.ts","../src/Flicking.ts","../src/CrossFlicking.ts","../src/cfc/getDefaultCameraTransform.ts","../src/cfc/getRenderingPanels.ts","../src/cfc/sync.ts","../src/cfc/withFlickingMethods.ts","../../../node_modules/.pnpm/@cfcs+core@0.1.0/node_modules/@cfcs/core/dist/cfcs.esm.js","../src/reactive/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * An object with all possible predefined literal string for the {@link Flicking.align | align} option\n */\nexport const ALIGN = {\n /** left/top align */\n PREV: \"prev\",\n /** center align */\n CENTER: \"center\",\n /** right/bottom align */\n NEXT: \"next\"\n} as const;\n\n/**\n * An object of directions\n */\nexport const DIRECTION = {\n /** \"left\" when {@link Flicking.horizontal | horizontal} is true, and \"top\" when {@link Flicking.horizontal | horizontal} is false */\n PREV: \"PREV\",\n /** \"right\" when {@link Flicking.horizontal | horizontal} is true, and \"bottom\" when {@link Flicking.horizontal | horizontal} is false */\n NEXT: \"NEXT\",\n /** This value usually means it's the same position */\n NONE: null\n} as const;\n\n/**\n * An object with all possible {@link Flicking.moveType | moveType}s\n */\nexport const MOVE_TYPE = {\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link SnapControl} as a Flicking's {@link Flicking.control | control} */\n SNAP: \"snap\",\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link FreeControl} as a Flicking's {@link Flicking.control | control} */\n FREE_SCROLL: \"freeScroll\",\n /** Flicking's {@link Flicking.moveType | moveType} that enables {@link StrictControl} as a Flicking's {@link Flicking.control | control} */\n STRICT: \"strict\"\n} as const;\n\nexport const CLASS = {\n VIEWPORT: \"flicking-viewport\",\n CAMERA: \"flicking-camera\",\n VERTICAL: \"vertical\",\n HIDDEN: \"flicking-hidden\",\n DEFAULT_VIRTUAL: \"flicking-panel\"\n};\n\n/**\n * An object with all possible {@link Flicking.circularFallback | circularFallback}s\n */\nexport const CIRCULAR_FALLBACK = {\n /** \"linear\" */\n LINEAR: \"linear\",\n /** \"bound\" */\n BOUND: \"bound\"\n} as const;\n\n/**\n * An object for identifying {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element(`.flicking-camera`)\n */\nexport const ORDER = {\n /** \"ltr\" */\n LTR: \"ltr\",\n /** \"rtl\" */\n RTL: \"rtl\"\n} as const;\n\n/**\n * An object that contains the direction that {@link Flicking} is moving\n */\nexport const MOVE_DIRECTION = {\n /** horizontal */\n HORIZONTAL: \"horizontal\",\n /** vertical */\n VERTICAL: \"vertical\"\n} as const;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Panel from \"./panel/Panel\";\n\n/**\n * Options for creating an AnchorPoint\n */\nexport interface AnchorPointOptions {\n /** Index of AnchorPoint */\n index: number;\n /** Position of AnchorPoint */\n position: number;\n /** A {@link Panel} instance AnchorPoint is referencing to */\n panel: Panel;\n}\n\n/**\n * A data component that has actual position where the camera should be stopped at\n */\nclass AnchorPoint {\n private _index: number;\n private _pos: number;\n private _panel: Panel;\n\n /**\n * Index of AnchorPoint\n * @readonly\n */\n public get index(): number {\n return this._index;\n }\n /**\n * Position of AnchorPoint\n * @readonly\n */\n public get position(): number {\n return this._pos;\n }\n /**\n * A {@link Panel} instance AnchorPoint is referencing to\n * @readonly\n */\n public get panel(): Panel {\n return this._panel;\n }\n\n /**\n * @param options - {@link AnchorPointOptions}\n */\n public constructor(options: AnchorPointOptions) {\n const { index, position, panel } = options;\n\n this._index = index;\n this._pos = position;\n this._panel = panel;\n }\n}\n\nexport default AnchorPoint;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n/* eslint-disable @typescript-eslint/restrict-template-expressions */\n\nimport type { FlickingErrors } from \"./types\";\n\ntype ErrorKey = keyof FlickingErrors;\n\n/**\n * Internal error catalog containing all error information.\n * @remarks\n * This is the single source of truth for all error codes and messages.\n * Use {@link ERROR_CODE} and {@link MESSAGE} exports for public access.\n * @privateRemarks\n * ## How to add a new error code\n *\n * 1. **Add to this `errors` object:**\n * ```typescript\n * NEW_ERROR_NAME: {\n * code: 15, // next available number\n * message: \"Error message\" // or function for parameterized messages\n * }\n * ```\n *\n * 2. **Document in FlickingErrors** (types.ts):\n * - Add property with same name and type signature\n * - Write comprehensive TSDoc with @remarks, @example, @see tags\n * - Include: description, common causes, solutions, wrong/correct examples\n *\n * 3. **Verify:**\n * - `pnpm build` - check TypeScript compilation\n * - `pnpm api-docs:docusaurus` - generate documentation\n * - Check packages/docs/docs/api/interfaces/FlickingErrors.mdx\n *\n * Note: `CODE` and `MESSAGE` exports are auto-generated via reduce, no manual updates needed.\n * @internal\n */\nconst errors: FlickingErrors = {\n WRONG_TYPE: {\n code: 0,\n message: (wrongVal, correctTypes) =>\n `${wrongVal}(${typeof wrongVal}) is not a ${correctTypes.map(type => `\"${type}\"`).join(\" or \")}.`\n },\n ELEMENT_NOT_FOUND: {\n code: 1,\n message: selector => `Element with selector \"${selector}\" not found.`\n },\n VAL_MUST_NOT_NULL: {\n code: 2,\n message: (val, name) => `${name} should be provided. Given: ${val}`\n },\n NOT_ATTACHED_TO_FLICKING: {\n code: 3,\n message: 'This module is not attached to the Flicking instance. \"init()\" should be called first.'\n },\n WRONG_OPTION: {\n code: 4,\n message: (optionName, val) => `Option \"${optionName}\" is not in correct format, given: ${val}`\n },\n INDEX_OUT_OF_RANGE: {\n code: 5,\n message: (val, min, max) => `Index \"${val}\" is out of range: should be between ${min} and ${max}.`\n },\n POSITION_NOT_REACHABLE: {\n code: 6,\n message: position => `Position \"${position}\" is not reachable.`\n },\n TRANSFORM_NOT_SUPPORTED: {\n code: 7,\n message: \"Browser does not support CSS transform.\"\n },\n STOP_CALLED_BY_USER: {\n code: 8,\n message: \"Event stop() is called by user.\"\n },\n ANIMATION_INTERRUPTED: {\n code: 9,\n message: \"Animation is interrupted by user input.\"\n },\n ANIMATION_ALREADY_PLAYING: {\n code: 10,\n message: \"Animation is already playing.\"\n },\n NOT_ALLOWED_IN_FRAMEWORK: {\n code: 11,\n message: \"This behavior is not allowed in the frameworks like React, Vue, or Angular.\"\n },\n NOT_INITIALIZED: {\n code: 12,\n message: \"Flicking is not initialized yet, call init() first.\"\n },\n NO_ACTIVE: {\n code: 13,\n message: \"There's no active panel that Flicking has selected. This may be due to the absence of any panels.\"\n },\n NOT_ALLOWED_IN_VIRTUAL: {\n code: 14,\n message: \"This behavior is not allowed when the virtual option is enabled\"\n }\n};\n\n/**\n * Error codes of {@link FlickingError}.\n * @remarks\n * Each error code represents a specific error condition that can occur during Flicking's lifecycle.\n * Use these codes to identify and handle errors programmatically.\n *\n * For detailed documentation of each error code, see {@link FlickingErrors}.\n * @example\n * ```typescript\n * import {FlickingError, ERROR_CODE} from \"@egjs/flicking\";\n *\n * try {\n * flicking.moveTo(999);\n * } catch (err) {\n * if (err instancof FlickingError && err.code === ERROR_CODE.INDEX_OUT_OF_RANGE) {\n * console.log(err.message);\n * }\n * }\n * ```\n * @public\n * @see {@link FlickingErrors} for detailed documentation of each error code\n */\nexport const CODE = (Object.keys(errors) as ErrorKey[]).reduce(\n (acc, key) => {\n acc[key] = errors[key].code;\n return acc;\n },\n {} as Record<ErrorKey, number>\n) as { [K in ErrorKey]: FlickingErrors[K][\"code\"] };\n\n/**\n * Error message generators for {@link FlickingError}.\n * @remarks\n * These functions generate human-readable error messages for each error code.\n * Used internally by Flicking to create {@link FlickingError} instances with\n * contextual information.\n * @internal\n */\nexport const MESSAGE = (Object.keys(errors) as ErrorKey[]).reduce(\n (acc, key) => {\n acc[key] = errors[key].message;\n return acc;\n },\n {} as Record<string, any>\n) as { [K in ErrorKey]: FlickingErrors[K][\"message\"] };\n\n/**\n * Alias for {@link CODE}.\n * @remarks\n * Exported as `ERROR_CODE` for semantic clarity when importing.\n * @example\n * ```typescript\n * import { ERROR_CODE } from \"@egjs/flicking\";\n *\n * if (err.code === ERROR_CODE.INDEX_OUT_OF_RANGE) {\n * // Handle index error\n * }\n * ```\n * @public\n */\nexport { CODE as ERROR_CODE };\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ALIGN, DIRECTION } from \"./constants/values\";\nimport * as ERROR from \"./error/codes\";\nimport FlickingError from \"./error/FlickingError\";\nimport Flicking, { FlickingOptions } from \"./Flicking\";\nimport { ElementLike } from \"./types/external\";\nimport { LiteralUnion, Merged, ValueOf } from \"./types/internal\";\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const merge = <From extends object, To extends object>(target: From, ...sources: To[]): Merged<From, To> => {\n sources.forEach(source => {\n Object.keys(source).forEach(key => {\n target[key] = source[key] as unknown;\n });\n });\n\n return target as Merged<From, To>;\n};\n\nexport const getElement = (el: HTMLElement | string | null, parent?: HTMLElement): HTMLElement => {\n let targetEl: HTMLElement | null = null;\n\n if (isString(el)) {\n const parentEl = parent ? parent : document;\n const queryResult = parentEl.querySelector(el);\n if (!queryResult) {\n throw new FlickingError(ERROR.MESSAGE.ELEMENT_NOT_FOUND(el), ERROR.CODE.ELEMENT_NOT_FOUND);\n }\n targetEl = queryResult as HTMLElement;\n } else if (el && el.nodeType === Node.ELEMENT_NODE) {\n targetEl = el;\n }\n\n if (!targetEl) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_TYPE(el, [\"HTMLElement\", \"string\"]), ERROR.CODE.WRONG_TYPE);\n }\n\n return targetEl;\n};\n\nexport const checkExistence = (value: any, nameOnErrMsg: string) => {\n if (value == null) {\n throw new FlickingError(ERROR.MESSAGE.VAL_MUST_NOT_NULL(value, nameOnErrMsg), ERROR.CODE.VAL_MUST_NOT_NULL);\n }\n};\n\nexport const clamp = (x: number, min: number, max: number) => Math.max(Math.min(x, max), min);\n\nexport const getFlickingAttached = (val: Flicking | null): Flicking => {\n if (!val) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ATTACHED_TO_FLICKING, ERROR.CODE.NOT_ATTACHED_TO_FLICKING);\n }\n\n return val;\n};\n\nexport const toArray = <T>(iterable: ArrayLike<T>): T[] => [].slice.call(iterable) as T[];\n\nexport const parseAlign = (align: LiteralUnion<ValueOf<typeof ALIGN>> | number, size: number): number => {\n let alignPoint: number | null;\n if (isString(align)) {\n switch (align) {\n case ALIGN.PREV:\n alignPoint = 0;\n break;\n case ALIGN.CENTER:\n alignPoint = 0.5 * size;\n break;\n case ALIGN.NEXT:\n alignPoint = size;\n break;\n default:\n alignPoint = parseArithmeticSize(align, size);\n if (alignPoint == null) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"align\", align), ERROR.CODE.WRONG_OPTION);\n }\n }\n } else {\n alignPoint = align as number;\n }\n\n return alignPoint;\n};\n\nexport const parseBounce = (bounce: FlickingOptions[\"bounce\"], size: number): number[] => {\n let parsedBounce: Array<number | null>;\n\n if (Array.isArray(bounce)) {\n parsedBounce = (bounce as string[]).map(val => parseArithmeticSize(val, size));\n } else {\n const parsedVal = parseArithmeticSize(bounce, size);\n\n parsedBounce = [parsedVal, parsedVal];\n }\n\n return parsedBounce.map(val => {\n if (val == null) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"bounce\", bounce), ERROR.CODE.WRONG_OPTION);\n }\n return val;\n });\n};\n\nexport const parseArithmeticSize = (cssValue: number | string, base: number): number | null => {\n const parsed = parseArithmeticExpression(cssValue);\n\n if (parsed == null) return null;\n\n return parsed.percentage * base + parsed.absolute;\n};\n\nexport const parseArithmeticExpression = (\n cssValue: number | string\n): { percentage: number; absolute: number } | null => {\n const cssRegex = /(?:(\\+|-)\\s*)?(\\d+(?:\\.\\d+)?(%|px)?)/g;\n\n if (typeof cssValue === \"number\") {\n return { percentage: 0, absolute: cssValue };\n }\n\n const parsed = {\n percentage: 0,\n absolute: 0\n };\n let idx = 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 const 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 null;\n }\n\n const signMultiplier = sign === \"+\" ? 1 : -1;\n\n if (unit === \"%\") {\n parsed.percentage += signMultiplier * (parsedValue / 100);\n } else {\n parsed.absolute += signMultiplier * parsedValue;\n }\n\n // Match next occurrence\n ++idx;\n matchResult = cssRegex.exec(cssValue);\n }\n\n // None-matched\n if (idx === 0) {\n return null;\n }\n\n return parsed;\n};\n\nexport const parseCSSSizeValue = (val: string | number): string => (isString(val) ? val : `${val}px`);\n\nexport const parsePanelAlign = (align: FlickingOptions[\"align\"]) =>\n typeof align === \"object\" ? (align as { panel: string | number }).panel : align;\n\nexport const getDirection = (start: number, end: number): ValueOf<typeof DIRECTION> => {\n if (start === end) return DIRECTION.NONE;\n return start < end ? DIRECTION.NEXT : DIRECTION.PREV;\n};\n\nexport const 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 if (el && el.nodeType === Node.ELEMENT_NODE) {\n elements.push(el);\n } else {\n throw new FlickingError(ERROR.MESSAGE.WRONG_TYPE(el, [\"HTMLElement\", \"string\"]), ERROR.CODE.WRONG_TYPE);\n }\n });\n\n return elements;\n};\n\nexport const getMinusCompensatedIndex = (idx: number, max: number) =>\n idx < 0 ? clamp(idx + max, 0, max) : clamp(idx, 0, max);\n\nexport const includes = <T>(array: T[], target: any): target is T => {\n for (const val of array) {\n if (val === target) return true;\n }\n return false;\n};\n\nexport const isString = (val: any): val is string => typeof val === \"string\";\n\nexport const circulatePosition = (pos: number, min: number, max: number) => {\n const size = max - min;\n\n if (pos < min) {\n const offset = (min - pos) % size;\n pos = max - offset;\n } else if (pos > max) {\n const offset = (pos - max) % size;\n pos = min + offset;\n }\n\n return pos;\n};\n\nexport const find = <T>(array: T[], checker: (val: T) => boolean): T | null => {\n for (const val of array) {\n if (checker(val)) {\n return val;\n }\n }\n\n return null;\n};\n\nexport const findRight = <T>(array: T[], checker: (val: T) => boolean): T | null => {\n for (let idx = array.length - 1; idx >= 0; idx--) {\n const val = array[idx];\n if (checker(val)) {\n return val;\n }\n }\n\n return null;\n};\n\nexport const findIndex = <T>(array: T[], checker: (val: T) => boolean): number => {\n for (let idx = 0; idx < array.length; idx++) {\n if (checker(array[idx])) {\n return idx;\n }\n }\n\n return -1;\n};\n\nexport const getProgress = (pos: number, prev: number, next: number) => (pos - prev) / (next - prev);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\nexport const getStyle = (el: HTMLElement): CSSStyleDeclaration => {\n if (!el) {\n return {} as CSSStyleDeclaration;\n }\n return window.getComputedStyle(el) || ((el as any).currentStyle as CSSStyleDeclaration);\n};\n\nexport const setSize = (\n el: HTMLElement,\n {\n width,\n height\n }: Partial<{\n width: number | string;\n height: number | string;\n }>\n) => {\n if (!el) {\n return;\n }\n\n if (width != null) {\n if (isString(width)) {\n el.style.width = width;\n } else {\n el.style.width = `${width}px`;\n }\n }\n if (height != null) {\n if (isString(height)) {\n el.style.height = height;\n } else {\n el.style.height = `${height}px`;\n }\n }\n};\n\nexport const isBetween = (val: number, min: number, max: number) => val >= min && val <= max;\n\nexport const circulateIndex = (index: number, max: number): number => {\n if (index >= max) {\n return index % max;\n } else if (index < 0) {\n return getMinusCompensatedIndex(((index + 1) % max) - 1, max);\n } else {\n return index;\n }\n};\n\nexport const range = (end: number): number[] => {\n const arr = new Array(end);\n\n for (let i = 0; i < end; i++) {\n arr[i] = i;\n }\n\n return arr;\n};\n\nexport const getElementSize = ({\n el,\n horizontal,\n useFractionalSize,\n useOffset,\n style\n}: {\n el: HTMLElement;\n horizontal: boolean;\n useFractionalSize: boolean;\n useOffset: boolean;\n style: CSSStyleDeclaration;\n}): number => {\n let size = 0;\n if (useFractionalSize) {\n const baseSize = parseFloat(horizontal ? style.width : style.height) || 0;\n const isBorderBoxSizing = style.boxSizing === \"border-box\";\n const border = horizontal\n ? parseFloat(style.borderLeftWidth || \"0\") + parseFloat(style.borderRightWidth || \"0\")\n : parseFloat(style.borderTopWidth || \"0\") + parseFloat(style.borderBottomWidth || \"0\");\n\n if (isBorderBoxSizing) {\n size = useOffset ? baseSize : baseSize - border;\n } else {\n const padding = horizontal\n ? parseFloat(style.paddingLeft || \"0\") + parseFloat(style.paddingRight || \"0\")\n : parseFloat(style.paddingTop || \"0\") + parseFloat(style.paddingBottom || \"0\");\n\n size = useOffset ? baseSize + padding + border : baseSize + padding;\n }\n } else {\n const sizeStr = horizontal ? \"Width\" : \"Height\";\n\n size = useOffset ? el[`offset${sizeStr}`] : el[`client${sizeStr}`];\n }\n\n return Math.max(size, 0);\n};\n\nexport const setPrototypeOf =\n Object.setPrototypeOf ||\n ((obj, proto) => {\n obj.__proto__ = proto;\n return obj;\n });\n\nexport const camelize = (str: string): string => {\n return str.replace(/[\\s-_]([a-z])/g, (all, letter) => letter.toUpperCase());\n};\n\nexport const getDataAttributes = (element: HTMLElement, attributePrefix: string): Record<string, string> => {\n const dataAttributes: Record<string, string> = {};\n const attributes = element.attributes;\n const length = attributes.length;\n\n for (let i = 0; i < length; ++i) {\n const attribute = attributes[i];\n const { name, value } = attribute;\n if (name.indexOf(attributePrefix) === -1) {\n continue;\n }\n dataAttributes[camelize(name.replace(attributePrefix, \"\"))] = value;\n }\n\n return dataAttributes;\n};\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { setPrototypeOf } from \"../utils\";\n\n/**\n * Special type of known error that {@link Flicking} throws.\n * @remarks\n * see {@link FlickingErrors} for possible error codes and explantaion\n * @example\n * ```ts\n * import Flicking, { FlickingError, ERROR_CODES } from \"@egjs/flicking\";\n * try {\n * const flicking = new Flicking(\".flicking-viewport\")\n * } catch (e) {\n * if (e instanceof FlickingError && e.code === ERROR_CODES.ELEMENT_NOT_FOUND) {\n * console.error(e.message)\n * }\n * }\n * ```\n */\nclass FlickingError extends Error {\n public code: number;\n\n /**\n * @param message - Error message\n * @param code - Error code\n */\n public constructor(message: string, code: number) {\n super(message);\n\n setPrototypeOf(this, FlickingError.prototype);\n this.name = \"FlickingError\";\n this.code = code;\n }\n}\n\nexport default FlickingError;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\n/**\n * Event type object with event name strings of {@link Flicking}\n * @example\n * ```ts\n * import { EVENTS } from \"@egjs/flicking\";\n * EVENTS.MOVE_START; // \"moveStart\"\n * ```\n */\nexport const EVENTS = {\n /** ready event */\n READY: \"ready\",\n /** beforeResize event */\n BEFORE_RESIZE: \"beforeResize\",\n /** afterResize event */\n AFTER_RESIZE: \"afterResize\",\n /** holdStart event */\n HOLD_START: \"holdStart\",\n /** holdEnd event */\n HOLD_END: \"holdEnd\",\n /** moveStart event */\n MOVE_START: \"moveStart\",\n /** move event */\n MOVE: \"move\",\n /** moveEnd event */\n MOVE_END: \"moveEnd\",\n /** willChange event */\n WILL_CHANGE: \"willChange\",\n /** changed event */\n CHANGED: \"changed\",\n /** willRestore event */\n WILL_RESTORE: \"willRestore\",\n /** restored event */\n RESTORED: \"restored\",\n /** select event */\n SELECT: \"select\",\n /** needPanel event */\n NEED_PANEL: \"needPanel\",\n /** visibleChange event */\n VISIBLE_CHANGE: \"visibleChange\",\n /** reachEdge event */\n REACH_EDGE: \"reachEdge\",\n /**\n * panelChange event\n * @since 4.1.0\n */\n PANEL_CHANGE: \"panelChange\"\n} as const;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport Flicking from \"../../Flicking\";\nimport { clamp } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\n/**\n * A mode of camera\n */\nabstract class CameraMode {\n protected _flicking: Flicking;\n\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n }\n\n public abstract checkAvailability(): boolean;\n public abstract getRange(): CameraRange;\n\n public getAnchors(): AnchorPoint[] {\n const panels = this._flicking.renderer.panels;\n\n return panels.map(\n (panel, index) =>\n new AnchorPoint({\n index,\n position: panel.position,\n panel\n })\n );\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const anchors = this._flicking.camera.anchorPoints;\n const anchorsIncludingPosition = anchors.filter(anchor => anchor.panel.includePosition(position, true));\n\n return anchorsIncludingPosition.reduce((nearest: AnchorPoint | null, anchor) => {\n if (!nearest) return anchor;\n\n return Math.abs(nearest.position - position) < Math.abs(anchor.position - position) ? nearest : anchor;\n }, null);\n }\n\n public findNearestAnchor(position: number): AnchorPoint | null {\n const anchors = this._flicking.camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n let prevDist = Infinity;\n for (let anchorIdx = 0; anchorIdx < anchors.length; anchorIdx++) {\n const anchor = anchors[anchorIdx];\n const dist = Math.abs(anchor.position - position);\n\n if (dist > prevDist) {\n // Return previous anchor\n return anchors[anchorIdx - 1];\n }\n\n prevDist = dist;\n }\n\n // Return last anchor\n return anchors[anchors.length - 1];\n }\n\n public clampToReachablePosition(position: number): number {\n const camera = this._flicking.camera;\n const range = camera.range;\n\n return clamp(position, range.min, range.max);\n }\n\n public getCircularOffset(): number {\n return 0;\n }\n\n public canReach(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const range = camera.range;\n\n if (panel.removed) return false;\n\n const panelPos = panel.position;\n\n return panelPos >= range.min && panelPos <= range.max;\n }\n\n public canSee(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const visibleRange = camera.visibleRange;\n // Should not include margin, as we don't declare what the margin is visible as what the panel is visible.\n return panel.isVisibleOnRange(visibleRange.min, visibleRange.max);\n }\n}\n\nexport default CameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport { parseAlign } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\nclass BoundCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n if (!firstPanel || !lastPanel) {\n return false;\n }\n\n const viewportSize = flicking.camera.size;\n const firstPanelPrev = firstPanel.range.min;\n const lastPanelNext = lastPanel.range.max;\n const panelAreaSize = lastPanelNext - firstPanelPrev;\n const isBiggerThanViewport = viewportSize < panelAreaSize;\n\n return isBiggerThanViewport;\n }\n\n public getRange(): CameraRange {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const alignPos = flicking.camera.alignPosition;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n if (!firstPanel || !lastPanel) {\n return { min: 0, max: 0 };\n }\n\n const viewportSize = flicking.camera.size;\n const firstPanelPrev = firstPanel.range.min;\n const lastPanelNext = lastPanel.range.max;\n const panelAreaSize = lastPanelNext - firstPanelPrev;\n const isBiggerThanViewport = viewportSize < panelAreaSize;\n\n const firstPos = firstPanelPrev + alignPos;\n const lastPos = lastPanelNext - viewportSize + alignPos;\n\n if (isBiggerThanViewport) {\n return { min: firstPos, max: lastPos };\n } else {\n const align = flicking.camera.align;\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n const pos = firstPos + parseAlign(alignVal, lastPos - firstPos);\n\n return { min: pos, max: pos };\n }\n }\n\n public getAnchors(): AnchorPoint[] {\n const flicking = this._flicking;\n const camera = flicking.camera;\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n return [];\n }\n\n const range = flicking.camera.range;\n const reachablePanels = panels.filter(panel => camera.canReach(panel));\n\n if (reachablePanels.length > 0) {\n const shouldPrependBoundAnchor = reachablePanels[0].position !== range.min;\n const shouldAppendBoundAnchor = reachablePanels[reachablePanels.length - 1].position !== range.max;\n const indexOffset = shouldPrependBoundAnchor ? 1 : 0;\n\n const newAnchors = reachablePanels.map(\n (panel, idx) =>\n new AnchorPoint({\n index: idx + indexOffset,\n position: panel.position,\n panel\n })\n );\n\n if (shouldPrependBoundAnchor) {\n newAnchors.splice(\n 0,\n 0,\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: panels[reachablePanels[0].index - 1]\n })\n );\n }\n\n if (shouldAppendBoundAnchor) {\n newAnchors.push(\n new AnchorPoint({\n index: newAnchors.length,\n position: range.max,\n panel: panels[reachablePanels[reachablePanels.length - 1].index + 1]\n })\n );\n }\n\n return newAnchors;\n } else if (range.min !== range.max) {\n // There're more than 2 panels\n const nearestPanelAtMin = this._findNearestPanel(range.min, panels);\n const panelAtMin = nearestPanelAtMin.index === panels.length - 1 ? nearestPanelAtMin.prev()! : nearestPanelAtMin;\n const panelAtMax = panelAtMin.next()!;\n\n return [\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: panelAtMin\n }),\n new AnchorPoint({\n index: 1,\n position: range.max,\n panel: panelAtMax\n })\n ];\n } else {\n return [\n new AnchorPoint({\n index: 0,\n position: range.min,\n panel: this._findNearestPanel(range.min, panels)\n })\n ];\n }\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const range = camera.range;\n const anchors = camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n if (position <= range.min) {\n return anchors[0];\n } else if (position >= range.max) {\n return anchors[anchors.length - 1];\n } else {\n return super.findAnchorIncludePosition(position);\n }\n }\n\n /**\n * @internal\n */\n private _findNearestPanel(pos: number, panels: Panel[]): Panel {\n let prevDist = Infinity;\n for (let panelIdx = 0; panelIdx < panels.length; panelIdx++) {\n const panel = panels[panelIdx];\n const dist = Math.abs(panel.position - pos);\n\n if (dist > prevDist) {\n // Return previous anchor\n return panels[panelIdx - 1];\n }\n\n prevDist = dist;\n }\n\n // Return last anchor\n return panels[panels.length - 1];\n }\n}\n\nexport default BoundCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { DIRECTION } from \"../../constants/values\";\nimport AnchorPoint from \"../../core/AnchorPoint\";\nimport Panel from \"../../core/panel/Panel\";\nimport { circulatePosition } from \"../../utils\";\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\n/**\n * A {@link Camera} mode that connects the last panel and the first panel, enabling continuous loop\n */\nclass CircularCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n\n if (panels.length <= 0) {\n return false;\n }\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n const firstPanelPrev = firstPanel.range.min - firstPanel.margin.prev;\n const lastPanelNext = lastPanel.range.max + lastPanel.margin.next;\n\n const visibleSize = flicking.camera.size;\n const panelSizeSum = lastPanelNext - firstPanelPrev;\n\n const canSetCircularMode = panels.every(panel => panelSizeSum - panel.size >= visibleSize);\n\n return canSetCircularMode;\n }\n\n public getRange(): CameraRange {\n const flicking = this._flicking;\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n return { min: 0, max: 0 };\n }\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n const firstPanelPrev = firstPanel.range.min - firstPanel.margin.prev;\n const lastPanelNext = lastPanel.range.max + lastPanel.margin.next;\n\n return { min: firstPanelPrev, max: lastPanelNext };\n }\n\n public getAnchors(): AnchorPoint[] {\n const flicking = this._flicking;\n const panels = flicking.renderer.panels;\n\n return panels.map(\n (panel, index) =>\n new AnchorPoint({\n index,\n position: panel.position,\n panel\n })\n );\n }\n\n public findNearestAnchor(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const anchors = camera.anchorPoints;\n\n if (anchors.length <= 0) return null;\n\n const camRange = camera.range;\n let minDist = Infinity;\n let minDistIndex = -1;\n for (let anchorIdx = 0; anchorIdx < anchors.length; anchorIdx++) {\n const anchor = anchors[anchorIdx];\n const dist = Math.min(\n Math.abs(anchor.position - position),\n Math.abs(anchor.position - camRange.min + camRange.max - position),\n Math.abs(position - camRange.min + camRange.max - anchor.position)\n );\n\n if (dist < minDist) {\n minDist = dist;\n minDistIndex = anchorIdx;\n }\n }\n\n // Return last anchor\n return anchors[minDistIndex];\n }\n\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n const camera = this._flicking.camera;\n const range = camera.range;\n const anchors = camera.anchorPoints;\n const rangeDiff = camera.rangeDiff;\n const anchorCount = anchors.length;\n const positionInRange = circulatePosition(position, range.min, range.max);\n\n let anchorInRange: AnchorPoint | null = super.findAnchorIncludePosition(positionInRange);\n\n if (anchorCount > 0 && (position === range.min || position === range.max)) {\n const possibleAnchors = [\n anchorInRange,\n new AnchorPoint({\n index: 0,\n position: anchors[0].position + rangeDiff,\n panel: anchors[0].panel\n }),\n new AnchorPoint({\n index: anchorCount - 1,\n position: anchors[anchorCount - 1].position - rangeDiff,\n panel: anchors[anchorCount - 1].panel\n })\n ].filter(anchor => !!anchor) as AnchorPoint[];\n\n anchorInRange = possibleAnchors.reduce((nearest: AnchorPoint | null, anchor) => {\n if (!nearest) return anchor;\n\n return Math.abs(nearest.position - position) < Math.abs(anchor.position - position) ? nearest : anchor;\n }, null);\n }\n\n if (!anchorInRange) return null;\n\n if (position < range.min) {\n const loopCount = -Math.floor((range.min - position) / rangeDiff) - 1;\n\n return new AnchorPoint({\n index: anchorInRange.index,\n position: anchorInRange.position + rangeDiff * loopCount,\n panel: anchorInRange.panel\n });\n } else if (position > range.max) {\n const loopCount = Math.floor((position - range.max) / rangeDiff) + 1;\n\n return new AnchorPoint({\n index: anchorInRange.index,\n position: anchorInRange.position + rangeDiff * loopCount,\n panel: anchorInRange.panel\n });\n }\n\n return anchorInRange;\n }\n\n public getCircularOffset(): number {\n const flicking = this._flicking;\n const camera = flicking.camera;\n\n if (!camera.circularEnabled) return 0;\n\n const toggled = flicking.panels.filter(panel => panel.toggled);\n const toggledPrev = toggled.filter(panel => panel.toggleDirection === DIRECTION.PREV);\n const toggledNext = toggled.filter(panel => panel.toggleDirection === DIRECTION.NEXT);\n\n return this._calcPanelAreaSum(toggledPrev) - this._calcPanelAreaSum(toggledNext);\n }\n\n public clampToReachablePosition(position: number): number {\n // Basically all position is reachable for circular camera\n return position;\n }\n\n public canReach(panel: Panel): boolean {\n if (panel.removed) return false;\n\n // Always reachable on circular mode\n return true;\n }\n\n public canSee(panel: Panel): boolean {\n const camera = this._flicking.camera;\n const range = camera.range;\n const rangeDiff = camera.rangeDiff;\n const visibleRange = camera.visibleRange;\n const visibleInCurrentRange = super.canSee(panel);\n\n // Check looped visible area for circular case\n if (visibleRange.min < range.min) {\n return (\n visibleInCurrentRange || panel.isVisibleOnRange(visibleRange.min + rangeDiff, visibleRange.max + rangeDiff)\n );\n } else if (visibleRange.max > range.max) {\n return (\n visibleInCurrentRange || panel.isVisibleOnRange(visibleRange.min - rangeDiff, visibleRange.max - rangeDiff)\n );\n }\n\n return visibleInCurrentRange;\n }\n\n /**\n * @internal\n */\n private _calcPanelAreaSum(panels: Panel[]) {\n return panels.reduce((sum: number, panel: Panel) => sum + panel.sizeIncludingMargin, 0);\n }\n}\n\nexport default CircularCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { CameraRange } from \"../Camera\";\n\nimport CameraMode from \"./CameraMode\";\n\nclass LinearCameraMode extends CameraMode {\n public checkAvailability(): boolean {\n // It's always available\n return true;\n }\n\n public getRange(): CameraRange {\n const renderer = this._flicking.renderer;\n\n const firstPanel = renderer.getPanel(0);\n const lastPanel = renderer.getPanel(renderer.panelCount - 1);\n\n return { min: firstPanel?.position ?? 0, max: lastPanel?.position ?? 0 };\n }\n}\n\nexport default LinearCameraMode;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport { ALIGN, CIRCULAR_FALLBACK, DIRECTION, ORDER } from \"../constants/values\";\nimport AnchorPoint from \"../core/AnchorPoint\";\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking, { FlickingOptions } from \"../Flicking\";\nimport { ValueOf } from \"../types/internal\";\nimport {\n checkExistence,\n find,\n getFlickingAttached,\n getProgress,\n getStyle,\n includes,\n parseAlign,\n toArray\n} from \"../utils\";\n\nimport { BoundCameraMode, CameraMode, CircularCameraMode, LinearCameraMode } from \"./mode\";\n\nexport interface CameraOptions {\n align: FlickingOptions[\"align\"];\n}\n\n/**\n * A range with minimum and maximum values\n */\nexport interface CameraRange {\n /** A minimum position */\n min: number;\n /** A maximum position */\n max: number;\n}\n\n/**\n * A component that manages actual movement inside the viewport\n * @public\n */\nclass Camera {\n // Options\n private _align: FlickingOptions[\"align\"];\n\n // Internal states\n private _flicking: Flicking;\n private _mode: CameraMode;\n private _el: HTMLElement;\n private _transform: string;\n private _lookedOffset = 0;\n private _position: number;\n private _alignPos: number;\n private _offset: number;\n private _circularOffset: number;\n private _circularEnabled: boolean;\n private _range: CameraRange;\n private _visiblePanels: Panel[];\n private _anchors: AnchorPoint[];\n private _needPanelTriggered: { prev: boolean; next: boolean };\n private _panelOrder: ValueOf<typeof ORDER>;\n\n // Internal states getter\n /**\n * The camera element(`.flicking-camera`)\n * @readonly\n */\n public get element(): HTMLElement {\n return this._el;\n }\n /**\n * An array of the child elements of the camera element(`.flicking-camera`)\n * @readonly\n */\n public get children(): HTMLElement[] {\n return toArray(this._el.children) as HTMLElement[];\n }\n /**\n * Current position of the camera\n * @readonly\n */\n public get position(): number {\n return this._position;\n }\n /**\n * Align position inside the viewport where {@link Panel}'s {@link Panel.alignPosition | alignPosition} should be located at\n * @readonly\n */\n public get alignPosition(): number {\n return this._alignPos;\n }\n /**\n * Position offset, used for the {@link Flicking.renderOnlyVisible | renderOnlyVisible} option\n * @defaultValue 0\n * @readonly\n */\n public get offset(): number {\n return this._offset - this._circularOffset;\n }\n /**\n * Whether the `circular` option is enabled.\n * @remarks\n * The {@link Flicking.circular | circular} option can't be enabled when sum of the panel sizes are too small.\n * @defaultValue false\n * @readonly\n */\n public get circularEnabled(): boolean {\n return this._circularEnabled;\n }\n /**\n * A current camera mode\n * @readonly\n */\n public get mode(): CameraMode {\n return this._mode;\n }\n /**\n * A range that Camera's {@link Camera.position | position} can reach\n * @readonly\n */\n public get range(): CameraRange {\n return this._range;\n }\n /**\n * A difference between Camera's minimum and maximum position that can reach\n * @readonly\n */\n public get rangeDiff(): number {\n return this._range.max - this._range.min;\n }\n /**\n * An array of visible panels from the current position\n * @readonly\n */\n public get visiblePanels(): Panel[] {\n return this._visiblePanels;\n }\n /**\n * A range of the visible area from the current position\n * @readonly\n */\n public get visibleRange(): CameraRange {\n return { min: this._position - this._alignPos, max: this._position - this._alignPos + this.size };\n }\n /**\n * An array of {@link AnchorPoint}s that Camera can be stopped at\n * @readonly\n */\n public get anchorPoints(): AnchorPoint[] {\n return this._anchors;\n }\n /**\n * A current parameters of the Camera for updating {@link AxesController}\n * @readonly\n */\n public get controlParams(): { range: CameraRange; position: number; circular: boolean } {\n return { range: this._range, position: this._position, circular: this._circularEnabled };\n }\n /**\n * A Boolean value indicating whether Camera's over the minimum or maximum position reachable\n * @readonly\n */\n public get atEdge(): boolean {\n return this._position <= this._range.min || this._position >= this._range.max;\n }\n /**\n * Return the size of the viewport\n * @readonly\n */\n public get size(): number {\n const flicking = this._flicking;\n return flicking ? (flicking.horizontal ? flicking.viewport.width : flicking.viewport.height) : 0;\n }\n\n /**\n * Return the camera's position progress from the first panel to last panel\n * @remarks\n * Range is from 0 to last panel's index\n * @readonly\n */\n public get progress(): number {\n const flicking = this._flicking;\n const position = this._position + this._offset;\n const nearestAnchor = this.findNearestAnchor(this._position);\n\n if (!flicking || !nearestAnchor) {\n return NaN;\n }\n\n const nearestPanel = nearestAnchor.panel;\n const panelPos = nearestPanel.position + nearestPanel.offset;\n const bounceSize = flicking.control.controller.bounce!;\n\n const { min: prevRange, max: nextRange } = this.range;\n const rangeDiff = this.rangeDiff;\n\n if (position === panelPos) {\n return nearestPanel.index;\n }\n\n if (position < panelPos) {\n const prevPanel = nearestPanel.prev();\n let prevPosition = prevPanel ? prevPanel.position + prevPanel.offset : prevRange - bounceSize[0];\n\n // Looped\n if (prevPosition > panelPos) {\n prevPosition -= rangeDiff;\n }\n\n return nearestPanel.index - 1 + getProgress(position, prevPosition, panelPos);\n } else {\n const nextPanel = nearestPanel.next();\n let nextPosition = nextPanel ? nextPanel.position + nextPanel.offset : nextRange + bounceSize[1];\n\n // Looped\n if (nextPosition < panelPos) {\n nextPosition += rangeDiff;\n }\n\n return nearestPanel.index + getProgress(position, panelPos, nextPosition);\n }\n }\n\n /**\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element(`.flicking-camera`)\n * @readonly\n */\n public get panelOrder(): ValueOf<typeof ORDER> {\n return this._panelOrder;\n }\n\n // Options Getter\n /**\n * A value indicating where the {@link Camera.alignPosition | alignPosition} should be located at inside the viewport element\n */\n public get align(): FlickingOptions[\"align\"] {\n return this._align;\n }\n\n // Options Setter\n public set align(val: FlickingOptions[\"align\"]) {\n this._align = val;\n }\n\n /**\n * Creates a new Camera instance\n * @param flicking - An instance of {@link Flicking}\n * @param options - Options for the Camera\n */\n public constructor(flicking: Flicking, { align = ALIGN.CENTER }: Partial<CameraOptions> = {}) {\n this._flicking = flicking;\n this._resetInternalValues();\n\n // Options\n this._align = align;\n }\n\n /**\n * Initialize Camera\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It finds the camera element inside the viewport.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public init(): this {\n const viewportEl = this._flicking.viewport.element;\n\n checkExistence(viewportEl.firstElementChild, \"First element child of the viewport element\");\n this._el = viewportEl.firstElementChild as HTMLElement;\n this._checkTranslateSupport();\n\n this._updateMode();\n this.updatePanelOrder();\n\n return this;\n }\n\n /**\n * Destroy Camera and return to initial state\n * @remarks\n * This method resets all internal values to their initial state.\n * @returns The current instance for method chaining\n */\n public destroy(): this {\n this._resetInternalValues();\n return this;\n }\n\n /**\n * Move to the given position and apply CSS transform\n * @remarks\n * This method updates the camera position, toggles panels for circular mode, and refreshes visible panels.\n * @param pos - A new position\n * @throws {@link InitializationErrors}\n */\n public lookAt(pos: number): void {\n const prevOffset = this._offset;\n const isChangedOffset = this._lookedOffset !== prevOffset;\n const flicking = getFlickingAttached(this._flicking);\n const prevPos = this._position;\n\n this._position = pos;\n const toggled = this._togglePanels(prevPos, pos);\n this._refreshVisiblePanels();\n this._checkNeedPanel();\n this._checkReachEnd(prevPos, pos);\n\n if (toggled) {\n void flicking.renderer.render().then(() => {\n this.updateOffset();\n this._lookedOffset = this._offset;\n });\n } else if (isChangedOffset) {\n // sync offset for renderOnlyVisible on resize\n this.updateOffset();\n this._lookedOffset = this._offset;\n } else {\n this.applyTransform();\n }\n }\n\n /**\n * Return a previous {@link AnchorPoint} of given {@link AnchorPoint}\n * @remarks\n * If it does not exist, return `null` instead\n * @param anchor - A reference {@link AnchorPoint}\n * @returns The previous {@link AnchorPoint}\n */\n public getPrevAnchor(anchor: AnchorPoint): AnchorPoint | null {\n if (!this._circularEnabled || anchor.index !== 0) {\n return this._anchors[anchor.index - 1] || null;\n } else {\n const anchors = this._anchors;\n const rangeDiff = this.rangeDiff;\n const lastAnchor = anchors[anchors.length - 1];\n\n return new AnchorPoint({\n index: lastAnchor.index,\n position: lastAnchor.position - rangeDiff,\n panel: lastAnchor.panel\n });\n }\n }\n\n /**\n * Return a next {@link AnchorPoint} of given {@link AnchorPoint}\n * @remarks\n * If it does not exist, return `null` instead\n * @param anchor - A reference {@link AnchorPoint}\n * @returns The next {@link AnchorPoint}\n */\n public getNextAnchor(anchor: AnchorPoint): AnchorPoint | null {\n const anchors = this._anchors;\n\n if (!this._circularEnabled || anchor.index !== anchors.length - 1) {\n return anchors[anchor.index + 1] || null;\n } else {\n const rangeDiff = this.rangeDiff;\n const firstAnchor = anchors[0];\n\n return new AnchorPoint({\n index: firstAnchor.index,\n position: firstAnchor.position + rangeDiff,\n panel: firstAnchor.panel\n });\n }\n }\n\n /**\n * Return the camera's position progress in the panel below\n * @remarks\n * Value is from 0 to 1 when the camera's inside panel.\n * Value can be lower than 0 or bigger than 1 when it's in the margin area\n * @param panel - A panel to check\n * @returns Progress value from 0 to 1 (or outside this range when in margin area)\n */\n public getProgressInPanel(panel: Panel): number {\n const panelRange = panel.range;\n\n return (this._position - panelRange.min) / (panelRange.max - panelRange.min);\n }\n\n /**\n * Return {@link AnchorPoint} that includes given position\n * @remarks\n * If there's no {@link AnchorPoint} that includes the given position, return `null` instead\n * @param position - A position to check\n * @returns The {@link AnchorPoint} that includes the given position\n */\n public findAnchorIncludePosition(position: number): AnchorPoint | null {\n return this._mode.findAnchorIncludePosition(position);\n }\n\n /**\n * Return {@link AnchorPoint} nearest to given position\n * @remarks\n * If there're no {@link AnchorPoint}s, return `null` instead\n * @param position - A position to check\n * @returns The {@link AnchorPoint} nearest to the given position\n */\n public findNearestAnchor(position: number): AnchorPoint | null {\n return this._mode.findNearestAnchor(position);\n }\n\n /**\n * Return {@link AnchorPoint} that matches {@link Flicking.currentPanel}\n * @returns The {@link AnchorPoint} that matches current panel\n */\n public findActiveAnchor(): AnchorPoint | null {\n const flicking = getFlickingAttached(this._flicking);\n const activePanel = flicking.control.activePanel;\n\n if (!activePanel) return null;\n\n return (\n find(this._anchors, anchor => anchor.panel.index === activePanel.index) ??\n this.findNearestAnchor(activePanel.position)\n );\n }\n\n /**\n * Clamp the given position between camera's range\n * @param position - A position to clamp\n * @returns A clamped position\n */\n public clampToReachablePosition(position: number): number {\n return this._mode.clampToReachablePosition(position);\n }\n\n /**\n * Check whether the given panel is inside of the Camera's range\n * @param panel - An instance of {@link Panel} to check\n * @returns Whether the panel's inside Camera's range\n */\n public canReach(panel: Panel): boolean {\n return this._mode.canReach(panel);\n }\n\n /**\n * Check whether the given panel element is visible at the current position\n * @param panel - An instance of {@link Panel} to check\n * @returns Whether the panel element is visible at the current position\n */\n public canSee(panel: Panel): boolean {\n return this._mode.canSee(panel);\n }\n\n /**\n * Update {@link Camera.range | range} of Camera\n * @remarks\n * This method recalculates the camera range based on the current panel positions and circular mode settings.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public updateRange(): this {\n const flicking = getFlickingAttached(this._flicking);\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n\n this._updateMode();\n this._range = this._mode.getRange();\n\n panels.forEach(panel => panel.updateCircularToggleDirection());\n\n return this;\n }\n\n /**\n * Update Camera's {@link Camera.alignPosition | alignPosition}\n * @returns The current instance for method chaining\n */\n public updateAlignPos(): this {\n const align = this._align;\n\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n this._alignPos = parseAlign(alignVal, this.size);\n\n return this;\n }\n\n /**\n * Update Camera's {@link Camera.anchorPoints | anchorPoints}\n * @remarks\n * Anchor points are positions where the camera can stop. This method recalculates them based on the current mode.\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public updateAnchors(): this {\n this._anchors = this._mode.getAnchors();\n\n return this;\n }\n\n /**\n * Update Viewport's height to visible panel's max height\n * @remarks\n * This method only takes effect when {@link FlickingOptions.horizontal | horizontal} is `true` and {@link FlickingOptions.adaptive | adaptive} is enabled.\n * @throws {@link InitializationErrors}\n */\n public updateAdaptiveHeight(): void {\n const flicking = getFlickingAttached(this._flicking);\n const activePanel = flicking.control.activePanel;\n const visiblePanels = flicking.visiblePanels;\n\n const selectedPanels = [...visiblePanels];\n\n if (activePanel) {\n selectedPanels.push(activePanel);\n }\n\n if (!flicking.horizontal || !flicking.adaptive || !selectedPanels.length) return;\n\n const maxHeight = Math.max(...selectedPanels.map(panel => panel.height));\n\n flicking.viewport.setSize({\n height: maxHeight\n });\n }\n\n /**\n * Update current offset of the camera\n * @returns The current instance for method chaining\n */\n public updateOffset(): this {\n const flicking = getFlickingAttached(this._flicking);\n const position = this._position;\n const unRenderedPanels = flicking.panels.filter(panel => !panel.rendered);\n\n this._offset = unRenderedPanels\n .filter(panel => panel.position + panel.offset < position)\n .reduce((offset, panel) => offset + panel.sizeIncludingMargin, 0);\n\n this._circularOffset = this._mode.getCircularOffset();\n\n this.applyTransform();\n\n return this;\n }\n\n /**\n * Update direction to match the {@link https://developer.mozilla.org/en-US/docs/Web/CSS/direction | direction} CSS property applied to the camera element\n * @returns The current instance for method chaining\n */\n public updatePanelOrder(): this {\n const flicking = getFlickingAttached(this._flicking);\n\n if (!flicking.horizontal) return this;\n\n const el = this._el;\n const direction = getStyle(el).direction;\n if (direction !== this._panelOrder) {\n this._panelOrder = direction === ORDER.RTL ? ORDER.RTL : ORDER.LTR;\n if (flicking.initialized) {\n flicking.control.controller.updateDirection();\n }\n }\n\n return this;\n }\n\n /**\n * Reset the history of {@link Flicking.event:needPanel | needPanel} events so it can be triggered again\n * @returns The current instance for method chaining\n */\n public resetNeedPanelHistory(): this {\n this._needPanelTriggered = { prev: false, next: false };\n return this;\n }\n\n /**\n * Apply \"transform\" style with the current position to camera element\n * @returns The current instance for method chaining\n */\n public applyTransform(): this {\n const el = this._el;\n const flicking = getFlickingAttached(this._flicking);\n const renderer = flicking.renderer;\n\n if (renderer.rendering || !flicking.initialized) return this;\n\n const actualPosition = this._position - this._alignPos - this._offset + this._circularOffset;\n\n el.style[this._transform] = flicking.horizontal\n ? `translate(${this._panelOrder === ORDER.RTL ? actualPosition : -actualPosition}px)`\n : `translate(0, ${-actualPosition}px)`;\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal state values to their defaults. Called during construction and destruction.\n */\n private _resetInternalValues() {\n this._position = 0;\n this._lookedOffset = 0;\n this._alignPos = 0;\n this._offset = 0;\n this._circularOffset = 0;\n this._circularEnabled = false;\n this._range = { min: 0, max: 0 };\n this._visiblePanels = [];\n this._anchors = [];\n this._needPanelTriggered = { prev: false, next: false };\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates the list of visible panels and triggers {@link VisibleChangeEvent} if panels were added or removed.\n */\n private _refreshVisiblePanels() {\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n\n const newVisiblePanels = panels.filter(panel => this.canSee(panel));\n const prevVisiblePanels = this._visiblePanels;\n this._visiblePanels = newVisiblePanels;\n\n const added: Panel[] = newVisiblePanels.filter(panel => !includes(prevVisiblePanels, panel));\n const removed: Panel[] = prevVisiblePanels.filter(panel => !includes(newVisiblePanels, panel));\n\n if (added.length > 0 || removed.length > 0) {\n void flicking.renderer.render().then(() => {\n flicking.trigger(\n new ComponentEvent(EVENTS.VISIBLE_CHANGE, {\n added,\n removed,\n visiblePanels: newVisiblePanels\n })\n );\n });\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if the camera is near the edges and triggers {@link NeedPanelEvent} for infinite scrolling implementations.\n */\n private _checkNeedPanel(): void {\n const needPanelTriggered = this._needPanelTriggered;\n\n if (needPanelTriggered.prev && needPanelTriggered.next) return;\n\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n\n if (panels.length <= 0) {\n if (!needPanelTriggered.prev) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.PREV }));\n needPanelTriggered.prev = true;\n }\n if (!needPanelTriggered.next) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.NEXT }));\n needPanelTriggered.next = true;\n }\n\n return;\n }\n\n const cameraPosition = this._position;\n const cameraSize = this.size;\n const cameraRange = this._range;\n const needPanelThreshold = flicking.needPanelThreshold;\n\n const cameraPrev = cameraPosition - this._alignPos;\n const cameraNext = cameraPrev + cameraSize;\n\n const firstPanel = panels[0];\n const lastPanel = panels[panels.length - 1];\n\n if (!needPanelTriggered.prev) {\n const firstPanelPrev = firstPanel.range.min;\n\n if (cameraPrev <= firstPanelPrev + needPanelThreshold || cameraPosition <= cameraRange.min + needPanelThreshold) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.PREV }));\n needPanelTriggered.prev = true;\n }\n }\n\n if (!needPanelTriggered.next) {\n const lastPanelNext = lastPanel.range.max;\n\n if (cameraNext >= lastPanelNext - needPanelThreshold || cameraPosition >= cameraRange.max - needPanelThreshold) {\n flicking.trigger(new ComponentEvent(EVENTS.NEED_PANEL, { direction: DIRECTION.NEXT }));\n needPanelTriggered.next = true;\n }\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if the camera has reached the edge of the range and triggers {@link ReachEdgeEvent}.\n */\n private _checkReachEnd(prevPos: number, newPos: number): void {\n const flicking = getFlickingAttached(this._flicking);\n const range = this._range;\n\n const wasBetweenRange = prevPos > range.min && prevPos < range.max;\n const isBetweenRange = newPos > range.min && newPos < range.max;\n\n if (!wasBetweenRange || isBetweenRange) return;\n\n const direction = newPos <= range.min ? DIRECTION.PREV : DIRECTION.NEXT;\n\n flicking.trigger(\n new ComponentEvent(EVENTS.REACH_EDGE, {\n direction\n })\n );\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks for CSS transform support and stores the vendor-prefixed property name. Throws if transforms are not supported.\n */\n private _checkTranslateSupport = () => {\n const transforms = [\"webkitTransform\", \"msTransform\", \"MozTransform\", \"OTransform\", \"transform\"];\n\n const supportedStyle = document.documentElement.style;\n let transformName = \"\";\n for (const prefixedTransform of transforms) {\n if (prefixedTransform in supportedStyle) {\n transformName = prefixedTransform;\n }\n }\n\n if (!transformName) {\n throw new FlickingError(ERROR.MESSAGE.TRANSFORM_NOT_SUPPORTED, ERROR.CODE.TRANSFORM_NOT_SUPPORTED);\n }\n\n this._transform = transformName;\n };\n\n /**\n * @internal\n * @privateRemarks\n * Updates the camera mode based on {@link FlickingOptions.circular | circular} and {@link FlickingOptions.bound | bound} options.\n */\n private _updateMode() {\n const flicking = getFlickingAttached(this._flicking);\n\n if (flicking.circular) {\n const circularMode = new CircularCameraMode(flicking);\n const canSetCircularMode = circularMode.checkAvailability();\n\n if (canSetCircularMode) {\n this._mode = circularMode;\n } else {\n const fallbackMode = flicking.circularFallback;\n\n this._mode =\n fallbackMode === CIRCULAR_FALLBACK.BOUND ? new BoundCameraMode(flicking) : new LinearCameraMode(flicking);\n }\n\n this._circularEnabled = canSetCircularMode;\n } else {\n this._mode = flicking.bound ? new BoundCameraMode(flicking) : new LinearCameraMode(flicking);\n this._circularEnabled = false;\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Toggles panel positions for circular mode. Returns true if any panel was toggled.\n */\n private _togglePanels(prevPos: number, pos: number): boolean {\n if (pos === prevPos) return false;\n\n const flicking = getFlickingAttached(this._flicking);\n const panels = flicking.renderer.panels;\n const toggled = panels.map(panel => panel.toggle(prevPos, pos));\n\n return toggled.some(isToggled => isToggled);\n }\n}\n\nexport default Camera;\n","/* @internal */\n/**\n * All possible @egjs/axes event keys\n * @internal\n */\nexport const EVENT = {\n HOLD: \"hold\",\n CHANGE: \"change\",\n RELEASE: \"release\",\n ANIMATION_END: \"animationEnd\",\n FINISH: \"finish\"\n} as const;\n\n/**\n * An Axis key that Flicking uses\n * @internal\n */\nexport const POSITION_KEY = \"flick\";\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { OnAnimationEnd, OnChange, OnFinish, OnHold, OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\nimport * as AXES from \"../../constants/internal\";\nimport Panel from \"../../core/panel/Panel\";\nimport { EVENTS } from \"../../event/names\";\nimport Flicking from \"../../Flicking\";\nimport { circulatePosition, getDirection } from \"../../utils\";\n\nexport enum STATE_TYPE {\n IDLE,\n HOLDING,\n DRAGGING,\n ANIMATING,\n DISABLED\n}\n\n/**\n * Event context for State event handlers\n * @internal\n */\nexport interface StateContext<T> {\n /** An instance of Flicking */\n flicking: Flicking;\n /** An Axes event */\n axesEvent: T;\n /** A function for changing current state to other state */\n transitTo: (nextState: STATE_TYPE) => State;\n}\n\n/**\n * A component that shows the current status of the user input or the animation\n * @internal\n */\nabstract class State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public abstract readonly holding: boolean;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public abstract readonly animating: boolean;\n\n protected _delta: number = 0;\n protected _targetPanel: Panel | null = null;\n\n /**\n * A sum of delta values of change events from the last hold event of Axes\n * @readonly\n */\n public get delta(): number {\n return this._delta;\n }\n\n /**\n * A panel to set as {@link Control.activePanel} after the animation is finished\n * @readonly\n */\n public get targetPanel(): Panel | null {\n return this._targetPanel;\n }\n\n public set targetPanel(val: Panel | null) {\n this._targetPanel = val;\n }\n\n /**\n * An callback which is called when state has changed to this state\n * @param prevState - An previous state\n */\n public onEnter(prevState: State): void {\n this._delta = prevState._delta;\n this._targetPanel = prevState._targetPanel;\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-hold | hold} event\n * @param ctx - {@link StateContext}\n */\n public onHold(ctx: StateContext<OnHold>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-change | change} event\n * @param ctx - {@link StateContext}\n */\n public onChange(ctx: StateContext<OnChange>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event\n * @param ctx - {@link StateContext}\n */\n public onRelease(ctx: StateContext<OnRelease>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-animationEnd | animationEnd} event\n * @param ctx - {@link StateContext}\n */\n public onAnimationEnd(ctx: StateContext<OnAnimationEnd>): void {\n // DO NOTHING\n }\n\n /**\n * An event handler for Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-finish | finish} event\n * @param ctx - {@link StateContext}\n */\n public onFinish(ctx: StateContext<OnFinish>): void {\n // DO NOTHING\n }\n\n /**\n * @internal\n */\n protected _moveToChangedPosition(ctx: StateContext<OnChange>): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const delta = axesEvent.delta[AXES.POSITION_KEY];\n\n if (!delta) {\n return;\n }\n\n this._delta += delta;\n\n const camera = flicking.camera;\n const prevPosition = camera.position;\n const position = axesEvent.pos[AXES.POSITION_KEY];\n const newPosition = flicking.circularEnabled\n ? circulatePosition(position, camera.range.min, camera.range.max)\n : position;\n\n camera.lookAt(newPosition);\n\n const moveEvent = new ComponentEvent(EVENTS.MOVE, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(0, axesEvent.delta[AXES.POSITION_KEY]),\n axesEvent\n });\n\n flicking.trigger(moveEvent);\n\n if (moveEvent.isCanceled()) {\n // Return to previous position\n camera.lookAt(prevPosition);\n transitTo(STATE_TYPE.DISABLED);\n }\n }\n}\n\nexport default State;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when Flicking's animating by user input or method call\n * @internal\n */\nclass AnimatingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onHold(ctx: Parameters<State[\"onHold\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const targetPanel = this._targetPanel;\n const control = flicking.control;\n\n this._delta = 0;\n flicking.control.updateInput();\n\n if (flicking.changeOnHold && targetPanel) {\n control.setActive(targetPanel, control.activePanel, axesEvent.isTrusted);\n }\n\n const holdStartEvent = new ComponentEvent(EVENTS.HOLD_START, { axesEvent });\n flicking.trigger(holdStartEvent);\n\n if (holdStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n transitTo(STATE_TYPE.DRAGGING);\n }\n }\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n this._moveToChangedPosition(ctx);\n }\n\n public onFinish(ctx: Parameters<State[\"onFinish\"]>[0]) {\n const { flicking, axesEvent, transitTo } = ctx;\n\n const control = flicking.control;\n const controller = control.controller;\n const animatingContext = controller.animatingContext;\n\n transitTo(STATE_TYPE.IDLE);\n\n flicking.trigger(\n new ComponentEvent(EVENTS.MOVE_END, {\n isTrusted: axesEvent.isTrusted,\n direction: getDirection(animatingContext.start, animatingContext.end),\n axesEvent\n })\n );\n\n const targetPanel = this._targetPanel;\n if (targetPanel) {\n control.setActive(targetPanel, control.activePanel, axesEvent.isTrusted);\n }\n }\n}\n\nexport default AnimatingState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when Flicking is stopped by event's `stop` method\n * @internal\n */\nclass DisabledState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onAnimationEnd(ctx: Parameters<State[\"onAnimationEnd\"]>[0]): void {\n const { transitTo } = ctx;\n\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { axesEvent, transitTo } = ctx;\n\n // Can stop Axes's change event\n axesEvent.stop();\n\n transitTo(STATE_TYPE.IDLE);\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]): void {\n const { axesEvent, transitTo } = ctx;\n\n // This is needed when stopped hold start event\n if (axesEvent.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 */\nimport { ComponentEvent } from \"@egjs/component\";\nimport * as AXES from \"../../constants/internal\";\nimport { EVENTS } from \"../../event/names\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when user's dragging the Flicking area\n * @internal\n */\nclass DraggingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = true;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = true;\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n this._moveToChangedPosition(ctx);\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]) {\n const { flicking, axesEvent, transitTo } = ctx;\n\n // Update last position to cope with Axes's animating behavior\n // Axes uses start position when animation start\n flicking.trigger(\n new ComponentEvent(EVENTS.HOLD_END, {\n axesEvent\n })\n );\n\n if (flicking.renderer.panelCount <= 0) {\n // There're no panels\n transitTo(STATE_TYPE.IDLE);\n return;\n }\n\n transitTo(STATE_TYPE.ANIMATING);\n\n const control = flicking.control;\n const position = axesEvent.destPos[AXES.POSITION_KEY];\n const duration = Math.max(axesEvent.duration, flicking.duration);\n\n try {\n void control.moveToPosition(position, duration, axesEvent);\n } catch (_err) {\n transitTo(STATE_TYPE.IDLE);\n axesEvent.setTo({ [AXES.POSITION_KEY]: flicking.camera.position }, 0);\n }\n }\n}\n\nexport default DraggingState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport Panel from \"../../core/panel/Panel\";\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A state that activates when user's holding the Flicking area, but not moved a single pixel yet\n * @internal\n */\nclass HoldingState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = true;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = false;\n\n private _releaseEvent: OnRelease | null = null;\n\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n\n const inputEvent = axesEvent.inputEvent as { offsetX: number; offsetY: number };\n\n if (!inputEvent) {\n return;\n }\n\n const offset = flicking.horizontal ? inputEvent.offsetX : inputEvent.offsetY;\n\n const moveStartEvent = new ComponentEvent(EVENTS.MOVE_START, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(0, -offset),\n axesEvent\n });\n flicking.trigger(moveStartEvent);\n\n if (moveStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n // Trigger DraggingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.DRAGGING).onChange(ctx);\n }\n }\n\n public onRelease(ctx: Parameters<State[\"onRelease\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n\n flicking.trigger(new ComponentEvent(EVENTS.HOLD_END, { axesEvent }));\n\n if (axesEvent.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 axesEvent.setTo({ flick: flicking.camera.position }, 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 = axesEvent;\n }\n\n public onFinish(ctx: Parameters<State[\"onFinish\"]>[0]): void {\n const { flicking, transitTo } = ctx;\n\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 /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access */\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 /* eslint-enable */\n\n const panels = flicking.renderer.panels;\n let clickedPanel: Panel | null = null;\n\n for (const panel of panels) {\n if (panel.contains(clickedElement)) {\n clickedPanel = panel;\n break;\n }\n }\n\n if (clickedPanel) {\n const cameraPosition = flicking.camera.position;\n const clickedPanelPosition = clickedPanel.position;\n\n flicking.trigger(\n new ComponentEvent(EVENTS.SELECT, {\n index: clickedPanel.index,\n panel: clickedPanel,\n // Direction to the clicked panel\n direction: getDirection(cameraPosition, clickedPanelPosition)\n })\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 */\nimport { ComponentEvent } from \"@egjs/component\";\n\nimport { EVENTS } from \"../../event/names\";\nimport { getDirection } from \"../../utils\";\n\nimport State, { STATE_TYPE } from \"./State\";\n\n/**\n * A default state when there's no user input and no animation's playing\n * @internal\n */\nclass IdleState extends State {\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public readonly holding = false;\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public readonly animating = false;\n\n public onEnter() {\n this._delta = 0;\n this._targetPanel = null;\n }\n\n public onHold(ctx: Parameters<State[\"onHold\"]>[0]): void {\n // Shouldn't do any action until any panels on flicking area\n const { flicking, axesEvent, transitTo } = ctx;\n\n if (flicking.renderer.panelCount <= 0) {\n transitTo(STATE_TYPE.DISABLED);\n return;\n }\n\n const holdStartEvent = new ComponentEvent(EVENTS.HOLD_START, {\n axesEvent\n });\n\n flicking.trigger(holdStartEvent);\n\n if (holdStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n transitTo(STATE_TYPE.HOLDING);\n }\n }\n\n // By methods call\n public onChange(ctx: Parameters<State[\"onChange\"]>[0]): void {\n const { flicking, axesEvent, transitTo } = ctx;\n const controller = flicking.control.controller;\n const animatingContext = controller.animatingContext;\n\n const moveStartEvent = new ComponentEvent(EVENTS.MOVE_START, {\n isTrusted: axesEvent.isTrusted,\n holding: this.holding,\n direction: getDirection(animatingContext.start, animatingContext.end),\n axesEvent\n });\n flicking.trigger(moveStartEvent);\n\n if (moveStartEvent.isCanceled()) {\n transitTo(STATE_TYPE.DISABLED);\n } else {\n // Trigger AnimatingState's onChange, to trigger \"move\" event immediately\n transitTo(STATE_TYPE.ANIMATING).onChange(ctx);\n }\n }\n}\n\nexport default IdleState;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { AxesEvents } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport Flicking from \"../Flicking\";\nimport AnimatingState from \"./states/AnimatingState\";\nimport DisabledState from \"./states/DisabledState\";\nimport DraggingState from \"./states/DraggingState\";\nimport HoldingState from \"./states/HoldingState\";\nimport IdleState from \"./states/IdleState\";\nimport State, { STATE_TYPE } from \"./states/State\";\n\n/**\n * @internal\n */\nclass StateMachine {\n private _state: State;\n\n public get state(): State {\n return this._state;\n }\n\n public constructor() {\n this._state = new IdleState();\n }\n\n public fire(\n eventType: keyof AxesEvents,\n externalCtx: {\n flicking: Flicking;\n axesEvent: any;\n }\n ) {\n const currentState = this._state;\n const ctx = { ...externalCtx, transitTo: this.transitTo };\n\n switch (eventType) {\n case AXES.EVENT.HOLD:\n currentState.onHold(ctx);\n break;\n case AXES.EVENT.CHANGE:\n currentState.onChange(ctx);\n break;\n case AXES.EVENT.RELEASE:\n currentState.onRelease(ctx);\n break;\n case AXES.EVENT.ANIMATION_END:\n currentState.onAnimationEnd(ctx);\n break;\n case AXES.EVENT.FINISH:\n currentState.onFinish(ctx);\n break;\n }\n }\n\n public transitTo = (nextStateType: STATE_TYPE): State => {\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 nextState.onEnter(this._state);\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 */\nimport Axes, { AxesEvents, OnRelease, PanInput } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport { ORDER } from \"../constants/values\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport Flicking from \"../Flicking\";\nimport { ControlParams } from \"../types/external\";\nimport { getFlickingAttached, parseBounce } from \"../utils\";\n\nimport StateMachine from \"./StateMachine\";\nimport State from \"./states/State\";\n\n/**\n * A controller that handles the {@link https://naver.github.io/egjs-axes/ | @egjs/axes} events\n * @internal\n */\nclass AxesController {\n private _flicking: Flicking | null;\n private _axes: Axes | null;\n private _panInput: PanInput | null;\n private _stateMachine: StateMachine;\n\n private _animatingContext: { start: number; end: number; offset: number };\n private _dragged: boolean;\n\n /**\n * An {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @see https://naver.github.io/egjs-axes/docs/api/Axes\n * @readonly\n */\n public get axes(): Axes | null {\n return this._axes;\n }\n /**\n * An {@link https://naver.github.io/egjs-axes/docs/api/PanInput | PanInput} instance\n * @see https://naver.github.io/egjs-axes/docs/api/PanInput\n * @readonly\n */\n public get panInput(): PanInput | null {\n return this._panInput;\n }\n /**\n * @internal\n */\n public get stateMachine(): StateMachine {\n return this._stateMachine;\n }\n /**\n * A activated {@link State} that shows the current status of the user input or the animation\n */\n public get state(): State {\n return this._stateMachine.state;\n }\n /**\n * A context of the current animation playing\n * @readonly\n */\n public get animatingContext(): { start: number; end: number; offset: number } {\n return this._animatingContext;\n }\n /**\n * A current control parameters of the Axes instance\n */\n public get controlParams(): ControlParams {\n const axes = this._axes;\n\n if (!axes) {\n return {\n range: { min: 0, max: 0 },\n position: 0,\n circular: false\n };\n }\n\n const axis = axes.axis[AXES.POSITION_KEY];\n\n return {\n range: { min: axis.range![0], max: axis.range![1] },\n circular: (axis.circular as boolean[])[0],\n position: this.position\n };\n }\n\n /**\n * A Boolean indicating whether the user input is enabled\n * @readonly\n */\n public get enabled(): boolean {\n return this._panInput?.isEnabled() ?? false;\n }\n /**\n * Current position value in {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @readonly\n */\n public get position(): number {\n return this._axes?.get([AXES.POSITION_KEY])[AXES.POSITION_KEY] ?? 0;\n }\n /**\n * Current range value in {@link https://naver.github.io/egjs-axes/docs/api/Axes | Axes} instance\n * @readonly\n */\n public get range(): number[] {\n return this._axes?.axis[AXES.POSITION_KEY].range ?? [0, 0];\n }\n /**\n * Actual bounce size(px)\n * @readonly\n */\n public get bounce(): number[] | undefined {\n return this._axes?.axis[AXES.POSITION_KEY].bounce as number[] | undefined;\n }\n\n public constructor() {\n this._resetInternalValues();\n this._stateMachine = new StateMachine();\n }\n\n /**\n * Initialize AxesController\n * @remarks\n * This method creates and configures the Axes and PanInput instances.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n\n this._axes = new Axes(\n {\n [AXES.POSITION_KEY]: {\n range: [0, 0],\n circular: false,\n bounce: [0, 0]\n }\n },\n {\n deceleration: flicking.deceleration,\n interruptable: flicking.interruptable,\n nested: flicking.nested,\n easing: flicking.easing\n }\n );\n this._panInput = new PanInput(flicking.viewport.element, {\n inputType: flicking.inputType,\n threshold: flicking.dragThreshold,\n iOSEdgeSwipeThreshold: flicking.iOSEdgeSwipeThreshold,\n preventDefaultOnDrag: flicking.preventDefaultOnDrag,\n scale: flicking.horizontal ? [flicking.camera.panelOrder === ORDER.RTL ? 1 : -1, 0] : [0, -1],\n releaseOnScroll: true\n });\n\n const axes = this._axes;\n\n axes.connect(flicking.horizontal ? [AXES.POSITION_KEY, \"\"] : [\"\", AXES.POSITION_KEY], this._panInput);\n\n for (const key in AXES.EVENT) {\n const eventType = AXES.EVENT[key] as keyof AxesEvents;\n\n axes.on(eventType, (e: AxesEvents[typeof eventType]) => {\n this._stateMachine.fire(eventType, {\n flicking,\n axesEvent: e\n });\n });\n }\n\n return this;\n }\n\n /**\n * Destroy AxesController and return to initial state\n * @remarks\n * This method destroys the Axes and PanInput instances and removes all event handlers.\n */\n public destroy(): void {\n if (this._axes) {\n this.removePreventClickHandler();\n this._axes.destroy();\n }\n\n this._panInput?.destroy();\n\n this._resetInternalValues();\n }\n\n /**\n * Enable input from the user (mouse/touch)\n * @remarks\n * Enables the PanInput to receive user interactions.\n * @returns The current instance for method chaining\n */\n public enable(): this {\n this._panInput?.enable();\n\n return this;\n }\n\n /**\n * Disable input from the user (mouse/touch)\n * @remarks\n * Disables the PanInput to ignore user interactions.\n * @returns The current instance for method chaining\n */\n public disable(): this {\n this._panInput?.disable();\n\n return this;\n }\n\n /**\n * Releases ongoing user input (mouse/touch)\n * @remarks\n * Immediately releases the PanInput, simulating the user lifting their finger.\n * @returns The current instance for method chaining\n */\n public release(): this {\n this._panInput?.release();\n\n return this;\n }\n\n /**\n * Change the destination and duration of the animation currently playing\n * @remarks\n * This method updates the Axes animation target position and optionally the duration.\n * @param position - A position to move\n * @param duration - Duration of the animation (unit: ms)\n * @returns The current instance for method chaining\n */\n public updateAnimation(position: number, duration?: number): this {\n this._animatingContext = {\n ...this._animatingContext,\n end: position\n };\n this._axes?.updateAnimation({\n destPos: { [AXES.POSITION_KEY]: position },\n duration\n });\n\n return this;\n }\n\n /**\n * Stops the animation currently playing\n * @remarks\n * This method immediately stops the Axes animation at the current position.\n * @returns The current instance for method chaining\n */\n public stopAnimation(): this {\n this._axes?.stopAnimation();\n\n return this;\n }\n\n /**\n * Update {@link https://naver.github.io/egjs-axes/ | @egjs/axes}'s state\n * @remarks\n * This method synchronizes the Axes state with the given control parameters.\n * @param controlParams - Control parameters\n * @throws {@link InitializationErrors}\n * @returns The current instance for method chaining\n */\n public update(controlParams: ControlParams): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const axes = this._axes!;\n const axis = axes.axis[AXES.POSITION_KEY];\n\n axis.circular = [controlParams.circular, controlParams.circular];\n axis.range = [controlParams.range.min, controlParams.range.max];\n axis.bounce = parseBounce(flicking.bounce, camera.size);\n\n axes.axisManager.set({ [AXES.POSITION_KEY]: controlParams.position });\n\n return this;\n }\n\n /**\n * Attach a handler to the camera element to prevent click events during animation\n * @remarks\n * This is used when {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} is enabled.\n * @returns The current instance for method chaining\n */\n public addPreventClickHandler(): this {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const cameraEl = flicking.camera.element;\n\n axes.on(AXES.EVENT.HOLD, this._onAxesHold);\n axes.on(AXES.EVENT.CHANGE, this._onAxesChange);\n cameraEl.addEventListener(\"click\", this._preventClickWhenDragged, true);\n\n return this;\n }\n\n /**\n * Detach a handler to the camera element to prevent click events during animation\n * @remarks\n * This is used when {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} is disabled.\n * @returns The current instance for method chaining\n */\n public removePreventClickHandler(): this {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const cameraEl = flicking.camera.element;\n\n axes.off(AXES.EVENT.HOLD, this._onAxesHold);\n axes.off(AXES.EVENT.CHANGE, this._onAxesChange);\n cameraEl.removeEventListener(\"click\", this._preventClickWhenDragged, true);\n\n return this;\n }\n\n /**\n * Run Axes's {@link https://naver.github.io/egjs-axes/docs/api/Axes#setTo | setTo} using the given position\n * @remarks\n * If the target position equals the current position, the promise resolves immediately without animation.\n * @param position - A position to move\n * @param duration - Duration of the animation (unit: ms)\n * @param axesEvent - If provided, it'll use its {@link https://naver.github.io/egjs-axes/docs/api/Axes#setTo | setTo} method instead\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public animateTo(position: number, duration: number, axesEvent?: OnRelease): Promise<void> {\n const axes = this._axes;\n const state = this._stateMachine.state;\n\n if (!axes) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.NOT_ATTACHED_TO_FLICKING, ERROR.CODE.NOT_ATTACHED_TO_FLICKING)\n );\n }\n\n const startPos = this.getCurrentPosition();\n\n if (startPos === position) {\n const flicking = getFlickingAttached(this._flicking);\n\n flicking.camera.lookAt(position);\n\n if (state.targetPanel) {\n flicking.control.setActive(state.targetPanel, flicking.control.activePanel, axesEvent?.isTrusted ?? false);\n }\n return Promise.resolve();\n }\n\n this._animatingContext = {\n start: startPos,\n end: position,\n offset: 0\n };\n\n const animate = () => {\n const resetContext = () => {\n this._animatingContext = { start: 0, end: 0, offset: 0 };\n };\n\n axes.once(AXES.EVENT.FINISH, resetContext);\n\n if (axesEvent) {\n axesEvent.setTo({ [AXES.POSITION_KEY]: position }, duration);\n } else {\n axes.setTo({ [AXES.POSITION_KEY]: position }, duration);\n }\n };\n\n return new Promise((resolve, reject) => {\n const animationFinishHandler = () => {\n axes.off(AXES.EVENT.HOLD, interruptionHandler);\n resolve();\n };\n\n const interruptionHandler = () => {\n axes.off(AXES.EVENT.FINISH, animationFinishHandler);\n reject(new FlickingError(ERROR.MESSAGE.ANIMATION_INTERRUPTED, ERROR.CODE.ANIMATION_INTERRUPTED));\n };\n\n axes.once(AXES.EVENT.FINISH, animationFinishHandler);\n axes.once(AXES.EVENT.HOLD, interruptionHandler);\n\n animate();\n });\n }\n\n /**\n * Returns the current axes position\n */\n public getCurrentPosition() {\n return this._axes?.get([AXES.POSITION_KEY])[AXES.POSITION_KEY] ?? 0;\n }\n\n public updateDirection() {\n const flicking = getFlickingAttached(this._flicking);\n const axes = this._axes!;\n const panInput = this._panInput!;\n\n axes.disconnect(panInput);\n axes.connect(flicking.horizontal ? [AXES.POSITION_KEY, \"\"] : [\"\", AXES.POSITION_KEY], panInput);\n\n panInput.options.scale = flicking.horizontal ? [flicking.camera.panelOrder === ORDER.RTL ? 1 : -1, 0] : [0, -1];\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal values to their defaults. Called during construction and destruction.\n */\n private _resetInternalValues() {\n this._flicking = null;\n this._axes = null;\n this._panInput = null;\n this._animatingContext = { start: 0, end: 0, offset: 0 };\n this._dragged = false;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Handles the Axes hold event to reset the dragged state.\n */\n private _onAxesHold = () => {\n this._dragged = false;\n };\n\n /**\n * @internal\n * @privateRemarks\n * Handles the Axes change event to update the dragged state.\n */\n private _onAxesChange = () => {\n this._dragged = !!this._panInput?.isEnabled();\n };\n\n /**\n * @internal\n * @privateRemarks\n * Prevents click events when the user has dragged. Used for {@link FlickingOptions.preventClickOnDrag}.\n */\n private _preventClickWhenDragged = (e: MouseEvent) => {\n if (this._dragged) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n this._dragged = false;\n };\n}\n\nexport default AxesController;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport { ComponentEvent } from \"@egjs/component\";\nimport { DIRECTION } from \"../constants/values\";\nimport AxesController from \"../control/AxesController\";\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking from \"../Flicking\";\nimport { ValueOf } from \"../types/internal\";\nimport { getDirection, getFlickingAttached } from \"../utils\";\n\n/**\n * Parameters for {@link Control.moveToPanel}\n * @public\n */\nexport interface MoveToPanelParams {\n /** Duration of the animation (unit: ms) */\n duration: number;\n /** Direction to move, only available in the {@link Flicking.circular | circular} mode */\n direction?: ValueOf<typeof DIRECTION>;\n /** {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes} */\n axesEvent?: OnRelease;\n}\n\n/**\n * A component that manages inputs and animation of Flicking\n * @public\n */\nabstract class Control {\n // Internal States\n protected _flicking: Flicking | null;\n protected _controller: AxesController;\n protected _activePanel: Panel | null;\n protected _nextPanel: Panel | null;\n\n /**\n * A controller that handles the {@link https://naver.github.io/egjs-axes/ | @egjs/axes} events\n * @readonly\n */\n public get controller(): AxesController {\n return this._controller;\n }\n /**\n * Index number of the {@link Flicking.currentPanel | currentPanel}\n * @defaultValue 0\n * @readonly\n */\n public get activeIndex(): number {\n return this._activePanel?.index ?? -1;\n }\n /**\n * An active panel\n * @readonly\n */\n public get activePanel(): Panel | null {\n return this._activePanel;\n }\n /**\n * Whether Flicking's animating\n * @readonly\n */\n public get animating(): boolean {\n return this._controller.state.animating;\n }\n /**\n * Whether user is clicking or touching\n * @readonly\n */\n public get holding(): boolean {\n return this._controller.state.holding;\n }\n\n public constructor() {\n this._flicking = null;\n this._controller = new AxesController();\n this._activePanel = null;\n }\n\n /**\n * Move {@link Camera} to the given position\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public abstract moveToPosition(position: number, duration: number, axesEvent?: OnRelease): Promise<void>;\n\n /**\n * Initialize Control\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It initializes the internal controller.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n this._controller.init(flicking);\n\n return this;\n }\n\n /**\n * Destroy Control and return to initial state\n * @remarks\n * This method destroys the internal controller and resets all internal values.\n */\n public destroy(): void {\n this._controller.destroy();\n\n this._flicking = null;\n this._activePanel = null;\n }\n\n /**\n * Enable input from the user (mouse/touch)\n * @remarks\n * This is a shorthand for `Flicking.enableInput`.\n * @returns The current instance for method chaining\n */\n public enable(): this {\n this._controller.enable();\n\n return this;\n }\n\n /**\n * Disable input from the user (mouse/touch)\n * @remarks\n * This is a shorthand for `Flicking.disableInput`.\n * @returns The current instance for method chaining\n */\n public disable(): this {\n this._controller.disable();\n\n return this;\n }\n\n /**\n * Releases ongoing user input (mouse/touch)\n * @remarks\n * This method immediately releases the user's input, similar to the user lifting their finger.\n * @returns The current instance for method chaining\n */\n public release(): this {\n this._controller.release();\n\n return this;\n }\n\n /**\n * Change the destination and duration of the animation currently playing\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @param panel - The target panel to move\n * @param duration - Duration of the animation (unit: ms)\n * @param direction - Direction to move, only available in the {@link Flicking.circular | circular} mode\n * @throws {@link AnimationUpdateErrors}\n * @returns The current instance for method chaining\n */\n public updateAnimation(panel: Panel, duration?: number, direction?: ValueOf<typeof DIRECTION>): this {\n const state = this._controller.state;\n const position = this._getPosition(panel, direction ?? DIRECTION.NONE);\n\n state.targetPanel = panel;\n this._controller.updateAnimation(position, duration);\n\n return this;\n }\n\n /**\n * Stops the animation currently playing\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @returns The current instance for method chaining\n */\n public stopAnimation(): this {\n const state = this._controller.state;\n\n state.targetPanel = null;\n this._controller.stopAnimation();\n\n return this;\n }\n\n /**\n * Update position after resizing\n * @remarks\n * This method moves the camera to the active panel's position after a resize operation.\n * @param progressInPanel - Previous camera's progress in active panel before resize\n * @throws {@link InitializationErrors}\n */\n public updatePosition(progressInPanel: number): void {\n // eslint-disable-line @typescript-eslint/no-unused-vars\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n if (activePanel) {\n camera.lookAt(camera.clampToReachablePosition(activePanel.position));\n }\n }\n\n /**\n * Update {@link Control.controller | controller}'s state\n * @remarks\n * This method synchronizes the controller state with the current camera parameters.\n * @returns The current instance for method chaining\n */\n public updateInput(): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n this._controller.update(camera.controlParams);\n\n return this;\n }\n\n /**\n * Reset {@link Control.activePanel | activePanel} to `null`\n * @remarks\n * This method is called when the active panel is removed from the renderer.\n * @returns The current instance for method chaining\n */\n public resetActive(): this {\n this._activePanel = null;\n\n return this;\n }\n\n /**\n * Move {@link Camera} to the given panel\n * @param panel - The target panel to move\n * @param options - {@link MoveToPanelParams}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target panel\n */\n public async moveToPanel(\n panel: Panel,\n { duration, direction = DIRECTION.NONE, axesEvent }: MoveToPanelParams\n ): Promise<void> {\n const position = this._getPosition(panel, direction);\n this._triggerIndexChangeEvent(panel, panel.position, axesEvent, direction);\n\n return this._animateToPosition({ position, duration, newActivePanel: panel, axesEvent });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Sets the active panel and triggers {@link ChangedEvent} or {@link RestoredEvent} based on whether the panel changed.\n */\n public setActive(newActivePanel: Panel, prevActivePanel: Panel | null, isTrusted: boolean) {\n const flicking = getFlickingAttached(this._flicking);\n\n this._activePanel = newActivePanel;\n this._nextPanel = null;\n\n flicking.camera.updateAdaptiveHeight();\n\n if (newActivePanel !== prevActivePanel) {\n flicking.trigger(\n new ComponentEvent(EVENTS.CHANGED, {\n index: newActivePanel.index,\n panel: newActivePanel,\n prevIndex: prevActivePanel?.index ?? -1,\n prevPanel: prevActivePanel,\n isTrusted,\n direction: prevActivePanel ? getDirection(prevActivePanel.position, newActivePanel.position) : DIRECTION.NONE\n })\n );\n } else {\n flicking.trigger(\n new ComponentEvent(EVENTS.RESTORED, {\n isTrusted\n })\n );\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Copies internal state from another Control instance. Used when changing moveType option.\n */\n public copy(control: Control) {\n this._flicking = control._flicking;\n this._activePanel = control._activePanel;\n this._controller = control._controller;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Triggers {@link WillChangeEvent} or {@link WillRestoreEvent} based on whether the target panel differs from the active panel.\n */\n protected _triggerIndexChangeEvent(\n panel: Panel,\n position: number,\n axesEvent?: OnRelease,\n direction?: ValueOf<typeof DIRECTION>\n ) {\n const flicking = getFlickingAttached(this._flicking);\n const triggeringEvent = panel !== this._activePanel ? EVENTS.WILL_CHANGE : EVENTS.WILL_RESTORE;\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n const event = new ComponentEvent(triggeringEvent, {\n index: panel.index,\n panel,\n isTrusted: axesEvent?.isTrusted || false,\n direction: direction ?? getDirection(activePanel?.position ?? camera.position, position)\n });\n\n this._nextPanel = panel;\n flicking.trigger(event);\n\n if (event.isCanceled()) {\n throw new FlickingError(ERROR.MESSAGE.STOP_CALLED_BY_USER, ERROR.CODE.STOP_CALLED_BY_USER);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Animates the camera to the target position and handles animation completion or interruption.\n */\n protected async _animateToPosition({\n position,\n duration,\n newActivePanel,\n axesEvent\n }: {\n position: number;\n duration: number;\n newActivePanel: Panel;\n axesEvent?: OnRelease;\n }) {\n const flicking = getFlickingAttached(this._flicking);\n // 거리(1px 미만)가 매우 짧은 경우 duration이 늘어지는걸 방지하기 위해 0으로 바꿔 즉시 변경\n let nextDuration = duration;\n\n if (Math.abs(nextDuration - position) < flicking.animationThreshold) {\n nextDuration = 0;\n }\n const animate = () => this._controller.animateTo(position, nextDuration, axesEvent);\n const state = this._controller.state;\n\n state.targetPanel = newActivePanel;\n\n if (nextDuration <= 0) {\n return animate();\n } else {\n return animate()\n .then(async () => {\n if (flicking.initialized) {\n await flicking.renderer.render();\n }\n })\n .catch(err => {\n if (axesEvent && err instanceof FlickingError && err.code === ERROR.CODE.ANIMATION_INTERRUPTED) return;\n throw err;\n });\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates the target position for a panel, considering circular mode and direction constraints.\n */\n private _getPosition(panel: Panel, direction: ValueOf<typeof DIRECTION> = DIRECTION.NONE) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n let position = panel.position;\n const nearestAnchor = camera.findNearestAnchor(position);\n\n if (panel.removed || !nearestAnchor) {\n throw new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(panel.position), ERROR.CODE.POSITION_NOT_REACHABLE);\n }\n if (!camera.canReach(panel)) {\n // Override position & panel if that panel is not reachable\n position = nearestAnchor.position;\n panel = nearestAnchor.panel;\n } else if (flicking.circularEnabled) {\n // Circular mode is enabled, find nearest distance to panel\n const camPos = this._controller.position; // Actual position of the Axes\n const camRangeDiff = camera.rangeDiff;\n const possiblePositions = [position, position + camRangeDiff, position - camRangeDiff].filter(pos => {\n if (direction === DIRECTION.NONE) return true;\n\n return direction === DIRECTION.PREV ? pos <= camPos : pos >= camPos;\n });\n\n position = possiblePositions.reduce((nearestPosition, pos) => {\n if (Math.abs(camPos - pos) < Math.abs(camPos - nearestPosition)) {\n return pos;\n } else {\n return nearestPosition;\n }\n }, Infinity);\n }\n\n return position;\n }\n}\n\nexport default Control;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { getFlickingAttached } from \"../utils\";\n\nimport Control from \"./Control\";\n\n/**\n * Options for the {@link FreeControl}\n */\nexport interface FreeControlOptions {\n /** Make scroll animation to stop at the start/end of the scroll area, not going out the bounce area */\n stopAtEdge: boolean;\n}\n\n/**\n * A {@link Control} that can be scrolled freely without alignment\n * @public\n */\nclass FreeControl extends Control {\n private _stopAtEdge: FreeControlOptions[\"stopAtEdge\"];\n\n /**\n * Make scroll animation to stop at the start/end of the scroll area, not going out the bounce area\n * @defaultValue true\n */\n public get stopAtEdge(): boolean {\n return this._stopAtEdge;\n }\n\n public set stopAtEdge(val: FreeControlOptions[\"stopAtEdge\"]) {\n this._stopAtEdge = val;\n }\n\n public constructor(options: Partial<FreeControlOptions> = {}) {\n super();\n\n const { stopAtEdge = true } = options;\n\n this._stopAtEdge = stopAtEdge;\n }\n\n /**\n * Update position after resizing\n * @remarks\n * Unlike the base Control, FreeControl preserves the progress within the panel instead of snapping to the panel position.\n * @param progressInPanel - Previous camera's progress in active panel before resize\n * @throws {@link InitializationErrors}\n */\n public updatePosition(progressInPanel: number): void {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activePanel = this._activePanel;\n\n if (activePanel) {\n const panelRange = activePanel.range;\n const newPosition = panelRange.min + (panelRange.max - panelRange.min) * progressInPanel;\n\n camera.lookAt(camera.clampToReachablePosition(newPosition));\n }\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * Unlike SnapControl, FreeControl moves to the exact position without snapping to panel boundaries.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease) {\n const flicking = getFlickingAttached(this._flicking);\n\n const camera = flicking.camera;\n const targetPos = camera.clampToReachablePosition(position);\n\n const anchorAtPosition = camera.findAnchorIncludePosition(targetPos);\n\n if (!anchorAtPosition) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const targetPanel = anchorAtPosition.panel;\n\n // Trigger only change event\n if (targetPanel !== this._activePanel) {\n this._triggerIndexChangeEvent(targetPanel, position, axesEvent);\n }\n\n return this._animateToPosition({\n position: this._stopAtEdge ? targetPos : position,\n duration,\n newActivePanel: targetPanel,\n axesEvent\n });\n }\n}\n\nexport default FreeControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\nimport * as AXES from \"../constants/internal\";\nimport AnchorPoint from \"../core/AnchorPoint\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { circulateIndex, clamp, getFlickingAttached } from \"../utils\";\n\nimport Control from \"./Control\";\n\n/**\n * Options for the {@link SnapControl}\n */\nexport interface SnapControlOptions {\n /** Maximum number of panels can go after release */\n count: number;\n}\n\n/**\n * A {@link Control} that uses a release momentum to choose destination panel\n * @public\n */\nclass SnapControl extends Control {\n private _count: SnapControlOptions[\"count\"];\n\n /**\n * Maximum number of panels can go after release\n * @defaultValue Infinity\n */\n public get count(): number {\n return this._count;\n }\n\n public set count(val: SnapControlOptions[\"count\"]) {\n this._count = val;\n }\n\n public constructor(options: Partial<SnapControlOptions> = {}) {\n super();\n\n const { count = Infinity } = options;\n\n this._count = count;\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * This method calculates the snap target based on the release momentum and threshold settings.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const activeAnchor = camera.findActiveAnchor();\n const anchorAtCamera = camera.findNearestAnchor(camera.position);\n const state = this._controller.state;\n\n if (!activeAnchor || !anchorAtCamera) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const snapThreshold = this._calcSnapThreshold(flicking.threshold, position, activeAnchor);\n\n const posDelta = flicking.animating ? state.delta : position - camera.position;\n const absPosDelta = Math.abs(posDelta);\n const snapDelta =\n axesEvent && axesEvent.delta[AXES.POSITION_KEY] !== 0\n ? Math.abs(axesEvent.delta[AXES.POSITION_KEY])\n : absPosDelta;\n let targetAnchor: AnchorPoint;\n\n if (snapDelta >= snapThreshold && snapDelta > 0) {\n // Move to anchor at position\n targetAnchor = this._findSnappedAnchor(position, anchorAtCamera);\n } else if (absPosDelta >= flicking.threshold && absPosDelta > 0) {\n // Move to the adjacent panel\n targetAnchor = this._findAdjacentAnchor(position, posDelta, anchorAtCamera);\n } else {\n // Fallback to nearest panel from current camera\n return this.moveToPanel(anchorAtCamera.panel, {\n duration,\n axesEvent\n });\n }\n\n this._triggerIndexChangeEvent(targetAnchor.panel, position, axesEvent);\n\n return this._animateToPosition({\n position: camera.clampToReachablePosition(targetAnchor.position),\n duration,\n newActivePanel: targetAnchor.panel,\n axesEvent\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Finds the anchor point to snap to based on the target position and count option.\n */\n private _findSnappedAnchor(position: number, anchorAtCamera: AnchorPoint): AnchorPoint {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const count = this._count;\n\n const currentPos = camera.position;\n\n const clampedPosition = camera.clampToReachablePosition(position);\n const anchorAtPosition = camera.findAnchorIncludePosition(clampedPosition);\n\n if (!anchorAtCamera || !anchorAtPosition) {\n throw new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE);\n }\n\n if (!Number.isFinite(count)) {\n return anchorAtPosition;\n }\n\n const panelCount = flicking.panelCount;\n const anchors = camera.anchorPoints;\n\n let loopCount = Math.sign(position - currentPos) * Math.floor(Math.abs(position - currentPos) / camera.rangeDiff);\n if (\n (position > currentPos && anchorAtPosition.index < anchorAtCamera.index) ||\n (anchorAtPosition.position > anchorAtCamera.position && anchorAtPosition.index === anchorAtCamera.index)\n ) {\n loopCount += 1;\n } else if (\n (position < currentPos && anchorAtPosition.index > anchorAtCamera.index) ||\n (anchorAtPosition.position < anchorAtCamera.position && anchorAtPosition.index === anchorAtCamera.index)\n ) {\n loopCount -= 1;\n }\n\n const circularIndexOffset = loopCount * panelCount;\n const anchorAtPositionIndex = anchorAtPosition.index + circularIndexOffset;\n\n if (Math.abs(anchorAtPositionIndex - anchorAtCamera.index) <= count) {\n const anchor = anchors[anchorAtPosition.index];\n\n return new AnchorPoint({\n index: anchor.index,\n position: anchor.position + loopCount * camera.rangeDiff,\n panel: anchor.panel\n });\n }\n\n if (flicking.circularEnabled) {\n const targetAnchor =\n anchors[circulateIndex(anchorAtCamera.index + Math.sign(position - currentPos) * count, panelCount)];\n let loop = Math.floor(count / panelCount);\n\n if (position > currentPos && targetAnchor.index < anchorAtCamera.index) {\n loop += 1;\n } else if (position < currentPos && targetAnchor.index > anchorAtCamera.index) {\n loop -= 1;\n }\n\n return new AnchorPoint({\n index: targetAnchor.index,\n position: targetAnchor.position + loop * camera.rangeDiff,\n panel: targetAnchor.panel\n });\n } else {\n return anchors[clamp(anchorAtCamera.index + Math.sign(position - currentPos) * count, 0, anchors.length - 1)];\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Finds the adjacent anchor point based on the movement direction.\n */\n private _findAdjacentAnchor(position: number, posDelta: number, anchorAtCamera: AnchorPoint): AnchorPoint {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n if (camera.circularEnabled) {\n const anchorIncludePosition = camera.findAnchorIncludePosition(position);\n\n if (anchorIncludePosition && anchorIncludePosition.position !== anchorAtCamera.position) {\n return anchorIncludePosition;\n }\n }\n\n const adjacentAnchor =\n (posDelta > 0 ? camera.getNextAnchor(anchorAtCamera) : camera.getPrevAnchor(anchorAtCamera)) ?? anchorAtCamera;\n\n return adjacentAnchor;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates the snap threshold based on the panel size and alignment.\n */\n private _calcSnapThreshold(threshold: number, position: number, activeAnchor: AnchorPoint): number {\n const isNextDirection = position > activeAnchor.position;\n const panel = activeAnchor.panel;\n const panelSize = panel.size;\n const alignPos = panel.alignPosition;\n\n // Minimum distance needed to decide prev/next panel as nearest\n /*\n * | Prev | Next |\n * |<------>|<------------>|\n * [ |<-Anchor ]\n */\n return Math.max(\n threshold,\n isNextDirection ? panelSize - alignPos + panel.margin.next : alignPos + panel.margin.prev\n );\n }\n}\n\nexport default SnapControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { OnRelease } from \"@egjs/axes\";\n\nimport Panel from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { clamp, getFlickingAttached, getMinusCompensatedIndex, isBetween } from \"../utils\";\n\nimport Control, { MoveToPanelParams } from \"./Control\";\n/**\n * Options for the {@link StrictControl}\n */\nexport interface StrictControlOptions {\n /** Maximum number of panels that can be moved at a time */\n count: number;\n}\n\n/**\n * A {@link Control} that allows you to select the maximum number of panels to move at a time\n * @since 4.2.0\n * @public\n */\nclass StrictControl extends Control {\n private _count: number;\n private _indexRange: { min: number; max: number };\n\n /**\n * Maximum number of panels that can be moved at a time\n * @defaultValue 1\n */\n public get count(): number {\n return this._count;\n }\n\n public set count(val: StrictControlOptions[\"count\"]) {\n this._count = val;\n }\n\n public constructor(options: Partial<StrictControlOptions> = {}) {\n super();\n\n const { count = 1 } = options;\n\n this._count = count;\n this._resetIndexRange();\n }\n\n /**\n * Destroy Control and return to initial state\n * @remarks\n * This method also resets the index range used for movement constraints.\n */\n public destroy() {\n super.destroy();\n\n this._resetIndexRange();\n }\n\n /**\n * Update {@link Control.controller | controller}'s state\n * @remarks\n * StrictControl limits the movement range based on the {@link StrictControlOptions.count | count} option.\n * @returns The current instance for method chaining\n */\n public updateInput(): this {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const renderer = flicking.renderer;\n const controller = this._controller;\n const controlParams = camera.controlParams;\n const count = this._count;\n\n const activePanel = controller.state.animating\n ? camera.findNearestAnchor(camera.position)?.panel\n : this._activePanel;\n\n if (!activePanel) {\n controller.update(controlParams);\n this._resetIndexRange();\n return this;\n }\n\n const cameraRange = controlParams.range;\n const currentPos = activePanel.position;\n const currentIndex = activePanel.index;\n const panelCount = renderer.panelCount;\n\n let prevPanelIndex = currentIndex - count;\n let nextPanelIndex = currentIndex + count;\n\n if (prevPanelIndex < 0) {\n prevPanelIndex = flicking.circularEnabled\n ? getMinusCompensatedIndex(((prevPanelIndex + 1) % panelCount) - 1, panelCount)\n : clamp(prevPanelIndex, 0, panelCount - 1);\n }\n if (nextPanelIndex >= panelCount) {\n nextPanelIndex = flicking.circularEnabled\n ? nextPanelIndex % panelCount\n : clamp(nextPanelIndex, 0, panelCount - 1);\n }\n\n const prevPanel = renderer.panels[prevPanelIndex];\n const nextPanel = renderer.panels[nextPanelIndex];\n\n let prevPos = Math.max(prevPanel.position, cameraRange.min);\n let nextPos = Math.min(nextPanel.position, cameraRange.max);\n\n if (prevPos > currentPos) {\n prevPos -= camera.rangeDiff;\n }\n if (nextPos < currentPos) {\n nextPos += camera.rangeDiff;\n }\n\n controlParams.range = {\n min: prevPos,\n max: nextPos\n };\n\n if (controlParams.circular) {\n if (controlParams.position < prevPos) {\n controlParams.position += camera.rangeDiff;\n }\n\n if (controlParams.position > nextPos) {\n controlParams.position -= camera.rangeDiff;\n }\n }\n\n controlParams.circular = false;\n controller.update(controlParams);\n\n this._indexRange = {\n min: prevPanel.index,\n max: nextPanel.index\n };\n\n return this;\n }\n\n public async moveToPanel(panel: Panel, options: MoveToPanelParams): Promise<void> {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const controller = this._controller;\n\n controller.update(camera.controlParams);\n\n return super.moveToPanel(panel, options);\n }\n\n /**\n * Move {@link Camera} to the given position\n * @remarks\n * StrictControl restricts movement to panels within the allowed index range based on the count option.\n * @param position - The target position to move\n * @param duration - Duration of the panel movement animation (unit: ms)\n * @param axesEvent - {@link https://naver.github.io/egjs-axes/docs/api/Axes#event-release | release} event of {@link https://naver.github.io/egjs-axes/ | Axes}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the target position\n */\n public moveToPosition(position: number, duration: number, axesEvent?: OnRelease): Promise<void> {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const currentPanel = this._nextPanel ?? this._activePanel;\n const axesRange = this._controller.range;\n const indexRange = this._indexRange;\n const cameraRange = camera.range;\n const state = this._controller.state;\n\n const clampedPosition = clamp(camera.clampToReachablePosition(position), axesRange[0], axesRange[1]);\n const anchorAtPosition = camera.findAnchorIncludePosition(clampedPosition);\n\n if (!anchorAtPosition || !currentPanel) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n\n const prevPos = currentPanel.position;\n const posDelta = flicking.animating ? state.delta : position - camera.position;\n\n const isOverThreshold = Math.abs(posDelta) >= flicking.threshold;\n const adjacentAnchor =\n position > prevPos ? camera.getNextAnchor(anchorAtPosition) : camera.getPrevAnchor(anchorAtPosition);\n\n let targetPos: number;\n let targetPanel: Panel;\n\n const anchors = camera.anchorPoints;\n const firstAnchor = anchors[0];\n const lastAnchor = anchors[anchors.length - 1];\n\n // position이 bounce으로 인하여 범위를 넘어가야 동작하도록 변경\n const shouldBounceToFirst =\n position < cameraRange.min && isBetween(firstAnchor.panel.index, indexRange.min, indexRange.max);\n const shouldBounceToLast =\n position > cameraRange.max && isBetween(lastAnchor.panel.index, indexRange.min, indexRange.max);\n\n const isAdjacent =\n adjacentAnchor &&\n (indexRange.min <= indexRange.max\n ? isBetween(adjacentAnchor.index, indexRange.min, indexRange.max)\n : adjacentAnchor.index >= indexRange.min || adjacentAnchor.index <= indexRange.max);\n\n if (shouldBounceToFirst || shouldBounceToLast) {\n // In bounce area\n const targetAnchor = position < cameraRange.min ? firstAnchor : lastAnchor;\n\n targetPanel = targetAnchor.panel;\n targetPos = targetAnchor.position;\n } else if (isOverThreshold && anchorAtPosition.position !== currentPanel.position) {\n // Move to anchor at position\n targetPanel = anchorAtPosition.panel;\n targetPos = anchorAtPosition.position;\n } else if (isOverThreshold && isAdjacent) {\n // Move to adjacent anchor\n targetPanel = adjacentAnchor!.panel;\n targetPos = adjacentAnchor!.position;\n } else {\n // Fallback to nearest panel from current camera\n const anchorAtCamera = camera.findNearestAnchor(camera.position);\n if (!anchorAtCamera) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.POSITION_NOT_REACHABLE(position), ERROR.CODE.POSITION_NOT_REACHABLE)\n );\n }\n return this.moveToPanel(anchorAtCamera.panel, {\n duration,\n axesEvent\n });\n }\n\n this._triggerIndexChangeEvent(targetPanel, position, axesEvent);\n\n return this._animateToPosition({\n position: targetPos,\n duration,\n newActivePanel: targetPanel,\n axesEvent\n });\n }\n\n public setActive = (newActivePanel: Panel, prevActivePanel: Panel | null, isTrusted: boolean) => {\n super.setActive(newActivePanel, prevActivePanel, isTrusted);\n this.updateInput();\n };\n\n /**\n * @internal\n * @privateRemarks\n * Resets the index range to default values.\n */\n private _resetIndexRange() {\n this._indexRange = { min: 0, max: 0 };\n }\n}\n\nexport default StrictControl;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Flicking from \"../Flicking\";\nimport { getElementSize, getStyle } from \"../utils\";\n\n/**\n * A component that detects size change and trigger resize method when the autoResize option is used\n */\nclass AutoResizer {\n private _flicking: Flicking;\n private _enabled: boolean;\n private _resizeObserver: ResizeObserver | null;\n private _resizeTimer: number;\n private _maxResizeDebounceTimer: number;\n\n public get enabled() {\n return this._enabled;\n }\n\n /**\n * @param flicking\n */\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n this._enabled = false;\n this._resizeObserver = null;\n this._resizeTimer = -1;\n this._maxResizeDebounceTimer = -1;\n }\n\n public enable(): this {\n const flicking = this._flicking;\n const viewport = flicking.viewport;\n\n if (this._enabled) {\n this.disable();\n }\n\n if (flicking.useResizeObserver && !!window.ResizeObserver) {\n const viewportSizeNot0 = viewport.width !== 0 || viewport.height !== 0;\n\n const resizeObserver = viewportSizeNot0\n ? new ResizeObserver(this._skipFirstResize)\n : new ResizeObserver(this._onResize);\n\n this._resizeObserver = resizeObserver;\n\n this.observe(flicking.viewport.element);\n\n if (flicking.observePanelResize) {\n this.observePanels();\n }\n } else {\n window.addEventListener(\"resize\", this._onResizeWrapper);\n }\n\n this._enabled = true;\n\n return this;\n }\n\n public observePanels(): this {\n this._flicking.panels.forEach(panel => {\n this.observe(panel.element);\n });\n return this;\n }\n\n public unobservePanels(): this {\n this._flicking.panels.forEach(panel => {\n this.unobserve(panel.element);\n });\n return this;\n }\n\n public observe(element: HTMLElement): this {\n const resizeObserver = this._resizeObserver;\n\n if (!resizeObserver) return this;\n\n resizeObserver.observe(element);\n\n return this;\n }\n\n public unobserve(element: HTMLElement): this {\n const resizeObserver = this._resizeObserver;\n\n if (!resizeObserver) return this;\n\n resizeObserver.unobserve(element);\n\n if (this._flicking.observePanelResize) {\n this.unobservePanels();\n }\n\n return this;\n }\n\n public disable(): this {\n if (!this._enabled) return this;\n\n const resizeObserver = this._resizeObserver;\n if (resizeObserver) {\n resizeObserver.disconnect();\n this._resizeObserver = null;\n } else {\n window.removeEventListener(\"resize\", this._onResizeWrapper);\n }\n\n this._enabled = false;\n\n return this;\n }\n\n private _onResizeWrapper = () => {\n this._onResize([]);\n };\n\n private _onResize = (entries: ResizeObserverEntry[]) => {\n const flicking = this._flicking;\n const resizeDebounce = flicking.resizeDebounce;\n const maxResizeDebounce = flicking.maxResizeDebounce;\n\n const resizedViewportElement = flicking.element;\n // 현재 구현에서 리사이즈 옵저빙 대상은 패널과 뷰포트 2개만 존재.\n // 아래는 뷰포트만 변경되었을 때 동작해야하는 로직이 있으므로 아래와 같이 조건문을 건다.\n // 패널 쪽에서는 리사이즈 감지에 resizeObserver를 사용하지 않는 경우가 없으므로 이 조건은 곧 뷰포트만 리사이즈가 된 경우를 의미한다.\n const isResizedViewportOnly = entries.find(e => e.target === flicking.element) && entries.length === 1;\n\n // 참고: resizeObserver를 사용하지 않은 경우에는 entries.length가 0으로 오는데 이 경우에는 그냥 항상 리사이즈가 진행되도록 한다.\n // (vw, vh 등을 사용하는 경우 이상 동작이 발생할 여지가 있기 때문이다)\n if (isResizedViewportOnly) {\n // resize 이벤트가 발생했으나 이전과 width, height의 변화가 없다면 이후 로직을 진행하지 않는다.\n const beforeSize = {\n width: flicking.viewport.width,\n height: flicking.viewport.height\n };\n\n const afterSize = {\n width: getElementSize({\n el: resizedViewportElement,\n horizontal: true,\n useFractionalSize: this._flicking.useFractionalSize,\n useOffset: false,\n style: getStyle(resizedViewportElement)\n }),\n height: getElementSize({\n el: resizedViewportElement,\n horizontal: false,\n useFractionalSize: this._flicking.useFractionalSize,\n useOffset: false,\n style: getStyle(resizedViewportElement)\n })\n };\n\n if (beforeSize.height === afterSize.height && beforeSize.width === afterSize.width) {\n return;\n }\n }\n\n if (resizeDebounce <= 0) {\n void flicking.resize();\n } else {\n if (this._maxResizeDebounceTimer <= 0) {\n if (maxResizeDebounce > 0 && maxResizeDebounce >= resizeDebounce) {\n this._maxResizeDebounceTimer = window.setTimeout(this._doScheduledResize, maxResizeDebounce);\n }\n }\n\n if (this._resizeTimer > 0) {\n clearTimeout(this._resizeTimer);\n this._resizeTimer = 0;\n }\n\n this._resizeTimer = window.setTimeout(this._doScheduledResize, resizeDebounce);\n }\n };\n\n private _doScheduledResize = () => {\n clearTimeout(this._resizeTimer);\n clearTimeout(this._maxResizeDebounceTimer);\n\n this._maxResizeDebounceTimer = -1;\n this._resizeTimer = -1;\n\n void this._flicking.resize();\n };\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private _skipFirstResize = (() => {\n let isFirstResize = true;\n\n return entries => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n this._onResize(entries);\n };\n })();\n}\n\nexport default AutoResizer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Flicking from \"../../../Flicking\";\n\nimport ElementProvider from \"./ElementProvider\";\n\n/**\n * @internal\n */\nclass VanillaElementProvider implements ElementProvider {\n private _element: HTMLElement;\n private _rendered: boolean;\n\n public get element() {\n return this._element;\n }\n public get rendered() {\n return this._rendered;\n }\n\n public constructor(element: HTMLElement) {\n this._element = element;\n this._rendered = true;\n }\n\n public show(flicking: Flicking): void {\n const el = this.element;\n const cameraEl = flicking.camera.element;\n\n if (el.parentElement !== cameraEl) {\n cameraEl.appendChild(el);\n this._rendered = true;\n }\n }\n\n public hide(flicking: Flicking): void {\n const el = this.element;\n const cameraEl = flicking.camera.element;\n\n if (el.parentElement === cameraEl) {\n cameraEl.removeChild(el);\n this._rendered = false;\n }\n }\n}\n\nexport default VanillaElementProvider;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Flicking from \"../../../Flicking\";\nimport VirtualPanel from \"../VirtualPanel\";\n\nimport ElementProvider from \"./ElementProvider\";\n\n/**\n * @internal\n */\nclass VirtualElementProvider implements ElementProvider {\n private _flicking: Flicking;\n private _panel: VirtualPanel;\n\n public get element() {\n return this._virtualElement.nativeElement;\n }\n public get rendered() {\n return this._virtualElement.visible;\n }\n\n private get _virtualElement() {\n const flicking = this._flicking;\n const elIndex = this._panel.elementIndex;\n const virtualElements = flicking.virtual.elements;\n\n return virtualElements[elIndex];\n }\n\n public constructor(flicking: Flicking) {\n this._flicking = flicking;\n }\n\n public init(panel: VirtualPanel) {\n this._panel = panel;\n }\n\n public show(): void {\n // DO_NOTHING\n // Actual element visibility is controlled by VirtualManager\n }\n\n public hide(): void {\n // DO_NOTHING\n // Actual element visibility is controlled by VirtualManager\n }\n}\n\nexport default VirtualElementProvider;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Flicking from \"../Flicking\";\nimport { SetSizeParams } from \"../types/params\";\nimport { getElementSize, getStyle, isString } from \"../utils\";\n\nexport interface ViewportPadding {\n /** CSS `padding-left` */\n left: number;\n /** CSS `padding-right` */\n right: number;\n /** CSS `padding-top` */\n top: number;\n /** CSS `padding-bottom` */\n bottom: number;\n}\n\n/**\n * A component that manages viewport size\n */\nclass Viewport {\n private _flicking: Flicking;\n private _el: HTMLElement;\n private _width: number;\n private _height: number;\n private _isBorderBoxSizing: boolean;\n private _padding: ViewportPadding;\n\n /**\n * A viewport(root) element\n * @readonly\n */\n public get element(): HTMLElement {\n return this._el;\n }\n\n /**\n * Viewport width, without paddings\n * @readonly\n */\n public get width(): number {\n return this._width - this._padding.left - this._padding.right;\n }\n /**\n * Viewport height, without paddings\n * @readonly\n */\n public get height(): number {\n return this._height - this._padding.top - this._padding.bottom;\n }\n /**\n * Viewport paddings\n * @readonly\n */\n public get padding(): ViewportPadding {\n return this._padding;\n }\n\n /**\n * @param flicking - Flicking instance\n * @param el - A viewport element\n */\n public constructor(flicking: Flicking, el: HTMLElement) {\n this._flicking = flicking;\n this._el = el;\n this._width = 0;\n this._height = 0;\n this._padding = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this._isBorderBoxSizing = false;\n }\n\n /**\n * Change viewport's size.\n * @remarks\n * This will change the actual size of `.flicking-viewport` element by changing its CSS width/height property\n * @param size - {@link SetSizeParams}\n */\n public setSize(size: SetSizeParams) {\n const { width, height } = size;\n\n const el = this._el;\n const padding = this._padding;\n const isBorderBoxSizing = this._isBorderBoxSizing;\n\n if (width != null) {\n if (isString(width)) {\n el.style.width = width;\n } else {\n const newWidth = isBorderBoxSizing ? width + padding.left + padding.right : width;\n el.style.width = `${newWidth}px`;\n }\n }\n if (height != null) {\n if (isString(height)) {\n el.style.height = height;\n } else {\n const newHeight = isBorderBoxSizing ? height + padding.top + padding.bottom : height;\n el.style.height = `${newHeight}px`;\n }\n }\n this.resize();\n }\n\n /**\n * Update width/height to the current viewport element's size\n */\n public resize() {\n const el = this._el;\n const elStyle = getStyle(el);\n const { useFractionalSize } = this._flicking;\n\n this._width = getElementSize({\n el,\n horizontal: true,\n useFractionalSize,\n useOffset: false,\n style: elStyle\n });\n this._height = getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: false,\n style: elStyle\n });\n\n this._padding = {\n left: elStyle.paddingLeft ? parseFloat(elStyle.paddingLeft) : 0,\n right: elStyle.paddingRight ? parseFloat(elStyle.paddingRight) : 0,\n top: elStyle.paddingTop ? parseFloat(elStyle.paddingTop) : 0,\n bottom: elStyle.paddingBottom ? parseFloat(elStyle.paddingBottom) : 0\n };\n this._isBorderBoxSizing = elStyle.boxSizing === \"border-box\";\n }\n}\n\nexport default Viewport;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { CLASS } from \"../constants/values\";\nimport Flicking from \"../Flicking\";\nimport { range } from \"../utils\";\n\nimport VirtualPanel from \"./panel/VirtualPanel\";\n\nexport type PanelRenderCallback =\n | ((\n /** Virtual panel to render */\n panel: VirtualPanel,\n /** Index of the panel */\n index: number\n ) => string)\n | (() => string);\n\nexport interface VirtualOptions {\n renderPanel: PanelRenderCallback;\n initialPanelCount: number;\n cache?: boolean;\n panelClass?: string;\n}\n\n/**\n * A manager class to add / remove virtual panels\n */\nclass VirtualManager {\n private _flicking: Flicking;\n\n private _renderPanel: PanelRenderCallback;\n private _initialPanelCount: number;\n private _cache: boolean;\n private _panelClass: string;\n\n private _elements: Array<{ nativeElement: HTMLElement; visible: boolean }>;\n\n public get elements() {\n return this._elements;\n }\n\n // Options\n /**\n * A rendering function for the panel element's innerHTML\n */\n public get renderPanel(): PanelRenderCallback {\n return this._renderPanel;\n }\n /**\n * Initial panel count to render\n * @readonly\n * @defaultValue -1\n */\n public get initialPanelCount(): number {\n return this._initialPanelCount;\n }\n /**\n * Whether to cache rendered panel's innerHTML\n * @defaultValue false\n */\n public get cache(): boolean {\n return this._cache;\n }\n /**\n * The class name that will be applied to rendered panel elements\n * @defaultValue \"flicking-panel\"\n */\n public get panelClass(): string {\n return this._panelClass;\n }\n\n public set renderPanel(val: VirtualOptions[\"renderPanel\"]) {\n this._renderPanel = val;\n this._flicking.renderer.panels.forEach((panel: VirtualPanel) => panel.uncacheRenderResult());\n }\n\n public set cache(val: NonNullable<VirtualOptions[\"cache\"]>) {\n this._cache = val;\n }\n public set panelClass(val: NonNullable<VirtualOptions[\"panelClass\"]>) {\n this._panelClass = val;\n }\n\n public constructor(flicking: Flicking, options: VirtualOptions | null) {\n this._flicking = flicking;\n\n this._renderPanel = options?.renderPanel ?? (() => \"\");\n this._initialPanelCount = options?.initialPanelCount ?? -1;\n this._cache = options?.cache ?? false;\n this._panelClass = options?.panelClass ?? CLASS.DEFAULT_VIRTUAL;\n\n this._elements = [];\n }\n\n public init() {\n const flicking = this._flicking;\n\n if (!flicking.virtualEnabled) return;\n\n if (!flicking.externalRenderer && !flicking.renderExternal) {\n this._initVirtualElements();\n }\n\n const virtualElements = flicking.camera.children;\n this._elements = virtualElements.map(el => ({ nativeElement: el, visible: true }));\n }\n\n public show(index: number) {\n const el = this._elements[index];\n const nativeEl = el.nativeElement;\n\n el.visible = true;\n\n if (nativeEl.style.display) {\n nativeEl.style.display = \"\";\n }\n }\n\n public hide(index: number) {\n const el = this._elements[index];\n const nativeEl = el.nativeElement;\n\n el.visible = false;\n nativeEl.style.display = \"none\";\n }\n\n /**\n * Add new virtual panels at the end of the list\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public append(count: number = 1): VirtualPanel[] {\n const flicking = this._flicking;\n\n return this.insert(flicking.panels.length, count);\n }\n\n /**\n * Add new virtual panels at the start of the list\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public prepend(count: number = 1): VirtualPanel[] {\n return this.insert(0, count);\n }\n\n /**\n * Add new virtual panels at the given index\n * @param count - The number of panels to add\n * @returns The new panels added\n */\n public insert(index: number, count: number = 1): VirtualPanel[] {\n if (count <= 0) return [];\n\n const flicking = this._flicking;\n\n return flicking.renderer.batchInsert({ index, elements: range(count), hasDOMInElements: false }) as VirtualPanel[];\n }\n\n /**\n * Remove panels at the given index\n * @param count - The number of panels to remove\n * @returns The panels removed\n */\n public remove(index: number, count: number): VirtualPanel[] {\n if (count <= 0) return [];\n\n const flicking = this._flicking;\n\n return flicking.renderer.batchRemove({ index, deleteCount: count, hasDOMInElements: false }) as VirtualPanel[];\n }\n\n /**\n * @internal\n */\n private _initVirtualElements() {\n const flicking = this._flicking;\n const cameraElement = flicking.camera.element;\n const panelsPerView = flicking.panelsPerView;\n const fragment = document.createDocumentFragment();\n\n const newElements = range(panelsPerView + 1).map(idx => {\n const panelEl = document.createElement(\"div\");\n panelEl.className = this._panelClass;\n panelEl.dataset.elementIndex = idx.toString();\n return panelEl;\n });\n\n newElements.forEach(el => {\n fragment.appendChild(el);\n });\n\n cameraElement.appendChild(fragment);\n }\n}\n\nexport default VirtualManager;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport ImReady from \"@egjs/imready\";\nimport { ALIGN } from \"../constants/values\";\nimport Panel, { PanelOptions } from \"../core/panel/Panel\";\nimport * as ERROR from \"../error/codes\";\nimport FlickingError from \"../error/FlickingError\";\nimport { EVENTS } from \"../event/names\";\nimport Flicking, { FlickingOptions } from \"../Flicking\";\nimport { getFlickingAttached, getMinusCompensatedIndex, includes, parsePanelAlign } from \"../utils\";\n\nimport RenderingStrategy from \"./strategy/RenderingStrategy\";\n\n/**\n * Options for creating a {@link Renderer}\n */\nexport interface RendererOptions {\n /** An {@link Flicking.align | align} value that will be applied to all panels */\n align?: FlickingOptions[\"align\"];\n /** An instance of RenderingStrategy(internal module) */\n strategy: RenderingStrategy;\n}\n\n/**\n * Parameters for {@link Renderer.batchInsert}\n * @public\n */\nexport interface BatchInsertParams {\n /** Index to insert new panels at */\n index: number;\n /** An array of element or framework component with element in it */\n elements: any[];\n /** Whether it contains actual DOM elements. If set to true, renderer will add them to the camera element */\n hasDOMInElements: boolean;\n}\n\n/**\n * Parameters for {@link Renderer.batchRemove}\n * @public\n */\nexport interface BatchRemoveParams {\n /** Index of panel to remove */\n index: number;\n /** Number of panels to remove from index */\n deleteCount: number;\n /** Whether it contains actual DOM elements. If set to true, renderer will remove them from the camera element */\n hasDOMInElements: boolean;\n}\n\n/**\n * A component that manages {@link Panel} and its elements\n * @public\n */\nabstract class Renderer {\n // Internal States\n protected _flicking: Flicking | null;\n protected _panels: Panel[];\n protected _rendering: boolean;\n\n // Options\n protected _align: NonNullable<RendererOptions[\"align\"]>;\n protected _strategy: RendererOptions[\"strategy\"];\n\n // Internal states Getter\n /**\n * Array of panels\n * @readonly\n * @see Panel\n */\n public get panels(): Panel[] {\n return this._panels;\n }\n /**\n * A boolean value indicating whether rendering is in progress\n * @readonly\n * @internal\n */\n public get rendering(): boolean {\n return this._rendering;\n }\n /**\n * Count of panels\n * @readonly\n */\n public get panelCount(): number {\n return this._panels.length;\n }\n /**\n * @internal\n */\n public get strategy(): RendererOptions[\"strategy\"] {\n return this._strategy;\n }\n\n // Options Getter\n /**\n * A {@link Panel}'s {@link Panel.align | align} value that applied to all panels\n */\n public get align(): NonNullable<RendererOptions[\"align\"]> {\n return this._align;\n }\n\n // Options Setter\n public set align(val: NonNullable<RendererOptions[\"align\"]>) {\n this._align = val;\n\n const panelAlign = parsePanelAlign(val);\n this._panels.forEach(panel => {\n panel.align = panelAlign;\n });\n }\n\n /**\n * @param options - {@link RendererOptions}\n */\n public constructor(options: RendererOptions) {\n // Destructure options with default values\n const { align = ALIGN.CENTER, strategy } = options;\n\n this._flicking = null;\n this._panels = [];\n this._rendering = false;\n\n // Bind options\n this._align = align;\n this._strategy = strategy;\n }\n\n /**\n * Render panel elements inside the camera element\n * @remarks\n * This method updates the DOM to reflect the current panel state.\n * @returns A Promise that resolves when rendering is complete\n */\n public abstract render(): Promise<void>;\n\n /**\n * @internal\n * @privateRemarks\n * Collects panel elements from the camera element and creates Panel instances.\n */\n protected abstract _collectPanels(): void;\n /**\n * @internal\n * @privateRemarks\n * Creates a Panel instance from an element with the given options.\n */\n protected abstract _createPanel(el: any, options: Omit<PanelOptions, \"elementProvider\">): Panel;\n\n /**\n * Initialize Renderer\n * @remarks\n * This method is called automatically during {@link Flicking.init}. It collects existing panel elements.\n * @param flicking - An instance of {@link Flicking}\n * @returns The current instance for method chaining\n */\n public init(flicking: Flicking): this {\n this._flicking = flicking;\n this._collectPanels();\n\n return this;\n }\n\n /**\n * Destroy Renderer and return to initial state\n * @remarks\n * This method clears all panel references and resets the internal state.\n */\n public destroy(): void {\n this._flicking = null;\n this._panels = [];\n }\n\n /**\n * Return the {@link Panel} at the given index. `null` if it doesn't exist.\n * @remarks\n * This is equivalent to accessing `Flicking.panels[index]`.\n * @param index - Index of the panel to get\n * @returns Panel at the given index\n * @see Panel\n */\n public getPanel(index: number): Panel | null {\n return this._panels[index] || null;\n }\n\n public forceRenderAllPanels(): Promise<void> {\n this._panels.forEach(panel => panel.markForShow());\n\n return Promise.resolve();\n }\n\n /**\n * Return Rendered Panels\n * @returns Rendered Panels\n */\n public getRenderedPanels(): Panel[] {\n const flicking = getFlickingAttached(this._flicking);\n\n return flicking.renderer.panels.filter(panel => panel.rendered);\n }\n\n /**\n * Update all panel sizes\n * @returns The current instance for method chaining\n */\n public updatePanelSize(): this {\n const flicking = getFlickingAttached(this._flicking);\n const panels = this._panels;\n\n if (panels.length <= 0) return this;\n\n if (flicking.panelsPerView > 0) {\n const firstPanel = panels[0];\n firstPanel.resize();\n\n this._updatePanelSizeByGrid(firstPanel, panels);\n } else {\n flicking.panels.forEach(panel => panel.resize());\n }\n\n return this;\n }\n\n /**\n * Insert new panels at given index\n * @remarks\n * This will increase index of panels after by the number of panels added.\n * @param items - An array of {@link BatchInsertParams}\n * @throws {@link DOMManipulationErrors}\n * @returns An array of inserted panels\n */\n public batchInsert(...items: BatchInsertParams[]): Panel[] {\n const allPanelsInserted = this.batchInsertDefer(...items);\n\n if (allPanelsInserted.length <= 0) return [];\n\n this.updateAfterPanelChange(allPanelsInserted, []);\n\n return allPanelsInserted;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Defers update. Camera position & others will be updated after calling updateAfterPanelChange.\n */\n public batchInsertDefer(...items: BatchInsertParams[]) {\n const panels = this._panels;\n const flicking = getFlickingAttached(this._flicking);\n\n const prevFirstPanel = panels[0];\n const align = parsePanelAlign(this._align);\n\n const allPanelsInserted = items.reduce((addedPanels, item) => {\n const insertingIdx = getMinusCompensatedIndex(item.index, panels.length);\n const panelsPushed = panels.slice(insertingIdx);\n const panelsInserted = item.elements.map((el, idx) =>\n this._createPanel(el, { index: insertingIdx + idx, align, flicking })\n );\n\n panels.splice(insertingIdx, 0, ...panelsInserted);\n\n if (item.hasDOMInElements) {\n // Insert the actual elements as camera element's children\n this._insertPanelElements(panelsInserted, panelsPushed[0] ?? null);\n }\n\n // Resize the newly added panels\n if (flicking.panelsPerView > 0) {\n const firstPanel = prevFirstPanel || panelsInserted[0].resize();\n\n this._updatePanelSizeByGrid(firstPanel, panelsInserted);\n } else {\n panelsInserted.forEach(panel => panel.resize());\n }\n\n // Update panel indexes & positions\n panelsPushed.forEach(panel => {\n panel.increaseIndex(panelsInserted.length);\n panel.updatePosition();\n });\n\n return [...addedPanels, ...panelsInserted];\n }, []);\n\n return allPanelsInserted;\n }\n\n /**\n * Remove the panel at the given index\n * @remarks\n * This will decrease index of panels after by the number of panels removed.\n * @param items - An array of {@link BatchRemoveParams}\n * @throws {@link DOMManipulationErrors}\n * @returns An array of removed panels\n */\n public batchRemove(...items: BatchRemoveParams[]): Panel[] {\n const allPanelsRemoved = this.batchRemoveDefer(...items);\n\n if (allPanelsRemoved.length <= 0) return [];\n\n this.updateAfterPanelChange([], allPanelsRemoved);\n\n return allPanelsRemoved;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Defers update. Camera position & others will be updated after calling updateAfterPanelChange.\n */\n public batchRemoveDefer(...items: BatchRemoveParams[]) {\n const panels = this._panels;\n const flicking = getFlickingAttached(this._flicking);\n\n const { control } = flicking;\n const activePanel = control.activePanel;\n\n const allPanelsRemoved = items.reduce((removed, item) => {\n const { index, deleteCount } = item;\n const removingIdx = getMinusCompensatedIndex(index, panels.length);\n\n const panelsPulled = panels.slice(removingIdx + deleteCount);\n const panelsRemoved = panels.splice(removingIdx, deleteCount);\n\n if (panelsRemoved.length <= 0) return [];\n\n // Update panel indexes & positions\n panelsPulled.forEach(panel => {\n panel.decreaseIndex(panelsRemoved.length);\n panel.updatePosition();\n });\n\n if (item.hasDOMInElements) {\n this._removePanelElements(panelsRemoved);\n }\n\n // Remove panel elements\n panelsRemoved.forEach(panel => panel.destroy());\n\n if (includes(panelsRemoved, activePanel)) {\n control.resetActive();\n }\n\n return [...removed, ...panelsRemoved];\n }, []);\n\n return allPanelsRemoved;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates camera, control, and triggers {@link PanelChangeEvent} after panels are added or removed.\n */\n public updateAfterPanelChange(panelsAdded: Panel[], panelsRemoved: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const { camera, control } = flicking;\n const panels = this._panels;\n const activePanel = control.activePanel;\n\n // Update camera & control\n this._updateCameraAndControl();\n\n if (flicking.autoResize && flicking.useResizeObserver) {\n panelsAdded.forEach(panel => {\n if (panel.element) {\n flicking.autoResizer.observe(panel.element);\n }\n });\n panelsRemoved.forEach(panel => {\n if (panel.element) {\n flicking.autoResizer.unobserve(panel.element);\n }\n });\n }\n\n void this.render();\n\n if (!flicking.animating) {\n if (!activePanel || activePanel.removed) {\n if (panels.length <= 0) {\n // All panels removed\n camera.lookAt(0);\n } else {\n let targetIndex = activePanel?.index ?? 0;\n if (targetIndex > panels.length - 1) {\n targetIndex = panels.length - 1;\n }\n\n void control\n .moveToPanel(panels[targetIndex], {\n duration: 0\n })\n .catch(() => void 0);\n }\n } else {\n void control\n .moveToPanel(activePanel, {\n duration: 0\n })\n .catch(() => void 0);\n }\n }\n\n flicking.camera.updateOffset();\n\n if (panelsAdded.length > 0 || panelsRemoved.length > 0) {\n flicking.trigger(\n new ComponentEvent(EVENTS.PANEL_CHANGE, {\n added: panelsAdded,\n removed: panelsRemoved\n })\n );\n\n this.checkPanelContentsReady([...panelsAdded, ...panelsRemoved]);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Checks if panel contents (images/videos) are ready and triggers resize when loaded.\n */\n public checkPanelContentsReady(checkingPanels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const resizeOnContentsReady = flicking.resizeOnContentsReady;\n const panels = this._panels;\n\n if (!resizeOnContentsReady || flicking.virtualEnabled) return;\n\n const hasContents = (panel: Panel) => panel.element && !!panel.element.querySelector(\"img, video\");\n checkingPanels = checkingPanels.filter(panel => hasContents(panel));\n\n if (checkingPanels.length <= 0) return;\n\n const contentsReadyChecker = new ImReady();\n\n checkingPanels.forEach(panel => {\n panel.loading = true;\n });\n\n contentsReadyChecker.on(\"readyElement\", e => {\n if (!this._flicking) {\n // Renderer's destroy() is called before\n contentsReadyChecker.destroy();\n return;\n }\n\n const panel = checkingPanels[e.index];\n const camera = flicking.camera;\n const control = flicking.control;\n const prevProgressInPanel = control.activePanel ? camera.getProgressInPanel(control.activePanel) : 0;\n\n panel.loading = false;\n panel.resize();\n panels.slice(panel.index + 1).forEach(panelBehind => panelBehind.updatePosition());\n\n if (!flicking.initialized) return;\n\n camera.updateRange();\n camera.updateOffset();\n camera.updateAnchors();\n\n if (control.animating) {\n // TODO: Need Axes update\n } else {\n control.updatePosition(prevProgressInPanel);\n control.updateInput();\n }\n });\n\n contentsReadyChecker.on(\"preReady\", e => {\n if (this._flicking) {\n void this.render();\n }\n\n if (e.readyCount === e.totalCount) {\n contentsReadyChecker.destroy();\n }\n });\n\n contentsReadyChecker.on(\"ready\", () => {\n if (this._flicking) {\n void this.render();\n }\n contentsReadyChecker.destroy();\n });\n\n contentsReadyChecker.check(checkingPanels.map(panel => panel.element));\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates camera range, anchors, and control input after panel changes.\n */\n protected _updateCameraAndControl() {\n const flicking = getFlickingAttached(this._flicking);\n const { camera, control } = flicking;\n\n camera.updateRange();\n camera.updateOffset();\n camera.updateAnchors();\n camera.resetNeedPanelHistory();\n control.updateInput();\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks only visible panels for rendering when {@link FlickingOptions.renderOnlyVisible | renderOnlyVisible} is enabled.\n */\n protected _showOnlyVisiblePanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else if (!flicking.holding) {\n // During the input sequence,\n // Do not remove panel elements as it won't trigger touchend event.\n panel.markForHide();\n }\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Calculates and applies panel sizes when {@link FlickingOptions.panelsPerView | panelsPerView} is enabled.\n */\n protected _updatePanelSizeByGrid(referencePanel: Panel, panels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const panelsPerView = flicking.panelsPerView;\n\n if (panelsPerView <= 0) {\n throw new FlickingError(ERROR.MESSAGE.WRONG_OPTION(\"panelsPerView\", panelsPerView), ERROR.CODE.WRONG_OPTION);\n }\n if (panels.length <= 0) return;\n\n const viewportSize = flicking.camera.size;\n const gap = referencePanel.margin.prev + referencePanel.margin.next;\n\n const panelSize = (viewportSize - gap * (panelsPerView - 1)) / panelsPerView;\n const panelSizeObj = flicking.horizontal ? { width: panelSize } : { height: panelSize };\n const firstPanelSizeObj = {\n size: panelSize,\n margin: referencePanel.margin,\n ...(!flicking.horizontal && { height: referencePanel.height })\n };\n\n if (!flicking.noPanelStyleOverride) {\n this._strategy.updatePanelSizes(flicking, panelSizeObj);\n }\n\n flicking.panels.forEach(panel => panel.resize(firstPanelSizeObj));\n }\n\n /**\n * @internal\n * @privateRemarks\n * Removes all child elements from the camera element.\n */\n protected _removeAllChildsFromCamera() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n // Remove other elements\n while (cameraElement.firstChild) {\n cameraElement.removeChild(cameraElement.firstChild);\n }\n }\n\n /**\n * @internal\n * @privateRemarks\n * Inserts panel elements into the camera element at the specified position.\n */\n protected _insertPanelElements(panels: Panel[], nextSibling: Panel | null = null) {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n const cameraElement = camera.element;\n const nextSiblingElement = nextSibling?.element || null;\n const fragment = document.createDocumentFragment();\n\n panels.forEach(panel => fragment.appendChild(panel.element));\n cameraElement.insertBefore(fragment, nextSiblingElement);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Removes panel elements from the camera element.\n */\n protected _removePanelElements(panels: Panel[]) {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n panels.forEach(panel => {\n cameraElement.removeChild(panel.element);\n });\n }\n\n /**\n * @internal\n * @privateRemarks\n * Called after rendering to apply the camera transform.\n */\n protected _afterRender() {\n const flicking = getFlickingAttached(this._flicking);\n\n flicking.camera.applyTransform();\n\n if (flicking.useCSSOrder) {\n // `useCSSOrder`를 사용하는 경우 DOM은 변화가 없지만 대신 css `order`값을 주입\n const renderedPanels = flicking.renderer.panels.filter(panel => panel.rendered);\n\n this._strategy.getRenderingIndexesByOrder(flicking).forEach((domIndex, index) => {\n if (renderedPanels[domIndex].element) {\n // 방어 코드 추가\n renderedPanels[domIndex].element.style.order = `${index}`;\n }\n });\n }\n }\n}\n\nexport default Renderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Panel from \"../core/panel/Panel\";\n\nimport Renderer from \"./Renderer\";\n\n/**\n * @internal\n */\nabstract class ExternalRenderer extends Renderer {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n protected _removePanelElements(panels: Panel[]): void {\n // DO NOTHING, overrided to prevent an unexpected error\n }\n\n protected _removeAllChildsFromCamera(): void {\n // DO NOTHING, overrided to prevent an unexpected error\n }\n /* eslint-enable @typescript-eslint/no-unused-vars */\n}\n\nexport default ExternalRenderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport Panel, { PanelOptions } from \"../core/panel/Panel\";\nimport { getFlickingAttached, toArray } from \"../utils\";\n\nimport Renderer from \"./Renderer\";\n\nclass VanillaRenderer extends Renderer {\n // eslint-disable-next-line @typescript-eslint/require-await\n public async render() {\n const flicking = getFlickingAttached(this._flicking);\n const strategy = this._strategy;\n\n strategy.updateRenderingPanels(flicking);\n strategy.renderPanels(flicking);\n\n this._resetPanelElementOrder();\n this._afterRender();\n }\n\n protected _collectPanels() {\n const flicking = getFlickingAttached(this._flicking);\n const camera = flicking.camera;\n\n this._removeAllTextNodes();\n this._panels = this._strategy.collectPanels(flicking, camera.children);\n }\n\n protected _createPanel(el: HTMLElement, options: Omit<PanelOptions, \"elementProvider\">): Panel {\n return this._strategy.createPanel(el, options);\n }\n\n /**\n * @internal\n */\n private _resetPanelElementOrder() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraEl = flicking.camera.element;\n\n // We're using reversed panels here as last panel should be the last element of camera element\n let reversedElements: HTMLElement[] = [];\n\n if (flicking.useCSSOrder) {\n // useCSSOrder를 사용하는 경우 DOM은 변화가 없지만 대신 css `order`값을 주입\n reversedElements = this.getRenderedPanels()\n .map(panel => panel.element)\n .reverse();\n } else {\n reversedElements = this._strategy.getRenderingElementsByOrder(flicking).reverse();\n }\n\n reversedElements.forEach((el, idx) => {\n const nextEl = reversedElements[idx - 1] ? reversedElements[idx - 1] : null;\n\n if (el.nextElementSibling !== nextEl) {\n cameraEl.insertBefore(el, nextEl);\n }\n });\n }\n\n /**\n * @internal\n */\n private _removeAllTextNodes() {\n const flicking = getFlickingAttached(this._flicking);\n const cameraElement = flicking.camera.element;\n\n // Remove all text nodes in the camera element\n toArray(cameraElement.childNodes).forEach(node => {\n if (node.nodeType === Node.TEXT_NODE) {\n cameraElement.removeChild(node);\n }\n });\n }\n}\n\nexport default VanillaRenderer;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { ALIGN, DIRECTION } from \"../../constants/values\";\nimport Flicking from \"../../Flicking\";\nimport { LiteralUnion, ValueOf } from \"../../types/internal\";\nimport { SetSizeParams } from \"../../types/params\";\nimport { getElementSize, getProgress, getStyle, parseAlign, setSize } from \"../../utils\";\n\nimport ElementProvider from \"./provider/ElementProvider\";\n\nexport interface PanelOptions {\n /** An initial index of the panel */\n index: number;\n /** An initial {@link Flicking.align | align} value of the panel */\n align: LiteralUnion<ValueOf<typeof ALIGN>> | number;\n /** The Flicking instance that this panel belongs to */\n flicking: Flicking;\n /** A provider instance that returns the actual html element */\n elementProvider: ElementProvider;\n}\n\nexport interface PanelMarginInfo {\n /** CSS `margin-left` when the {@link Flicking.horizontal | horizontal} is `true`, and `margin-top` else */\n prev: number;\n /** CSS `margin-right` when the {@link Flicking.horizontal | horizontal} is `true`, and `margin-bottom` else */\n next: number;\n}\n\nexport interface PanelBoundingBoxRange {\n /** Bounding box's left({@link Flicking.horizontal | horizontal}: true) / top({@link Flicking.horizontal | horizontal}: false) */\n min: number;\n /** Bounding box's right({@link Flicking.horizontal | horizontal}: true) / bottom({@link Flicking.horizontal | horizontal}: false) */\n max: number;\n}\n\n/**\n * A slide data component that holds information of a single HTMLElement\n * @public\n */\nclass Panel {\n // Internal States\n protected _flicking: Flicking;\n protected _elProvider: ElementProvider;\n protected _index: number;\n protected _pos: number;\n protected _size: number;\n protected _height: number;\n protected _margin: PanelMarginInfo;\n protected _alignPos: number; // Actual align pos\n protected _rendered: boolean;\n protected _removed: boolean;\n protected _loading: boolean;\n protected _toggleDirection: ValueOf<typeof DIRECTION>;\n protected _toggled: boolean;\n protected _togglePosition: number;\n\n // Options\n protected _align: PanelOptions[\"align\"];\n\n // Internal States Getter\n /**\n * `HTMLElement` that panel's referencing\n * @readonly\n */\n public get element(): HTMLElement {\n return this._elProvider.element;\n }\n /**\n * @internal\n * @readonly\n */\n public get elementProvider(): ElementProvider {\n return this._elProvider;\n }\n /**\n * Index of the panel\n * @readonly\n */\n public get index(): number {\n return this._index;\n }\n /**\n * Position of the panel, including {@link Panel.alignPosition | alignPosition}\n * @readonly\n */\n public get position(): number {\n return this._pos + this._alignPos;\n }\n /**\n * Cached size of the panel element\n * @remarks\n * This is equal to {@link Panel.element | element}'s `offsetWidth` if {@link Flicking.horizontal | horizontal} is `true`, and `offsetHeight` else\n * @readonly\n */\n public get size(): number {\n return this._size;\n }\n /**\n * Panel's size including CSS `margin`\n * @remarks\n * This value includes {@link Panel.element | element}'s margin left/right if {@link Flicking.horizontal | horizontal} is `true`, and margin top/bottom else\n * @readonly\n */\n public get sizeIncludingMargin(): number {\n return this._size + this._margin.prev + this._margin.next;\n }\n /**\n * Height of the panel element\n * @readonly\n */\n public get height(): number {\n return this._height;\n }\n /**\n * Cached CSS `margin` value of the panel element\n * @readonly\n */\n public get margin(): PanelMarginInfo {\n return this._margin;\n }\n /**\n * Align position inside the panel where {@link Camera}'s {@link Camera.alignPosition | alignPosition} inside viewport should be located at\n * @readonly\n */\n public get alignPosition(): number {\n return this._alignPos;\n }\n /**\n * A value indicating whether the panel's {@link Flicking.remove | remove}d\n * @readonly\n */\n public get removed(): boolean {\n return this._removed;\n }\n /**\n * A value indicating whether the panel's element is being rendered on the screen\n * @readonly\n */\n public get rendered(): boolean {\n return this._rendered;\n }\n /**\n * A value indicating whether the panel's image/video is not loaded and waiting for resize\n * @readonly\n */\n public get loading(): boolean {\n return this._loading;\n }\n /**\n * Panel element's range of the bounding box\n * @readonly\n */\n public get range(): PanelBoundingBoxRange {\n return { min: this._pos, max: this._pos + this._size };\n }\n /**\n * A value indicating whether the panel's position is toggled by circular behavior\n * @readonly\n */\n public get toggled(): boolean {\n return this._toggled;\n }\n /**\n * A direction where the panel's position is toggled\n * @readonly\n */\n public get toggleDirection(): ValueOf<typeof DIRECTION> {\n return this._toggleDirection;\n }\n /**\n * Actual position offset determined by {@link Panel.order}\n * @readonly\n */\n public get offset(): number {\n const toggleDirection = this._toggleDirection;\n const cameraRangeDiff = this._flicking.camera.rangeDiff;\n\n return toggleDirection === DIRECTION.NONE || !this._toggled\n ? 0\n : toggleDirection === DIRECTION.PREV\n ? -cameraRangeDiff\n : cameraRangeDiff;\n }\n\n /**\n * Progress of movement between previous or next panel relative to current panel\n * @readonly\n */\n public get progress(): number {\n const flicking = this._flicking;\n\n return this.index - flicking.camera.progress;\n }\n\n /**\n * Progress of movement between points that panel is completely invisible outside of viewport(prev direction: -1, selected point: 0, next direction: 1)\n * @readonly\n */\n public get outsetProgress(): number {\n const position = this.position + this.offset;\n const alignPosition = this._alignPos;\n const camera = this._flicking.camera;\n const camPos = camera.position;\n\n if (camPos === position) {\n return 0;\n }\n\n if (camPos < position) {\n const disappearPosNext = position + (camera.size - camera.alignPosition) + alignPosition;\n\n return -getProgress(camPos, position, disappearPosNext);\n } else {\n const disappearPosPrev = position - (camera.alignPosition + this._size - alignPosition);\n\n return 1 - getProgress(camPos, disappearPosPrev, position);\n }\n }\n\n /**\n * Percentage of area where panel is visible in the viewport\n * @readonly\n */\n public get visibleRatio(): number {\n const range = this.range;\n const size = this._size;\n const offset = this.offset;\n const visibleRange = this._flicking.camera.visibleRange;\n\n const checkingRange = {\n min: range.min + offset,\n max: range.max + offset\n };\n\n if (checkingRange.max <= visibleRange.min || checkingRange.min >= visibleRange.max) {\n return 0;\n }\n\n let visibleSize = size;\n\n if (visibleRange.min > checkingRange.min) {\n visibleSize -= visibleRange.min - checkingRange.min;\n }\n if (visibleRange.max < checkingRange.max) {\n visibleSize -= checkingRange.max - visibleRange.max;\n }\n\n return visibleSize / size;\n }\n\n public set loading(val: boolean) {\n this._loading = val;\n }\n\n // Options Getter\n /**\n * A value indicating where the {@link Panel.alignPosition | alignPosition} should be located at inside the panel element\n */\n public get align(): PanelOptions[\"align\"] {\n return this._align;\n }\n\n // Options Setter\n public set align(val: PanelOptions[\"align\"]) {\n this._align = val;\n this._updateAlignPos();\n }\n\n /**\n * Creates a new Panel instance\n * @param panelOptions - Options for creating the panel\n */\n public constructor(panelOptions: PanelOptions) {\n const { index, align, flicking, elementProvider } = panelOptions;\n\n this._index = index;\n this._flicking = flicking;\n this._elProvider = elementProvider;\n\n this._align = align;\n\n this._removed = false;\n this._rendered = true;\n this._loading = false;\n this._resetInternalStates();\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks this panel to be rendered on the camera element.\n */\n public markForShow() {\n this._rendered = true;\n this._elProvider.show(this._flicking);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Marks this panel to be hidden from the camera element.\n */\n public markForHide() {\n this._rendered = false;\n this._elProvider.hide(this._flicking);\n }\n\n /**\n * Update size of the panel\n * @remarks\n * This method recalculates the panel's size, margin, and position based on the current DOM state.\n * @param cached - Predefined cached size of the panel\n * @returns The current instance for method chaining\n */\n public resize(cached?: { size: number; height?: number; margin: { prev: number; next: number } }): this {\n const el = this.element;\n const flicking = this._flicking;\n const { horizontal, useFractionalSize } = flicking;\n\n if (!el) {\n return this;\n }\n\n if (cached) {\n this._size = cached.size;\n this._margin = { ...cached.margin };\n this._height =\n cached.height ??\n getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: true,\n style: getStyle(el)\n });\n } else {\n const elStyle = getStyle(el);\n\n this._size = getElementSize({\n el,\n horizontal,\n useFractionalSize,\n useOffset: true,\n style: elStyle\n });\n\n this._margin = horizontal\n ? {\n prev: parseFloat(elStyle.marginLeft || \"0\"),\n next: parseFloat(elStyle.marginRight || \"0\")\n }\n : {\n prev: parseFloat(elStyle.marginTop || \"0\"),\n next: parseFloat(elStyle.marginBottom || \"0\")\n };\n\n this._height = horizontal\n ? getElementSize({\n el,\n horizontal: false,\n useFractionalSize,\n useOffset: true,\n style: elStyle\n })\n : this._size;\n }\n\n this.updatePosition();\n this._updateAlignPos();\n\n return this;\n }\n\n /**\n * Change panel's size\n * @remarks\n * This will change the actual size of the panel element by changing its CSS width/height property.\n * @param size - {@link SetSizeParams}\n * @returns The current instance for method chaining\n */\n public setSize(size: SetSizeParams): this {\n setSize(this.element, size);\n\n return this;\n }\n\n /**\n * Check whether the given element is inside of this panel's {@link Panel.element | element}\n * @remarks\n * This is useful for determining which panel contains a clicked element.\n * @param element - The HTMLElement to check\n * @returns A Boolean value indicating the element is inside of this panel {@link Panel.element | element}\n */\n public contains(element: HTMLElement): boolean {\n return !!this.element?.contains(element);\n }\n\n /**\n * Reset internal state and set {@link Panel.removed | removed} to `true`\n * @remarks\n * After calling this method, the panel should no longer be used.\n */\n public destroy(): void {\n this._resetInternalStates();\n this._removed = true;\n }\n\n /**\n * Check whether the given position is inside of this panel's {@link Panel.range | range}\n * @param pos - A position to check\n * @param includeMargin - Include {@link Panel.margin | margin} to the range\n * @returns A Boolean value indicating whether the given position is included in the panel range\n */\n public includePosition(pos: number, includeMargin: boolean = false): boolean {\n return this.includeRange(pos, pos, includeMargin);\n }\n\n /**\n * Check whether the given range is fully included in this panel's area (inclusive)\n * @param min - Minimum value of the range to check\n * @param max - Maximum value of the range to check\n * @param includeMargin - Include {@link Panel.margin | margin} to the range\n * @returns A Boolean value indicating whether the given range is fully included in the panel range\n */\n public includeRange(min: number, max: number, includeMargin: boolean = false): boolean {\n const margin = this._margin;\n const panelRange = this.range;\n\n if (includeMargin) {\n panelRange.min -= margin.prev;\n panelRange.max += margin.next;\n }\n\n return max >= panelRange.min && min <= panelRange.max;\n }\n\n /**\n * Check whether the panel is visble in the given range (exclusive)\n * @param min - Minimum value of the range to check\n * @param max - Maximum value of the range to check\n * @returns A Boolean value indicating whether the panel is visible\n */\n public isVisibleOnRange(min: number, max: number): boolean {\n const panelRange = this.range;\n\n return max > panelRange.min && min < panelRange.max;\n }\n\n /**\n * Move {@link Camera} to this panel\n * @remarks\n * This is equivalent to calling `Flicking.moveTo(panel.index, duration)`.\n * @param duration - Duration of the animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns A Promise which will be resolved after reaching the panel\n */\n public focus(duration?: number): Promise<void> {\n return this._flicking.moveTo(this._index, duration);\n }\n\n /**\n * Get previous(`index - 1`) panel.\n * @remarks\n * When the previous panel does not exist, this will return `null` instead\n * If the {@link Flicking.circularEnabled | circular} is enabled, this will return the last panel if called from the first panel\n * @returns The previous panel\n */\n public prev(): Panel | null {\n const index = this._index;\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panelCount = renderer.panelCount;\n\n if (panelCount === 1) return null;\n\n return flicking.circularEnabled\n ? renderer.getPanel(index === 0 ? panelCount - 1 : index - 1)\n : renderer.getPanel(index - 1);\n }\n\n /**\n * Get next(`index + 1`) panel.\n * @remarks\n * When the next panel does not exist, this will return `null` instead\n * If the {@link Flicking.circularEnabled | circular} is enabled, this will return the first panel if called from the last panel\n * @returns The next panel\n */\n public next(): Panel | null {\n const index = this._index;\n const flicking = this._flicking;\n const renderer = flicking.renderer;\n const panelCount = renderer.panelCount;\n\n if (panelCount === 1) return null;\n\n return flicking.circularEnabled\n ? renderer.getPanel(index === panelCount - 1 ? 0 : index + 1)\n : renderer.getPanel(index + 1);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Increases the panel's index by the given value. Called when panels are inserted before this panel.\n */\n public increaseIndex(val: number): this {\n this._index += Math.max(val, 0);\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Decreases the panel's index by the given value. Called when panels are removed before this panel.\n */\n public decreaseIndex(val: number): this {\n this._index -= Math.max(val, 0);\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Recalculates the panel's position based on the previous panel's position and margins.\n */\n public updatePosition(): this {\n const prevPanel = this._flicking.renderer.panels[this._index - 1];\n\n this._pos = prevPanel ? prevPanel.range.max + prevPanel.margin.next + this._margin.prev : this._margin.prev;\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Toggles the panel's position for circular mode. Returns true if the panel was toggled.\n */\n public toggle(prevPos: number, newPos: number): boolean {\n const toggleDirection = this._toggleDirection;\n const togglePosition = this._togglePosition;\n\n if (toggleDirection === DIRECTION.NONE || newPos === prevPos) return false;\n\n const prevToggled = this._toggled;\n\n if (newPos > prevPos) {\n if (togglePosition >= prevPos && togglePosition <= newPos) {\n this._toggled = toggleDirection === DIRECTION.NEXT;\n }\n } else {\n if (togglePosition <= prevPos && togglePosition >= newPos) {\n this._toggled = toggleDirection !== DIRECTION.NEXT;\n }\n }\n\n return prevToggled !== this._toggled;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Updates the toggle direction for circular mode based on the panel's visibility at the camera range edges.\n */\n public updateCircularToggleDirection(): this {\n const flicking = this._flicking;\n\n if (!flicking.circularEnabled) {\n this._toggleDirection = DIRECTION.NONE;\n this._togglePosition = 0;\n this._toggled = false;\n return this;\n }\n\n const camera = flicking.camera;\n const camRange = camera.range;\n const camAlignPosition = camera.alignPosition;\n const camVisibleRange = camera.visibleRange;\n const camVisibleSize = camVisibleRange.max - camVisibleRange.min;\n\n const minimumVisible = camRange.min - camAlignPosition;\n const maximumVisible = camRange.max - camAlignPosition + camVisibleSize;\n\n const shouldBeVisibleAtMin = this.includeRange(maximumVisible - camVisibleSize, maximumVisible, false);\n const shouldBeVisibleAtMax = this.includeRange(minimumVisible, minimumVisible + camVisibleSize, false);\n\n this._toggled = false;\n if (shouldBeVisibleAtMin) {\n this._toggleDirection = DIRECTION.PREV;\n this._togglePosition = this.range.max + camRange.min - camRange.max + camAlignPosition;\n this.toggle(Infinity, camera.position);\n } else if (shouldBeVisibleAtMax) {\n this._toggleDirection = DIRECTION.NEXT;\n this._togglePosition = this.range.min + camRange.max - camVisibleSize + camAlignPosition;\n this.toggle(-Infinity, camera.position);\n } else {\n this._toggleDirection = DIRECTION.NONE;\n this._togglePosition = 0;\n }\n\n return this;\n }\n\n /**\n * @internal\n * @privateRemarks\n * Recalculates the align position based on the align option and panel size.\n */\n private _updateAlignPos() {\n this._alignPos = parseAlign(this._align, this._size);\n }\n\n /**\n * @internal\n * @privateRemarks\n * Resets all internal state values to their defaults.\n */\n private _resetInternalStates() {\n this._size = 0;\n this._pos = 0;\n this._margin = { prev: 0, next: 0 };\n this._height = 0;\n this._alignPos = 0;\n this._toggled = false;\n this._togglePosition = 0;\n this._toggleDirection = DIRECTION.NONE;\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 { DIRECTION } from \"../../constants/values\";\nimport Panel, { PanelOptions } from \"../../core/panel/Panel\";\nimport ElementProvider from \"../../core/panel/provider/ElementProvider\";\nimport Flicking from \"../../Flicking\";\nimport { parsePanelAlign } from \"../../utils\";\n\nimport RenderingStrategy from \"./RenderingStrategy\";\n\nexport interface NormalRenderingStrategyOptions {\n providerCtor: new (...args: any) => ElementProvider;\n}\n\nclass NormalRenderingStrategy implements RenderingStrategy {\n private _providerCtor: NormalRenderingStrategyOptions[\"providerCtor\"];\n\n public constructor(options: NormalRenderingStrategyOptions) {\n const { providerCtor } = options;\n this._providerCtor = providerCtor;\n }\n\n public renderPanels() {\n // DO_NOTHING\n }\n\n public getRenderingIndexesByOrder(flicking: Flicking) {\n const renderedPanels = flicking.renderer.panels.filter(panel => panel.rendered);\n const toggledPrev = renderedPanels.filter(panel => panel.toggled && panel.toggleDirection === DIRECTION.PREV);\n const toggledNext = renderedPanels.filter(panel => panel.toggled && panel.toggleDirection === DIRECTION.NEXT);\n const notToggled = renderedPanels.filter(panel => !panel.toggled);\n\n return [...toggledPrev, ...notToggled, ...toggledNext].map(panel => panel.index);\n }\n\n public getRenderingElementsByOrder(flicking: Flicking) {\n const panels = flicking.panels;\n\n return this.getRenderingIndexesByOrder(flicking).map(index => panels[index].element);\n }\n\n public updateRenderingPanels(flicking: Flicking) {\n if (flicking.renderOnlyVisible) {\n this._showOnlyVisiblePanels(flicking);\n } else {\n flicking.panels.forEach(panel => panel.markForShow());\n }\n }\n\n public collectPanels(flicking: Flicking, elements: any[]) {\n const align = parsePanelAlign(flicking.renderer.align);\n\n return elements.map(\n (el, index) =>\n new Panel({\n index,\n elementProvider: new this._providerCtor(el),\n align,\n flicking\n })\n );\n }\n\n public createPanel(element: any, options: Omit<PanelOptions, \"elementProvider\">) {\n return new Panel({\n ...options,\n elementProvider: new this._providerCtor(element)\n });\n }\n\n public updatePanelSizes(\n flicking: Flicking,\n size: Partial<{\n width: number | string;\n height: number | string;\n }>\n ) {\n flicking.panels.forEach(panel => panel.setSize(size));\n }\n\n /**\n * @internal\n */\n private _showOnlyVisiblePanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else if (!flicking.holding) {\n // During the input sequence,\n // Do not remove panel elements as it won't trigger touchend event.\n panel.markForHide();\n }\n });\n\n camera.updateOffset();\n }\n}\n\nexport default NormalRenderingStrategy;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { DIRECTION } from \"../../constants/values\";\nimport { circulateIndex } from \"../../utils\";\n\nimport Panel, { PanelOptions } from \"./Panel\";\nimport VirtualElementProvider from \"./provider/VirtualElementProvider\";\n\n/**\n * Options for creating a {@link VirtualPanel}\n */\nexport interface VirtualPanelOptions extends PanelOptions {\n /** A provider instance that returns the actual html element */\n elementProvider: VirtualElementProvider;\n}\n\n/**\n * A slide data component that holds information of a single HTMLElement\n */\nclass VirtualPanel extends Panel {\n protected _elProvider: VirtualElementProvider;\n protected _cachedInnerHTML: string | null;\n\n /**\n * `HTMLElement` that panel's referencing\n * @readonly\n */\n public get element(): HTMLElement {\n return this._elProvider.element;\n }\n\n /**\n * Cached innerHTML by the previous render function\n * @readonly\n */\n public get cachedInnerHTML(): string | null {\n return this._cachedInnerHTML;\n }\n\n /**\n * A number for indexing which element it will be rendered on\n * @readonly\n */\n public get elementIndex(): number {\n const flicking = this._flicking;\n const virtualElCount = flicking.panelsPerView + 1;\n const panelCount = flicking.panelCount;\n let index = this._index;\n\n if (this._toggled) {\n // To prevent element duplication\n index = this._toggleDirection === DIRECTION.NEXT ? index + panelCount : index - panelCount;\n }\n\n return circulateIndex(index, virtualElCount);\n }\n\n /**\n * @param options - {@link VirtualPanelOptions}\n */\n public constructor(options: VirtualPanelOptions) {\n super(options);\n\n options.elementProvider.init(this);\n this._elProvider = options.elementProvider;\n this._cachedInnerHTML = null;\n }\n\n public cacheRenderResult(result: string) {\n this._cachedInnerHTML = result;\n }\n\n public uncacheRenderResult() {\n this._cachedInnerHTML = null;\n }\n\n public render() {\n const flicking = this._flicking;\n const { renderPanel, cache } = flicking.virtual;\n\n const element = this._elProvider.element;\n const newInnerHTML = this._cachedInnerHTML || renderPanel(this, this._index);\n\n if (newInnerHTML === element.innerHTML) return;\n\n element.innerHTML = newInnerHTML;\n\n if (cache) {\n this.cacheRenderResult(newInnerHTML);\n }\n }\n\n public increaseIndex(val: number) {\n this.uncacheRenderResult();\n return super.increaseIndex(val);\n }\n\n public decreaseIndex(val: number) {\n this.uncacheRenderResult();\n return super.decreaseIndex(val);\n }\n}\n\nexport default VirtualPanel;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\n\nimport { PanelOptions } from \"../../core/panel/Panel\";\nimport VirtualElementProvider from \"../../core/panel/provider/VirtualElementProvider\";\nimport VirtualPanel from \"../../core/panel/VirtualPanel\";\nimport Flicking from \"../../Flicking\";\nimport { parsePanelAlign, range, setSize } from \"../../utils\";\n\nimport RenderingStrategy from \"./RenderingStrategy\";\n\nclass VirtualRenderingStrategy implements RenderingStrategy {\n public renderPanels(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const visiblePanels = flicking.visiblePanels as VirtualPanel[];\n const invisibleIndexes = range(flicking.panelsPerView + 1);\n\n visiblePanels.forEach(panel => {\n const elementIndex = panel.elementIndex;\n\n panel.render();\n\n virtualManager.show(elementIndex);\n invisibleIndexes[elementIndex] = -1;\n });\n\n invisibleIndexes\n .filter(val => val >= 0)\n .forEach(idx => {\n virtualManager.hide(idx);\n });\n }\n\n public getRenderingIndexesByOrder(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const visiblePanels = [...flicking.visiblePanels]\n .filter(panel => panel.rendered)\n .sort((panel1, panel2) => {\n return panel1.position + panel1.offset - (panel2.position + panel2.offset);\n }) as VirtualPanel[];\n\n if (visiblePanels.length <= 0) return virtualManager.elements.map((_, idx) => idx);\n\n const visibleIndexes = visiblePanels.map(panel => panel.elementIndex);\n const invisibleIndexes = virtualManager.elements\n .map((el, idx) => ({ ...el, idx }))\n .filter(el => !el.visible)\n .map(el => el.idx);\n\n return [...visibleIndexes, ...invisibleIndexes];\n }\n\n public getRenderingElementsByOrder(flicking: Flicking) {\n const virtualManager = flicking.virtual;\n const elements = virtualManager.elements;\n\n return this.getRenderingIndexesByOrder(flicking).map(index => elements[index].nativeElement);\n }\n\n public updateRenderingPanels(flicking: Flicking) {\n const panels = flicking.renderer.panels;\n const camera = flicking.camera;\n\n const visibleIndexes = camera.visiblePanels.reduce((visibles, panel) => {\n visibles[panel.index] = true;\n return visibles;\n }, {});\n\n panels.forEach(panel => {\n if (panel.index in visibleIndexes || panel.loading) {\n panel.markForShow();\n } else {\n panel.markForHide();\n }\n });\n\n camera.updateOffset();\n }\n\n public collectPanels(flicking: Flicking) {\n const align = parsePanelAlign(flicking.renderer.align);\n\n return range(flicking.virtual.initialPanelCount).map(\n index =>\n new VirtualPanel({\n index,\n elementProvider: new VirtualElementProvider(flicking),\n align,\n flicking\n })\n );\n }\n\n public createPanel(_el: any, options: PanelOptions) {\n return new VirtualPanel({\n ...options,\n elementProvider: new VirtualElementProvider(options.flicking)\n });\n }\n\n public updatePanelSizes(\n flicking: Flicking,\n size: Partial<{\n width: number | string;\n height: number | string;\n }>\n ) {\n flicking.virtual.elements.forEach(el => {\n setSize(el.nativeElement, size);\n });\n flicking.panels.forEach(panel => panel.setSize(size));\n }\n}\n\nexport default VirtualRenderingStrategy;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport Component, { ComponentEvent } from \"@egjs/component\";\nimport { Camera } from \"./camera\";\nimport { ALIGN, CIRCULAR_FALLBACK, DIRECTION, MOVE_TYPE } from \"./constants/values\";\nimport {\n Control,\n FreeControl,\n FreeControlOptions,\n SnapControl,\n SnapControlOptions,\n StrictControl,\n StrictControlOptions\n} from \"./control\";\nimport AutoResizer from \"./core/AutoResizer\";\nimport { Panel } from \"./core/panel\";\nimport { VanillaElementProvider } from \"./core/panel/provider\";\nimport Viewport from \"./core/Viewport\";\nimport VirtualManager, { VirtualOptions } from \"./core/VirtualManager\";\nimport * as ERROR from \"./error/codes\";\nimport FlickingError from \"./error/FlickingError\";\nimport { EVENTS } from \"./event/names\";\nimport { FlickingEvents } from \"./event/types\";\nimport {\n ExternalRenderer,\n NormalRenderingStrategy,\n Renderer,\n RendererOptions,\n VanillaRenderer,\n VirtualRenderingStrategy\n} from \"./renderer\";\nimport { ElementLike, MoveTypeOptions, Plugin, Status } from \"./types/external\";\nimport { LiteralUnion, ValueOf } from \"./types/internal\";\nimport { findIndex, getElement, includes, parseElement } from \"./utils\";\n\n/**\n * Options for the Flicking component\n * @public\n */\nexport interface FlickingOptions {\n // UI / LAYOUT\n /**\n * Align position of the panels within viewport. You can set different values each for the panel and camera.\n * @remarks\n * Possible values include\n *\n * - literal strings (\"prev\", \"center\", \"next\")\n *\n * - percentage values (\"0%\", \"25%\")\n *\n * - pixel values (\"0px\", \"100px\")\n *\n * - arithmetic expressions (\"50% - 25px\")\n *\n * - numbers\n *\n * - an object with separate `panel` and `camera` alignment values\n *\n * @example\n * ```ts\n * const possibleOptions = [\n * // Literal strings\n * \"prev\", \"center\", \"next\",\n * // % values, applied to both panel & camera\n * \"0%\", \"25%\", \"42%\",\n * // px values, arithmetic calculation with (+/-) is also allowed.\n * \"0px\", \"100px\", \"50% - 25px\",\n * // numbers, same to number + px (\"0px\", \"100px\")\n * 0, 100, 1000,\n * // Setting a different value for panel & camera\n * { panel: \"10%\", camera: \"25%\" }\n * ];\n *\n * possibleOptions.forEach(align => {\n * new Flicking(\"#el\", { align });\n * });\n * ```\n * @accepts {@link ALIGN}\n * @defaultValue \"center\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/alignment | Demo: Alignment}\n */\n align: LiteralUnion<ValueOf<typeof ALIGN>> | number | { panel: number | string; camera: number | string };\n\n /**\n * Index of the panel to move when Flicking's {@link Flicking.init | init()} is called. A zero-based integer.\n * @defaultValue 0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/default-index | Demo: Default Index}\n */\n defaultIndex: number;\n\n /**\n * Direction of panel movement. `true` for horizontal, `false` for vertical.\n *\n * @remarks\n * In vanilla JS, you must manually add the `vertical` class to the viewport element when using vertical mode.\n * React and Vue wrappers add this class automatically.\n *\n * @example\n * ```ts\n * // Vanilla JS: add \"vertical\" class to the viewport element\n * // <div class=\"flicking-viewport vertical\">\n * // <div class=\"flicking-camera\">...</div>\n * // </div>\n * const flicking = new Flicking(\"#my-flicking\", {\n * horizontal: false\n * });\n * ```\n *\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/vertical | Demo: Vertical}\n */\n horizontal: boolean;\n\n /**\n * Enables circular (continuous loop) mode, which connects first/last panel for continuous scrolling.\n * @dependency Mutual Exclusive - {@link FlickingOptions.bound | bound}. When both are true, circular takes precedence and bound will be ignored.\n * @dependency Conditional - Total panel size must be ≥ viewport size. If not met, automatically falls back to {@link FlickingOptions.circularFallback | circularFallback} mode.\n * @dependency Related - {@link FlickingOptions.circularFallback | circularFallback} determines fallback behavior when circular cannot be enabled\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/circular | Demo: Circular}\n */\n circular: boolean;\n\n /**\n * Set panel control mode for the case when circular cannot be enabled.\n * @dependency Requires - Only takes effect when {@link FlickingOptions.circular | circular} is true but activation requirements are not met (total panel size < viewport size)\n *\n * @remarks\n * - \"linear\": The view's range is set from the top of the first panel to the top of the last panel.\n * - \"bound\": Prevents the view from going out of the first/last panel, hiding empty spaces.\n *\n * @accepts {@link CIRCULAR_FALLBACK}\n * @defaultValue \"linear\"\n *\n * @since 4.5.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/circular | Demo: Circular}\n */\n circularFallback: LiteralUnion<ValueOf<typeof CIRCULAR_FALLBACK>>;\n\n /**\n * Prevent the view (camera element) from going out of the first/last panel.\n * @dependency Mutual Exclusive - {@link FlickingOptions.circular | circular}. When circular is true, this option is ignored.\n * @dependency Related - Works with {@link FlickingOptions.bounce | bounce} for bounce effect at boundaries\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/bound | Demo: Bound}\n */\n bound: boolean;\n\n /**\n * Update height of the viewport element after movement same to the height of the panel below.\n * @dependency Conditional - Only works when {@link FlickingOptions.horizontal | horizontal} is true. When horizontal is false, this option has no effect.\n *\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/adaptive | Demo: Adaptive}\n */\n adaptive: boolean;\n\n /**\n * A visible number of panels on viewport. Enabling this option will force the panel to resize.\n * @remarks\n * When set to -1, automatically calculates based on panel sizes.\n *\n * @dependency Related - Affects how {@link FlickingOptions.align | align} calculates panel positions\n * @dependency Requires - Required for {@link FlickingOptions.virtual | virtual} to work (must be > 0)\n * @dependency Related - Works with {@link FlickingOptions.noPanelStyleOverride | noPanelStyleOverride} to prevent style modifications\n *\n * @defaultValue -1\n *\n * @since 4.2.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/panels-per-view | Demo: Panels Per View}\n */\n panelsPerView: number;\n\n /**\n * When enabled, prevents modifying the panel's `width/height` styles when {@link Flicking.panelsPerView | panelsPerView} is enabled.\n * Enabling this option can improve performance if you are manually managing all panel sizes.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/panels-per-view | Demo: Panels Per View}\n */\n noPanelStyleOverride: boolean;\n\n /**\n * When enabled, automatically calls {@link Flicking.resize} when images/videos inside Flicking panels are loaded.\n * This is useful when Flicking contains content that changes size before and after loading.\n * @defaultValue false\n * @since 4.3.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-on-contents-ready | Demo: Resize On Contents Ready}\n */\n resizeOnContentsReady: boolean;\n\n /**\n * Enable nested Flicking mode to allow parent Flicking to move when reaching boundaries.\n * @remarks\n * When Flicking is nested inside another Flicking, enabling this option allows the parent\n * Flicking to move in the same direction after the nested Flicking reaches the first or last panel.\n *\n * This option is not required if the parent and nested Flicking have different horizontal options.\n *\n * @defaultValue false\n *\n * @since 4.7.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/nested | Demo: Nested}\n */\n nested: boolean;\n\n // EVENT\n /**\n * A threshold from the viewport edge to trigger the `needPanel` event.\n * @defaultValue 0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/infinite-scroll | Demo: Infinite Scroll}\n */\n needPanelThreshold: number;\n\n /**\n * When enabled, disables events before the `ready` event during initialization.\n * @defaultValue true\n * @since 4.2.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/auto-init | Demo: Auto Init}\n */\n preventEventsBeforeInit: boolean;\n\n // ANIMATION\n /**\n * Deceleration of panel movement animation with momentum applied by user interaction (input).\n * Higher values result in a shorter animation duration.\n * @defaultValue 0.0075\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/deceleration | Demo: Deceleration}\n */\n deceleration: number;\n\n /**\n * Default duration of the animation in milliseconds.\n * @defaultValue 500\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/duration | Demo: Duration}\n */\n duration: number;\n\n /**\n * An easing function applied to the panel movement animation.\n * @defaultValue \"easeOutCubic\" (x => 1 - Math.pow(1 - x, 3))\n * @see {@link http://easings.net/ | Easing Functions Cheat Sheet}\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/easing | Demo: Easing}\n */\n easing: (x: number) => number;\n\n // INPUT\n /**\n * Types of input devices to enable.\n * @defaultValue [\"touch\", \"mouse\"]\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/input-type | Demo: Input Type}\n */\n inputType: string[];\n\n /**\n * Movement style by user input. Determines the instance type of {@link Flicking.control | control}.\n * @remarks\n * - \"snap\": Uses {@link SnapControl}\n *\n * - \"freeScroll\": Uses {@link FreeControl} with {@link FreeControlOptions}\n *\n * - \"strict\": Uses {@link StrictControl} with {@link StrictControlOptions}\n * @accepts {@link MOVE_TYPE}\n * @example\n * ```ts\n * import Flicking, { MOVE_TYPE } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking({\n * moveType: MOVE_TYPE.SNAP\n * });\n * ```\n *\n * ```ts\n * const flicking = new Flicking({\n * // If you want more specific settings for the moveType\n * // [moveType, options for that moveType]\n * // In this case, it's [\"freeScroll\", FreeControlOptions]\n * moveType: [MOVE_TYPE.FREE_SCROLL, { stopAtEdge: true }]\n * });\n * ```\n * @defaultValue \"snap\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/movement-types | Demo: Movement Types}\n */\n moveType: ValueOf<typeof MOVE_TYPE> | MoveTypeOptions<ValueOf<typeof MOVE_TYPE>>;\n\n /**\n * Movement threshold to change panels (unit: px). Panels will only change after scrolling beyond this value.\n * @defaultValue 40\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/threshold | Demo: Threshold}\n */\n threshold: number;\n\n /**\n * Minimum distance to recognize user input (unit: px). Panels will only move after scrolling beyond this value.\n * @defaultValue 1\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/threshold | Demo: Threshold}\n */\n dragThreshold: number;\n\n /**\n * The minimum distance for animation to proceed.\n * @remarks\n * If the distance to be moved is less than `animationThreshold`, the movement proceeds immediately without animation (duration: 0).\n * @defaultValue 0.5\n * @since 4.15.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/animation-threshold | Demo: Animation Threshold}\n */\n animationThreshold: number;\n\n /**\n * Using `useCSSOrder` does not change the DOM order, but the `order` CSS property changes the order on the screen.\n * @remarks\n * When `circular` is used, the DOM order changes depending on the position.\n * When using `iframe`, you can prevent reloading when the DOM order changes.\n * In svelte, CSS order is always used.\n * @defaultValue false\n * @since 4.15.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/use-css-order | Demo: CSS Order}\n */\n useCSSOrder: boolean;\n\n /**\n * Allows stopping animations with user click/touch input.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/interruptable | Demo: Interruptable}\n */\n interruptable: boolean;\n\n /**\n * The size value of the bounce area.\n * @dependency Conditional - Only can be enabled when {@link FlickingOptions.circular | circular} is false\n * @dependency Related - Works with {@link FlickingOptions.bound | bound} to provide bounce effect at panel boundaries\n *\n * @remarks\n * You can set different bounce value for prev/next direction by using array.\n * Use `number` for px value, and `string` for px or % value relative to viewport size.\n * You have to call {@link Control.updateInput | updateInput()} after changing this value to take effect.\n *\n * @example\n * ```ts\n * const possibleOptions = [\n * \"0%\", \"25%\", \"42%\", // % values\n * \"0px\", \"100px\", \"50% - 25px\", // px values with arithmetic\n * 0, 100, 1000 // numbers (same as px)\n * ];\n * ```\n *\n * @defaultValue \"20%\"\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/bound | Demo: Bound}\n */\n bounce: number | string | [number | string, number | string];\n\n /**\n * Size of the area from the right edge in iOS Safari (in px) that enables swipe-back or swipe-forward.\n * @defaultValue 30\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/input-type | Demo: Input Type}\n */\n iOSEdgeSwipeThreshold: number;\n\n /**\n * Automatically cancels {@link https://developer.mozilla.org/ko/docs/Web/API/Element/click_event | click} events when the user drags the viewport by any amount.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/prevent-click | Demo: Prevent Click}\n */\n preventClickOnDrag: boolean;\n\n /**\n * Whether to use the {@link https://developer.mozilla.org/ko/docs/Web/API/Event/preventDefault | preventDefault} when the user starts dragging\n * @defaultValue false\n * @since 4.11.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/prevent-click | Demo: Prevent Click}\n */\n preventDefaultOnDrag: boolean;\n\n /**\n * Automatically call {@link Flicking.disableInput | disableInput()} during initialization.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/disable-input | Demo: Disable Input}\n */\n disableOnInit: boolean;\n\n /**\n * Change active panel index on mouse/touch hold while animating.\n * @remarks\n * `index` of the `willChange`/`willRestore` event will be used as new index.\n * @defaultValue false\n * @since 4.8.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/interruptable | Demo: Interruptable}\n */\n changeOnHold: boolean;\n\n // PERFORMANCE\n /**\n * When enabled, only renders visible panels. Can significantly improve performance with many panels.\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/render-only-visible | Demo: Render Only Visible}\n */\n renderOnlyVisible: boolean;\n\n /**\n * When enabled, restricts the number of panel elements to `panelsPerView + 1` to reduce memory usage.\n * @dependency Requires - Must be used with {@link FlickingOptions.panelsPerView | panelsPerView}. When panelsPerView is -1 (auto), this option is ignored.\n *\n * @remarks\n * After Flicking initialization, this property can be used to add or remove the number of rendered panels.\n *\n * The option object contains:\n * - `renderPanel`: A rendering function for the panel element's innerHTML\n * - `initialPanelCount`: Initial panel count to render\n * - `cache` (optional, default: false): Whether to cache rendered panel's innerHTML\n * - `panelClass` (optional, default: \"flicking-panel\"): The class name for rendered panel elements\n *\n * @example\n * ```ts\n * import Flicking, { VirtualPanel } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking(\"#some_el\", {\n * panelsPerView: 3,\n * virtual: {\n * renderPanel: (panel: VirtualPanel, index: number) => `Panel ${index}`,\n * initialPanelCount: 100\n * }\n * });\n *\n * // Add 100 virtual panels (at the end)\n * flicking.virtual.append(100);\n *\n * // Remove 100 virtual panels from 0 to 100\n * flicking.virtual.remove(0, 100);\n * ```\n *\n * @defaultValue null\n *\n * @since 4.4.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/virtual-scroll | Demo: Virtual Scroll}\n */\n virtual: VirtualOptions | null;\n\n // OTHERS\n /**\n * Call {@link Flicking.init | init()} automatically when creating Flicking's instance.\n * @defaultValue true\n * @readonly\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/basic/auto-init | Demo: Auto Init}\n */\n autoInit: boolean;\n\n /**\n * Whether to automatically call {@link Flicking.resize | resize()} when the viewport element (.flicking-viewport) size is changed.\n * @defaultValue true\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/auto-resize | Demo: Auto Resize}\n */\n autoResize: boolean;\n\n /**\n * Whether to listen {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver | ResizeObserver}'s event instead of Window's {@link https://developer.mozilla.org/ko/docs/Web/API/Window/resize_event | resize} event when using the `autoResize` option\n * @defaultValue true\n * @since 4.4.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/auto-resize | Demo: Auto Resize}\n */\n useResizeObserver: boolean;\n\n /**\n * Delays size recalculation from `autoResize` by the given time in milliseconds.\n * @remarks\n * If the size is changed again while being delayed, it cancels the previous one and delays from the beginning again.\n * This can increase performance by preventing `resize` being called too often.\n * @defaultValue 0\n * @since 4.6.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-debounce | Demo: Resize Debounce}\n */\n resizeDebounce: number;\n\n /**\n * Whether to use ResizeObserver to observe the size of the panel element.\n * @dependency Conditional - Only available when {@link FlickingOptions.useResizeObserver | useResizeObserver} is enabled\n *\n * @remarks\n * This option guarantees that the resize event is triggered when the size of the panel element is changed.\n *\n * @since 4.13.1\n * @defaultValue false\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/observe-panel-resize | Demo: Observe Panel Resize}\n */\n observePanelResize: boolean;\n\n /**\n * The maximum time for size recalculation delay when using `resizeDebounce`, in milliseconds.\n * @remarks\n * This guarantees that size recalculation is performed at least once every (n)ms.\n * @defaultValue 100\n * @since 4.6.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/resize-debounce | Demo: Resize Debounce}\n */\n maxResizeDebounce: number;\n\n /**\n * By enabling this, Flicking will calculate all internal size with CSS width computed with getComputedStyle.\n * @remarks\n * This can prevent 1px offset issue in some cases where panel size has the fractional part.\n * All sizes will have the original size before CSS {@link https://developer.mozilla.org/en-US/docs/Web/CSS/transform | transform} is applied on the element.\n * @defaultValue false\n * @since 4.9.0\n * @see {@link https://naver.github.io/egjs-flicking/docs/demos/advanced/fractional-size | Demo: Fractional Size}\n */\n useFractionalSize: boolean;\n\n /**\n * This is an option for the frameworks (React, Vue, Angular, ...).\n * Don't set it as it's automatically managed by Flicking.\n * @defaultValue null\n * @internal\n * @readonly\n */\n externalRenderer: ExternalRenderer | null;\n\n /**\n * This option works only when autoResize is set to true.\n * @internal\n * @defaultValue false\n */\n optimizeSizeUpdate: boolean;\n\n /**\n * @deprecated Use {@link FlickingOptions.externalRenderer | externalRenderer} instead\n */\n renderExternal: {\n renderer: new (options: RendererOptions) => ExternalRenderer;\n rendererOptions: RendererOptions;\n } | null;\n}\n\n/**\n * Parameters for {@link Flicking.getStatus}\n * @public\n */\nexport interface GetStatusParams {\n /**\n * Include current panel index\n * @defaultValue true\n */\n index?: boolean;\n /**\n * Include camera position. Only works when {@link FlickingOptions.moveType | moveType} is `freeScroll`\n * @defaultValue true\n */\n position?: boolean;\n /**\n * Include panel's `outerHTML`\n * @defaultValue false\n */\n includePanelHTML?: boolean;\n /**\n * Include only visible panels' HTML. Only available when `includePanelHTML` is `true`\n * @defaultValue false\n */\n visiblePanelsOnly?: boolean;\n}\n\nclass Flicking extends Component<FlickingEvents> {\n /**\n * Version info string\n * @example\n * ```ts\n * Flicking.VERSION; // ex) 4.0.0\n * ```\n */\n public static readonly VERSION: string = \"#__VERSION__#\";\n\n // Core components\n private _viewport: Viewport;\n private _autoResizer: AutoResizer;\n private _camera: Camera;\n private _control: Control;\n private _renderer: Renderer;\n private _virtualManager: VirtualManager;\n\n // Options\n private _align: FlickingOptions[\"align\"];\n private _defaultIndex: FlickingOptions[\"defaultIndex\"];\n private _horizontal: FlickingOptions[\"horizontal\"];\n private _circular: FlickingOptions[\"circular\"];\n private _circularFallback: FlickingOptions[\"circularFallback\"];\n private _bound: FlickingOptions[\"bound\"];\n private _adaptive: FlickingOptions[\"adaptive\"];\n private _panelsPerView: FlickingOptions[\"panelsPerView\"];\n private _noPanelStyleOverride: FlickingOptions[\"noPanelStyleOverride\"];\n private _resizeOnContentsReady: FlickingOptions[\"resizeOnContentsReady\"];\n private _virtual: FlickingOptions[\"virtual\"];\n private _nested: FlickingOptions[\"nested\"];\n\n private _needPanelThreshold: FlickingOptions[\"needPanelThreshold\"];\n private _preventEventsBeforeInit: FlickingOptions[\"preventEventsBeforeInit\"];\n\n private _deceleration: FlickingOptions[\"deceleration\"];\n private _duration: FlickingOptions[\"duration\"];\n private _easing: FlickingOptions[\"easing\"];\n\n private _inputType: FlickingOptions[\"inputType\"];\n private _moveType: FlickingOptions[\"moveType\"];\n private _threshold: FlickingOptions[\"threshold\"];\n private _dragThreshold: FlickingOptions[\"dragThreshold\"];\n private _animationThreshold: FlickingOptions[\"animationThreshold\"];\n private _useCSSOrder: FlickingOptions[\"useCSSOrder\"];\n private _interruptable: FlickingOptions[\"interruptable\"];\n private _bounce: FlickingOptions[\"bounce\"];\n private _iOSEdgeSwipeThreshold: FlickingOptions[\"iOSEdgeSwipeThreshold\"];\n private _preventClickOnDrag: FlickingOptions[\"preventClickOnDrag\"];\n private _preventDefaultOnDrag: FlickingOptions[\"preventDefaultOnDrag\"];\n private _disableOnInit: FlickingOptions[\"disableOnInit\"];\n private _changeOnHold: FlickingOptions[\"changeOnHold\"];\n\n private _renderOnlyVisible: FlickingOptions[\"renderOnlyVisible\"];\n\n private _autoInit: FlickingOptions[\"autoInit\"];\n private _autoResize: FlickingOptions[\"autoResize\"];\n private _useResizeObserver: FlickingOptions[\"useResizeObserver\"];\n private _resizeDebounce: FlickingOptions[\"resizeDebounce\"];\n private _observePanelResize: FlickingOptions[\"observePanelResize\"];\n private _maxResizeDebounce: FlickingOptions[\"maxResizeDebounce\"];\n private _useFractionalSize: FlickingOptions[\"useFractionalSize\"];\n private _externalRenderer: FlickingOptions[\"externalRenderer\"];\n private _renderExternal: FlickingOptions[\"renderExternal\"];\n private _optimizeSizeUpdate: FlickingOptions[\"optimizeSizeUpdate\"];\n\n // Internal State\n private _initialized: boolean;\n private _plugins: Plugin[];\n private _isResizing: boolean;\n private _scheduleResize = false;\n\n // Components\n /**\n * {@link Control} instance that manages user input and panel movement animations\n * @remarks\n * The concrete Control implementation is selected based on {@link FlickingOptions.moveType | moveType} option.\n * @privateRemarks\n * The control instance is created during construction by {@link Flicking._createControl}.\n * @readonly\n */\n public get control(): Control {\n return this._control;\n }\n\n /**\n * {@link Camera} instance that manages actual movement and positioning inside the viewport\n * @remarks\n * The concrete Camera implementation is selected based on {@link FlickingOptions.circular} and {@link FlickingOptions.bound} options.\n * @privateRemarks\n * The camera instance is created during construction by {@link Flicking._createCamera}.\n * @readonly\n */\n public get camera(): Camera {\n return this._camera;\n }\n\n /**\n * {@link Renderer} instance that manages panels and their elements\n * @remarks\n * The concrete Renderer implementation is selected based on {@link Flicking.externalRenderer} and {@link FlickingOptions.virtual} options.\n * @privateRemarks\n * The renderer instance is created during construction by {@link Flicking._createRenderer}.\n * @readonly\n */\n public get renderer(): Renderer {\n return this._renderer;\n }\n\n /**\n * {@link Viewport} instance that manages viewport size and element\n * @privateRemarks\n * The viewport instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get viewport(): Viewport {\n return this._viewport;\n }\n\n /**\n * {@link AutoResizer} instance that detects size changes and triggers resize when {@link FlickingOptions.autoResize | autoResize} option is enabled\n * @privateRemarks\n * The autoResizer instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get autoResizer(): AutoResizer {\n return this._autoResizer;\n }\n\n // Internal States\n /**\n * Whether Flicking's {@link Flicking.init} is called.\n * @remarks\n * This is `true` when {@link Flicking.init} is called, and is `false` after calling {@link Flicking.destroy}.\n * Use this to check if Flicking is ready before calling certain methods that require initialization.\n * @defaultValue false\n * @readonly\n * @example\n * ```ts\n * if (flicking.initialized) {\n * flicking.setStatus(status);\n * } else {\n * await flicking.init();\n * flicking.setStatus(status);\n * }\n * ```\n */\n public get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Whether the circular mode is actually enabled.\n * @remarks\n * The {@link FlickingOptions.circular} option may not be enabled when the sum of panel sizes is too small.\n * This property reflects the actual enabled state, which may differ from the {@link FlickingOptions.circular} option value.\n * @defaultValue false\n * @readonly\n */\n public get circularEnabled(): boolean {\n return this._camera.circularEnabled;\n }\n\n /**\n * Whether the virtual mode is actually enabled.\n * @remarks\n * The {@link FlickingOptions.virtual} option may not be enabled when {@link FlickingOptions.panelsPerView} is less than or equal to zero.\n * This property reflects the actual enabled state, which may differ from the {@link FlickingOptions.virtual} option value.\n * @defaultValue false\n * @readonly\n */\n public get virtualEnabled(): boolean {\n return this._panelsPerView > 0 && this._virtual != null;\n }\n\n /**\n * Index of the currently active panel.\n * @remarks\n * Returns -1 when there is no active panel. This is a shorthand for `Flicking.currentPanel.index`.\n * @readonly\n */\n public get index(): number {\n return this._control.activeIndex;\n }\n\n /**\n * The root viewport element (`.flicking-viewport`).\n * @remarks\n * This is the element passed to the Flicking constructor. It is a shorthand for `Flicking.viewport.element`.\n * @readonly\n */\n public get element(): HTMLElement {\n return this._viewport.element;\n }\n\n /**\n * The currently active panel.\n * @remarks\n * Returns `null` when there is no active panel. This is a shorthand for `Flicking.control.activePanel`.\n * @readonly\n */\n public get currentPanel(): Panel | null {\n return this._control.activePanel;\n }\n\n /**\n * Array of all panels.\n * @remarks\n * This is a shorthand for `Flicking.renderer.panels`.\n * @readonly\n */\n public get panels(): Panel[] {\n return this._renderer.panels;\n }\n\n /**\n * Total number of panels.\n * @remarks\n * This is a shorthand for `Flicking.renderer.panelCount`.\n * @readonly\n */\n public get panelCount(): number {\n return this._renderer.panelCount;\n }\n\n /**\n * Array of panels that are currently visible in the viewport.\n * @remarks\n * This is a shorthand for `Flicking.camera.visiblePanels`.\n * @readonly\n */\n public get visiblePanels(): Panel[] {\n return this._camera.visiblePanels;\n }\n\n /**\n * Whether Flicking is currently animating.\n * @remarks\n * This is a shorthand for `Flicking.control.animating`.\n * @readonly\n */\n public get animating(): boolean {\n return this._control.animating;\n }\n\n /**\n * Whether the user is currently clicking or touching the viewport.\n * @remarks\n * This is a shorthand for `Flicking.control.holding`.\n * @readonly\n */\n public get holding(): boolean {\n return this._control.holding;\n }\n\n /**\n * Array of currently activated plugins.\n * @remarks\n * Plugins are added via {@link Flicking.addPlugins} and removed via {@link Flicking.removePlugins}.\n * @readonly\n */\n public get activePlugins(): Plugin[] {\n return this._plugins;\n }\n\n // Options Getter\n // UI / LAYOUT\n /** Current value of the {@link FlickingOptions.align | align} option. */\n public get align(): FlickingOptions[\"align\"] {\n return this._align;\n }\n\n /** Current value of the {@link FlickingOptions.defaultIndex | defaultIndex} option. */\n public get defaultIndex(): FlickingOptions[\"defaultIndex\"] {\n return this._defaultIndex;\n }\n\n /** Current value of the {@link FlickingOptions.horizontal | horizontal} option. */\n public get horizontal(): FlickingOptions[\"horizontal\"] {\n return this._horizontal;\n }\n\n /** Current value of the {@link FlickingOptions.circular | circular} option. */\n public get circular(): FlickingOptions[\"circular\"] {\n return this._circular;\n }\n\n /**\n * Current value of the {@link FlickingOptions.circularFallback | circularFallback} option.\n * @since 4.5.0\n */\n public get circularFallback(): FlickingOptions[\"circularFallback\"] {\n return this._circularFallback;\n }\n\n /** Current value of the {@link FlickingOptions.bound | bound} option. */\n public get bound(): FlickingOptions[\"bound\"] {\n return this._bound;\n }\n\n /** Current value of the {@link FlickingOptions.adaptive | adaptive} option. */\n public get adaptive(): FlickingOptions[\"adaptive\"] {\n return this._adaptive;\n }\n\n /**\n * Current value of the {@link FlickingOptions.panelsPerView | panelsPerView} option.\n * @since 4.2.0\n */\n public get panelsPerView(): FlickingOptions[\"panelsPerView\"] {\n return this._panelsPerView;\n }\n\n /** Current value of the {@link FlickingOptions.noPanelStyleOverride | noPanelStyleOverride} option. */\n public get noPanelStyleOverride(): FlickingOptions[\"noPanelStyleOverride\"] {\n return this._noPanelStyleOverride;\n }\n\n /**\n * Current value of the {@link FlickingOptions.resizeOnContentsReady | resizeOnContentsReady} option.\n * @since 4.3.0\n */\n public get resizeOnContentsReady(): FlickingOptions[\"resizeOnContentsReady\"] {\n return this._resizeOnContentsReady;\n }\n\n /**\n * Current value of the {@link FlickingOptions.nested | nested} option.\n * @since 4.7.0\n */\n public get nested(): FlickingOptions[\"nested\"] {\n return this._nested;\n }\n\n // EVENTS\n /** Current value of the {@link FlickingOptions.needPanelThreshold | needPanelThreshold} option. */\n public get needPanelThreshold(): FlickingOptions[\"needPanelThreshold\"] {\n return this._needPanelThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.preventEventsBeforeInit | preventEventsBeforeInit} option.\n * @since 4.2.0\n */\n public get preventEventsBeforeInit(): FlickingOptions[\"preventEventsBeforeInit\"] {\n return this._preventEventsBeforeInit;\n }\n\n // ANIMATION\n /** Current value of the {@link FlickingOptions.deceleration | deceleration} option. */\n public get deceleration(): FlickingOptions[\"deceleration\"] {\n return this._deceleration;\n }\n\n /** Current value of the {@link FlickingOptions.easing | easing} option. */\n public get easing(): FlickingOptions[\"easing\"] {\n return this._easing;\n }\n\n /** Current value of the {@link FlickingOptions.duration | duration} option. */\n public get duration(): FlickingOptions[\"duration\"] {\n return this._duration;\n }\n\n // INPUT\n /** Current value of the {@link FlickingOptions.inputType | inputType} option. */\n public get inputType(): FlickingOptions[\"inputType\"] {\n return this._inputType;\n }\n\n /** Current value of the {@link FlickingOptions.moveType | moveType} option. */\n public get moveType(): FlickingOptions[\"moveType\"] {\n return this._moveType;\n }\n\n /** Current value of the {@link FlickingOptions.threshold | threshold} option. */\n public get threshold(): FlickingOptions[\"threshold\"] {\n return this._threshold;\n }\n\n /** Current value of the {@link FlickingOptions.dragThreshold | dragThreshold} option. */\n public get dragThreshold(): FlickingOptions[\"dragThreshold\"] {\n return this._dragThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.animationThreshold | animationThreshold} option.\n * @since 4.15.0\n */\n public get animationThreshold() {\n return this._animationThreshold;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useCSSOrder | useCSSOrder} option.\n * @since 4.15.0\n */\n public get useCSSOrder() {\n return this._useCSSOrder;\n }\n\n /** Current value of the {@link FlickingOptions.interruptable | interruptable} option. */\n public get interruptable(): FlickingOptions[\"interruptable\"] {\n return this._interruptable;\n }\n\n /** Current value of the {@link FlickingOptions.bounce | bounce} option. */\n public get bounce(): FlickingOptions[\"bounce\"] {\n return this._bounce;\n }\n\n /** Current value of the {@link FlickingOptions.iOSEdgeSwipeThreshold | iOSEdgeSwipeThreshold} option. */\n public get iOSEdgeSwipeThreshold(): FlickingOptions[\"iOSEdgeSwipeThreshold\"] {\n return this._iOSEdgeSwipeThreshold;\n }\n\n /** Current value of the {@link FlickingOptions.preventClickOnDrag | preventClickOnDrag} option. */\n public get preventClickOnDrag(): FlickingOptions[\"preventClickOnDrag\"] {\n return this._preventClickOnDrag;\n }\n\n /**\n * Current value of the {@link FlickingOptions.preventDefaultOnDrag | preventDefaultOnDrag} option.\n * @since 4.11.0\n */\n public get preventDefaultOnDrag(): FlickingOptions[\"preventDefaultOnDrag\"] {\n return this._preventDefaultOnDrag;\n }\n\n /** Current value of the {@link FlickingOptions.disableOnInit | disableOnInit} option. */\n public get disableOnInit(): FlickingOptions[\"disableOnInit\"] {\n return this._disableOnInit;\n }\n\n /**\n * Current value of the {@link FlickingOptions.changeOnHold | changeOnHold} option.\n * @since 4.8.0\n */\n public get changeOnHold(): FlickingOptions[\"changeOnHold\"] {\n return this._changeOnHold;\n }\n\n // PERFORMANCE\n /** Current value of the {@link FlickingOptions.renderOnlyVisible | renderOnlyVisible} option. */\n public get renderOnlyVisible(): FlickingOptions[\"renderOnlyVisible\"] {\n return this._renderOnlyVisible;\n }\n\n /**\n * {@link VirtualManager} instance that manages virtual panels\n * @privateRemarks\n * The virtualManager instance is created during construction by {@link Flicking} constructor.\n * @readonly\n */\n public get virtual(): VirtualManager {\n return this._virtualManager;\n }\n\n // OTHERS\n /** Current value of the {@link FlickingOptions.autoInit | autoInit} option. */\n public get autoInit(): FlickingOptions[\"autoInit\"] {\n return this._autoInit;\n }\n\n /** Current value of the {@link FlickingOptions.autoResize | autoResize} option. */\n public get autoResize(): FlickingOptions[\"autoResize\"] {\n return this._autoResize;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useResizeObserver | useResizeObserver} option.\n * @since 4.4.0\n */\n public get useResizeObserver(): FlickingOptions[\"useResizeObserver\"] {\n return this._useResizeObserver;\n }\n\n /**\n * Current value of the {@link FlickingOptions.observePanelResize | observePanelResize} option.\n * @since 4.13.1\n */\n public get observePanelResize(): FlickingOptions[\"observePanelResize\"] {\n return this._observePanelResize;\n }\n\n /**\n * Current value of the {@link FlickingOptions.resizeDebounce | resizeDebounce} option.\n * @since 4.6.0\n */\n public get resizeDebounce(): FlickingOptions[\"resizeDebounce\"] {\n return this._resizeDebounce;\n }\n\n /**\n * Current value of the {@link FlickingOptions.maxResizeDebounce | maxResizeDebounce} option.\n * @since 4.6.0\n */\n public get maxResizeDebounce(): FlickingOptions[\"maxResizeDebounce\"] {\n return this._maxResizeDebounce;\n }\n\n /**\n * Current value of the {@link FlickingOptions.useFractionalSize | useFractionalSize} option.\n * @since 4.9.0\n */\n public get useFractionalSize(): FlickingOptions[\"useFractionalSize\"] {\n return this._useFractionalSize;\n }\n\n /** Current value of the {@link FlickingOptions.externalRenderer | externalRenderer} option. */\n public get externalRenderer(): FlickingOptions[\"externalRenderer\"] {\n return this._externalRenderer;\n }\n\n /**\n * @deprecated Use {@link Flicking.externalRenderer | externalRenderer} instead.\n * Current value of the {@link FlickingOptions.renderExternal | renderExternal} option.\n */\n public get renderExternal(): FlickingOptions[\"renderExternal\"] {\n return this._renderExternal;\n }\n\n /** @internal */\n public get optimizeSizeUpdate(): FlickingOptions[\"optimizeSizeUpdate\"] {\n return this._optimizeSizeUpdate;\n }\n\n // Options Setter\n // UI / LAYOUT\n /**\n * Sets {@link FlickingOptions.align}.\n * @privateRemarks\n * Setting this value updates the renderer and camera alignment, and triggers a resize operation.\n */\n public set align(val: FlickingOptions[\"align\"]) {\n this._align = val;\n this._renderer.align = val;\n this._camera.align = val;\n void this.resize();\n }\n\n public set defaultIndex(val: FlickingOptions[\"defaultIndex\"]) {\n this._defaultIndex = val;\n }\n\n /**\n * Sets {@link FlickingOptions.horizontal}.\n * @privateRemarks\n * Setting this value updates the control direction and triggers a resize operation.\n */\n public set horizontal(val: FlickingOptions[\"horizontal\"]) {\n this._horizontal = val;\n this._control.controller.updateDirection();\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.circular}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel positions.\n */\n public set circular(val: FlickingOptions[\"circular\"]) {\n this._circular = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.bound}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel positions.\n */\n public set bound(val: FlickingOptions[\"bound\"]) {\n this._bound = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.adaptive}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel sizes.\n */\n public set adaptive(val: FlickingOptions[\"adaptive\"]) {\n this._adaptive = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.panelsPerView}.\n * @privateRemarks\n * Setting this value triggers a resize operation to recalculate panel sizes.\n */\n public set panelsPerView(val: FlickingOptions[\"panelsPerView\"]) {\n this._panelsPerView = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.noPanelStyleOverride}.\n * @privateRemarks\n * Setting this value triggers a resize operation to update panel styles.\n */\n public set noPanelStyleOverride(val: FlickingOptions[\"noPanelStyleOverride\"]) {\n this._noPanelStyleOverride = val;\n void this.resize();\n }\n\n /**\n * Sets {@link FlickingOptions.resizeOnContentsReady}.\n * @privateRemarks\n * When set to `true`, immediately checks all panels for content readiness.\n */\n public set resizeOnContentsReady(val: FlickingOptions[\"resizeOnContentsReady\"]) {\n this._resizeOnContentsReady = val;\n if (val) {\n this._renderer.checkPanelContentsReady(this._renderer.panels);\n }\n }\n\n /**\n * Sets {@link FlickingOptions.nested}.\n * @privateRemarks\n * Setting this value updates the control's axes options.\n */\n public set nested(val: FlickingOptions[\"nested\"]) {\n this._nested = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.nested = val;\n }\n }\n\n // EVENTS\n public set needPanelThreshold(val: FlickingOptions[\"needPanelThreshold\"]) {\n this._needPanelThreshold = val;\n }\n\n public set preventEventsBeforeInit(val: FlickingOptions[\"preventEventsBeforeInit\"]) {\n this._preventEventsBeforeInit = val;\n }\n\n // ANIMATION\n /**\n * Sets {@link FlickingOptions.deceleration}.\n * @privateRemarks\n * Setting this value updates the control's axes deceleration option.\n */\n public set deceleration(val: FlickingOptions[\"deceleration\"]) {\n this._deceleration = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.deceleration = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.easing}.\n * @privateRemarks\n * Setting this value updates the control's axes easing option.\n */\n public set easing(val: FlickingOptions[\"easing\"]) {\n this._easing = val;\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.easing = val;\n }\n }\n\n public set duration(val: FlickingOptions[\"duration\"]) {\n this._duration = val;\n }\n\n // INPUT\n /**\n * Sets {@link FlickingOptions.inputType}.\n * @privateRemarks\n * Setting this value updates the control's pan input options.\n */\n public set inputType(val: FlickingOptions[\"inputType\"]) {\n this._inputType = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.inputType = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.moveType}.\n * @privateRemarks\n * Setting this value creates a new Control instance based on the moveType and preserves the current panel position and progress.\n */\n public set moveType(val: FlickingOptions[\"moveType\"]) {\n this._moveType = val;\n\n const prevControl = this._control;\n const newControl = this._createControl();\n const activePanel = prevControl.activePanel;\n newControl.copy(prevControl);\n\n const prevProgressInPanel = activePanel ? this._camera.getProgressInPanel(activePanel) : 0;\n\n this._control = newControl;\n this._control.updatePosition(prevProgressInPanel);\n this._control.updateInput();\n }\n\n public set threshold(val: FlickingOptions[\"threshold\"]) {\n this._threshold = val;\n }\n\n /**\n * Sets {@link FlickingOptions.dragThreshold}.\n * @privateRemarks\n * Setting this value updates the control's pan input threshold option.\n */\n public set dragThreshold(val: FlickingOptions[\"dragThreshold\"]) {\n this._dragThreshold = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.threshold = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.animationThreshold}.\n */\n public set animationThreshold(val: FlickingOptions[\"animationThreshold\"]) {\n this._animationThreshold = val;\n }\n\n /**\n * Sets {@link FlickingOptions.useCSSOrder}.\n */\n public set useCSSOrder(val: FlickingOptions[\"useCSSOrder\"]) {\n this._useCSSOrder = val;\n }\n\n /**\n * Sets {@link FlickingOptions.interruptable}.\n * @privateRemarks\n * Setting this value updates the control's axes interruptable option.\n */\n public set interruptable(val: FlickingOptions[\"interruptable\"]) {\n this._interruptable = val;\n\n const axes = this._control.controller.axes;\n\n if (axes) {\n axes.options.interruptable = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.bounce}.\n * @privateRemarks\n * Setting this value updates the control input configuration.\n */\n public set bounce(val: FlickingOptions[\"bounce\"]) {\n this._bounce = val;\n this._control.updateInput();\n }\n\n /**\n * Sets {@link FlickingOptions.iOSEdgeSwipeThreshold}.\n * @privateRemarks\n * Setting this value updates the control's pan input iOS edge swipe threshold option.\n */\n public set iOSEdgeSwipeThreshold(val: FlickingOptions[\"iOSEdgeSwipeThreshold\"]) {\n this._iOSEdgeSwipeThreshold = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.iOSEdgeSwipeThreshold = val;\n }\n }\n\n /**\n * Sets {@link FlickingOptions.preventClickOnDrag}.\n * @privateRemarks\n * Setting this value adds or removes the prevent click handler from the control.\n */\n public set preventClickOnDrag(val: FlickingOptions[\"preventClickOnDrag\"]) {\n const prevVal = this._preventClickOnDrag;\n\n if (val === prevVal) return;\n\n const controller = this._control.controller;\n\n if (val) {\n controller.addPreventClickHandler();\n } else {\n controller.removePreventClickHandler();\n }\n\n this._preventClickOnDrag = val;\n }\n\n /**\n * Sets {@link FlickingOptions.preventDefaultOnDrag}.\n * @privateRemarks\n * Setting this value updates the control's pan input preventDefaultOnDrag option.\n */\n public set preventDefaultOnDrag(val: FlickingOptions[\"preventDefaultOnDrag\"]) {\n this._preventDefaultOnDrag = val;\n const panInput = this._control.controller.panInput;\n\n if (panInput) {\n panInput.options.preventDefaultOnDrag = val;\n }\n }\n\n public set disableOnInit(val: FlickingOptions[\"disableOnInit\"]) {\n this._disableOnInit = val;\n }\n\n public set changeOnHold(val: FlickingOptions[\"changeOnHold\"]) {\n this._changeOnHold = val;\n }\n\n // PERFORMANCE\n /**\n * Sets {@link FlickingOptions.renderOnlyVisible}.\n * @privateRemarks\n * Setting this value triggers an immediate render operation.\n */\n public set renderOnlyVisible(val: FlickingOptions[\"renderOnlyVisible\"]) {\n this._renderOnlyVisible = val;\n void this._renderer.render();\n }\n\n // OTHERS\n /**\n * Sets {@link FlickingOptions.autoResize}.\n * @privateRemarks\n * Setting this value enables or disables the auto resizer if Flicking is already initialized.\n */\n public set autoResize(val: FlickingOptions[\"autoResize\"]) {\n this._autoResize = val;\n\n if (!this._initialized) {\n return;\n }\n\n if (val) {\n this._autoResizer.enable();\n } else {\n this._autoResizer.disable();\n }\n }\n\n /**\n * Sets {@link FlickingOptions.useResizeObserver}.\n * @privateRemarks\n * Setting this value re-enables the auto resizer if Flicking is initialized and autoResize is enabled.\n */\n public set useResizeObserver(val: FlickingOptions[\"useResizeObserver\"]) {\n this._useResizeObserver = val;\n\n if (this._initialized && this._autoResize) {\n this._autoResizer.enable();\n }\n }\n\n /**\n * Sets {@link FlickingOptions.observePanelResize}.\n * @privateRemarks\n * Setting this value starts or stops observing panel sizes if Flicking is initialized and autoResize is enabled.\n */\n public set observePanelResize(val: FlickingOptions[\"observePanelResize\"]) {\n this._observePanelResize = val;\n\n if (this._initialized && this._autoResize) {\n if (val) {\n this._autoResizer.observePanels();\n } else {\n this._autoResizer.unobservePanels();\n }\n }\n }\n\n public set optimizeSizeUpdate(val: FlickingOptions[\"optimizeSizeUpdate\"]) {\n this._optimizeSizeUpdate = val;\n }\n\n /** Creates a new Flicking instance\n * @param root - A root HTMLElement to initialize Flicking on it. When it's a typeof `string`, it should be a css selector string\n * @param options - A {@link FlickingOptions} object\n * @throws {@link InitializationErrors}\n * @example\n * ```ts\n * import Flicking from \"@egjs/flicking\";\n *\n * // Creating new instance of Flicking with HTMLElement\n * const flicking = new Flicking(document.querySelector(\".flicking-viewport\"), { circular: true });\n *\n * // Creating new instance of Flicking with CSS selector\n * const flicking2 = new Flicking(\".flicking-viewport\", { circular: true });\n * ```\n */\n public constructor(root: HTMLElement | string, options: Partial<FlickingOptions> = {}) {\n super();\n\n // Destructure options with default values\n const {\n align = ALIGN.CENTER,\n defaultIndex = 0,\n horizontal = true,\n circular = false,\n circularFallback = CIRCULAR_FALLBACK.LINEAR,\n bound = false,\n adaptive = false,\n panelsPerView = -1,\n noPanelStyleOverride = false,\n resizeOnContentsReady = false,\n nested = false,\n needPanelThreshold = 0,\n preventEventsBeforeInit = true,\n deceleration = 0.0075,\n duration = 500,\n easing = x => 1 - (1 - x) ** 3,\n inputType = [\"mouse\", \"touch\"],\n moveType = \"snap\",\n threshold = 40,\n dragThreshold = 1,\n interruptable = true,\n bounce = \"20%\",\n iOSEdgeSwipeThreshold = 30,\n preventClickOnDrag = true,\n preventDefaultOnDrag = false,\n disableOnInit = false,\n changeOnHold = false,\n renderOnlyVisible = false,\n virtual = null,\n autoInit = true,\n autoResize = true,\n useResizeObserver = true,\n resizeDebounce = 0,\n observePanelResize = false,\n maxResizeDebounce = 100,\n useFractionalSize = false,\n externalRenderer = null,\n renderExternal = null,\n optimizeSizeUpdate = false,\n animationThreshold = 0.5,\n useCSSOrder = false\n } = options;\n\n // Internal states\n this._initialized = false;\n this._plugins = [];\n this._isResizing = false;\n\n // Bind options\n this._align = align;\n this._defaultIndex = defaultIndex;\n this._horizontal = horizontal;\n this._circular = circular;\n this._circularFallback = circularFallback;\n this._bound = bound;\n this._adaptive = adaptive;\n this._panelsPerView = panelsPerView;\n this._noPanelStyleOverride = noPanelStyleOverride;\n this._resizeOnContentsReady = resizeOnContentsReady;\n this._nested = nested;\n this._virtual = virtual;\n this._needPanelThreshold = needPanelThreshold;\n this._preventEventsBeforeInit = preventEventsBeforeInit;\n this._deceleration = deceleration;\n this._duration = duration;\n this._easing = easing;\n this._inputType = inputType;\n this._moveType = moveType;\n this._threshold = threshold;\n this._dragThreshold = dragThreshold;\n this._interruptable = interruptable;\n this._bounce = bounce;\n this._iOSEdgeSwipeThreshold = iOSEdgeSwipeThreshold;\n this._preventClickOnDrag = preventClickOnDrag;\n this._preventDefaultOnDrag = preventDefaultOnDrag;\n this._disableOnInit = disableOnInit;\n this._changeOnHold = changeOnHold;\n this._renderOnlyVisible = renderOnlyVisible;\n this._autoInit = autoInit;\n this._autoResize = autoResize;\n this._useResizeObserver = useResizeObserver;\n this._resizeDebounce = resizeDebounce;\n this._maxResizeDebounce = maxResizeDebounce;\n this._observePanelResize = observePanelResize;\n this._useFractionalSize = useFractionalSize;\n this._externalRenderer = externalRenderer;\n this._renderExternal = renderExternal;\n this._optimizeSizeUpdate = optimizeSizeUpdate;\n this._animationThreshold = animationThreshold;\n this._useCSSOrder = useCSSOrder;\n\n // Create core components\n this._viewport = new Viewport(this, getElement(root));\n this._autoResizer = new AutoResizer(this);\n this._renderer = this._createRenderer();\n this._camera = this._createCamera();\n this._control = this._createControl();\n this._virtualManager = new VirtualManager(this, virtual);\n\n if (this._autoInit) {\n void this.init();\n }\n }\n\n /**\n * Initialize Flicking and move to the default index.\n * @remarks\n * This method is automatically called in the constructor when {@link FlickingOptions.autoInit | autoInit} is `true` (default).\n * If Flicking is already initialized, this method returns immediately without doing anything.\n * @fires {@link ReadyEvent}\n * @returns Promise that resolves when initialization is complete\n */\n public init(): Promise<void> {\n if (this._initialized) return Promise.resolve();\n\n const camera = this._camera;\n const renderer = this._renderer;\n const control = this._control;\n const virtualManager = this._virtualManager;\n const originalTrigger = this.trigger;\n const preventEventsBeforeInit = this._preventEventsBeforeInit;\n\n camera.init();\n virtualManager.init();\n renderer.init(this);\n control.init(this);\n\n if (preventEventsBeforeInit) {\n this.trigger = () => this;\n }\n\n this._initialResize();\n\n // Look at initial panel\n this._moveToInitialPanel();\n if (this._autoResize) {\n this._autoResizer.enable();\n }\n if (this._preventClickOnDrag) {\n control.controller.addPreventClickHandler();\n }\n if (this._disableOnInit) {\n this.disableInput();\n }\n renderer.checkPanelContentsReady(renderer.panels);\n this._initialized = true;\n\n return renderer.render().then(() => {\n // Done initializing & emit ready event\n this._plugins.forEach(plugin => plugin.init(this));\n\n if (preventEventsBeforeInit) {\n this.trigger = originalTrigger;\n }\n this.trigger(new ComponentEvent(EVENTS.READY));\n });\n }\n\n /**\n * Destroy Flicking and remove all event handlers.\n * @remarks\n * This method cleans up all resources including event handlers, components, and plugins.\n * After calling this method, {@link Flicking.initialized} will be `false` and the instance should not be used.\n */\n public destroy(): void {\n this.off();\n\n this._autoResizer.disable();\n this._control.destroy();\n this._camera.destroy();\n this._renderer.destroy();\n\n this._plugins.forEach(plugin => plugin.destroy());\n\n this._scheduleResize = false;\n this._initialized = false;\n this._isResizing = false;\n }\n\n /**\n * Move to the previous panel (current index - 1).\n * @param duration - Duration of the panel movement animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the previous panel\n */\n public prev(duration: number = this._duration): Promise<void> {\n return this.moveTo(this._control.activePanel?.prev()?.index ?? -1, duration, DIRECTION.PREV);\n }\n\n /**\n * Move to the next panel (current index + 1).\n * @param duration - Duration of the panel movement animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the next panel\n */\n public next(duration: number = this._duration): Promise<void> {\n return this.moveTo(this._control.activePanel?.next()?.index ?? this._renderer.panelCount, duration, DIRECTION.NEXT);\n }\n\n /**\n * Move to the panel with the given index.\n * @param index - The index of the panel to move to\n * @param duration - Duration of the animation (unit: ms). Defaults to {@link FlickingOptions.duration}\n * @param direction - Direction to move (circular mode only). Defaults to {@link DIRECTION.NONE}\n * @fires {@link MovementEvents}\n * @throws {@link MovementErrors}\n * @returns Promise that resolves after reaching the target panel\n */\n public moveTo(\n index: number,\n duration: number = this._duration,\n direction: ValueOf<typeof DIRECTION> = DIRECTION.NONE\n ): Promise<void> {\n const renderer = this._renderer;\n const panelCount = renderer.panelCount;\n\n const panel = renderer.getPanel(index);\n\n if (!panel) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.INDEX_OUT_OF_RANGE(index, 0, panelCount - 1), ERROR.CODE.INDEX_OUT_OF_RANGE)\n );\n }\n\n if (this._control.animating) {\n return Promise.reject(\n new FlickingError(ERROR.MESSAGE.ANIMATION_ALREADY_PLAYING, ERROR.CODE.ANIMATION_ALREADY_PLAYING)\n );\n }\n\n if (this._control.holding) {\n this._control.controller.release();\n }\n\n return this._control.moveToPanel(panel, {\n duration,\n direction\n });\n }\n\n /**\n * Change the destination and duration of the animation currently playing.\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @param index - The index of the panel to move to\n * @param duration - Duration of the animation (unit: ms)\n * @param direction - Direction to move. Only available when {@link FlickingOptions.circular} is enabled\n * @since 4.10.0\n * @throws {@link AnimationUpdateErrors}\n */\n public updateAnimation(index: number, duration?: number, direction?: ValueOf<typeof DIRECTION>): void {\n if (!this._control.animating) {\n return;\n }\n\n const renderer = this._renderer;\n const panelCount = renderer.panelCount;\n\n const panel = renderer.getPanel(index);\n\n if (!panel) {\n throw new FlickingError(\n ERROR.MESSAGE.INDEX_OUT_OF_RANGE(index, 0, panelCount - 1),\n ERROR.CODE.INDEX_OUT_OF_RANGE\n );\n }\n\n this._control.updateAnimation(panel, duration, direction);\n }\n\n /**\n * Stop the animation currently playing.\n * @remarks\n * This method does nothing if no animation is currently playing.\n * @since 4.10.0\n * @fires {@link MoveEndEvent}\n */\n public stopAnimation(): void {\n if (!this._control.animating) {\n return;\n }\n\n this._control.stopAnimation();\n }\n\n /**\n * Get the panel at the given index.\n * @param index - The index of the panel to get\n * @returns The panel at the given index, or `null` if it doesn't exist. This is a shorthand for `Flicking.renderer.getPanel(index)`.\n * @example\n * ```ts\n * const panel = flicking.getPanel(0);\n * // Which is a shorthand to...\n * const samePanel = flicking.panels[0];\n * ```\n */\n public getPanel(index: number): Panel | null {\n return this._renderer.getPanel(index);\n }\n\n /**\n * Enable user input (mouse/touch).\n * @remarks\n * This is a shorthand for `Flicking.control.enable`.\n * @returns The current instance for method chaining\n */\n public enableInput(): this {\n this._control.enable();\n return this;\n }\n\n /**\n * Disable user input (mouse/touch).\n * @remarks\n * This is a shorthand for `Flicking.control.disable`.\n * @returns The current instance for method chaining\n */\n public disableInput(): this {\n this._control.disable();\n return this;\n }\n\n /**\n * Get the current Flicking status.\n * @param options - {@link GetStatusParams}\n * @returns Status object that can be used with {@link Flicking.setStatus} to restore the state\n */\n public getStatus(options: GetStatusParams = {}): Status {\n // Destructure options with default values\n const { index = true, position = true, includePanelHTML = false, visiblePanelsOnly = false } = options;\n\n const camera = this._camera;\n const panels = visiblePanelsOnly ? this.visiblePanels : this.panels;\n\n const status: Status = {\n panels: panels.map(panel => {\n const panelInfo: Status[\"panels\"][0] = { index: panel.index };\n\n if (includePanelHTML) {\n panelInfo.html = panel.element.outerHTML;\n }\n\n return panelInfo;\n })\n };\n\n if (index) {\n status.index = this.index;\n }\n if (position) {\n const nearestAnchor = camera.findNearestAnchor(camera.position);\n\n if (nearestAnchor) {\n status.position = {\n panel: nearestAnchor.panel.index,\n progressInPanel: camera.getProgressInPanel(nearestAnchor.panel)\n };\n }\n }\n\n if (visiblePanelsOnly) {\n const visiblePanels = this.visiblePanels;\n\n status.visibleOffset = visiblePanels[0]?.index ?? 0;\n }\n\n return status;\n }\n\n /**\n * Restore Flicking to the state of the given {@link Status}.\n * @param status - {@link Status}\n * @throws {@link StatusRestoreErrors}\n */\n public setStatus(status: Status): void {\n if (!this._initialized) {\n throw new FlickingError(ERROR.MESSAGE.NOT_INITIALIZED, ERROR.CODE.NOT_INITIALIZED);\n }\n\n const { index, position, visibleOffset, panels } = status;\n\n const renderer = this._renderer;\n const control = this._control;\n\n // Can't add/remove panels on external rendering\n if (panels[0]?.html && !this._renderExternal) {\n renderer.batchRemove({\n index: 0,\n deleteCount: this.panels.length,\n hasDOMInElements: true\n });\n renderer.batchInsert({\n index: 0,\n elements: parseElement(panels.map(panel => panel.html!)),\n hasDOMInElements: true\n });\n }\n\n if (index != null) {\n const panelIndex = visibleOffset ? index - visibleOffset : index;\n\n void this.moveTo(panelIndex, 0).catch(() => void 0);\n }\n\n if (position && this._moveType === MOVE_TYPE.FREE_SCROLL) {\n const { panel, progressInPanel } = position;\n const panelIndex = visibleOffset ? panel - visibleOffset : panel;\n const panelRange = renderer.panels[panelIndex].range;\n const newCameraPos = panelRange.min + (panelRange.max - panelRange.min) * progressInPanel;\n\n void control.moveToPosition(newCameraPos, 0).catch(() => void 0);\n }\n }\n\n /**\n * Add plugins to Flicking.\n * @remarks\n * Plugins are automatically initialized if Flicking is already initialized.\n * @param plugins - {@link Plugin}\n * @returns The current instance for method chaining\n * @see https://github.com/naver/egjs-flicking-plugins\n */\n public addPlugins(...plugins: Plugin[]): this {\n if (this._initialized) {\n plugins.forEach(item => item.init(this));\n }\n\n this._plugins.push(...plugins);\n\n return this;\n }\n\n /**\n * Remove plugins from Flicking.\n * @param plugins - {@link Plugin}\n * @returns The current instance for method chaining\n * @see https://github.com/naver/egjs-flicking-plugins\n */\n public removePlugins(...plugins: Plugin[]): this {\n plugins.forEach(item => {\n const foundIndex = findIndex(this._plugins, val => val === item);\n\n if (foundIndex >= 0) {\n item.destroy();\n this._plugins.splice(foundIndex, 1);\n }\n });\n\n return this;\n }\n\n /**\n * Update viewport and panel sizes.\n * @remarks\n * This method does nothing if a resize is already in progress.\n * @fires {@link ResizeEvents}\n * @returns Promise that resolves when resize is complete\n */\n public async resize(): Promise<void> {\n if (!this._initialized) {\n return;\n }\n if (this._isResizing) {\n // resize를 연속으로 발생하면 무시하기에 마지막 viewport를 사이즈를 알 수 없음.\n // resize를 1번 더 실행할 수 잇는 스케줄링 등록\n this._scheduleResize = true;\n return;\n }\n\n this._scheduleResize = false;\n this._isResizing = true;\n\n const viewport = this._viewport;\n const renderer = this._renderer;\n const camera = this._camera;\n const control = this._control;\n\n const activePanel = control.activePanel;\n const prevWidth = viewport.width;\n const prevHeight = viewport.height;\n const prevProgressInPanel = activePanel ? camera.getProgressInPanel(activePanel) : 0;\n\n this.trigger(\n new ComponentEvent(EVENTS.BEFORE_RESIZE, {\n width: prevWidth,\n height: prevHeight,\n element: viewport.element\n })\n );\n\n viewport.resize();\n\n // 뷰포트 사이즈가 변경되었을 때 내부의 패널 사이즈들도 전부 업데이트 되어야 하므로 패널들을 전부 리렌더링한다.\n // optimizeSizeUpdate가 true일 경우에는 플리킹 방향에 대응되는 뷰포트 사이즈 요소가 변경되었을 때만 패널들을 리렌더링한다.\n // 자세한 사항은 optimizeSizeUpdate 옵션의 설명을 참고.\n if (this._optimizeSizeUpdate) {\n if ((this.horizontal && viewport.width !== prevWidth) || (!this.horizontal && viewport.height !== prevHeight)) {\n await renderer.forceRenderAllPanels();\n }\n } else {\n await renderer.forceRenderAllPanels(); // Render all panel elements, to update sizes\n }\n\n if (!this._initialized) {\n return;\n }\n renderer.updatePanelSize();\n camera.updateAlignPos();\n camera.updateRange();\n camera.updateAnchors();\n camera.updateAdaptiveHeight();\n camera.updatePanelOrder();\n camera.updateOffset();\n await renderer.render();\n\n if (!this._initialized) {\n return;\n }\n\n if (control.animating) {\n // TODO:\n } else {\n control.updatePosition(prevProgressInPanel);\n control.updateInput();\n }\n\n const newWidth = viewport.width;\n const newHeight = viewport.height;\n const sizeChanged = newWidth !== prevWidth || newHeight !== prevHeight;\n\n this.trigger(\n new ComponentEvent(EVENTS.AFTER_RESIZE, {\n width: viewport.width,\n height: viewport.height,\n prev: {\n width: prevWidth,\n height: prevHeight\n },\n sizeChanged,\n element: viewport.element\n })\n );\n\n this._isResizing = false;\n\n // 연속으로 resize를 호출하는 경우를 대비하기 위해서 스케줄링 반영\n if (this._scheduleResize) {\n void this.resize();\n }\n return;\n }\n\n /**\n * Add new panels after the last panel.\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of appended panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.append(document.createElement(\"div\"));\n * flicking.append(\"<div>Panel</div>\");\n * flicking.append([\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public append(element: ElementLike | ElementLike[]): Panel[] {\n return this.insert(this._renderer.panelCount, element);\n }\n\n /**\n * Add new panels before the first panel.\n * @remarks\n * This will increase the index of existing panels by the number of panels added.\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of prepended panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.prepend(document.createElement(\"div\"));\n * flicking.prepend(\"<div>Panel</div>\");\n * flicking.prepend([\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public prepend(element: ElementLike | ElementLike[]): Panel[] {\n return this.insert(0, element);\n }\n\n /**\n * Insert new panels at the given index.\n * @remarks\n * This will increase the index of panels at or after the given index by the number of panels added.\n * @param index - Index to insert new panels at\n * @param element - A new HTMLElement, outerHTML string, or an array of both\n * @throws {@link DOMManipulationErrors}\n * @returns Array of inserted panels\n * @example\n * ```ts\n * const flicking = new Flicking(\"#flick\");\n * flicking.insert(0, document.createElement(\"div\"));\n * flicking.insert(2, \"<div>Panel</div>\");\n * flicking.insert(1, [\"<div>Panel</div>\", document.createElement(\"div\")]);\n * ```\n */\n public insert(index: number, element: ElementLike | ElementLike[]): Panel[] {\n if (this._renderExternal) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ALLOWED_IN_FRAMEWORK, ERROR.CODE.NOT_ALLOWED_IN_FRAMEWORK);\n }\n\n return this._renderer.batchInsert({\n index,\n elements: parseElement(element),\n hasDOMInElements: true\n });\n }\n\n /**\n * Remove panels starting from the given index.\n * @remarks\n * This will decrease the index of panels after the removed ones by the number of panels removed.\n * @param index - Index of the first panel to remove\n * @param deleteCount - Number of panels to remove. Defaults to `1`\n * @throws {@link DOMManipulationErrors}\n * @returns Array of removed panels\n */\n public remove(index: number, deleteCount: number = 1): Panel[] {\n if (this._renderExternal) {\n throw new FlickingError(ERROR.MESSAGE.NOT_ALLOWED_IN_FRAMEWORK, ERROR.CODE.NOT_ALLOWED_IN_FRAMEWORK);\n }\n\n return this._renderer.batchRemove({\n index,\n deleteCount,\n hasDOMInElements: true\n });\n }\n\n /**\n * Factory method to create the appropriate Control implementation based on moveType option.\n * @internal\n * @privateRemarks\n * Called during constructor and when moveType option is changed. The moveType option must be set before calling this method.\n * Throws error if moveType is invalid.\n */\n private _createControl(): Control {\n const moveType = this._moveType;\n const moveTypes = Object.keys(MOVE_TYPE).map(key => MOVE_TYPE[key] as ValueOf<typeof MOVE_TYPE>);\n\n const moveTypeStr = Array.isArray(moveType) ? moveType[0] : moveType;\n\n const moveTypeOptions = Array.isArray(moveType) ? (moveType[1] ?? {}) : {};\n\n if (!includes(moveTypes, moveTypeStr)) {\n throw new FlickingError(\n ERROR.MESSAGE.WRONG_OPTION(\"moveType\", JSON.stringify(moveType)),\n ERROR.CODE.WRONG_OPTION\n );\n }\n\n switch (moveTypeStr) {\n case MOVE_TYPE.SNAP:\n return new SnapControl(moveTypeOptions as SnapControlOptions);\n case MOVE_TYPE.FREE_SCROLL:\n return new FreeControl(moveTypeOptions as FreeControlOptions);\n case MOVE_TYPE.STRICT:\n return new StrictControl(moveTypeOptions as StrictControlOptions);\n }\n }\n\n /**\n * Factory method to create Camera instance for managing viewport movement and positioning.\n * @internal\n * @privateRemarks\n * Called during constructor. The align option must be set before calling this method.\n * Warns if both circular and bound options are enabled (bound is ignored).\n */\n private _createCamera(): Camera {\n if (this._circular && this._bound) {\n // eslint-disable-next-line no-console\n console.warn('\"circular\" and \"bound\" option cannot be used together, ignoring bound.');\n }\n\n return new Camera(this, {\n align: this._align\n });\n }\n\n /**\n * Factory method to create the appropriate Renderer implementation based on externalRenderer and virtual options.\n * @internal\n * @privateRemarks\n * Called during constructor. Selects ExternalRenderer if externalRenderer is provided, otherwise creates VanillaRenderer or ExternalRenderer based on renderExternal option.\n * Warns if virtual is enabled without panelsPerView.\n */\n private _createRenderer(): Renderer {\n const externalRenderer = this._externalRenderer;\n if (this._virtual && this._panelsPerView <= 0) {\n // eslint-disable-next-line no-console\n console.warn('\"virtual\" and \"panelsPerView\" option should be used together, ignoring virtual.');\n }\n\n return externalRenderer\n ? externalRenderer\n : this._renderExternal\n ? this._createExternalRenderer()\n : this._createVanillaRenderer();\n }\n\n /**\n * Factory method to create ExternalRenderer from renderExternal option (deprecated).\n * @internal\n * @privateRemarks\n * Called by _createRenderer when renderExternal option is set. The renderExternal option must not be null and must contain renderer class and options.\n */\n private _createExternalRenderer(): ExternalRenderer {\n const { renderer, rendererOptions } = this._renderExternal!;\n\n return new renderer({ align: this._align, ...rendererOptions });\n }\n\n /**\n * Factory method to create VanillaRenderer for vanilla JavaScript rendering.\n * @internal\n * @privateRemarks\n * Called by _createRenderer when neither externalRenderer nor renderExternal is set.\n * Uses VirtualRenderingStrategy if virtual is enabled, otherwise NormalRenderingStrategy.\n */\n private _createVanillaRenderer(): VanillaRenderer {\n const virtual = this.virtualEnabled;\n\n return new VanillaRenderer({\n align: this._align,\n strategy: virtual\n ? new VirtualRenderingStrategy()\n : new NormalRenderingStrategy({\n providerCtor: VanillaElementProvider\n })\n });\n }\n\n /**\n * Move camera to the initial panel position based on defaultIndex option.\n * @internal\n * @privateRemarks\n * Called during init() method, after _initialResize(). Requires camera, renderer, and control to be already initialized.\n * Throws error if the initial panel position is not reachable.\n */\n private _moveToInitialPanel(): void {\n const renderer = this._renderer;\n const control = this._control;\n const camera = this._camera;\n const defaultPanel = renderer.getPanel(this._defaultIndex) || renderer.getPanel(0);\n\n if (!defaultPanel) return;\n\n const nearestAnchor = camera.findNearestAnchor(defaultPanel.position);\n const initialPanel =\n nearestAnchor &&\n defaultPanel.position !== nearestAnchor.panel.position &&\n defaultPanel.index !== nearestAnchor.panel.index\n ? nearestAnchor.panel\n : defaultPanel;\n control.setActive(initialPanel, null, false);\n\n if (!nearestAnchor) {\n throw new FlickingError(\n ERROR.MESSAGE.POSITION_NOT_REACHABLE(initialPanel.position),\n ERROR.CODE.POSITION_NOT_REACHABLE\n );\n }\n\n let position = initialPanel.position;\n\n if (!camera.canReach(initialPanel)) {\n position = nearestAnchor.position;\n }\n\n camera.lookAt(position);\n control.updateInput();\n camera.updateOffset();\n }\n\n /**\n * Calculate initial viewport and panel sizes during initialization.\n * @internal\n * @privateRemarks\n * Called during init() method, before _moveToInitialPanel(). This is separate from the regular resize() to avoid triggering events before initialization is complete.\n * Requires viewport, renderer, camera, and control to be already initialized. Triggers BEFORE_RESIZE and AFTER_RESIZE events.\n */\n private _initialResize() {\n const viewport = this._viewport;\n const renderer = this._renderer;\n const camera = this._camera;\n const control = this._control;\n\n this.trigger(\n new ComponentEvent(EVENTS.BEFORE_RESIZE, {\n width: 0,\n height: 0,\n element: viewport.element\n })\n );\n\n viewport.resize();\n renderer.updatePanelSize();\n camera.updateAlignPos();\n camera.updateRange();\n camera.updateAnchors();\n camera.updateOffset();\n control.updateInput();\n\n const newWidth = viewport.width;\n const newHeight = viewport.height;\n const sizeChanged = newWidth !== 0 || newHeight !== 0;\n\n this.trigger(\n new ComponentEvent(EVENTS.AFTER_RESIZE, {\n width: viewport.width,\n height: viewport.height,\n prev: {\n width: 0,\n height: 0\n },\n sizeChanged,\n element: viewport.element\n })\n );\n }\n}\n\nexport default Flicking;\n","/*\n * Copyright (c) 2015 NAVER Corp.\n * egjs projects are licensed under the MIT license\n */\nimport { ComponentEvent } from \"@egjs/component\";\nimport { EventKey } from \"@egjs/component/declaration/types\";\nimport { CLASS, MOVE_DIRECTION } from \"./constants/values\";\nimport { EVENTS } from \"./event/names\";\nimport {\n ChangedEvent,\n FlickingEvents,\n HoldEndEvent,\n HoldStartEvent,\n MoveEndEvent,\n MoveEvent,\n MoveStartEvent,\n RestoredEvent,\n WillChangeEvent,\n WillRestoreEvent\n} from \"./event/types\";\nimport Flicking, { FlickingOptions } from \"./Flicking\";\nimport { LiteralUnion, ValueOf } from \"./types/internal\";\nimport { getDataAttributes, includes, toArray } from \"./utils\";\n\nexport const SIDE_EVENTS = {\n HOLD_START: \"sideHoldStart\",\n HOLD_END: \"sideHoldEnd\",\n MOVE_START: \"sideMoveStart\",\n MOVE: \"sideMove\",\n MOVE_END: \"sideMoveEnd\",\n WILL_CHANGE: \"sideWillChange\",\n CHANGED: \"sideChanged\",\n WILL_RESTORE: \"sideWillRestore\",\n RESTORED: \"sideRestored\"\n} as const;\n\nexport type CrossFlickingEvent<T> = { mainIndex: number } & T;\n\nexport interface CrossFlickingEvents extends FlickingEvents {\n [SIDE_EVENTS.HOLD_START]: CrossFlickingEvent<HoldStartEvent>;\n [SIDE_EVENTS.HOLD_END]: CrossFlickingEvent<HoldEndEvent>;\n [SIDE_EVENTS.MOVE_START]: CrossFlickingEvent<MoveStartEvent>;\n [SIDE_EVENTS.MOVE]: CrossFlickingEvent<MoveEvent>;\n [SIDE_EVENTS.MOVE_END]: CrossFlickingEvent<MoveEndEvent>;\n [SIDE_EVENTS.WILL_CHANGE]: CrossFlickingEvent<WillChangeEvent>;\n [SIDE_EVENTS.CHANGED]: CrossFlickingEvent<ChangedEvent>;\n [SIDE_EVENTS.WILL_RESTORE]: CrossFlickingEvent<WillRestoreEvent>;\n [SIDE_EVENTS.RESTORED]: CrossFlickingEvent<RestoredEvent>;\n}\n\nexport interface CrossFlickingOptions extends FlickingOptions {\n sideOptions: Partial<FlickingOptions> | undefined;\n preserveIndex: boolean | undefined;\n disableSlideOnHold: boolean | undefined;\n disableIndexSync: boolean | undefined;\n}\n\nexport interface SideState {\n key: string;\n start: number;\n end: number;\n element: HTMLElement;\n}\n\nexport interface CrossFlickingChangedEvent extends ChangedEvent {\n sideIndex?: number;\n}\n\nexport interface CrossFlickingWillChangeEvent extends WillChangeEvent {\n sideIndex?: number;\n}\n\n/**\n * A preset for cross-directional carousel that combines horizontal and vertical Flicking instances\n * @since 4.12.0\n * @public\n */\nexport class CrossFlicking extends Flicking {\n // Core components\n private _sideFlicking: Flicking[];\n\n // Options\n private _sideOptions: CrossFlickingOptions[\"sideOptions\"];\n private _preserveIndex: CrossFlickingOptions[\"preserveIndex\"];\n private _disableSlideOnHold: CrossFlickingOptions[\"disableSlideOnHold\"];\n private _disableIndexSync: CrossFlickingOptions[\"disableIndexSync\"];\n\n // Internal State\n private _sideState: SideState[];\n private _moveDirection: LiteralUnion<ValueOf<typeof MOVE_DIRECTION>> | null;\n private _originalDragThreshold: number;\n private _nextIndex: number;\n\n // Components\n public get sideFlicking() {\n return this._sideFlicking;\n }\n\n public get sideIndex() {\n return this._sideFlicking.map(i => i.index);\n }\n\n public get sideState() {\n return this._sideState;\n }\n\n // Options Getter\n public get sideOptions() {\n return this._sideOptions;\n }\n\n public get preserveIndex() {\n return this._preserveIndex;\n }\n\n public get disableSlideOnHold() {\n return this._disableSlideOnHold;\n }\n\n public get disableIndexSync() {\n return this._disableIndexSync;\n }\n\n // Options Setter\n public set sideOptions(val: CrossFlickingOptions[\"sideOptions\"]) {\n this._sideOptions = val;\n }\n\n public set preserveIndex(val: CrossFlickingOptions[\"preserveIndex\"]) {\n this._preserveIndex = val;\n }\n\n public set disableSlideOnHold(val: CrossFlickingOptions[\"disableSlideOnHold\"]) {\n this._disableSlideOnHold = val;\n }\n\n public set disableIndexSync(val: CrossFlickingOptions[\"disableIndexSync\"]) {\n this._disableIndexSync = val;\n }\n\n public constructor(root: HTMLElement | string, options: Partial<CrossFlickingOptions>) {\n super(root, options);\n const { sideOptions = {}, preserveIndex = true, disableSlideOnHold = true, disableIndexSync = false } = options;\n\n // Internal states\n this._moveDirection = null;\n this._nextIndex = 0;\n this._originalDragThreshold = this.dragThreshold;\n\n // Bind options\n this._sideOptions = sideOptions;\n this._preserveIndex = preserveIndex;\n this._disableSlideOnHold = disableSlideOnHold;\n this._disableIndexSync = disableIndexSync;\n }\n\n public init(): Promise<void> {\n return super.init().then(() => {\n this._sideState = this._createSideState();\n this._sideFlicking = this._createSideFlicking();\n this._addComponentEvents();\n });\n }\n\n public destroy(): void {\n this._sideFlicking.forEach(flicking => {\n flicking.destroy();\n });\n super.destroy();\n }\n\n private _addComponentEvents(): void {\n this.on(EVENTS.HOLD_START, this._onHorizontalHoldStart);\n this.on(EVENTS.MOVE, this._onHorizontalMove);\n this.on(EVENTS.MOVE_END, this._onHorizontalMoveEnd);\n [EVENTS.CHANGED, EVENTS.WILL_CHANGE].forEach(event => {\n this.on(event, this._addSideIndex);\n });\n\n this._sideFlicking.forEach((flicking, mainIndex) => {\n flicking.on(EVENTS.HOLD_START, this._onSideHoldStart);\n flicking.on(EVENTS.MOVE, this._onSideMove);\n flicking.on(EVENTS.MOVE_END, this._onSideMoveEnd);\n flicking.on(EVENTS.CHANGED, this._onSideChanged);\n\n Object.keys(SIDE_EVENTS).forEach((name: EventKey<FlickingEvents>) => {\n flicking.on(EVENTS[name], event => {\n this.trigger(\n new ComponentEvent(SIDE_EVENTS[name], {\n mainIndex,\n ...event\n })\n );\n });\n });\n });\n }\n\n private _createSideState(): SideState[] {\n const viewportEl = this.element;\n const cameraEl = this.camera.element;\n const panels = toArray(cameraEl.children) as HTMLElement[];\n const isCrossStructure = getDataAttributes(viewportEl, \"data-cross-\").structure;\n let sideState: SideState[] = [];\n\n if (!isCrossStructure) {\n const groupPanels = this._getGroupFromAttribute(panels);\n const groupKeys = Object.keys(groupPanels);\n\n if (groupKeys.length) {\n sideState = this._getSideStateFromGroup(groupPanels);\n this.remove(0, this.panelCount - groupKeys.length);\n } else {\n sideState = this._getSideStateFromPanels(panels);\n }\n\n this._createCrossStructure(sideState);\n } else {\n sideState = this._getSideStateFromCrossStructure(panels);\n }\n\n void this.resize();\n\n return sideState;\n }\n\n private _createCrossStructure(sideState: SideState[]) {\n const sideCamera = document.createElement(\"div\");\n let sidePanels: string = \"\";\n\n sideCamera.classList.add(CLASS.CAMERA);\n sideState.forEach((state, i) => {\n const panel = this.camera.children[i];\n sidePanels += state.element.innerHTML;\n Array.from(panel.attributes).forEach(attribute => panel.removeAttribute(attribute.name));\n });\n\n sideCamera.innerHTML = sidePanels;\n\n sideState.forEach((_, i) => {\n const panel = this.camera.children[i];\n [CLASS.VIEWPORT, CLASS.VERTICAL].forEach(className => {\n if (!panel.classList.contains(className)) {\n panel.classList.add(className);\n }\n });\n panel.innerHTML = sideCamera.outerHTML;\n });\n\n this.element.setAttribute(\"data-cross-structure\", \"true\");\n }\n\n private _getGroupFromAttribute(panels: HTMLElement[]): Record<string, HTMLElement[]> {\n const groupKeys: string[] = [];\n const groupPanels: Record<string, HTMLElement[]> = {};\n\n panels.forEach(panel => {\n const groupKey = getDataAttributes(panel, \"data-cross-\").groupkey;\n if (groupKey && !includes(groupKeys, groupKey)) {\n groupKeys.push(groupKey);\n groupPanels[groupKey] = [panel];\n } else if (groupKey) {\n groupPanels[groupKey].push(panel);\n }\n });\n\n return groupPanels;\n }\n\n private _getSideStateFromGroup(groupPanels: Record<string, HTMLElement[]>): SideState[] {\n return Object.keys(groupPanels).reduce((state: SideState[], key: string) => {\n const start = state.length ? +state[state.length - 1].end + 1 : 0;\n const element = groupPanels[key].reduce((el: HTMLElement, panel: HTMLElement) => {\n el.innerHTML += panel.outerHTML;\n return el;\n }, document.createElement(\"div\"));\n return [\n ...state,\n {\n key,\n start,\n end: start + groupPanels[key].length - 1,\n element: element\n }\n ];\n }, []);\n }\n\n private _getSideStateFromPanels(panels: HTMLElement[]): SideState[] {\n return panels.reduce((state: SideState[], panel: HTMLElement, i: number) => {\n const start = state.length ? +state[state.length - 1].end + 1 : 0;\n return [\n ...state,\n {\n key: i.toString(),\n start,\n end: start + panel.children.length - 1,\n element: panel\n }\n ];\n }, []);\n }\n\n private _getSideStateFromCrossStructure(panels: HTMLElement[]): SideState[] {\n const groupPanels = this._getGroupFromAttribute(panels);\n return this._getSideStateFromGroup(groupPanels);\n }\n\n private _createSideFlicking(): Flicking[] {\n return this.sideState.map((state, i) => {\n return new Flicking(this.camera.children[i], {\n ...this.sideOptions,\n horizontal: false,\n panelsPerView: 1,\n defaultIndex: state.start\n });\n });\n }\n\n private _syncToCategory = (index: number, outerIndex: number): void => {\n if (this._disableIndexSync) {\n return;\n }\n\n this.stopAnimation();\n this._sideFlicking.forEach((child, i) => {\n const { start, end } = this._sideState[i];\n\n if (start <= index && end >= index && outerIndex !== i) {\n child.stopAnimation();\n void child.moveTo(index, 0);\n void this.moveTo(i, 0);\n }\n });\n };\n\n private _setDraggable = (direction: ValueOf<typeof MOVE_DIRECTION>, draggable: boolean): void => {\n if (!this._disableSlideOnHold) {\n return;\n }\n\n const dragThreshold = this._originalDragThreshold;\n const threshold = draggable ? (dragThreshold && dragThreshold >= 10 ? dragThreshold : 10) : Infinity;\n\n if ((direction === MOVE_DIRECTION.HORIZONTAL) === this.horizontal) {\n this.dragThreshold = threshold;\n } else if ((direction === MOVE_DIRECTION.VERTICAL) === this.horizontal) {\n this._sideFlicking.forEach(child => {\n child.dragThreshold = threshold;\n });\n }\n };\n\n private _setPreviousSideIndex = () => {\n this._sideFlicking.forEach((child, i) => {\n const { start, end } = this._sideState[i];\n\n if (this._preserveIndex) {\n if (this._nextIndex !== i) {\n if (child.index < start) {\n child.stopAnimation();\n void child.moveTo(start, 0);\n } else if (child.index > end) {\n child.stopAnimation();\n void child.moveTo(end, 0);\n }\n }\n } else {\n if (this._nextIndex !== i) {\n void child.moveTo(start, 0);\n }\n }\n });\n };\n\n private _addSideIndex = (e: ChangedEvent | WillChangeEvent): void => {\n (e as CrossFlickingChangedEvent | CrossFlickingWillChangeEvent).sideIndex = this._sideFlicking[e.index].index;\n };\n\n private _onHorizontalHoldStart = (): void => {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, true);\n this._moveDirection = null;\n };\n\n private _onHorizontalMove = (e: MoveEvent): void => {\n if (e.isTrusted && !this._moveDirection) {\n this._setDraggable(MOVE_DIRECTION.VERTICAL, false);\n this._moveDirection = MOVE_DIRECTION.HORIZONTAL;\n }\n };\n\n private _onHorizontalMoveEnd = (e: MoveEndEvent): void => {\n const visiblePanels = this.visiblePanels;\n\n if (visiblePanels.length > 1) {\n this._nextIndex = e.direction === \"NEXT\" ? visiblePanels[1].index : visiblePanels[0].index;\n } else {\n this._nextIndex = visiblePanels[0].index;\n }\n\n this._setDraggable(MOVE_DIRECTION.VERTICAL, true);\n this._moveDirection = null;\n\n // _syncToCategory에서 완전히 가로 이동이 이루어지기 전에 세로 방향 index가 변하는 경우가 있어 requestAnimationFrame 처리\n requestAnimationFrame(() => this._setPreviousSideIndex());\n\n if (e.isTrusted) {\n this._syncToCategory(this._sideFlicking[this._nextIndex].index, this._nextIndex);\n }\n };\n\n private _onSideHoldStart = (): void => {\n this._setDraggable(MOVE_DIRECTION.VERTICAL, true);\n this._moveDirection = null;\n };\n\n private _onSideMove = (e: MoveEvent): void => {\n if (e.isTrusted && !this._moveDirection) {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, false);\n this._moveDirection = MOVE_DIRECTION.VERTICAL;\n }\n };\n\n private _onSideMoveEnd = (): void => {\n this._setDraggable(MOVE_DIRECTION.HORIZONTAL, true);\n this._moveDirection = null;\n };\n\n private _onSideChanged = (e: ChangedEvent): void => {\n // If this.visiblePanels.length >= 2, it means that horizontal flicking is being dragged.\n // In this case, syncToCategory in _onHorizontalMoveEnd will fire after moving finishes, so we don't fire it here.\n if (this.visiblePanels.length < 2 && this._sideFlicking[this.index] === e.currentTarget) {\n this._syncToCategory(e.index, this.index);\n }\n };\n}\n","import { ALIGN } from \"../constants/values\";\nimport { FlickingOptions } from \"../Flicking\";\nimport { parseArithmeticExpression } from \"../utils\";\n\nexport default (\n align: FlickingOptions[\"align\"] = ALIGN.CENTER,\n horizontal: boolean = true,\n firstPanelSize?: string\n) => {\n const cameraAlign = getCameraAlign(align);\n const panelAlign = getPanelAlign(align);\n\n if (panelAlign == null) return \"\";\n\n const camPosition = `calc(${cameraAlign} - (${firstPanelSize || \"0px\"} * ${panelAlign.percentage}) - ${panelAlign.absolute}px)`;\n\n return horizontal ? `translate(${camPosition})` : `translate(0, ${camPosition})`;\n};\n\nconst getCameraAlign = (align: FlickingOptions[\"align\"]) => {\n const alignVal = typeof align === \"object\" ? (align as { camera: string | number }).camera : align;\n\n return parseAlign(alignVal);\n};\n\nconst getPanelAlign = (align: FlickingOptions[\"align\"]) => {\n const alignVal = typeof align === \"object\" ? (align as { panel: string | number }).panel : align;\n\n return parseArithmeticExpression(parseAlign(alignVal));\n};\n\nconst parseAlign = (alignVal: number | string) => {\n if (typeof alignVal === \"number\") {\n return `${alignVal}px`;\n }\n\n switch (alignVal) {\n case ALIGN.CENTER:\n return \"50%\";\n case ALIGN.NEXT:\n return \"100%\";\n case ALIGN.PREV:\n return \"0%\";\n default:\n return alignVal;\n }\n};\n","import { DiffResult } from \"@egjs/list-differ\";\n\nimport Flicking from \"../Flicking\";\n\nexport default <T>(flicking: Flicking, diffResult: DiffResult<T>) => {\n const removedPanels = diffResult.removed.reduce((map, idx) => {\n map[idx] = true;\n return map;\n }, {});\n\n const maintainedMap = diffResult.maintained.reduce((map, [prev, current]) => {\n map[prev] = current;\n return map;\n }, {});\n const renderingPanels = flicking.panels.filter(panel => !removedPanels[panel.index]);\n\n if (!flicking.useCSSOrder) {\n // useCSSOrder를 사용하게 되는 경우 sort를 하지 않는다.\n renderingPanels.sort((panel1, panel2) => panel1.position + panel1.offset - (panel2.position + panel2.offset));\n }\n\n return [\n ...renderingPanels.map(panel => diffResult.list[maintainedMap[panel.index]]),\n ...diffResult.added.map(idx => diffResult.list[idx])\n ];\n};\n","import { DiffResult } from \"@egjs/list-differ\";\nimport Panel from \"../core/panel/Panel\";\nimport Flicking from \"../Flicking\";\nimport Renderer from \"../renderer/Renderer\";\n\nexport default (flicking: Flicking, diffResult: DiffResult<any>, rendered: any[]) => {\n const renderer = flicking.renderer;\n const panels = renderer.panels;\n const prevList = [...diffResult.prevList];\n\n const added: Panel[] = [];\n const removed: Panel[] = [];\n\n if (diffResult.removed.length > 0) {\n let endIdx = -1;\n let prevIdx = -1;\n\n diffResult.removed.forEach(removedIdx => {\n if (endIdx < 0) {\n endIdx = removedIdx;\n }\n\n if (prevIdx >= 0 && removedIdx !== prevIdx - 1) {\n removed.push(...batchRemove(renderer, prevIdx, endIdx + 1));\n\n endIdx = removedIdx;\n prevIdx = removedIdx;\n } else {\n prevIdx = removedIdx;\n }\n\n prevList.splice(removedIdx, 1);\n });\n\n removed.push(...batchRemove(renderer, prevIdx, endIdx + 1));\n }\n\n diffResult.ordered.forEach(([from, to]) => {\n const prevPanel = panels.splice(from, 1)[0];\n panels.splice(to, 0, prevPanel);\n });\n\n if (diffResult.ordered.length > 0) {\n panels.forEach((panel, idx) => {\n const indexDiff = idx - panel.index;\n\n if (indexDiff > 0) {\n panel.increaseIndex(indexDiff);\n } else {\n panel.decreaseIndex(-indexDiff);\n }\n });\n\n panels.sort((panel1, panel2) => panel1.index - panel2.index);\n\n panels.forEach(panel => {\n panel.updatePosition();\n });\n }\n\n if (diffResult.added.length > 0) {\n let startIdx = -1;\n let prevIdx = -1;\n\n const addedElements = rendered.slice(prevList.length);\n\n diffResult.added.forEach((addedIdx, idx) => {\n if (startIdx < 0) {\n startIdx = idx;\n }\n\n if (prevIdx >= 0 && addedIdx !== prevIdx + 1) {\n added.push(...batchInsert(renderer, diffResult, addedElements, startIdx, idx + 1));\n\n startIdx = -1;\n prevIdx = -1;\n } else {\n prevIdx = addedIdx;\n }\n });\n\n if (startIdx >= 0) {\n added.push(...batchInsert(renderer, diffResult, addedElements, startIdx));\n }\n }\n\n if (diffResult.added.length > 0 || diffResult.removed.length > 0) {\n renderer.updateAfterPanelChange(added, removed);\n } else if (diffResult.ordered.length > 0) {\n const camera = flicking.camera;\n // 순서 변경으로 인한 index 변경 및 range 값 변경\n camera.updateRange();\n // index 변경으로 인한 카메라 위치 즉시 변경\n camera.updateOffset();\n // 순서 변경으로 인한 anchors 전부 업데이트\n camera.updateAnchors();\n // need panel 여부 재확인 필요\n camera.resetNeedPanelHistory();\n }\n};\n\nconst batchInsert = (\n renderer: Renderer,\n diffResult: DiffResult<any>,\n addedElements: any[],\n startIdx: number,\n endIdx?: number\n) => {\n return renderer.batchInsertDefer(\n ...diffResult.added\n .slice(startIdx, endIdx)\n .map((index, elIdx) => ({ index, elements: [addedElements[elIdx]], hasDOMInElements: false }))\n );\n};\n\nconst batchRemove = (renderer: Renderer, startIdx: number, endIdx?: number) => {\n const removed = renderer.panels.slice(startIdx, endIdx);\n\n return renderer.batchRemoveDefer({ index: startIdx, deleteCount: removed.length, hasDOMInElements: false });\n};\n","import Component from \"@egjs/component\";\n\nimport Flicking from \"../Flicking\";\n\n/**\n * Decorator that makes the method of flicking available in the framework.\n * @internal\n * @example\n * ```js\n * import Flicking, { withFlickingMethods } from \"@egjs/flicking\";\n *\n * class Flicking extends React.Component<Partial<FlickingProps & FlickingOptions>> {\n * @withFlickingMethods\n * private flicking: Flicking;\n * }\n * ```\n */\nconst withFlickingMethods = (prototype: any, flickingName: string) => {\n [Component.prototype, Flicking.prototype].forEach(proto => {\n Object.getOwnPropertyNames(proto)\n .filter(name => !prototype[name] && name.indexOf(\"_\") !== 0 && name !== \"constructor\")\n .forEach((name: string) => {\n const descriptor = Object.getOwnPropertyDescriptor(proto, name)!;\n\n if (descriptor.value) {\n // Public Function\n Object.defineProperty(prototype, name, {\n value: function (...args) {\n return descriptor.value.call(this[flickingName], ...args);\n }\n });\n } else {\n const getterDescriptor: { get?: () => any; set?: (val: any) => void } = {};\n if (descriptor.get) {\n getterDescriptor.get = function () {\n const flicking = this[flickingName];\n return flicking && descriptor.get?.call(flicking);\n };\n }\n if (descriptor.set) {\n getterDescriptor.set = function (...args) {\n return descriptor.set?.call(this[flickingName], ...args);\n };\n }\n\n Object.defineProperty(prototype, name, getterDescriptor);\n }\n });\n });\n};\n\nexport default withFlickingMethods;\n","/*\nCopyright (c) 2022-present NAVER Corp.\nname: @cfcs/core\nlicense: MIT\nauthor: NAVER Crop.\nrepository: https://github.com/naver/cfcs/tree/main/packages/core\nversion: 0.1.0\n*/\nimport Component from '@egjs/component';\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\n/**\n * @hidden\n */\nfunction keys(obj) {\n return Object.keys(obj);\n}\n/**\n * @hidden\n */\n\nfunction camelize(str) {\n return str.replace(/[\\s-_]([a-z])/g, function (all, letter) {\n return letter.toUpperCase();\n });\n}\n/**\n * @hidden\n */\n\nfunction isString(val) {\n return typeof val === \"string\";\n}\n/**\n * @hidden\n */\n\nfunction isObject(val) {\n return typeof val === \"object\";\n}\n/**\n * @hidden\n */\n\nfunction isFunction(val) {\n return typeof val === \"function\";\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction findTarget(target) {\n var el;\n\n if (!target) {\n return null;\n }\n\n if (isString(target)) {\n el = document.querySelector(target);\n } else if (target instanceof Element) {\n el = target;\n } else if (\"value\" in target || \"current\" in target) {\n el = target.value || target.current;\n }\n\n return el;\n}\n/**\n * @description Sets the name of the class method to be exposed to the outside.\n * @category DOM\n * @return Property Decorator\n * @example\n * ```ts\n * import { withClassMethods } from \"@cfcs/core\";\n *\n * class YourFrameworkComponent {\n * @withClassMethod(METHOD_NAMES)\n * inst = new YourComponent();\n * }\n * ```\n */\n\nfunction withClassMethods(methods) {\n return function (prototype, memberName) {\n methods.forEach(function (name) {\n if (name in prototype) {\n return;\n }\n\n prototype[name] = function () {\n var _a;\n\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var result = (_a = this[memberName])[name].apply(_a, args); // fix `this` type to return your own `class` instance to the instance using the decorator.\n\n\n if (result === this[memberName]) {\n return this;\n } else {\n return result;\n }\n };\n });\n };\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\nvar OBSERVERS_PATH = \"__observers__\";\nvar COMPUTED_PATH = \"__computed__\";\nvar CFCS_DETECTED_DEPENDENCIES_VERSION = 1;\nvar CFCS_DETECTED_DEPENDENCIES = \"__CFCS_DETECTED_DEPENDENCIES__\";\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\n\n/* global Reflect, Promise */\nvar extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n };\n\n return extendStatics(d, b);\n};\n\nfunction __extends(d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nfunction __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\nfunction getDetectedStack() {\n // Version issues do not occur when you access the native object in the global.\n Object[CFCS_DETECTED_DEPENDENCIES] = Object[CFCS_DETECTED_DEPENDENCIES] || {};\n var versionList = Object[CFCS_DETECTED_DEPENDENCIES];\n versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] = versionList[CFCS_DETECTED_DEPENDENCIES_VERSION] || [];\n return versionList[CFCS_DETECTED_DEPENDENCIES_VERSION];\n}\nfunction getCurrentDetected() {\n var stack = getDetectedStack();\n return stack[stack.length - 1];\n}\nfunction detectDependencies(host) {\n var stack = getDetectedStack();\n var observers = [];\n var detected = {\n host: host,\n observers: observers,\n push: function (observer) {\n if (host !== observer && observers.indexOf(observer) === -1) {\n observers.push(observer);\n }\n }\n };\n stack.push(detected);\n return detected;\n}\nfunction endDetectDependencies() {\n var stack = getDetectedStack();\n return stack.pop();\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * Creates a mutable ref object. You can access the `.current` value and detect the value change through `.subscribe`.\n * @category Reactive\n * @see observe\n */\n\nvar Observer =\n/*#__PURE__*/\nfunction () {\n /**\n *\n */\n function Observer(value) {\n this._emitter = new Component();\n this._current = value;\n }\n\n var __proto = Observer.prototype;\n Object.defineProperty(__proto, \"current\", {\n /**\n * return the current value.\n */\n get: function () {\n var currentDetected = getCurrentDetected();\n currentDetected === null || currentDetected === void 0 ? void 0 : currentDetected.push(this);\n return this._current;\n },\n set: function (value) {\n this._setCurrent(value);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * When the current value changes, the callback function is called.\n */\n\n __proto.subscribe = function (callback) {\n this.current;\n\n this._emitter.on(\"update\", callback);\n\n return this;\n };\n /**\n * Cancel the registered subscription through callback.\n */\n\n\n __proto.unsubscribe = function (callback) {\n this._emitter.off(\"update\", callback);\n\n return this;\n };\n\n __proto._setCurrent = function (value) {\n var prevValue = this._current;\n var isUpdate = value !== prevValue;\n this._current = value;\n\n if (isUpdate) {\n this._emitter.trigger(\"update\", value, prevValue);\n }\n };\n /**\n * @hidden\n */\n\n\n __proto.toString = function () {\n return \"\".concat(this.current);\n };\n /**\n * @hidden\n */\n\n\n __proto.valueOf = function () {\n return this.current;\n };\n\n return Observer;\n}();\n\n/**\n * @category Reactive\n * @hidden\n */\n\nvar ComputedObserver =\n/*#__PURE__*/\nfunction (_super) {\n __extends(ComputedObserver, _super);\n /**\n * @description Creates a new computed observer from the values of other observers.\n * It is read-only and if you change the value of the observer used inside the callback, its value will be automatically updated.\n * @param _computedCallback A function for observers to be computed.\n */\n\n\n function ComputedObserver(_computedCallback) {\n var _this = _super.call(this) || this;\n\n _this._computedCallback = _computedCallback;\n _this._registered = [];\n\n _this._onCheckUpdate = function () {\n _this._setCurrent(_this.current);\n };\n\n _this._current = _this.current;\n return _this;\n }\n\n var __proto = ComputedObserver.prototype;\n Object.defineProperty(__proto, \"current\", {\n get: function () {\n var _this = this;\n\n detectDependencies(this);\n\n var value = this._computedCallback();\n\n var results = endDetectDependencies();\n\n this._registered.forEach(function (observer) {\n observer.unsubscribe(_this._onCheckUpdate);\n });\n\n results.observers.forEach(function (observer) {\n observer.subscribe(_this._onCheckUpdate);\n });\n this._registered = results.observers;\n return value;\n },\n enumerable: false,\n configurable: true\n });\n return ComputedObserver;\n}(Observer);\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\nfunction injectObserve(prototype, memberName, publicName) {\n if (publicName === void 0) {\n publicName = memberName;\n }\n\n var nextAttributes = {\n configurable: true,\n get: function () {\n return getObserver(this, publicName).current;\n },\n set: function (value) {\n getObserver(this, publicName, value).current = value;\n }\n };\n Object.defineProperty(prototype, memberName, nextAttributes);\n\n if (publicName !== memberName) {\n Object.defineProperty(prototype, publicName, {\n configurable: true,\n get: function () {\n return getObserver(this, publicName).current;\n }\n });\n }\n}\n/**\n * @description `Observe` is a property decorator and converts the property into a `reactive state`. You can detect its status through `.subscribe`.\n * @category Reactive-Decorator\n * @see ReactiveSubscribe\n * @example\n* ```ts\nimport { ReactiveSubscribe, Observe } from \"@cfcs/core\";\n\n@ReactiveSubscribe\nclass Component {\n // The public name and state name are the same.\n @Observe value1 = 1;\n // If you want to set public name and private properties separately\n @Observe(\"value2\") _value2 = 1;\n\n constructor() {\n requestAnimationFrame(() => {\n this.value1 = 2;\n });\n }\n}\ninterface C\n```\n */\n\n\nfunction Observe() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n if (args.length > 1) {\n return injectObserve(args[0], args[1]);\n }\n\n return function (prototype, memberName) {\n return injectObserve(prototype, memberName, args[0]);\n };\n}\n/**\n * @hidden\n */\n\nfunction Reactive() {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n return Observe.apply(void 0, args);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction injectReactiveSubscribe(object) {\n object[\"subscribe\"] = function (name, callback) {\n this[name];\n getObserver(this, name).subscribe(callback);\n };\n\n object[\"unsubscribe\"] = function (name, callback) {\n var _this = this;\n\n if (!name) {\n keys(getObservers(this)).forEach(function (observerName) {\n _this.unsubscribe(observerName);\n });\n return;\n }\n\n if (!(name in this)) {\n return;\n }\n\n getObserver(this, name).unsubscribe(callback);\n };\n}\n/**\n * @description `ReactiveSubscribe` is a class decorator and adds `.subscribe` and `.unsubscribe` methods.\n * @category Reactive-Decorator\n * @see Observe\n * @example\n * ```ts\nimport { ReactiveSubscribe, Observe } from \"@cfcs/core\";\n\n@ReactiveSubscribe\nclass Component {\n @Observe value1 = 1;\n\n constructor() {\n requestAnimationFrame(() => {\n this.value1 = 2;\n });\n }\n}\n\ninterface Component extends ReactiveSubscribe<{\n value1: number;\n value2: number;\n}> {}\n\nconst component = new Component();\n\n// 1\nconsole.log(component.value1);\n\ncomponent.subscribe(\"value1\", nextValue => {\n // When the change event occurs => (2, 2)\n console.log(nextValue, component.value2);\n});\n```\n */\n\nfunction ReactiveSubscribe(Constructor) {\n var prototype = Constructor.prototype;\n injectReactiveSubscribe(prototype);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n\nfunction makeReactiveObject(setup, all) {\n var result = isFunction(setup) ? setup() : setup;\n var reactiveObject = {};\n defineObservers(reactiveObject);\n keys(result).forEach(function (name) {\n var value = result[name];\n\n if (isObserver(value)) {\n setObserver(reactiveObject, name, value);\n } else {\n setObserver(reactiveObject, name, observe(value));\n }\n\n Observe(name)(reactiveObject, name);\n });\n injectReactiveSubscribe(reactiveObject);\n return reactiveObject;\n}\n/**\n * @description Make the return value of the corresponding object or function a reactive object.\n * @category Reactive\n * @param setup - The target object or function to which reactive is applied\n * @returns Makes all values into reactive objects.\n * @example\n * ```ts\n * import { reactive } from \"@cfcs/core\";\n *\n * const obj = reactive({\n * value1: 1,\n * value2: 2,\n * });\n *\n * obj.subscribe(\"value1\", value1 => {\n * console.log(value1);\n * });\n * obj.value1 = 2;\n * ```\n */\n\n\nfunction reactive(setup) {\n return makeReactiveObject(setup);\n}\n/**\n * @description Make the return value of the corresponding object or function a reactive object.\n * @category Reactive\n * @param setup - The target object or function to which reactive is applied\n * @returns Only the values to which observer is applied are objects to which reactive is applied.\n * @example\n * ```ts\n * import { partialReactive, observe } from \"@cfcs/core\";\n *\n * const value1 = observe(1);\n * const value2 = observe(2);\n * const obj = partialReactive({\n * value1,\n * value2,\n * });\n *\n * obj.subscribe(\"value1\", value1 => {\n * console.log(value1);\n * });\n * value1.current = 2;\n * ```\n */\n\nfunction partialReactive(setup) {\n return makeReactiveObject(setup);\n}\n/**\n * @description Creates a mutable ref object. You can access the `.current` value and detect the value change through `.subscribe`.\n * @category Reactive\n * @example\n * ```ts\n * import { observe } from \"@cfcs/core\";\n *\n * const ob1 = observe(1);\n *\n * ob1.subscribe(nextValue => {\n * console.log(nextValue);\n * });\n *\n * ob1.current = 2;\n * ```\n */\n\nfunction observe(defaultValue) {\n return new Observer(defaultValue);\n}\n/**\n * @hidden\n */\n\nfunction computed(computedCallback) {\n return new ComputedObserver(computedCallback);\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @hidden\n */\n\nfunction withReactiveMethods(ref, methods) {\n var obj = {};\n\n if (!methods) {\n return obj;\n }\n\n methods.forEach(function (name) {\n obj[name] = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var current = ref.current || ref.value;\n return current[name].apply(current, args);\n };\n });\n return obj;\n}\n/**\n * @hidden\n */\n\nfunction defineObservers(instance) {\n var observers = {};\n Object.defineProperty(instance, OBSERVERS_PATH, {\n get: function () {\n return observers;\n }\n });\n return observers;\n}\n/**\n * @hidden\n */\n\nfunction getObservers(instance, isComputed) {\n var _a, _b;\n\n if (!instance[OBSERVERS_PATH]) {\n defineObservers(instance);\n }\n\n var observers = instance[OBSERVERS_PATH];\n\n if (!isComputed) {\n var computedList = (_b = (_a = instance === null || instance === void 0 ? void 0 : instance.constructor) === null || _a === void 0 ? void 0 : _a.prototype) === null || _b === void 0 ? void 0 : _b[COMPUTED_PATH];\n\n if (computedList) {\n computedList.forEach(function (name) {\n if (!(name in observers) && name in instance) {\n instance[name];\n }\n });\n }\n }\n\n return observers;\n}\n/**\n * @hidden\n */\n\nfunction getObserver(instance, name, defaultValue) {\n var observers = getObservers(instance);\n\n if (!observers[name]) {\n observers[name] = observe(defaultValue);\n }\n\n return observers[name];\n}\n/**\n * @hidden\n */\n\nfunction setObserver(instance, name, observer) {\n var observers = getObservers(instance);\n observers[name] = observer;\n}\n/**\n * @description Whether that object is an observer instance\n * @category Reactive\n */\n\nfunction isObserver(val) {\n return val && isObject(val) && \"current\" in val && \"subscribe\" in val && \"unsubscribe\" in val;\n}\n/**\n * @description Whether the object is reactive\n * @category Reactive\n */\n\nfunction isReactive(val) {\n return val && !isObserver(val) && \"subscribe\" in val && \"unsubscribe\" in val;\n}\n\n/**\n * @category Reactive\n * @hidden\n */\n\nfunction adaptReactive(adapter, props) {\n var objectAdapter = isFunction(adapter) ? {\n setup: adapter\n } : adapter;\n\n function getProps() {\n var _a, _b, _c, _d, _e;\n\n return (_e = (_c = (_a = props === null || props === void 0 ? void 0 : props()) !== null && _a !== void 0 ? _a : (_b = objectAdapter.props) === null || _b === void 0 ? void 0 : _b.call(objectAdapter)) !== null && _c !== void 0 ? _c : (_d = objectAdapter.data) === null || _d === void 0 ? void 0 : _d.call(objectAdapter)) !== null && _e !== void 0 ? _e : {};\n }\n\n var eventEmitter = new Component();\n var mountedHooks = [];\n var initHooks = [];\n var destroyHooks = [];\n var onHooks = [];\n var instanceRef = {\n current: null\n };\n var offHooksList = [];\n var initialState = null;\n var eventNames = [];\n var methodNames = [];\n\n var onMounted = function (callback) {\n mountedHooks.push(callback);\n };\n\n var onInit = function (callback) {\n initHooks.push(callback);\n };\n\n var onDestroy = function (callback) {\n destroyHooks.push(callback);\n };\n\n var on = function (callback) {\n onHooks.push(callback);\n };\n\n var emit = function (eventName) {\n var params = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n params[_i - 1] = arguments[_i];\n }\n\n eventEmitter.trigger.apply(eventEmitter, __spreadArray([eventName], params, false));\n };\n\n var setInitialState = function (state) {\n initialState = state;\n };\n\n var setEvents = function (events) {\n eventNames = events;\n };\n\n var setMethods = function (methods) {\n methodNames = methods;\n };\n\n if (objectAdapter.setup) {\n instanceRef.current = objectAdapter.setup({\n getProps: getProps,\n setInitialState: setInitialState,\n setEvents: setEvents,\n setMethods: setMethods,\n onMounted: onMounted,\n onDestroy: onDestroy,\n onInit: onInit,\n emit: emit,\n on: on\n }) || null;\n }\n\n if (objectAdapter.created) {\n instanceRef.current = objectAdapter.created(getProps()) || null;\n }\n\n if (objectAdapter.events) {\n setEvents(objectAdapter.events);\n }\n\n if (objectAdapter.state) {\n setInitialState(objectAdapter.state);\n }\n\n if (objectAdapter.methods) {\n setMethods(objectAdapter.methods);\n }\n\n if (objectAdapter.mounted) {\n onMounted(objectAdapter.mounted);\n }\n\n if (objectAdapter.destroy) {\n destroyHooks.push(objectAdapter.destroy);\n }\n\n if (objectAdapter.init) {\n initHooks.push(objectAdapter.init);\n }\n\n if (objectAdapter.on) {\n onHooks.push(function (instance, eventName, listener) {\n var off = objectAdapter.on(instance, eventName, listener);\n return function () {\n var _a;\n\n off && off();\n (_a = objectAdapter.off) === null || _a === void 0 ? void 0 : _a.call(objectAdapter, instance, eventName, listener);\n };\n });\n }\n\n return {\n events: function () {\n return eventNames;\n },\n state: function () {\n var inst = instanceRef.current;\n\n if (initialState) {\n return initialState;\n }\n\n if (inst) {\n var observers_1 = getObservers(inst);\n setInitialState(keys(observers_1).reduce(function (prev, cur) {\n prev[cur] = observers_1[cur].current;\n return prev;\n }, {}));\n }\n\n return initialState || {};\n },\n instance: function () {\n return instanceRef.current;\n },\n mounted: function () {\n var props = getProps();\n mountedHooks.forEach(function (hook) {\n instanceRef.current = hook(props, instanceRef.current) || instanceRef.current;\n });\n },\n init: function () {\n // on events\n var instance = instanceRef.current;\n var props = getProps();\n offHooksList = eventNames.map(function (eventName) {\n var listener = function () {\n var _a;\n\n var params = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n\n (_a = eventEmitter).trigger.apply(_a, __spreadArray([eventName], params, false));\n };\n\n var instance = instanceRef.current;\n return onHooks.map(function (hook) {\n return hook(instance, eventName, listener);\n }).filter(Boolean);\n }); // init\n\n initHooks.forEach(function (hook) {\n hook(instance, props);\n });\n },\n destroy: function () {\n // off events\n offHooksList.forEach(function (offHooks) {\n offHooks.forEach(function (hook) {\n hook();\n });\n }); // destroy\n\n eventEmitter.off();\n var instance = instanceRef.current;\n var props = getProps();\n destroyHooks.forEach(function (hook) {\n hook(instance, props);\n });\n },\n methods: function () {\n return withReactiveMethods(instanceRef, methodNames);\n },\n on: function (eventName, listener) {\n eventEmitter.on(eventName, listener);\n },\n off: function (eventName, listener) {\n eventEmitter.off(eventName, listener);\n }\n };\n}\n\n/**\n * cfcs\n * Copyright (c) 2022-present NAVER Corp.\n * MIT license\n */\n/**\n * @description `Computed` is a property decorator.\n * Changes in computed state values are also recognized according to changes in observers used within the getter function.\n * You can detect its status through `.subscribe`.\n * @hidden\n * @category Reactive-Decorator\n * @see ReactiveSubscribe\n * @example\n * ```ts\nconst ob1 = observe(0);\nconst ob2 = observe(1);\n\n// When\n@ReactiveSubscribe\nclass TestComputed {\n @Computed\n get ob3() {\n return ob1.current + ob2.current;\n }\n}\nconst inst = new TestComputed();\n\ninst.subscribe(\"ob3\", ob3 => {\n console.log(ob3);\n});\n\nob1.current = 1;\n```\n */\n\nfunction Computed(prototype, memberName, attributes) {\n var get = attributes.get;\n\n function getComputed() {\n var observers = getObservers(this, true);\n\n if (!(memberName in observers)) {\n observers[memberName] = computed(get.bind(this));\n }\n\n return getObserver(this, memberName).current;\n }\n\n var nextAttributes = {\n configurable: true,\n get: getComputed\n };\n prototype[COMPUTED_PATH] || (prototype[COMPUTED_PATH] = []);\n var computedList = prototype[COMPUTED_PATH];\n\n if (computedList.indexOf(memberName) === -1) {\n computedList.push(memberName);\n }\n\n Object.defineProperty(prototype, memberName, nextAttributes);\n return nextAttributes;\n}\n\nexport { Computed, ComputedObserver, Observe, Observer, Reactive, ReactiveSubscribe, adaptReactive, camelize, computed, defineObservers, findTarget, getObserver, getObservers, injectReactiveSubscribe, isFunction, isObject, isObserver, isReactive, isString, keys, observe, partialReactive, reactive, setObserver, withClassMethods, withReactiveMethods };\n//# sourceMappingURL=cfcs.esm.js.map\n","import { adaptReactive, ReactiveObject, ReactiveSetupAdapter, reactive } from \"@cfcs/core\";\n\nimport Flicking from \"../Flicking\";\n\n// Check if Flicking has reached the first panel\nconst getIsReachStart = (flicking: Flicking) => !flicking.circular && flicking.index === 0;\n\n// Check if Flicking has reached the last panel\nconst getIsReachEnd = (flicking: Flicking) => !flicking.circular && flicking.index === flicking.panelCount - 1;\n\n// Get the total number of panels\nconst getTotalPanelCount = (flicking: Flicking) => flicking.panelCount;\n\n// Get the current active panel index\nconst getCurrentPanelIndex = (flicking: Flicking) => flicking.index;\n\n// Calculate the overall scroll progress percentage based on the current camera position\nconst getProgress = (flicking: Flicking) => {\n const cam = flicking.camera;\n\n const progressRatio = (cam.position - cam.range.min) / (cam.range.max - cam.range.min);\n\n const percent = Math.min(Math.max(progressRatio, 0), 1) * 100;\n\n return percent;\n};\n\n// Calculate the progress between panels including decimal values\nconst getIndexProgress = (flicking: Flicking) => {\n const cam = flicking.camera;\n const anchorPoints = cam.anchorPoints;\n const length = anchorPoints.length;\n const cameraPosition = cam.position;\n const isCircular = flicking.circularEnabled;\n let indexProgress = 0;\n\n const { min, max } = cam.range;\n const firstAnchorPoint = anchorPoints[0];\n const lastAnchorPoint = anchorPoints[length - 1];\n const distanceLastToFirst = max - lastAnchorPoint.position + (firstAnchorPoint.position - min);\n\n anchorPoints.some((anchorPoint, index) => {\n const anchorPosition = anchorPoint.position;\n const nextAnchorPoint = anchorPoints[index + 1];\n\n if (index === 0 && cameraPosition <= anchorPosition) {\n if (isCircular) {\n indexProgress = (cameraPosition - anchorPosition) / distanceLastToFirst;\n } else {\n indexProgress = (cameraPosition - anchorPosition) / anchorPoint.panel.size;\n }\n } else if (index === length - 1 && cameraPosition >= anchorPosition) {\n if (isCircular) {\n indexProgress = index + (cameraPosition - anchorPosition) / distanceLastToFirst;\n } else {\n indexProgress = index + (cameraPosition - anchorPosition) / anchorPoint.panel.size;\n }\n } else if (nextAnchorPoint && anchorPosition <= cameraPosition && cameraPosition <= nextAnchorPoint.position) {\n indexProgress = index + (cameraPosition - anchorPosition) / (nextAnchorPoint.position - anchorPosition);\n } else {\n return false;\n }\n return true;\n });\n\n return indexProgress;\n};\n\n/**\n * Reactive object type that combines state and methods for Flicking\n * @remarks\n * This type provides reactive state properties and methods that automatically update\n * when the Flicking instance state changes.\n * @see {@link https://naver.github.io/egjs-flicking/Demos#reactive-api-demo}\n * @example\n * ```jsx\n * const flickingRef = React.useRef(null);\n * const {\n * progress\n * } = useFlickingReactiveAPI(flickingRef);\n * ```\n */\nexport type FlickingReactiveObject = ReactiveObject<FlickingReactiveState & FlickingReactiveMethod>;\n\n/**\n * Reactive state properties for Flicking\n */\nexport interface FlickingReactiveState {\n /** Whether Flicking has reached the first panel */\n isReachStart: boolean;\n /** Whether Flicking has reached the last panel */\n isReachEnd: boolean;\n /** Total number of panels */\n totalPanelCount: number;\n /** Current active panel index */\n currentPanelIndex: number;\n /** Overall scroll progress percentage (0-100) */\n progress: number;\n /** Panel progress with decimal values */\n indexProgress: number;\n}\n\n/**\n * Reactive methods for Flicking\n */\nexport interface FlickingReactiveMethod {\n /**\n * Move to a specific panel index\n * @param i - Target panel index\n * @returns Promise that resolves when movement is complete\n */\n moveTo: (i: number) => Promise<void>;\n}\n\n/**\n * Data required for reactive API setup\n */\nexport interface FlickingReactiveData {\n /** Flicking instance to connect */\n flicking?: Flicking;\n /** Flicking options used for initialization */\n options?: FlickingReactiveAPIOptions;\n}\n\n/**\n * Options for Flicking reactive API that help optimize initial rendering in SSR scenarios\n * @remarks\n * These options allow you to set initial state values before the Flicking instance is fully initialized,\n * preventing unnecessary re-renders when the actual Flicking state is applied.\n * @example\n * ```js\n * const options = {\n * defaultIndex: 2,\n * totalPanelCount: 5\n * };\n * const reactiveObj = connectFlickingReactiveAPI(flicking, options);\n * ```\n */\nexport interface FlickingReactiveAPIOptions {\n /**\n * Initial panel index to start with. This sets the currentPanelIndex and indexProgress initial values.\n * @remarks\n * Also affects isReachStart and isReachEnd initial value setting.\n * @defaultValue 0\n */\n defaultIndex?: number;\n /**\n * Total number of panels in the Flicking instance. This sets the totalPanelCount initial value\n * @remarks\n * Helps prevent layout shifts during SSR hydration.\n * @defaultValue 0\n */\n totalPanelCount?: number;\n}\n\n/**\n * Internal reactive API adapter for Flicking that manages state and event listeners\n * @remarks\n * This adapter is used internally by framework-specific packages (react-flicking, vue-flicking, etc.)\n * to provide reactive API support. Users rarely need to use this directly.\n * @param onInit - Callback when reactive object is initialized\n * @param onDestroy - Callback when reactive object is destroyed\n * @param setMethods - Function to set available methods\n * @returns Reactive object with Flicking state and methods\n */\nconst flickingReactiveAPIAdapter: ReactiveSetupAdapter<\n FlickingReactiveObject,\n FlickingReactiveState,\n \"moveTo\",\n FlickingReactiveData\n> = ({ onInit, onDestroy, setMethods, getProps }) => {\n let flicking: Flicking | undefined;\n\n // Move to a specific panel index\n const moveTo = (i: number) => {\n if (flicking == null) {\n return Promise.reject(new Error(\"Flicking instance is not available\"));\n }\n if (flicking?.animating) {\n return Promise.resolve();\n }\n return flicking.moveTo(i);\n };\n setMethods([\"moveTo\"]);\n\n const options = getProps().options;\n\n // options를 고려하지 않고 초기값을 설정해도 동작에는 아무런 문제가 없으나, 이 시점의 초기값과 컴포넌트 init 단계에서의 초기값이 다르면 화면 리렌더링이 발생할 수 있으므로\n // 이렇게 미리 옵션을 통해서 예측할 수 있는 부분들은 맞춰둔다.\n const reactiveObj: FlickingReactiveObject = reactive({\n isReachStart: options?.defaultIndex ? options?.defaultIndex === 0 : true,\n isReachEnd:\n options?.totalPanelCount && options?.defaultIndex ? options.defaultIndex === options.totalPanelCount - 1 : false,\n totalPanelCount: options?.totalPanelCount ?? 0,\n currentPanelIndex: options?.defaultIndex ?? 0,\n progress: 0,\n indexProgress: options?.defaultIndex ?? 0,\n moveTo\n });\n\n // Update state when panel changes\n const onChanged = () => {\n if (flicking === undefined) return;\n\n reactiveObj.isReachStart = getIsReachStart(flicking);\n reactiveObj.isReachEnd = getIsReachEnd(flicking);\n reactiveObj.currentPanelIndex = getCurrentPanelIndex(flicking);\n };\n\n // Update state when panel count changes\n const onPanelChange = () => {\n if (flicking === undefined) return;\n\n onChanged();\n reactiveObj.totalPanelCount = getTotalPanelCount(flicking);\n };\n\n // Update progress when camera moves\n const onMove = () => {\n if (flicking === undefined) return;\n\n reactiveObj.progress = getProgress(flicking);\n reactiveObj.indexProgress = getIndexProgress(flicking);\n };\n\n onInit((inst, data) => {\n flicking = data.flicking;\n if (flicking === undefined) return;\n\n reactiveObj.isReachStart = getIsReachStart(flicking);\n reactiveObj.isReachEnd = getIsReachEnd(flicking);\n reactiveObj.currentPanelIndex = getCurrentPanelIndex(flicking);\n reactiveObj.progress = getProgress(flicking);\n\n reactiveObj.totalPanelCount = getTotalPanelCount(flicking);\n\n flicking?.on(\"changed\", onChanged);\n flicking?.on(\"panelChange\", onPanelChange);\n flicking?.on(\"move\", onMove);\n });\n\n onDestroy(() => {\n flicking?.off(\"changed\", onChanged);\n flicking?.off(\"panelChange\", onPanelChange);\n flicking?.off(\"move\", onMove);\n });\n\n return reactiveObj;\n};\n\n/**\n * Connect Flicking instance to reactive API\n * @param flicking - Flicking instance to connect\n * @param options - Flicking options\n * @returns Reactive object with Flicking state and methods\n * @example\n * ```js\n * import Flicking, { connectFlickingReactiveAPI } from \"@egjs/flicking\";\n *\n * const flicking = new Flicking(\"#el\");\n * const reactiveObj = connectFlickingReactiveAPI(flicking);\n *\n * // Access reactive state\n * console.log(\"Current panel:\", reactiveObj.currentPanelIndex);\n * console.log(\"Progress:\", reactiveObj.progress + \"%\");\n * console.log(\"Is at start:\", reactiveObj.isReachStart);\n * console.log(\"Is at end:\", reactiveObj.isReachEnd);\n * console.log(\"Total panels:\", reactiveObj.totalPanelCount);\n * console.log(\"Index progress:\", reactiveObj.indexProgress);\n *\n * // Subscribe to state changes\n * reactiveObj.subscribe(\"currentPanelIndex\", (nextValue) => {\n * console.log(\"Panel changed to:\", nextValue);\n * });\n *\n * // Use reactive methods\n * reactiveObj.moveTo(2); // Move to third panel\n * ```\n */\nconst connectFlickingReactiveAPI = (\n flicking: Flicking,\n options?: FlickingReactiveAPIOptions\n): FlickingReactiveObject => {\n const obj = adaptReactive(flickingReactiveAPIAdapter, () => ({ flicking, options }));\n obj.mounted();\n const instance = obj.instance();\n obj.init();\n return instance;\n};\n\nexport { flickingReactiveAPIAdapter, connectFlickingReactiveAPI };\n"],"names":["ERROR.MESSAGE","ERROR.CODE","parseAlign","getProgress","range","ComponentEvent","STATE_TYPE","AXES.POSITION_KEY","AXES.EVENT","PanInput","flicking","Observer","props","instance"],"mappings":"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","x_google_ignoreList":[42]}
|