ÿØÿà JFIFÿØÿà JFIF ÿØÿà JFIFÿØÿà JFIF   ÿþ$    File Manager

File Manager

Path: /home/u371470492/domains/theglitzcontest.com/public_html/splide/dist/js/

Melihat File: splide.js.map

{"version":3,"file":"splide.js","sources":["../../src/js/constants/project.ts","../../src/js/constants/states.ts","../../src/js/constants/priority.ts","../../src/js/utils/array/empty/empty.ts","../../src/js/utils/type/type.ts","../../src/js/utils/array/toArray/toArray.ts","../../src/js/utils/array/forEach/forEach.ts","../../src/js/utils/array/includes/includes.ts","../../src/js/utils/array/push/push.ts","../../src/js/utils/array/index.ts","../../src/js/utils/arrayLike/slice/slice.ts","../../src/js/utils/arrayLike/find/find.ts","../../src/js/utils/dom/toggleClass/toggleClass.ts","../../src/js/utils/dom/addClass/addClass.ts","../../src/js/utils/dom/append/append.ts","../../src/js/utils/dom/before/before.ts","../../src/js/utils/dom/matches/matches.ts","../../src/js/utils/dom/children/children.ts","../../src/js/utils/dom/child/child.ts","../../src/js/utils/object/forOwn/forOwn.ts","../../src/js/utils/object/assign/assign.ts","../../src/js/utils/object/merge/merge.ts","../../src/js/utils/dom/removeAttribute/removeAttribute.ts","../../src/js/utils/dom/setAttribute/setAttribute.ts","../../src/js/utils/dom/create/create.ts","../../src/js/utils/dom/style/style.ts","../../src/js/utils/dom/display/display.ts","../../src/js/utils/dom/focus/focus.ts","../../src/js/utils/dom/getAttribute/getAttribute.ts","../../src/js/utils/dom/hasClass/hasClass.ts","../../src/js/utils/dom/rect/rect.ts","../../src/js/utils/dom/remove/remove.ts","../../src/js/utils/dom/measure/measure.ts","../../src/js/utils/dom/parseHtml/parseHtml.ts","../../src/js/utils/dom/prevent/prevent.ts","../../src/js/utils/dom/query/query.ts","../../src/js/utils/dom/queryAll/queryAll.ts","../../src/js/utils/dom/removeClass/removeClass.ts","../../src/js/utils/dom/unit/unit.ts","../../src/js/utils/error/assert/assert.ts","../../src/js/utils/function/nextTick/nextTick.ts","../../src/js/utils/function/noop/noop.ts","../../src/js/utils/function/raf/raf.ts","../../src/js/utils/math/math/math.ts","../../src/js/utils/math/approximatelyEqual/approximatelyEqual.ts","../../src/js/utils/math/between/between.ts","../../src/js/utils/math/clamp/clamp.ts","../../src/js/utils/math/sign/sign.ts","../../src/js/utils/string/format/format.ts","../../src/js/utils/string/pad/pad.ts","../../src/js/utils/string/uniqueId/uniqueId.ts","../../src/js/constructors/EventBus/EventBus.ts","../../src/js/constants/events.ts","../../src/js/constructors/EventInterface/EventInterface.ts","../../src/js/constructors/RequestInterval/RequestInterval.ts","../../src/js/constructors/State/State.ts","../../src/js/constructors/Throttle/Throttle.ts","../../src/js/components/Options/Options.ts","../../src/js/constants/directions.ts","../../src/js/components/Direction/Direction.ts","../../src/js/constants/classes.ts","../../src/js/components/Elements/Elements.ts","../../src/js/constants/attributes.ts","../../src/js/constants/types.ts","../../src/js/components/Slides/Slide.ts","../../src/js/components/Slides/Slides.ts","../../src/js/components/Layout/Layout.ts","../../src/js/components/Clones/Clones.ts","../../src/js/components/Move/Move.ts","../../src/js/components/Controller/Controller.ts","../../src/js/components/Arrows/path.ts","../../src/js/components/Arrows/Arrows.ts","../../src/js/components/Autoplay/Autoplay.ts","../../src/js/components/Cover/Cover.ts","../../src/js/components/Scroll/constants.ts","../../src/js/components/Scroll/Scroll.ts","../../src/js/components/Drag/constants.ts","../../src/js/components/Drag/Drag.ts","../../src/js/components/Keyboard/Keyboard.ts","../../src/js/components/LazyLoad/constants.ts","../../src/js/components/LazyLoad/LazyLoad.ts","../../src/js/components/Pagination/Pagination.ts","../../src/js/components/Sync/Sync.ts","../../src/js/components/Wheel/Wheel.ts","../../src/js/constants/i18n.ts","../../src/js/constants/defaults.ts","../../src/js/transitions/Fade/Fade.ts","../../src/js/transitions/Slide/Slide.ts","../../src/js/core/Splide/Splide.ts"],"sourcesContent":["/**\r\n * The project code.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const PROJECT_CODE = 'splide';\r\n\r\n/**\r\n * The data attribute prefix.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const DATA_ATTRIBUTE = `data-${ PROJECT_CODE }`;\r\n","/**\r\n * Splide has been just created.\r\n */\r\nexport const CREATED = 1;\r\n\r\n/**\r\n * Splide has mounted components.\r\n */\r\nexport const MOUNTED = 2;\r\n\r\n/**\r\n * Splide is ready.\r\n */\r\nexport const IDLE = 3;\r\n\r\n/**\r\n * Splide is moving.\r\n */\r\nexport const MOVING = 4;\r\n\r\n/**\r\n * Splide has been destroyed.\r\n */\r\nexport const DESTROYED = 5;\r\n\r\n/**\r\n * The collection of all states.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const STATES = {\r\n  CREATED,\r\n  MOUNTED,\r\n  IDLE,\r\n  MOVING,\r\n  DESTROYED,\r\n};\r\n","/**\r\n * The default priority for internal handlers.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const DEFAULT_EVENT_PRIORITY = 10;\r\n\r\n/**\r\n * The default priority for users' handlers.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const DEFAULT_USER_EVENT_PRIORITY = 20;\r\n","/**\r\n * Empties the array.\r\n *\r\n * @param array - A array to empty.\r\n */\r\nexport function empty( array: any[] ): void {\r\n  array.length = 0;\r\n}\r\n","/**\r\n * Checks if the given subject is an object or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is an object, or otherwise `false`.\r\n */\r\nexport function isObject( subject: unknown ): subject is object {\r\n  return ! isNull( subject ) && typeof subject === 'object';\r\n}\r\n\r\n/**\r\n * Checks if the given subject is an array or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is an array, or otherwise `false`.\r\n */\r\nexport function isArray<T>( subject: unknown ): subject is T[] {\r\n  return Array.isArray( subject );\r\n}\r\n\r\n/**\r\n * Checks if the given subject is a function or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is a function, or otherwise `false`.\r\n */\r\nexport function isFunction( subject: unknown ): subject is ( ...args: any[] ) => any {\r\n  return typeof subject === 'function';\r\n}\r\n\r\n/**\r\n * Checks if the given subject is a string or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is a string, or otherwise `false`.\r\n */\r\nexport function isString( subject: unknown ): subject is string {\r\n  return typeof subject === 'string';\r\n}\r\n\r\n/**\r\n * Checks if the given subject is `undefined` or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is `undefined`, or otherwise `false`.\r\n */\r\nexport function isUndefined( subject: unknown ): subject is undefined {\r\n  return typeof subject === 'undefined';\r\n}\r\n\r\n/**\r\n * Checks if the given subject is `null` or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is `null`, or otherwise `false`.\r\n */\r\nexport function isNull( subject: unknown ): subject is null {\r\n  return subject === null;\r\n}\r\n\r\n/**\r\n * Checks if the given subject is an HTMLElement or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is an HTMLElement instance, or otherwise `false`.\r\n */\r\nexport function isHTMLElement( subject: unknown ): subject is HTMLElement {\r\n  return subject instanceof HTMLElement;\r\n}\r\n\r\n/**\r\n * Checks if the given subject is an HTMLButtonElement or not.\r\n *\r\n * @param subject - A subject to check.\r\n *\r\n * @return `true` if the subject is an HTMLButtonElement, or otherwise `false`.\r\n */\r\nexport function isHTMLButtonElement( subject: unknown ): subject is HTMLButtonElement {\r\n  return subject instanceof HTMLButtonElement;\r\n}\r\n","import { isArray } from '../../type/type';\r\n\r\n\r\n/**\r\n * Push the provided value to an array if the value is not an array.\r\n *\r\n * @param value - A value to push.\r\n *\r\n * @return An array containing the value, or the value itself if it is already an array.\r\n */\r\nexport function toArray<T>( value: T | T[] ): T[] {\r\n  return isArray( value ) ? value : [ value ];\r\n}\r\n","import { toArray } from '../toArray/toArray';\r\n\r\n\r\n/**\r\n * The extended `Array#forEach` method that accepts a single value as an argument.\r\n *\r\n * @param values   - A value or values to iterate over.\r\n * @param iteratee - An iteratee function.\r\n */\r\nexport function forEach<T>( values: T | T[], iteratee: ( value: T, index: number, array: T[] ) => void ): void {\r\n  toArray( values ).forEach( iteratee );\r\n}\r\n","/**\r\n * Checks if the array includes the value or not.\r\n * `Array#includes` is not supported by IE.\r\n *\r\n * @param array - An array.\r\n * @param value - A value to search for.\r\n *\r\n * @return `true` if the array includes the value, or otherwise `false`.\r\n */\r\nexport function includes<T>( array: T[], value: T ): boolean {\r\n  return array.indexOf( value ) > -1;\r\n}\r\n","import { toArray } from '../toArray/toArray';\r\n\r\n\r\n/**\r\n * Extended `Array#push()` that accepts an item or an array with items.\r\n *\r\n * @param array - An array to push items.\r\n * @param items - An item or items to push.\r\n *\r\n * @return A provided array itself.\r\n */\r\nexport function push<T>( array: T[], items: T | T[] ): T[] {\r\n  array.push( ...toArray( items ) );\r\n  return array;\r\n}\r\n","export { empty }    from './empty/empty';\r\nexport { forEach }  from './forEach/forEach';\r\nexport { includes } from './includes/includes';\r\nexport { push }     from './push/push';\r\nexport { toArray }  from './toArray/toArray';\r\n\r\nexport const arrayProto = Array.prototype;\r\n","import { arrayProto } from '../../array';\r\n\r\n\r\n/**\r\n * The slice method for an array-like object.\r\n *\r\n * @param arrayLike - An array-like object.\r\n * @param start     - Optional. A start index.\r\n * @param end       - Optional. A end index.\r\n *\r\n * @return An array with sliced elements.\r\n */\r\nexport function slice<T>( arrayLike: ArrayLike<T>, start?: number, end?: number ): T[] {\r\n  return arrayProto.slice.call( arrayLike, start, end );\r\n}\r\n","import { slice } from '../slice/slice';\r\n\r\n\r\n/**\r\n * The find method for an array or array-like object, works in IE.\r\n * This method is not performant for a huge array.\r\n *\r\n * @param arrayLike - An array-like object.\r\n * @param predicate - The predicate function to test each element in the object.\r\n *\r\n * @return A found value if available, or otherwise `undefined`.\r\n */\r\nexport function find<T>(\r\n  arrayLike: ArrayLike<T>,\r\n  predicate: ( value: T, index: number, array: T[] ) => any\r\n): T | undefined {\r\n  return slice( arrayLike ).filter( predicate )[ 0 ];\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Toggles the provided class or classes by following the `add` boolean.\r\n *\r\n * @param elm     - An element whose classes are toggled.\r\n * @param classes - A class or class names.\r\n * @param add     - Whether to add or remove a class.\r\n */\r\nexport function toggleClass( elm: Element, classes: string | string[], add: boolean ): void {\r\n  if ( elm ) {\r\n    forEach( classes, name => {\r\n      if ( name ) {\r\n        elm.classList[ add ? 'add' : 'remove' ]( name );\r\n      }\r\n    } );\r\n  }\r\n}\r\n","import { isString } from '../../type/type';\r\nimport { toggleClass } from '../toggleClass/toggleClass';\r\n\r\n\r\n/**\r\n * Adds classes to the element.\r\n *\r\n * @param elm     - An element to add classes to.\r\n * @param classes - Classes to add.\r\n */\r\nexport function addClass( elm: Element, classes: string | string[] ): void {\r\n  toggleClass( elm, isString( classes ) ? classes.split( ' ' ) : classes, true );\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Appends children to the parent element.\r\n *\r\n * @param parent   - A parent element.\r\n * @param children - A child or children to append to the parent.\r\n */\r\nexport function append( parent: Element, children: Node | Node[] ): void {\r\n  forEach( children, parent.appendChild.bind( parent ) );\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Inserts a node or nodes before the specified reference node.\r\n *\r\n * @param nodes - A node or nodes to insert.\r\n * @param ref   - A reference node.\r\n */\r\nexport function before( nodes: Node | Node[], ref: Node ): void {\r\n  forEach( nodes, node => {\r\n    const parent = ref.parentNode;\r\n\r\n    if ( parent ) {\r\n      parent.insertBefore( node, ref );\r\n    }\r\n  } );\r\n}\r\n","/**\r\n * Checks if the element can be selected by the provided selector or not.\r\n *\r\n * @param elm      - An element to check.\r\n * @param selector - A selector to test.\r\n *\r\n * @return `true` if the selector matches the element, or otherwise `false`.\r\n */\r\nexport function matches( elm: Element, selector: string ): boolean {\r\n  return ( elm[ 'msMatchesSelector' ] || elm.matches ).call( elm, selector );\r\n}\r\n","import { slice } from '../../arrayLike';\r\nimport { matches } from '../matches/matches';\r\n\r\n\r\n/**\r\n * Finds children that has the specified tag or class name.\r\n *\r\n * @param parent   - A parent element.\r\n * @param selector - A selector to filter children.\r\n *\r\n * @return An array with filtered children.\r\n */\r\nexport function children<E extends HTMLElement>( parent: HTMLElement, selector: string ): E[] {\r\n  return parent ? slice( parent.children ).filter( child => matches( child, selector ) ) as E[] : [];\r\n}\r\n","import { children } from '../children/children';\r\n\r\n\r\n/**\r\n * Returns a child element that matches the specified tag or class name.\r\n *\r\n * @param parent   - A parent element.\r\n * @param selector - A selector to filter children.\r\n *\r\n * @return A matched child element if available, or otherwise `undefined`.\r\n */\r\nexport function child<E extends HTMLElement>( parent: HTMLElement, selector?: string ): E | undefined {\r\n  return selector ? children<E>( parent, selector )[ 0 ] : parent.firstElementChild as E;\r\n}\r\n","/**\r\n * Iterates over the provided object by own enumerable keys with calling the iteratee function.\r\n *\r\n * @param object   - An object to iterate over.\r\n * @param iteratee - An iteratee function that takes the value and key as arguments.\r\n *\r\n * @return A provided object itself.\r\n */\r\nexport function forOwn<T extends object>(\r\n  object: T,\r\n  iteratee: ( value: T[ keyof T ], key: string ) => boolean | void\r\n): T {\r\n  if ( object ) {\r\n    const keys = Object.keys( object );\r\n\r\n    for ( let i = 0; i < keys.length; i++ ) {\r\n      const key = keys[ i ];\r\n\r\n      if ( key !== '__proto__' ) {\r\n        if ( iteratee( object[ key ], key ) === false ) {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return object;\r\n}\r\n","import { slice } from '../../arrayLike';\r\nimport { forOwn } from '../forOwn/forOwn';\r\n\r\n\r\n/**\r\n * Assign U to T.\r\n *\r\n * @typeParam T - An object to assign to.\r\n * @typeParam U - An object to assign.\r\n *\r\n * @return An assigned object type.\r\n */\r\nexport type Assign<T, U> = Omit<T, keyof U> & U;\r\n\r\nexport function assign<T extends object>( object: T ): T;\r\n\r\n// There is a way to type arguments recursively, but these fixed definitions are enough for this project.\r\nexport function assign<T extends object, U extends object>( object: T, source: U ): Assign<T, U>;\r\n\r\nexport function assign<T extends object, U1 extends object, U2 extends object>(\r\n  object: T, source1: U1, source2: U2\r\n): Assign<Assign<T, U1>, U2>;\r\n\r\nexport function assign<T extends object, U1 extends object, U2 extends object, U3 extends object>(\r\n  object: T, source1: U1, source2: U2, source3: U3\r\n): Assign<Assign<Assign<T, U1>, U2>, U3>;\r\n\r\n/**\r\n * Assigns all own enumerable properties of all source objects to the provided object.\r\n * `undefined` in source objects will be skipped.\r\n *\r\n * @param object - An object to assign properties to.\r\n *\r\n * @return An object assigned properties of the sources to.\r\n */\r\nexport function assign<T extends object>( object: T ): any {\r\n  // eslint-disable-next-line prefer-rest-params, prefer-spread\r\n  slice( arguments, 1 ).forEach( source => {\r\n    forOwn( source, ( value, key ) => {\r\n      object[ key ] = source[ key ];\r\n    } );\r\n  } );\r\n\r\n  return object;\r\n}\r\n","import { isArray, isObject } from '../../type/type';\r\nimport { forOwn } from '../forOwn/forOwn';\r\n\r\n\r\n/**\r\n * Merges U to T.\r\n *\r\n * @typeParam T - An object to merge to.\r\n * @typeParam U - An object to to.\r\n *\r\n * @return An merged object type.\r\n */\r\nexport type Merge<T extends object, U extends object> = Omit<T, keyof U> & {\r\n  [ K in ( keyof T & keyof U ) ]: U[ K ] extends object\r\n    ? U[ K ] extends any[]\r\n      ? T[ K ] extends any[]\r\n        ? Array<T[ K ][ number ] | U[ K ][ number ]>\r\n        : U[ K ]\r\n      : T[ K ] extends object\r\n        ? Merge<T[ K ], U[ K ]> extends infer A ? Cast<A, object> : never\r\n        : U[ K ]\r\n    : U[ K ];\r\n} & Omit<U, keyof T>;\r\n\r\ntype Cast<T, U> = T extends U ? T : U;\r\n\r\n/**\r\n * Recursively merges source properties to the object.\r\n * Be aware that this method does not merge arrays. They are just duplicated by `slice()`.\r\n *\r\n * @param object - An object to merge properties to.\r\n * @param source - A source object to merge properties from.\r\n *\r\n * @return A new object with merged properties.\r\n */\r\nexport function merge<T extends object, U extends object>( object: T, source: U ): Merge<T, U> {\r\n  forOwn( source, ( value, key ) => {\r\n    if ( isArray( value ) ) {\r\n      object[ key ] = value.slice();\r\n    } else if ( isObject( value ) ) {\r\n      object[ key ] = merge( isObject( object[ key ] ) ? object[ key ] : {}, value );\r\n    } else {\r\n      object[ key ] = value;\r\n    }\r\n  } );\r\n\r\n  return object as Merge<T, U>;\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Removes attributes from the element.\r\n *\r\n * @param elm   - An element.\r\n * @param attrs - An attribute or attributes to remove.\r\n */\r\nexport function removeAttribute( elm: Element, attrs: string | string[] ): void {\r\n  if ( elm ) {\r\n    forEach( attrs, attr => {\r\n      elm.removeAttribute( attr );\r\n    } );\r\n  }\r\n}\r\n","import { forOwn } from '../../object';\r\nimport { isNull, isObject } from '../../type/type';\r\nimport { removeAttribute } from '../removeAttribute/removeAttribute';\r\n\r\n\r\nexport function setAttribute( elm: Element, attr: string, value: string | number | boolean ): void;\r\nexport function setAttribute( elm: Element, attrs: Record<string, string | number | boolean> ): void;\r\n\r\nexport function setAttribute(\r\n  elm: Element,\r\n  attrs: string | Record<string, string | number | boolean>,\r\n  value?: string | number | boolean\r\n): void {\r\n  if ( isObject( attrs ) ) {\r\n    forOwn( attrs, ( value, name ) => {\r\n      setAttribute( elm, name, value );\r\n    } );\r\n  } else {\r\n    isNull( value ) ? removeAttribute( elm, attrs ) : elm.setAttribute( attrs, String( value ) );\r\n  }\r\n}\r\n","import { isString } from '../../type/type';\r\nimport { addClass } from '../addClass/addClass';\r\nimport { append } from '../append/append';\r\nimport { setAttribute } from '../setAttribute/setAttribute';\r\n\r\n\r\nexport function create<K extends keyof HTMLElementTagNameMap>(\r\n  tag: K,\r\n  attrs?: Record<string, string | number | boolean> | string | string[],\r\n  parent?: HTMLElement\r\n): HTMLElementTagNameMap[ K ];\r\n\r\nexport function create(\r\n  tag: string,\r\n  attrs?: Record<string, string | number | boolean> | string | string[],\r\n  parent?: HTMLElement\r\n): HTMLElement;\r\n\r\n/**\r\n * Creates a HTML element.\r\n *\r\n * @param tag    - A tag name.\r\n * @param attrs  - Optional. An object with attributes to apply the created element to, or a string with classes.\r\n * @param parent - Optional. A parent element where the created element is appended.\r\n */\r\nexport function create<K extends keyof HTMLElementTagNameMap>(\r\n  tag: K,\r\n  attrs?: Record<string, string | number | boolean> | string,\r\n  parent?: HTMLElement\r\n): HTMLElementTagNameMap[ K ] {\r\n  const elm = document.createElement( tag );\r\n\r\n  if ( attrs ) {\r\n    isString( attrs ) ? addClass( elm, attrs ) : setAttribute( elm, attrs );\r\n  }\r\n\r\n  parent && append( parent, elm );\r\n\r\n  return elm;\r\n}\r\n","import { isNull, isUndefined } from '../../type/type';\n\n\nexport function style<K extends keyof CSSStyleDeclaration>(\n  elm: HTMLElement,\n  prop: K,\n): CSSStyleDeclaration[ K ];\n\nexport function style(\n  elm: HTMLElement,\n  prop: string,\n): string;\n\nexport function style(\n  elm: HTMLElement,\n  prop: string,\n  value: string | number\n): void;\n\n\n/**\n * Applies inline styles to the provided element by an object literal.\n *\n * @param elm   - An element to apply styles to.\n * @param prop  - An object literal with styles or a property name.\n * @param value - A value to set.\n */\nexport function style(\n  elm: HTMLElement,\n  prop: string,\n  value?: string | number\n): string | void {\n  if ( isUndefined( value ) ) {\n    return getComputedStyle( elm )[ prop ];\n  }\n\n  if ( ! isNull( value ) ) {\n    const { style } = elm;\n    value = `${ value }`;\n\n    if ( style[ prop ] !== value ) {\n      style[ prop ] = value;\n    }\n  }\n}\n","import { style } from '../style/style';\n\n\n/**\n * Sets the `display` CSS value to the element.\n *\n * @param elm     - An element to set a new value to.\n * @param display - A new `display` value.\n */\nexport function display( elm: HTMLElement, display: string ): void {\n  style( elm, 'display', display );\n}\n","/**\n * Focuses the provided element without scrolling the ascendant element.\n *\n * @param elm - An element to focus.\n */\nexport function focus( elm: HTMLElement ): void {\n  elm[ 'setActive' ] && elm[ 'setActive' ]() || elm.focus( { preventScroll: true } )\n}\n","/**\r\n * Returns the specified attribute value.\r\n *\r\n * @param elm  - An element.\r\n * @param attr - An attribute to get.\r\n */\r\nexport function getAttribute( elm: Element, attr: string ): string {\r\n  return elm.getAttribute( attr );\r\n}\r\n","/**\r\n * Checks if the element contains the specified class or not.\r\n *\r\n * @param elm       - An element to check.\r\n * @param className - A class name that may be contained by the element.\r\n *\r\n * @return `true` if the element contains the class, or otherwise `false`.\r\n */\r\nexport function hasClass( elm: Element, className: string ): boolean {\r\n  return elm && elm.classList.contains( className );\r\n}\r\n","/**\r\n * Returns a DOMRect object of the provided element.\r\n *\r\n * @param target - An element.\r\n */\r\nexport function rect( target: Element ): DOMRect {\r\n  return target.getBoundingClientRect();\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Removes the provided node from its parent.\r\n *\r\n * @param nodes - A node or nodes to remove.\r\n */\r\nexport function remove( nodes: Node | Node[] ): void {\r\n  forEach( nodes, node => {\r\n    if ( node && node.parentNode ) {\r\n      node.parentNode.removeChild( node );\r\n    }\r\n  } );\r\n}\r\n","import { isString } from '../../type/type';\r\nimport { create } from '../create/create';\r\nimport { rect } from '../rect/rect';\r\nimport { remove } from '../remove/remove';\r\n\r\n\r\n/**\r\n * Attempts to convert the provided value to pixel as the relative value to the parent element.\r\n *\r\n * @param parent - A parent element.\r\n * @param value  - A value to convert.\r\n *\r\n * @return A converted value in pixel. Unhandled values will become 0.\r\n */\r\nexport function measure( parent: HTMLElement, value: number | string ): number {\r\n  if ( isString( value ) ) {\r\n    const div = create( 'div', { style: `width: ${ value }; position: absolute;` }, parent );\r\n    value = rect( div ).width;\r\n    remove( div );\r\n  }\r\n\r\n  return value;\r\n}\r\n","import { child } from '../child/child';\r\n\r\n\r\n/**\r\n * Parses the provided HTML string and returns the first element.\r\n *\r\n * @param html - An HTML string to parse.\r\n *\r\n * @return An Element on success, or otherwise `undefined`.\r\n */\r\nexport function parseHtml<E extends HTMLElement>( html: string ): E | undefined {\r\n  return child<E>( new DOMParser().parseFromString( html, 'text/html' ).body );\r\n}\r\n","/**\r\n * Call the `preventDefault()` of the provided event.\r\n *\r\n * @param e               - An Event object.\r\n * @param stopPropagation - Optional. Whether to stop the event propagation or not.\r\n */\r\nexport function prevent( e: Event, stopPropagation?: boolean ): void {\r\n  e.preventDefault();\r\n\r\n  if ( stopPropagation ) {\r\n    e.stopPropagation();\r\n    e.stopImmediatePropagation();\r\n  }\r\n}\r\n","/**\r\n * Returns an element that matches the provided selector.\r\n *\r\n * @param parent   - A parent element to start searching from.\r\n * @param selector - A selector to query.\r\n *\r\n * @return A found element or `null`.\r\n */\r\nexport function query<E extends Element = Element>( parent: Element | Document, selector: string ): E | null {\r\n  return parent && parent.querySelector( selector );\r\n}\r\n","import { slice } from '../../arrayLike';\r\n\r\n\r\n/**\r\n * Returns elements that match the provided selector.\r\n *\r\n * @param parent   - A parent element to start searching from.\r\n * @param selector - A selector to query.\r\n *\r\n * @return An array with matched elements.\r\n */\r\nexport function queryAll<E extends Element = Element>( parent: Element | Document, selector: string ): E[] {\r\n  return slice<E>( parent.querySelectorAll( selector ) );\r\n}\r\n","import { toggleClass } from '../toggleClass/toggleClass';\r\n\r\n\r\n/**\r\n * Removes classes from the element.\r\n *\r\n * @param elm     - An element to remove classes from.\r\n * @param classes - Classes to remove.\r\n */\r\nexport function removeClass( elm: Element, classes: string | string[] ): void {\r\n  toggleClass( elm, classes, false );\r\n}\r\n","import { isString } from '../../type/type';\r\n\r\n\r\n/**\r\n * Appends `px` to the provided number.\r\n * If the value is already string, just returns it.\r\n *\r\n * @param value - A value to append `px` to.\r\n *\r\n * @return A string with the CSS unit.\r\n */\r\nexport function unit( value: number | string ): string {\r\n  return isString( value ) ? value : value ? `${ value }px` : '';\r\n}\r\n","import { PROJECT_CODE } from '../../../constants/project';\r\n\r\n\r\n/**\r\n * Throws an error if the provided condition is falsy.\r\n *\r\n * @param condition - If falsy, an error is thrown.\r\n * @param message   - Optional. A message to display.\r\n */\r\nexport function assert( condition: any, message = '' ): void {\r\n  if ( ! condition ) {\r\n    throw new Error( `[${ PROJECT_CODE }] ${ message }` );\r\n  }\r\n}\r\n","import { AnyFunction } from '../../../types';\r\n\r\n\r\n/**\r\n * Invokes the callback on the next tick.\r\n *\r\n * @param callback - A callback function.\r\n */\r\nexport function nextTick( callback: AnyFunction ): void {\r\n  setTimeout( callback );\r\n}\r\n","/**\r\n * No operation.\r\n */\r\nexport const noop = (): void => {}; // eslint-disable-line no-empty-function, @typescript-eslint/no-empty-function\r\n","/**\r\n * The arias of `window.requestAnimationFrame()`.\r\n */\r\nexport function raf( func: FrameRequestCallback ): number {\r\n  return requestAnimationFrame( func );\r\n}\r\n","export const { min, max, floor, ceil, abs } = Math;\r\n","import { abs } from '../math/math';\r\n\r\n\r\n/**\r\n * Checks if the provided 2 numbers are approximately equal or not.\r\n *\r\n * @param x       - A number.\r\n * @param y       - Another number to compare.\r\n * @param epsilon - An accuracy that defines the approximation.\r\n *\r\n * @return `true` if 2 numbers are considered to be equal, or otherwise `false`.\r\n */\r\nexport function approximatelyEqual( x: number, y: number, epsilon: number ): boolean {\r\n  return abs( x - y ) < epsilon;\r\n}\r\n","import { max, min } from '../math/math';\r\n\r\n\r\n/**\r\n * Checks if the subject number is between `minOrMax` and `maxOrMin`.\r\n *\r\n * @param number    - A subject number to check.\r\n * @param minOrMax  - A min or max number.\r\n * @param maxOrMin  - A max or min number.\r\n * @param exclusive - Optional. Whether to exclude `x` or `y`.\r\n */\r\nexport function between( number: number, minOrMax: number, maxOrMin: number, exclusive?: boolean ): boolean {\r\n  const minimum = min( minOrMax, maxOrMin );\r\n  const maximum = max( minOrMax, maxOrMin );\r\n  return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;\r\n}\r\n","import { max, min } from '../math/math';\r\n\r\n\r\n/**\r\n * Clamps a number.\r\n *\r\n * @param number - A subject number to check.\r\n * @param x      - A min or max number.\r\n * @param y      - A min or max number.\r\n */\r\nexport function clamp( number: number, x: number, y: number ): number {\r\n  const minimum = min( x, y );\r\n  const maximum = max( x, y );\r\n  return min( max( minimum, number ), maximum );\r\n}\r\n","/**\r\n * Returns the sign of the provided number.\r\n *\r\n * @param x - A number.\r\n *\r\n * @return `1` for positive numbers, `-1` for negative numbers, or `0` for `0`.\r\n */\r\nexport function sign( x: number ): number {\r\n  return +( x > 0 ) - +( x < 0 );\r\n}\r\n","import { forEach } from '../../array';\r\n\r\n\r\n/**\r\n * Formats a string.\r\n *\r\n * @param string       - A string to format.\r\n * @param replacements - A replacement or replacements.\r\n *\r\n * @return A formatted string.\r\n */\r\nexport function format( string: string, replacements: string | number | Array<string | number> ): string {\r\n  forEach( replacements, replacement => {\r\n    string = string.replace( '%s', `${ replacement }` );\r\n  } );\r\n\r\n  return string;\r\n}\r\n","/**\r\n * Pads the number with 0.\r\n *\r\n * @param number - A number to pad.\r\n *\r\n * @return string - Padded number.\r\n */\r\nexport function pad( number: number ): string {\r\n  return number < 10 ? `0${ number }` : `${ number }`;\r\n}\r\n","import { pad } from '../pad/pad';\r\n\r\n\r\n/**\r\n * Stores unique IDs.\r\n *\r\n * @since 3.0.0\r\n */\r\nconst ids: Record<string, number> = {};\r\n\r\n/**\r\n * Returns a sequential unique ID as \"{ prefix }-{ number }\".\r\n *\r\n * @param prefix - A prefix for the ID.\r\n */\r\nexport function uniqueId( prefix: string ): string {\r\n  return `${ prefix }${ pad( ( ids[ prefix ] = ( ids[ prefix ] || 0 ) + 1 ) ) }`;\r\n}\r\n","import { DEFAULT_EVENT_PRIORITY } from '../../constants/priority';\nimport { AnyFunction } from '../../types';\nimport { forOwn, push, slice, toArray } from '../../utils';\n\n\n/**\n * The interface for the EventBus instance.\n *\n * @since 3.0.0\n */\nexport interface EventBusObject {\n  on( events: string | string[], callback: EventBusCallback, key?: object, priority?: number ): void;\n  off( events: string | string[], key?: object ): void;\n  offBy( key: object ): void;\n  emit( event: string, ...args: any[] ): void;\n  destroy(): void;\n}\n\n/**\n * The interface for each event handler object.\n *\n * @since 3.0.0\n */\nexport interface EventHandler {\n  _event: string;\n  _callback: AnyFunction;\n  _namespace: string;\n  _priority: number;\n  _key?: object;\n}\n\n/**\n * The type for a callback function of the EventBus.\n *\n * @since 3.0.0\n */\nexport type EventBusCallback = AnyFunction;\n\n/**\n * The constructor to provided a simple event system.\n *\n * @since 3.0.0\n *\n * @return An EventBus object.\n */\nexport function EventBus(): EventBusObject {\n  /**\n   * The collection of registered handlers.\n   */\n  let handlers: Record<string, EventHandler[]> = {};\n\n  /**\n   * Registers an event handler.\n   *\n   * @param events   - An event name or names separated by spaces. Use a dot(.) to add a namespace.\n   * @param callback - A callback function to register.\n   * @param key      - Optional. An object for an identifier of the handler.\n   * @param priority - Optional. A priority number for the order in which the callbacks are invoked.\n   *                   Lower numbers correspond with earlier execution. The default value is 10.\n   */\n  function on(\n    events: string | string[],\n    callback: EventBusCallback,\n    key?: object,\n    priority = DEFAULT_EVENT_PRIORITY\n  ): void {\n    forEachEvent( events, ( event, namespace ) => {\n      handlers[ event ] = handlers[ event ] || [];\n\n      push( handlers[ event ], {\n        _event    : event,\n        _callback : callback,\n        _namespace: namespace,\n        _priority : priority,\n        _key      : key,\n      } ).sort( ( handler1, handler2 ) => handler1._priority - handler2._priority );\n    } );\n  }\n\n  /**\n   * Removes event handlers registered by `on()`.\n   * If only the event name is provided, all handlers that associate with the event are removed.\n   * If the event name and namespace are specified, handlers that associate with the event and namespace are removed.\n   *\n   * @param events - An event name or names separated by spaces. Use a dot(.) to add a namespace.\n   * @param key    - Optional. An object for an identifier of the handler.\n   */\n  function off( events: string | string[], key?: object ): void {\n    forEachEvent( events, ( event, namespace ) => {\n      const eventHandlers = handlers[ event ];\n\n      handlers[ event ] = eventHandlers && eventHandlers.filter( handler => {\n        return handler._key ? handler._key !== key : key || handler._namespace !== namespace;\n      } );\n    } );\n  }\n\n  /**\n   * Removes all handlers locked by the specified key.\n   *\n   * @param key - A key.\n   */\n  function offBy( key: object ): void {\n    forOwn( handlers, ( eventHandlers, event ) => {\n      off( event, key );\n    } );\n  }\n\n  /**\n   * Triggers callback functions.\n   * This accepts additional arguments and passes them to callbacks.\n   *\n   * @param event - An event name.\n   */\n  function emit( event: string ): void {\n    ( handlers[ event ] || [] ).forEach( handler => {\n      // eslint-disable-next-line prefer-rest-params, prefer-spread\n      handler._callback.apply( handler, slice( arguments, 1 ) );\n    } );\n  }\n\n  /**\n   * Removes all handlers.\n   */\n  function destroy(): void {\n    handlers = {};\n  }\n\n  /**\n   * Parses provided events and iterates over them.\n   *\n   * @param events   - An event or events.\n   * @param iteratee - An iteratee function.\n   */\n  function forEachEvent( events: string | string[], iteratee: ( event: string, namespace: string ) => void ): void {\n    toArray( events ).join( ' ' ).split( ' ' ).forEach( eventNS => {\n      const fragments = eventNS.split( '.' );\n      iteratee( fragments[ 0 ], fragments[ 1 ] );\n    } );\n  }\n\n  return {\n    on,\n    off,\n    offBy,\n    emit,\n    destroy,\n  };\n}\n","export const EVENT_MOUNTED            = 'mounted';\r\nexport const EVENT_READY              = 'ready';\r\nexport const EVENT_MOVE               = 'move';\r\nexport const EVENT_MOVED              = 'moved';\r\nexport const EVENT_CLICK              = 'click';\r\nexport const EVENT_ACTIVE             = 'active';\r\nexport const EVENT_INACTIVE           = 'inactive';\r\nexport const EVENT_VISIBLE            = 'visible';\r\nexport const EVENT_HIDDEN             = 'hidden';\r\nexport const EVENT_SLIDE_KEYDOWN      = 'slide:keydown';\r\nexport const EVENT_REFRESH            = 'refresh';\r\nexport const EVENT_UPDATED            = 'updated';\r\nexport const EVENT_RESIZE             = 'resize';\r\nexport const EVENT_RESIZED            = 'resized';\r\nexport const EVENT_REPOSITIONED       = 'repositioned';\r\nexport const EVENT_DRAG               = 'drag';\r\nexport const EVENT_DRAGGING           = 'dragging';\r\nexport const EVENT_DRAGGED            = 'dragged';\r\nexport const EVENT_SCROLL             = 'scroll';\r\nexport const EVENT_SCROLLED           = 'scrolled';\r\nexport const EVENT_DESTROY            = 'destroy';\r\nexport const EVENT_ARROWS_MOUNTED     = 'arrows:mounted';\r\nexport const EVENT_ARROWS_UPDATED     = 'arrows:updated';\r\nexport const EVENT_PAGINATION_MOUNTED = 'pagination:mounted';\r\nexport const EVENT_PAGINATION_UPDATED = 'pagination:updated';\r\nexport const EVENT_NAVIGATION_MOUNTED = 'navigation:mounted';\r\nexport const EVENT_AUTOPLAY_PLAY      = 'autoplay:play';\r\nexport const EVENT_AUTOPLAY_PLAYING   = 'autoplay:playing';\r\nexport const EVENT_AUTOPLAY_PAUSE     = 'autoplay:pause';\r\nexport const EVENT_LAZYLOAD_LOADED    = 'lazyload:loaded';\r\n\r\n","import { EVENT_DESTROY } from '../../constants/events';\nimport { Splide } from '../../core/Splide/Splide';\nimport { AnyFunction, EventMap } from '../../types';\nimport { forEach } from '../../utils';\nimport { EventBusCallback } from '../EventBus/EventBus';\n\n\n/**\n * The interface for the EventInterface object.\n *\n * @since 3.0.0\n */\nexport interface EventInterfaceObject {\n  on<K extends keyof EventMap>( event: K, callback: EventMap[ K ], priority?: number ): void;\n  on( events: string | string[], callback: EventBusCallback, priority?: number ): void;\n  off<K extends keyof EventMap>( events: K | K[] | string | string[] ): void;\n  emit<K extends keyof EventMap>( event: K, ...args: Parameters<EventMap[ K ]> ): void\n  emit( event: string, ...args: any[] ): void;\n  bind(\n    target: Element | Window | Document | Array<Element | Window | Document>,\n    events: string,\n    callback: AnyFunction,\n    options?: AddEventListenerOptions\n  ): void\n  unbind(\n    target: Element | Window | Document | Array<Element | Window | Document>,\n    events: string,\n    callback?: AnyFunction,\n  ): void;\n  destroy(): void;\n}\n\n/**\n * The type for event targets.\n *\n * @since 3.0.0\n */\ntype EventTarget = Element | Window | Document;\n\n/**\n * The function that provides interface for internal and native events.\n *\n * @since 3.0.0\n *\n * @param Splide - A Splide instance.\n *\n * @return A collection of interface functions.\n */\nexport function EventInterface( Splide: Splide ): EventInterfaceObject {\n  /**\n   * Holds the event object.\n   */\n  const { event } = Splide;\n\n  /**\n   * The key for events.\n   */\n  const key = {};\n\n  /**\n   * Stores all handlers that listen to native events.\n   */\n  let listeners: [ EventTarget, string, AnyFunction, AddEventListenerOptions? ][] = [];\n\n  /**\n   * Registers an event handler with an unique key.\n   * It can only be removed by `off()` method below.\n   *\n   * @param events   - An event name or names separated by spaces. Use a dot(.) to add a namespace.\n   * @param callback - A callback function to register.\n   * @param priority - Optional. A priority number for the order in which the callbacks are invoked.\n   *                   Lower numbers correspond with earlier execution. The default value is 10.\n   */\n  function on( events: string | string[], callback: EventBusCallback, priority?: number ): void {\n    event.on( events, callback, key, priority );\n  }\n\n  /**\n   * Removes event handlers registered by `on()`.\n   *\n   * @param events - An event name or names separated by spaces. Use a dot(.) to add a namespace.\n   */\n  function off( events: string | string[] ): void {\n    event.off( events, key );\n  }\n\n  /**\n   * Listens to native events.\n   * Splide#destory() will remove all registered listeners.\n   *\n   * @param targets  - A target element, the window object or the document object.\n   * @param events   - An event or events to listen to.\n   * @param callback - A callback function.\n   * @param options  - Optional. The options to pass to the `addEventListener` function.\n   */\n  function bind(\n    targets: EventTarget | EventTarget[],\n    events: string,\n    callback: AnyFunction,\n    options?: AddEventListenerOptions\n  ): void {\n    forEachEvent( targets, events, ( target, event ) => {\n      listeners.push( [ target, event, callback, options ] );\n      target.addEventListener( event, callback, options );\n    } );\n  }\n\n  /**\n   * Removes the event handler.\n   *\n   * @param targets  - A target element, the window object or the document object.\n   * @param events   - An event name or names to remove.\n   * @param callback - Optional. Specify the callback to remove.\n   */\n  function unbind( targets: EventTarget | EventTarget[], events: string, callback?: AnyFunction ): void {\n    forEachEvent( targets, events, ( target, event ) => {\n      listeners = listeners.filter( listener => {\n        if ( listener[ 0 ] === target && listener[ 1 ] === event && ( ! callback || listener[ 2 ] === callback ) ) {\n          target.removeEventListener( event, listener[ 2 ], listener[ 3 ] );\n          return false;\n        }\n\n        return true;\n      } );\n    } );\n  }\n\n  /**\n   * Iterates over each target and event.\n   *\n   * @param targets  - A target element, the window object or the document object.\n   * @param events   - An event name or names.\n   * @param iteratee - An iteratee function.\n   */\n  function forEachEvent(\n    targets: EventTarget | EventTarget[],\n    events: string,\n    iteratee: ( target: EventTarget, event: string ) => void\n  ): void {\n    forEach( targets, target => {\n      if ( target ) {\n        events.split( ' ' ).forEach( iteratee.bind( null, target ) );\n      }\n    } );\n  }\n\n  /**\n   * Removes all listeners.\n   */\n  function destroy(): void {\n    listeners = listeners.filter( data => unbind( data[ 0 ], data[ 1 ] ) );\n    event.offBy( key );\n  }\n\n  /**\n   * Invokes destroy when the slider is destroyed.\n   */\n  event.on( EVENT_DESTROY, destroy, key );\n\n  return {\n    on,\n    off,\n    emit: event.emit,\n    bind,\n    unbind,\n    destroy,\n  };\n}\n","import { raf } from '../../utils';\r\n\r\n\r\n/**\r\n * The interface for the returning value of the RequestInterval.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface RequestIntervalInterface {\r\n  start( resume?: boolean ): void;\r\n  pause(): void;\r\n  rewind(): void;\r\n  cancel(): void;\r\n  isPaused(): boolean;\r\n}\r\n\r\n/**\r\n * Requests interval like the native `setInterval()` with using `requestAnimationFrame`.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param interval   - The interval duration in milliseconds.\r\n * @param onInterval - The callback fired on every interval.\r\n * @param onUpdate   - Optional. Called on every animation frame, taking the progress rate.\r\n * @param limit      - Optional. Limits the number of interval.\r\n */\r\nexport function RequestInterval(\r\n  interval: number,\r\n  onInterval: () => void,\r\n  onUpdate?: ( rate: number ) => void,\r\n  limit?: number\r\n): RequestIntervalInterface {\r\n  const { now } = Date;\r\n\r\n  /**\r\n   * The time when the interval starts.\r\n   */\r\n  let startTime: number;\r\n\r\n  /**\r\n   * The current progress rate.\r\n   */\r\n  let rate = 0;\r\n\r\n  /**\r\n   * The animation frame ID.\r\n   */\r\n  let id: number;\r\n\r\n  /**\r\n   * Indicates whether the interval is currently paused or not.\r\n   */\r\n  let paused = true;\r\n\r\n  /**\r\n   * The loop count. This only works when the `limit` argument is provided.\r\n   */\r\n  let count = 0;\r\n\r\n  /**\r\n   * The update function called on every animation frame.\r\n   */\r\n  function update(): void {\r\n    if ( ! paused ) {\r\n      const elapsed = now() - startTime;\r\n\r\n      if ( elapsed >= interval ) {\r\n        rate      = 1;\r\n        startTime = now();\r\n      } else {\r\n        rate = elapsed / interval;\r\n      }\r\n\r\n      if ( onUpdate ) {\r\n        onUpdate( rate );\r\n      }\r\n\r\n      if ( rate === 1 ) {\r\n        onInterval();\r\n\r\n        if ( limit && ++count >= limit ) {\r\n          return pause();\r\n        }\r\n      }\r\n\r\n      raf( update );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Starts the interval.\r\n   *\r\n   * @param resume - Optional. Whether to resume the paused progress or not.\r\n   */\r\n  function start( resume?: boolean ): void {\r\n    ! resume && cancel();\r\n    startTime = now() - ( resume ? rate * interval : 0 );\r\n    paused    = false;\r\n    raf( update );\r\n  }\r\n\r\n  /**\r\n   * Pauses the interval.\r\n   */\r\n  function pause(): void {\r\n    paused = true;\r\n  }\r\n\r\n  /**\r\n   * Rewinds the current progress.\r\n   */\r\n  function rewind(): void {\r\n    startTime = now();\r\n    rate      = 0;\r\n\r\n    if ( onUpdate ) {\r\n      onUpdate( rate );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cancels the interval.\r\n   */\r\n  function cancel() {\r\n    cancelAnimationFrame( id );\r\n    rate   = 0;\r\n    id     = 0;\r\n    paused = true;\r\n  }\r\n\r\n  /**\r\n   * Checks if the interval is paused or not.\r\n   *\r\n   * @return `true` if the interval is paused, or otherwise `false`.\r\n   */\r\n  function isPaused(): boolean {\r\n    return paused;\r\n  }\r\n\r\n  return {\r\n    start,\r\n    rewind,\r\n    pause,\r\n    cancel,\r\n    isPaused,\r\n  };\r\n}\r\n","import { includes, toArray } from '../../utils';\r\n\r\n\r\n/**\r\n * The interface for the State object.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface StateObject {\r\n  set( state: number ): void;\r\n  is( states: number | number[] ): boolean;\r\n}\r\n\r\n/**\r\n * The function providing a super simple state system.\r\n *\r\n * @param initialState - Specifies the initial state.\r\n */\r\nexport function State( initialState: number ): StateObject {\r\n  /**\r\n   * The current state.\r\n   */\r\n  let state = initialState;\r\n\r\n  /**\r\n   * Sets a new state.\r\n   *\r\n   * @param value - A new state value.\r\n   */\r\n  function set( value: number ): void {\r\n    state = value;\r\n  }\r\n\r\n  /**\r\n   * Checks if the current state matches the provided one.\r\n   *\r\n   * @param states - A state to check.\r\n   *\r\n   * @return `true` if the current state is the provided one.\r\n   */\r\n  function is( states: number | number[] ): boolean {\r\n    return includes( toArray( states ), state );\r\n  }\r\n\r\n  return { set, is };\r\n}\r\n","import { AnyFunction } from '../../types';\r\nimport { RequestInterval, RequestIntervalInterface } from '../RequestInterval/RequestInterval';\r\n\r\n\r\n/**\r\n * The interface for the returning value of the RequestInterval.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface ThrottleInstance<F extends AnyFunction> extends Function {\r\n  ( ...args: Parameters<F> ): void;\r\n}\r\n\r\n/**\r\n * Returns the throttled function.\r\n *\r\n * @param func     - A function to throttle.\r\n * @param duration - Optional. Throttle duration in milliseconds.\r\n *\r\n * @return A throttled function.\r\n */\r\nexport function Throttle<F extends AnyFunction>(\r\n  func: F,\r\n  duration?: number\r\n): ThrottleInstance<F> {\r\n  let interval: RequestIntervalInterface;\r\n\r\n  function throttled( this: ThisParameterType<F> ): void {\r\n    if ( ! interval ) {\r\n      interval = RequestInterval( duration || 0, () => {\r\n        // eslint-disable-next-line prefer-rest-params\r\n        func.apply( this, arguments );\r\n        interval = null;\r\n      }, null, 1 );\r\n\r\n      interval.start();\r\n    }\r\n  }\r\n\r\n  return throttled;\r\n}\r\n","import { DATA_ATTRIBUTE } from '../../constants/project';\r\nimport { DESTROYED } from '../../constants/states';\r\nimport { Throttle } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport { assert, find, getAttribute, merge } from '../../utils';\r\n\r\n\r\n/**\r\n * The interface for the Options component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface OptionsComponent extends BaseComponent {\r\n}\r\n\r\n/**\r\n * The component for managing options.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return An Options component object.\r\n */\r\nexport function Options( Splide: Splide, Components: Components, options: Options ): OptionsComponent {\r\n  /**\r\n   * The throttled `observe` function.\r\n   */\r\n  const throttledObserve = Throttle( observe );\r\n\r\n  /**\r\n   * Keeps the initial options to apply when no matched query exists.\r\n   */\r\n  let initialOptions: Options;\r\n\r\n  /**\r\n   * Stores breakpoints with the MediaQueryList object.\r\n   */\r\n  let points: [ string, MediaQueryList ][];\r\n\r\n  /**\r\n   * Holds the current breakpoint.\r\n   */\r\n  let currPoint: string | undefined;\r\n\r\n  /**\r\n   * Called when the component is constructed.\r\n   */\r\n  function setup(): void {\r\n    try {\r\n      merge( options, JSON.parse( getAttribute( Splide.root, DATA_ATTRIBUTE ) ) );\r\n    } catch ( e ) {\r\n      assert( false, e.message );\r\n    }\r\n\r\n    initialOptions = merge( {}, options );\r\n\r\n    const { breakpoints } = options;\r\n\r\n    if ( breakpoints ) {\r\n      const isMin = options.mediaQuery === 'min';\r\n\r\n      points = Object.keys( breakpoints )\r\n        .sort( ( n, m ) => isMin ? +m - +n : +n - +m )\r\n        .map( point => [\r\n          point,\r\n          matchMedia( `(${ isMin ? 'min' : 'max' }-width:${ point }px)` ),\r\n        ] );\r\n\r\n      observe();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    if ( points ) {\r\n      addEventListener( 'resize', throttledObserve );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroys the component.\r\n   *\r\n   * @param completely - Will be `true` for complete destruction.\r\n   */\r\n  function destroy( completely: boolean ): void {\r\n    if ( completely ) {\r\n      removeEventListener( 'resize', throttledObserve );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Observes breakpoints.\r\n   * The `currPoint` may be `undefined`.\r\n   */\r\n  function observe(): void {\r\n    const item = find( points, item => item[ 1 ].matches ) || [];\r\n\r\n    if ( item[ 0 ] !== currPoint ) {\r\n      onMatch( ( currPoint = item[ 0 ] ) );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Called when the media query matches breakpoints.\r\n   *\r\n   * @param point - A matched point, or `undefined` that means no breakpoint matches a media query.\r\n   */\r\n  function onMatch( point: string | undefined ): void {\r\n    const newOptions = options.breakpoints[ point ] || initialOptions;\r\n\r\n    if ( newOptions.destroy ) {\r\n      Splide.options = initialOptions;\r\n      Splide.destroy( newOptions.destroy === 'completely' );\r\n    } else {\r\n      if ( Splide.state.is( DESTROYED ) ) {\r\n        destroy( true );\r\n        Splide.mount();\r\n      }\r\n\r\n      Splide.options = newOptions;\r\n    }\r\n  }\r\n\r\n  return {\r\n    setup,\r\n    mount,\r\n    destroy,\r\n  };\r\n}\r\n","/**\r\n * Enumerates slides from left to right.\r\n */\r\nexport const LTR = 'ltr';\r\n\r\n/**\r\n * Enumerates slides from right to left.\r\n */\r\nexport const RTL = 'rtl';\r\n\r\n/**\r\n * Enumerates slides in a col.\r\n */\r\nexport const TTB = 'ttb';\r\n","import { RTL, TTB } from '../../constants/directions';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\n\r\n\r\n/**\r\n * The interface for the Direction component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface DirectionComponent extends BaseComponent {\r\n  resolve( prop: string, axisOnly?: boolean ): string;\r\n  orient( value: number ): number;\r\n}\r\n\r\n/**\r\n * The translation map for directions.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const ORIENTATION_MAP = {\r\n  marginRight : [ 'marginBottom', 'marginLeft' ],\r\n  autoWidth   : [ 'autoHeight' ],\r\n  fixedWidth  : [ 'fixedHeight' ],\r\n  paddingLeft : [ 'paddingTop', 'paddingRight' ],\r\n  paddingRight: [ 'paddingBottom', 'paddingLeft' ],\r\n  width       : [ 'height' ],\r\n  left        : [ 'top', 'right' ],\r\n  right       : [ 'bottom', 'left' ],\r\n  x           : [ 'y' ],\r\n  X           : [ 'Y' ],\r\n  Y           : [ 'X' ],\r\n  ArrowLeft   : [ 'ArrowUp', 'ArrowRight' ],\r\n  ArrowRight  : [ 'ArrowDown', 'ArrowLeft' ],\r\n};\r\n\r\n/**\r\n * The component that absorbs the difference among directions.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return A Direction component object.\r\n */\r\nexport function Direction( Splide: Splide, Components: Components, options: Options ): DirectionComponent {\r\n  /**\r\n   * Resolves the provided property name.\r\n   *\r\n   * @param prop     - A property name to translate.\r\n   * @param axisOnly - Optional. If `ture`, returns the same property for LTR and RTL.\r\n   */\r\n  function resolve( prop: string, axisOnly?: boolean ): string {\r\n    const { direction } = options;\r\n    const index = direction === RTL && ! axisOnly ? 1 : direction === TTB ? 0 : -1;\r\n    return ORIENTATION_MAP[ prop ][ index ] || prop;\r\n  }\r\n\r\n  /**\r\n   * Orients the value towards the current direction.\r\n   *\r\n   * @param value - A value to orient.\r\n   *\r\n   * @return The oriented value.\r\n   */\r\n  function orient( value: number ): number {\r\n    return value * ( options.direction === RTL ? 1 : -1 );\r\n  }\r\n\r\n  return {\r\n    resolve,\r\n    orient,\r\n  };\r\n}\r\n","import { PROJECT_CODE } from './project';\r\n\r\n\r\nexport const CLASS_ROOT            = PROJECT_CODE;\r\nexport const CLASS_SLIDER          = `${ PROJECT_CODE }__slider`;\r\nexport const CLASS_TRACK           = `${ PROJECT_CODE }__track`;\r\nexport const CLASS_LIST            = `${ PROJECT_CODE }__list`;\r\nexport const CLASS_SLIDE           = `${ PROJECT_CODE }__slide`;\r\nexport const CLASS_CLONE           = `${ CLASS_SLIDE }--clone`;\r\nexport const CLASS_CONTAINER       = `${ CLASS_SLIDE }__container`;\r\nexport const CLASS_ARROWS          = `${ PROJECT_CODE }__arrows`;\r\nexport const CLASS_ARROW           = `${ PROJECT_CODE }__arrow`;\r\nexport const CLASS_ARROW_PREV      = `${ CLASS_ARROW }--prev`;\r\nexport const CLASS_ARROW_NEXT      = `${ CLASS_ARROW }--next`;\r\nexport const CLASS_PAGINATION      = `${ PROJECT_CODE }__pagination`;\r\nexport const CLASS_PAGINATION_PAGE = `${ CLASS_PAGINATION }__page`;\r\nexport const CLASS_PROGRESS        = `${ PROJECT_CODE }__progress`;\r\nexport const CLASS_PROGRESS_BAR    = `${ CLASS_PROGRESS }__bar`;\r\nexport const CLASS_AUTOPLAY        = `${ PROJECT_CODE }__autoplay`;\r\nexport const CLASS_PLAY            = `${ PROJECT_CODE }__play`;\r\nexport const CLASS_PAUSE           = `${ PROJECT_CODE }__pause`;\r\nexport const CLASS_SPINNER         = `${ PROJECT_CODE }__spinner`;\r\nexport const CLASS_INITIALIZED     = 'is-initialized';\r\nexport const CLASS_ACTIVE          = 'is-active';\r\nexport const CLASS_PREV            = 'is-prev';\r\nexport const CLASS_NEXT            = 'is-next';\r\nexport const CLASS_VISIBLE         = 'is-visible';\r\nexport const CLASS_LOADING         = 'is-loading';\r\n\r\n/**\r\n * The array with all status classes.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const STATUS_CLASSES = [ CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING ];\r\n\r\n/**\r\n * The collection of classes for elements that Splide dynamically creates.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const CLASSES = {\r\n  slide     : CLASS_SLIDE,\r\n  clone     : CLASS_CLONE,\r\n  arrows    : CLASS_ARROWS,\r\n  arrow     : CLASS_ARROW,\r\n  prev      : CLASS_ARROW_PREV,\r\n  next      : CLASS_ARROW_NEXT,\r\n  pagination: CLASS_PAGINATION,\r\n  page      : CLASS_PAGINATION_PAGE,\r\n  spinner   : CLASS_SPINNER,\r\n};\r\n","import {\n  CLASS_ACTIVE,\n  CLASS_ARROW_NEXT,\n  CLASS_ARROW_PREV,\n  CLASS_ARROWS,\n  CLASS_AUTOPLAY,\n  CLASS_CLONE,\n  CLASS_LIST,\n  CLASS_PAUSE,\n  CLASS_PLAY,\n  CLASS_PROGRESS,\n  CLASS_PROGRESS_BAR,\n  CLASS_ROOT,\n  CLASS_SLIDE,\n  CLASS_SLIDER,\n  CLASS_TRACK,\n} from '../../constants/classes';\nimport { EVENT_REFRESH, EVENT_UPDATED } from '../../constants/events';\nimport { DEFAULT_EVENT_PRIORITY } from '../../constants/priority';\nimport { PROJECT_CODE } from '../../constants/project';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport {\n  addClass,\n  assert,\n  assign,\n  child,\n  children,\n  empty,\n  push,\n  query,\n  removeAttribute,\n  removeClass,\n  uniqueId,\n} from '../../utils';\n\n\n/**\n * The interface for elements which the slider consists of.\n *\n * @since 3.0.0\n */\nexport interface ElementCollection {\n  root: HTMLElement;\n  slider: HTMLElement;\n  track: HTMLElement;\n  list: HTMLElement;\n  slides: HTMLElement[];\n  arrows: HTMLElement;\n  prev: HTMLButtonElement;\n  next: HTMLButtonElement;\n  bar: HTMLElement;\n  autoplay: HTMLElement;\n  play: HTMLButtonElement;\n  pause: HTMLButtonElement;\n}\n\n/**\n * The interface for the Elements component.\n *\n * @since 3.0.0\n */\nexport interface ElementsComponent extends BaseComponent, ElementCollection {\n}\n\n/**\n * The component that collects and handles elements which the slider consists of.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return An Elements component object.\n */\nexport function Elements( Splide: Splide, Components: Components, options: Options ): ElementsComponent {\n  const { on } = EventInterface( Splide );\n  const { root } = Splide;\n  const elements: ElementCollection = {} as ElementCollection;\n\n  /**\n   * Stores all slide elements.\n   */\n  const slides: HTMLElement[] = [];\n\n  /**\n   * Stores all root classes.\n   */\n  let classes: string[];\n\n  /**\n   * The slider element that may be `undefined`.\n   */\n  let slider: HTMLElement;\n\n  /**\n   * The track element.\n   */\n  let track: HTMLElement;\n\n  /**\n   * The list element.\n   */\n  let list: HTMLElement;\n\n  /**\n   * Called when the component is constructed.\n   */\n  function setup(): void {\n    collect();\n    identify();\n    addClass( root, ( classes = getClasses() ) );\n  }\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    on( EVENT_REFRESH, refresh, DEFAULT_EVENT_PRIORITY - 2 );\n    on( EVENT_UPDATED, update );\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    [ root, track, list ].forEach( elm => {\n      removeAttribute( elm, 'style' );\n    } );\n\n    empty( slides );\n    removeClass( root, classes );\n  }\n\n  /**\n   * Recollects slide elements.\n   */\n  function refresh(): void {\n    destroy();\n    setup();\n  }\n\n  /**\n   * Updates the status of elements.\n   */\n  function update(): void {\n    removeClass( root, classes );\n    addClass( root, ( classes = getClasses() ) );\n  }\n\n  /**\n   * Collects elements which the slider consists of.\n   */\n  function collect(): void {\n    slider = child( root, `.${ CLASS_SLIDER }` );\n    track  = query( root, `.${ CLASS_TRACK }` );\n    list   = child( track, `.${ CLASS_LIST }` );\n\n    assert( track && list, 'A track/list element is missing.' );\n\n    push( slides, children( list, `.${ CLASS_SLIDE }:not(.${ CLASS_CLONE })` ) );\n\n    const autoplay = find( `.${ CLASS_AUTOPLAY }` );\n    const arrows   = find( `.${ CLASS_ARROWS }` );\n\n    assign( elements, {\n      root,\n      slider,\n      track,\n      list,\n      slides,\n      arrows,\n      autoplay,\n      prev : query( arrows, `.${ CLASS_ARROW_PREV }` ),\n      next : query( arrows, `.${ CLASS_ARROW_NEXT }` ),\n      bar  : query( find( `.${ CLASS_PROGRESS }` ), `.${ CLASS_PROGRESS_BAR }` ),\n      play : query( autoplay, `.${ CLASS_PLAY }` ),\n      pause: query( autoplay, `.${ CLASS_PAUSE }` ),\n    } );\n  }\n\n  /**\n   * Assigns unique IDs to essential elements.\n   */\n  function identify(): void {\n    const id = root.id || uniqueId( PROJECT_CODE );\n    root.id  = id;\n    track.id = track.id || `${ id }-track`;\n    list.id  = list.id || `${ id }-list`;\n  }\n\n  /**\n   * Finds an element only in children of the root or slider element.\n   *\n   * @return {Element} - A found element or undefined.\n   */\n  function find( selector: string ): HTMLElement {\n    return child( root, selector ) || child( slider, selector );\n  }\n\n  /**\n   * Return an array with classes for the root element.\n   *\n   * @return An array with classes.\n   */\n  function getClasses(): string[] {\n    return [\n      `${ CLASS_ROOT }--${ options.type }`,\n      `${ CLASS_ROOT }--${ options.direction }`,\n      options.drag && `${ CLASS_ROOT }--draggable`,\n      options.isNavigation && `${ CLASS_ROOT }--nav`,\n      CLASS_ACTIVE,\n    ];\n  }\n\n  return assign( elements, {\n    setup,\n    mount,\n    destroy,\n  } );\n}\n","export const ROLE             = 'role';\r\nexport const ARIA_CONTROLS    = 'aria-controls';\r\nexport const ARIA_CURRENT     = 'aria-current';\r\nexport const ARIA_LABEL       = 'aria-label';\r\nexport const ARIA_HIDDEN      = 'aria-hidden';\r\nexport const TAB_INDEX        = 'tabindex';\r\nexport const DISABLED         = 'disabled';\r\nexport const ARIA_ORIENTATION = 'aria-orientation';\r\n\r\n/**\r\n * The array with all attributes.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const ALL_ATTRIBUTES = [\r\n  ROLE,\r\n  ARIA_CONTROLS,\r\n  ARIA_CURRENT,\r\n  ARIA_LABEL,\r\n  ARIA_HIDDEN,\r\n  ARIA_ORIENTATION,\r\n  TAB_INDEX,\r\n  DISABLED,\r\n];\r\n","/**\r\n * The type for the regular slider.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const SLIDE = 'slide';\r\n\r\n/**\r\n * The type for the carousel slider.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const LOOP = 'loop';\r\n\r\n/**\r\n * The type for the fade slider that can not have multiple slides in a page.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const FADE = 'fade';\r\n","import {\n  ALL_ATTRIBUTES,\n  ARIA_CONTROLS,\n  ARIA_CURRENT,\n  ARIA_HIDDEN,\n  ARIA_LABEL,\n  ROLE,\n  TAB_INDEX,\n} from '../../constants/attributes';\nimport {\n  CLASS_ACTIVE,\n  CLASS_CONTAINER,\n  CLASS_NEXT,\n  CLASS_PREV,\n  CLASS_VISIBLE,\n  STATUS_CLASSES,\n} from '../../constants/classes';\nimport {\n  EVENT_ACTIVE,\n  EVENT_CLICK,\n  EVENT_HIDDEN,\n  EVENT_INACTIVE,\n  EVENT_MOVE,\n  EVENT_MOVED,\n  EVENT_REFRESH,\n  EVENT_REPOSITIONED,\n  EVENT_SCROLLED,\n  EVENT_SLIDE_KEYDOWN,\n  EVENT_VISIBLE,\n} from '../../constants/events';\nimport { FADE, SLIDE } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent } from '../../types';\nimport {\n  abs,\n  ceil,\n  child,\n  floor,\n  format,\n  getAttribute,\n  hasClass,\n  min,\n  pad,\n  queryAll,\n  rect,\n  removeAttribute,\n  removeClass,\n  setAttribute,\n  style as _style,\n  toggleClass,\n} from '../../utils';\n\n\n/**\n * The interface for the Slide sub component.\n *\n * @since 3.0.0\n */\nexport interface  SlideComponent extends BaseComponent {\n  index: number;\n  slideIndex: number;\n  slide: HTMLElement;\n  container: HTMLElement;\n  isClone: boolean;\n  style( prop: string, value: string | number, useContainer?: boolean ): void\n  isWithin( from: number, distance: number ): boolean;\n}\n\n/**\n * The sub component for managing each slide.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param index      - A slide index.\n * @param slideIndex - A slide index for clones. This must be `-1` if the slide is not a clone.\n * @param slide      - A slide element.\n *\n * @return A Slide sub component.\n */\nexport function Slide( Splide: Splide, index: number, slideIndex: number, slide: HTMLElement ): SlideComponent {\n  const { on, emit, bind, destroy: destroyEvents } = EventInterface( Splide );\n  const { Components, root, options } = Splide;\n  const { isNavigation, updateOnMove } = options;\n  const { resolve } = Components.Direction;\n  const styles         = getAttribute( slide, 'style' );\n  const isClone        = slideIndex > -1;\n  const container      = child( slide, `.${ CLASS_CONTAINER }` );\n  const focusableNodes = options.focusableNodes && queryAll( slide, options.focusableNodes );\n\n  /**\n   * Turns into `true` when the component is destroyed.\n   */\n  let destroyed: boolean;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount( this: SlideComponent ): void {\n    init();\n\n    bind( slide, 'click keydown', e => {\n      emit( e.type === 'click' ? EVENT_CLICK : EVENT_SLIDE_KEYDOWN, this, e );\n    } );\n\n    on( [ EVENT_REFRESH, EVENT_REPOSITIONED, EVENT_MOVED, EVENT_SCROLLED ], update.bind( this ) );\n\n    if ( updateOnMove ) {\n      on( EVENT_MOVE, onMove.bind( this ) );\n    }\n  }\n\n  /**\n   * Initializes the component.\n   */\n  function init(): void {\n    if ( ! isClone ) {\n      slide.id = `${ root.id }-slide${ pad( index + 1 ) }`;\n    }\n\n    if ( isNavigation ) {\n      const idx      = isClone ? slideIndex : index;\n      const label    = format( options.i18n.slideX, idx + 1 );\n      const controls = Splide.splides.map( splide => splide.root.id ).join( ' ' );\n\n      setAttribute( slide, ARIA_LABEL, label );\n      setAttribute( slide, ARIA_CONTROLS, controls );\n      setAttribute( slide, ROLE, 'menuitem' );\n    }\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    destroyed = true;\n    destroyEvents();\n    removeClass( slide, STATUS_CLASSES );\n    removeAttribute( slide, ALL_ATTRIBUTES );\n    setAttribute( slide, 'style', styles );\n  }\n\n  /**\n   * If the `updateOnMove` option is `true`, called when the slider starts moving.\n   *\n   * @param next - A next index.\n   * @param prev - A previous index.\n   * @param dest - A destination index.\n   */\n  function onMove( this: SlideComponent, next: number, prev: number, dest: number ): void {\n    if ( ! destroyed ) {\n      update.call( this );\n\n      if ( dest === index ) {\n        updateActivity.call( this, true );\n      }\n    }\n  }\n\n  /**\n   * Updates attribute and classes of the slide.\n   */\n  function update( this: SlideComponent ): void {\n    if ( ! destroyed ) {\n      const { index: currIndex } = Splide;\n\n      updateActivity.call( this, isActive() );\n      updateVisibility.call( this, isVisible() );\n\n      toggleClass( slide, CLASS_PREV, index === currIndex - 1 );\n      toggleClass( slide, CLASS_NEXT, index === currIndex + 1 );\n    }\n  }\n\n  /**\n   * Updates the status related with activity.\n   *\n   * @param active - Set `true` if the slide is active.\n   */\n  function updateActivity( this: SlideComponent, active: boolean ): void {\n    if ( active !== hasClass( slide, CLASS_ACTIVE ) ) {\n      toggleClass( slide, CLASS_ACTIVE, active );\n\n      if ( isNavigation ) {\n        setAttribute( slide, ARIA_CURRENT, active || null );\n      }\n\n      emit( active ? EVENT_ACTIVE : EVENT_INACTIVE, this );\n    }\n  }\n\n  /**\n   * Updates classes and attributes related with visibility.\n   *\n   * @param visible - Set `true` if the slide is visible.\n   */\n  function updateVisibility( this: SlideComponent, visible: boolean ): void {\n    const ariaHidden = ! visible && ! isActive();\n\n    setAttribute( slide, ARIA_HIDDEN, ariaHidden || null );\n    setAttribute( slide, TAB_INDEX, ! ariaHidden && options.slideFocus ? 0 : null );\n\n    if ( focusableNodes ) {\n      focusableNodes.forEach( node => {\n        setAttribute( node, TAB_INDEX, ariaHidden ? -1 : null );\n      } );\n    }\n\n    if ( visible !== hasClass( slide, CLASS_VISIBLE ) ) {\n      toggleClass( slide, CLASS_VISIBLE, visible );\n      emit( visible ? EVENT_VISIBLE : EVENT_HIDDEN, this );\n    }\n  }\n\n  /**\n   * Adds a CSS rule to the slider or the container.\n   *\n   * @param prop         - A property name.\n   * @param value        - A CSS value to add.\n   * @param useContainer - Optional. Determines whether to apply the rule to the container or not.\n   */\n  function style( prop: string, value: string | number, useContainer?: boolean ): void {\n    _style( ( useContainer && container ) || slide, prop, value );\n  }\n\n  /**\n   * Checks if the slide is active or not.\n   *\n   * @return `true` if the slide is active.\n   */\n  function isActive(): boolean {\n    return Splide.index === index;\n  }\n\n  /**\n   * Checks if the slide is visible or not.\n   */\n  function isVisible(): boolean {\n    if ( Splide.is( FADE ) ) {\n      return isActive();\n    }\n\n    const trackRect = rect( Components.Elements.track );\n    const slideRect = rect( slide );\n    const left      = resolve( 'left' );\n    const right     = resolve( 'right' );\n\n    return floor( trackRect[ left ] ) <= ceil( slideRect[ left ] )\n      && floor( slideRect[ right ] ) <= ceil( trackRect[ right ] );\n  }\n\n  /**\n   * Calculates how far this slide is from another slide and\n   * returns `true` if the distance is within the given number.\n   *\n   * @param from     - An index of a base slide.\n   * @param distance - `true` if the slide is within this number.\n   *\n   * @return `true` if the slide is within the `distance` from the base slide, or otherwise `false`.\n   */\n  function isWithin( from: number, distance: number ): boolean {\n    let diff = abs( from - index );\n\n    if ( ! Splide.is( SLIDE ) && ! isClone ) {\n      diff = min( diff, Splide.length - diff );\n    }\n\n    return diff <= distance;\n  }\n\n  return {\n    index,\n    slideIndex,\n    slide,\n    container,\n    isClone,\n    mount,\n    destroy,\n    style,\n    isWithin,\n  };\n}\n","import { EVENT_MOUNTED, EVENT_REFRESH, EVENT_RESIZE } from '../../constants/events';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { AnyFunction, BaseComponent, Components, Options } from '../../types';\nimport {\n  addClass,\n  append,\n  before,\n  between,\n  empty,\n  forEach as forEachItem,\n  includes,\n  isFunction,\n  isHTMLElement,\n  isString,\n  matches,\n  parseHtml,\n  queryAll,\n  remove as removeNode,\n  toArray,\n} from '../../utils';\nimport { Slide, SlideComponent } from './Slide';\n\n\n/**\n * The interface for the Slides component.\n *\n * @since 3.0.0\n */\nexport interface  SlidesComponent extends BaseComponent {\n  register( slide: HTMLElement, index: number, slideIndex: number ): void;\n  get( excludeClones?: boolean ): SlideComponent[];\n  getIn( page: number ): SlideComponent[];\n  getAt( index: number ): SlideComponent | undefined;\n  add( slide: string | Element | Array<string | Element>, index?: number ): void;\n  remove( selector: SlideMatcher ): void;\n  forEach( iteratee: SlidesIteratee, excludeClones?: boolean ): void;\n  filter( matcher: SlideMatcher ): SlideComponent[];\n  style( prop: string, value: string | number, useContainer?: boolean ): void\n  getLength( excludeClones?: boolean ): number;\n  isEnough(): boolean;\n}\n\n/**\n * The iteratee function for Slides.\n *\n * @since 3.0.0\n */\nexport type SlidesIteratee = ( Slide: SlideComponent, index: number, Slides: SlideComponent[] ) => void\n\n/**\n * The predicate function for Slides.\n *\n * @since 3.0.0\n */\nexport type SlidesPredicate = ( Slide: SlideComponent, index: number, Slides: SlideComponent[] ) => any\n\n/**\n * The type for filtering SlideComponent objects.\n *\n * @since 3.0.0\n */\nexport type SlideMatcher = number | number[] | string | SlidesPredicate;\n\n/**\n * The component for managing all slides include clones.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return An Slides component object.\n */\nexport function Slides( Splide: Splide, Components: Components, options: Options ): SlidesComponent {\n  const { on, emit, bind } = EventInterface( Splide );\n  const { slides, list } = Components.Elements;\n\n  /**\n   * Stores all SlideComponent objects.\n   */\n  const Slides: SlideComponent[] = [];\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    init();\n    on( EVENT_REFRESH, refresh );\n    on( [ EVENT_MOUNTED, EVENT_REFRESH ], () => {\n      Slides.sort( ( Slide1, Slide2 ) => Slide1.index - Slide2.index );\n    } );\n  }\n\n  /**\n   * Initializes the component.\n   */\n  function init(): void {\n    slides.forEach( ( slide, index ) => { register( slide, index, -1 ) } );\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    forEach( Slide => { Slide.destroy() } );\n    empty( Slides );\n  }\n\n  /**\n   * Discards all Slide components and regenerates them.\n   */\n  function refresh(): void {\n    destroy();\n    init();\n  }\n\n  /**\n   * Registers a slide element and creates a Slide object.\n   *\n   * @param slide      - A slide element to register.\n   * @param index      - A slide index.\n   * @param slideIndex - A slide index for clones. This must be `-1` for regular slides.\n   */\n  function register( slide: HTMLElement, index: number, slideIndex: number ): void {\n    const object = Slide( Splide, index, slideIndex, slide );\n    object.mount();\n    Slides.push( object );\n  }\n\n  /**\n   * Returns all Slide objects.\n   *\n   * @param excludeClones - Optional. Determines whether to exclude clones or not.\n   *\n   * @return An array with Slide objects.\n   */\n  function get( excludeClones?: boolean ): SlideComponent[] {\n    return excludeClones ? filter( Slide => ! Slide.isClone ) : Slides;\n  }\n\n  /**\n   * Returns slides in the specified page.\n   *\n   * @param page - A page index.\n   *\n   * @return An array with slides that belong to the page.\n   */\n  function getIn( page: number ): SlideComponent[] {\n    const { Controller } = Components;\n    const index = Controller.toIndex( page );\n    const max   = Controller.hasFocus() ? 1 : options.perPage;\n    return filter( Slide => between( Slide.index, index, index + max - 1 ) );\n  }\n\n  /**\n   * Returns a Slide object at the specified index.\n   *\n   * @param index - A slide index.\n   *\n   * @return A Slide object if available, or otherwise `undefined`.\n   */\n  function getAt( index: number ): SlideComponent | undefined {\n    return filter( index )[ 0 ];\n  }\n\n  /**\n   * Inserts a slide or slides at a specified index.\n   *\n   * @param items - A slide element, an HTML string or an array with them.\n   * @param index - Optional. An index to insert the slide at. If omitted, appends it to the list.\n   */\n  function add( items: string | Element | Array<string | Element>, index?: number ): void {\n    forEachItem( items, slide => {\n      if ( isString( slide ) ) {\n        slide = parseHtml( slide );\n      }\n\n      if ( isHTMLElement( slide ) ) {\n        const ref = slides[ index ];\n        ref ? before( slide, ref ) : append( list, slide );\n        addClass( slide, options.classes.slide );\n        observeImages( slide, emit.bind( null, EVENT_RESIZE ) );\n      }\n    } );\n\n    emit( EVENT_REFRESH );\n  }\n\n  /**\n   * Removes slides that match the matcher\n   * that can be an index, an array with indices, a selector, or an iteratee function.\n   *\n   * @param matcher - An index, an array with indices, a selector string, or an iteratee function.\n   */\n  function remove( matcher: SlideMatcher ): void {\n    removeNode( filter( matcher ).map( Slide => Slide.slide ) );\n    emit( EVENT_REFRESH );\n  }\n\n  /**\n   * Iterates over Slide objects by the iteratee function.\n   *\n   * @param iteratee      - An iteratee function that takes a Slide object, an index and an array with Slides.\n   * @param excludeClones - Optional. Determines whether to exclude clones or not.\n   */\n  function forEach( iteratee: SlidesIteratee, excludeClones?: boolean ): void {\n    get( excludeClones ).forEach( iteratee );\n  }\n\n  /**\n   * Filters Slides by the matcher\n   * that can be an index, an array with indices, a selector, or a predicate function.\n   *\n   * @param matcher - An index, an array with indices, a selector string, or a predicate function.\n   *\n   * @return An array with SlideComponent objects.\n   */\n  function filter( matcher: SlideMatcher ): SlideComponent[] {\n    return Slides.filter( isFunction( matcher )\n      ? matcher\n      : Slide => isString( matcher )\n        ? matches( Slide.slide, matcher )\n        : includes( toArray( matcher ), Slide.index )\n    );\n  }\n\n  /**\n   * Adds a CSS rule to all slides or containers.\n   *\n   * @param prop         - A property name.\n   * @param value        - A CSS value to add.\n   * @param useContainer - Optional. Determines whether to apply the rule to the container or not.\n   */\n  function style( prop: string, value: string | number, useContainer?: boolean ): void {\n    forEach( Slide => { Slide.style( prop, value, useContainer ) } );\n  }\n\n  /**\n   * Invokes the callback after all images in the element are loaded.\n   *\n   * @param elm      - An element that may contain images.\n   * @param callback - A callback function.\n   */\n  function observeImages( elm: Element, callback: AnyFunction ): void {\n    const images = queryAll( elm, 'img' );\n    let { length } = images;\n\n    if ( length ) {\n      images.forEach( img => {\n        bind( img, 'load error', () => {\n          if ( ! --length ) {\n            callback();\n          }\n        } );\n      } );\n    } else {\n      callback();\n    }\n  }\n\n  /**\n   * Returns the length of slides.\n   *\n   * @param excludeClones - Optional. Determines whether to exclude clones or not.\n   *\n   * @return The length of slides.\n   */\n  function getLength( excludeClones?: boolean ): number {\n    return excludeClones ? slides.length : Slides.length;\n  }\n\n  /**\n   * Checks if the number of slides is over than the `perPage` option, including clones.\n   *\n   * @return `true` if there are enough slides, or otherwise `false`.\n   */\n  function isEnough(): boolean {\n    return Slides.length > options.perPage;\n  }\n\n  return {\n    mount,\n    destroy,\n    register,\n    get,\n    getIn,\n    getAt,\n    add,\n    remove,\n    forEach,\n    filter,\n    style,\n    getLength,\n    isEnough,\n  };\n}\n","import { TTB } from '../../constants/directions';\nimport { EVENT_REFRESH, EVENT_RESIZE, EVENT_RESIZED, EVENT_UPDATED } from '../../constants/events';\nimport { EventInterface, Throttle } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport { abs, assert, isObject, rect, style, unit } from '../../utils';\n\n\n/**\n * The interface for the Layout component.\n *\n * @since 3.0.0\n */\nexport interface LayoutComponent extends BaseComponent {\n  listSize(): number;\n  slideSize( index: number, withoutGap?: boolean ): number;\n  sliderSize(): number;\n  totalSize( index?: number, withoutGap?: boolean ): number;\n  getPadding( right: boolean ): number;\n}\n\n/**\n * The component that layouts slider components and provides methods for dimensions.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return An Layout component object.\n */\nexport function Layout( Splide: Splide, Components: Components, options: Options ): LayoutComponent {\n  const { on, bind, emit } = EventInterface( Splide );\n  const { Slides } = Components;\n  const { resolve } = Components.Direction;\n  const { track, list } = Components.Elements;\n  const { getAt } = Slides;\n\n  /**\n   * Indicates whether the slider direction is vertical or not.\n   */\n  let vertical: boolean;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    init();\n    bind( window, 'resize load', Throttle( emit.bind( this, EVENT_RESIZE ) ) );\n    on( [ EVENT_UPDATED, EVENT_REFRESH ], init );\n    on( EVENT_RESIZE, resize );\n  }\n\n  /**\n   * Initializes the component on `mount` or `updated`.\n   * Uses `max-width` for the root to prevent the slider from exceeding the parent element.\n   */\n  function init(): void {\n    vertical = options.direction === TTB;\n\n    style( Splide.root, 'maxWidth', unit( options.width ) );\n    style( track, resolve( 'paddingLeft' ), cssPadding( false ) );\n    style( track, resolve( 'paddingRight' ), cssPadding( true ) );\n\n    resize();\n  }\n\n  /**\n   * Updates dimensions of some elements when the slider is resized.\n   */\n  function resize(): void {\n    style( track, 'height', cssTrackHeight() );\n\n    Slides.style( resolve( 'marginRight' ), unit( options.gap ) );\n    Slides.style( 'width', cssSlideWidth() || null );\n    setSlidesHeight();\n\n    emit( EVENT_RESIZED );\n  }\n\n  /**\n   * Updates the height of slides or their container elements if available.\n   */\n  function setSlidesHeight(): void {\n    Slides.style( 'height', cssSlideHeight() || null, true );\n  }\n\n  /**\n   * Parses the padding option and returns the value for each side.\n   * This method returns `paddingTop` or `paddingBottom` for the vertical slider.\n   *\n   * @param right - Determines whether to get `paddingRight/Bottom` or `paddingLeft/Top`.\n   *\n   * @return The padding value as a CSS string.\n   */\n  function cssPadding( right: boolean ): string {\n    const { padding } = options;\n    const prop = resolve( right ? 'right' : 'left', true );\n    return padding && unit( padding[ prop ] || ( isObject( padding ) ? 0 : padding ) ) || '0px';\n  }\n\n  /**\n   * Returns the height of the track element as a CSS string.\n   *\n   * @return The height of the track.\n   */\n  function cssTrackHeight(): string {\n    let height = '';\n\n    if ( vertical ) {\n      height = cssHeight();\n      assert( height, 'height or heightRatio is missing.' );\n      height = `calc(${ height } - ${ cssPadding( false ) } - ${ cssPadding( true ) })`;\n    }\n\n    return height;\n  }\n\n  /**\n   * Converts options related with height to a CSS string.\n   *\n   * @return The height as a CSS string if available, or otherwise an empty string.\n   */\n  function cssHeight(): string {\n    return unit( options.height || rect( list ).width * options.heightRatio );\n  }\n\n  /**\n   * Returns the width of the slide as a CSS string.\n   *\n   * @return The width of the slide.\n   */\n  function cssSlideWidth(): string {\n    return options.autoWidth ? '' : unit( options.fixedWidth ) || ( vertical ? '' : cssSlideSize() );\n  }\n\n  /**\n   * Returns the height of the slide as a CSS string.\n   *\n   * @return The height of the slide.\n   */\n  function cssSlideHeight(): string {\n    return unit( options.fixedHeight )\n      || ( vertical ? ( options.autoHeight ? '' : cssSlideSize() ) : cssHeight() );\n  }\n\n  /**\n   * Returns the CSS string for slide width or height without gap.\n   *\n   * @return The CSS string for slide width or height.\n   */\n  function cssSlideSize(): string {\n    const gap = unit( options.gap );\n    return `calc((100%${ gap && ` + ${ gap }` })/${ options.perPage || 1 }${ gap && ` - ${ gap }` })`;\n  }\n\n  /**\n   * Returns the list width for the horizontal slider, or the height for the vertical slider.\n   *\n   * @return The size of the track element in pixel.\n   */\n  function listSize(): number {\n    return rect( list )[ resolve( 'width' ) ];\n  }\n\n  /**\n   * Returns the slide width for the horizontal slider, or the height for the vertical slider.\n   *\n   * @param index      - Optional. A slide index.\n   * @param withoutGap - Optional. Determines whether to exclude the gap amount or not.\n   *\n   * @return The size of the specified slide element in pixel.\n   */\n  function slideSize( index?: number, withoutGap?: boolean ): number {\n    const Slide = getAt( index || 0 );\n    return Slide\n      ? rect( Slide.slide )[ resolve( 'width' ) ] + ( withoutGap ? 0 : getGap() )\n      : 0;\n  }\n\n  /**\n   * Returns the total width or height of slides from the head of the slider to the specified index.\n   * This includes sizes of clones before the first slide.\n   *\n   * @param index      - A slide index. If omitted, uses the last index.\n   * @param withoutGap - Optional. Determines whether to exclude the last gap or not.\n   *\n   * @return The total width of slides in the horizontal slider, or the height in the vertical one.\n   */\n  function totalSize( index: number, withoutGap?: boolean ): number {\n    const Slide = getAt( index );\n\n    if ( Slide ) {\n      const right = rect( Slide.slide )[ resolve( 'right' ) ];\n      const left  = rect( list )[ resolve( 'left' ) ];\n      return abs( right - left ) + ( withoutGap ? 0 : getGap() );\n    }\n\n    return 0;\n  }\n\n  /**\n   * Returns the slider size without clones before the first slide.\n   *\n   * @return The width or height of the slider without clones.\n   */\n  function sliderSize(): number {\n    return totalSize( Splide.length - 1, true ) - totalSize( -1, true );\n  }\n\n  /**\n   * Returns the gap value.\n   *\n   * @return The gap value in pixel.\n   */\n  function getGap(): number {\n    const Slide = getAt( 0 );\n    return Slide && parseFloat( style( Slide.slide, resolve( 'marginRight' ) ) ) || 0;\n  }\n\n  /**\n   * Returns the padding value.\n   *\n   * @param right - Determines whether to get `paddingRight/Bottom` or `paddingLeft/Top`.\n   *\n   * @return The padding value in pixel.\n   */\n  function getPadding( right: boolean ): number {\n    return parseFloat( style( track, resolve( `padding${ right ? 'Right' : 'Left' }`, true ) ) ) || 0;\n  }\n\n  return {\n    mount,\n    listSize,\n    slideSize,\n    sliderSize,\n    totalSize,\n    getPadding,\n  };\n}\n","import { EVENT_REFRESH, EVENT_RESIZE, EVENT_UPDATED } from '../../constants/events';\nimport { LOOP } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport { addClass, append, before, ceil, empty, measure, pad, push, rect, remove } from '../../utils';\n\n\n/**\n * The interface for the Clone component.\n *\n * @since 3.0.0\n */\nexport interface CloneComponent extends BaseComponent {\n}\n\n/**\n * The component that generates clones for the loop slider.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Clones component object.\n */\nexport function Clones( Splide: Splide, Components: Components, options: Options ): CloneComponent {\n  const { on, emit } = EventInterface( Splide );\n  const { Elements, Slides } = Components;\n  const { resolve } = Components.Direction;\n\n  /**\n   * Stores all cloned elements.\n   */\n  const clones: HTMLElement[] = [];\n\n  /**\n   * Keeps the current number of clones.\n   */\n  let cloneCount: number;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    init();\n    on( EVENT_REFRESH, refresh );\n    on( [ EVENT_UPDATED, EVENT_RESIZE ], observe );\n  }\n\n  /**\n   * Removes all clones if available, and generates new clones.\n   */\n  function init(): void {\n    if ( ( cloneCount = computeCloneCount() ) ) {\n      generate( cloneCount );\n      emit( EVENT_RESIZE );\n    }\n  }\n\n  /**\n   * Destroys clones.\n   */\n  function destroy(): void {\n    remove( clones );\n    empty( clones );\n  }\n\n  /**\n   * Discards all clones and regenerates them.\n   * Must do this before the Elements component collects slide elements.\n   */\n  function refresh(): void {\n    destroy();\n    init();\n  }\n\n  /**\n   * Observes the required clone count and refreshes the slider if necessary.\n   */\n  function observe(): void {\n    if ( cloneCount < computeCloneCount() ) {\n      emit( EVENT_REFRESH );\n    }\n  }\n\n  /**\n   * Generates the specified number of clones.\n   *\n   * @param count - The number of clones to generate for each side.\n   */\n  function generate( count: number ): void {\n    const slides = Slides.get().slice();\n    const { length } = slides;\n\n    if ( length ) {\n      while ( slides.length < count ) {\n        push( slides, slides );\n      }\n\n      push( slides.slice( -count ), slides.slice( 0, count ) ).forEach( ( Slide, index ) => {\n        const isHead = index < count;\n        const clone  = cloneDeep( Slide.slide, index );\n        isHead ? before( clone, slides[ 0 ].slide ) : append( Elements.list, clone );\n        push( clones, clone );\n        Slides.register( clone, index - count + ( isHead ? 0 : length ), Slide.index );\n      } );\n    }\n  }\n\n  /**\n   * Deeply clones the provided element with removing the ID attribute.\n   *\n   * @param elm   - An element to clone.\n   * @param index - An index of the clone.\n   *\n   * @return A cloned element.\n   */\n  function cloneDeep( elm: HTMLElement, index: number ): HTMLElement {\n    const clone = elm.cloneNode( true ) as HTMLElement;\n    addClass( clone, options.classes.clone );\n    clone.id = `${ Splide.root.id }-clone${ pad( index + 1 ) }`;\n    return clone;\n  }\n\n  /**\n   * Returns the number of elements to generate.\n   * This always returns 0 if the slider type is not `'loop'`.\n   *\n   * @return The number of clones.\n   */\n  function computeCloneCount(): number {\n    let { clones } = options;\n\n    if ( ! Splide.is( LOOP ) ) {\n      clones = 0;\n    } else if ( ! clones ) {\n      const fixedSize  = measure( Elements.list, options[ resolve( 'fixedWidth' ) ] );\n      const fixedCount = fixedSize && ceil( rect( Elements.track )[ resolve( 'width' ) ] / fixedSize );\n      const baseCount  = fixedCount || ( options[ resolve( 'autoWidth' ) ] && Splide.length ) || options.perPage;\n\n      clones = baseCount * ( options.drag ? ( options.flickMaxPages || 1 ) + 1 : 2 );\n    }\n\n    return clones;\n  }\n\n  return {\n    mount,\n    destroy,\n  };\n}\n","import {\n  EVENT_MOUNTED,\n  EVENT_MOVE,\n  EVENT_MOVED,\n  EVENT_REFRESH,\n  EVENT_REPOSITIONED,\n  EVENT_RESIZED,\n  EVENT_UPDATED,\n} from '../../constants/events';\nimport { IDLE, MOVING } from '../../constants/states';\nimport { FADE, LOOP, SLIDE } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { AnyFunction, BaseComponent, Components, Options } from '../../types';\nimport { abs, ceil, clamp, isUndefined, rect, removeAttribute, sign } from '../../utils';\n\n\n/**\n * The interface for the Move component.\n *\n * @since 3.0.0\n */\nexport interface MoveComponent extends BaseComponent {\n  move( dest: number, index: number, prev: number, callback?: AnyFunction ): void;\n  jump( index: number ): void;\n  translate( position: number, preventLoop?: boolean ): void;\n  shift( position: number, backwards: boolean ): number;\n  cancel(): void;\n  toIndex( position: number ): number;\n  toPosition( index: number, trimming?: boolean ): number;\n  getPosition(): number;\n  getLimit( max: boolean ): number;\n  isBusy(): boolean;\n  exceededLimit( max?: boolean | undefined, position?: number ): boolean;\n}\n\n/**\n * The component for moving the slider.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Move component object.\n */\nexport function Move( Splide: Splide, Components: Components, options: Options ): MoveComponent {\n  const { on, emit } = EventInterface( Splide );\n  const { slideSize, getPadding, totalSize, listSize, sliderSize } = Components.Layout;\n  const { resolve, orient } = Components.Direction;\n  const { list, track } = Components.Elements;\n\n  /**\n   * Indicates whether the component can move the slider or not.\n   */\n  let waiting: boolean;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    on( [ EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH ], reposition );\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    removeAttribute( list, 'style' );\n  }\n\n  /**\n   * Repositions the slider.\n   * This must be called before the Slide component checks the visibility.\n   * Do not call `cancel()` here because LazyLoad may emit resize while transitioning.\n   */\n  function reposition(): void {\n    Components.Scroll.cancel();\n    jump( Splide.index );\n    emit( EVENT_REPOSITIONED );\n  }\n\n  /**\n   * Moves the slider to the dest index with the Transition component.\n   *\n   * @param dest     - A destination index to go to, including clones'.\n   * @param index    - A slide index.\n   * @param prev     - A previous index.\n   * @param callback - Optional. A callback function invoked after transition ends.\n   */\n  function move( dest: number, index: number, prev: number, callback?: AnyFunction ): void {\n    if ( ! isBusy() ) {\n      const { set } = Splide.state;\n      const position = getPosition();\n      const looping  = dest !== index;\n\n      waiting = looping || options.waitForTransition;\n      set( MOVING );\n      emit( EVENT_MOVE, index, prev, dest );\n\n      Components.Transition.start( dest, () => {\n        looping && jump( index );\n        waiting = false;\n        set( IDLE );\n        emit( EVENT_MOVED, index, prev, dest );\n\n        if ( options.trimSpace === 'move' && dest !== prev && position === getPosition() ) {\n          Components.Controller.go( dest > prev ? '>' : '<', false, callback );\n        } else {\n          callback && callback();\n        }\n      } );\n    }\n  }\n\n  /**\n   * Jumps to the slide at the specified index.\n   *\n   * @param index - An index to jump to.\n   */\n  function jump( index: number ): void {\n    translate( toPosition( index, true ) );\n  }\n\n  /**\n   * Moves the slider to the provided position.\n   *\n   * @param position    - The position to move to.\n   * @param preventLoop - Optional. If `true`, sets the provided position as is.\n   */\n  function translate( position: number, preventLoop?: boolean ): void {\n    if ( ! Splide.is( FADE ) ) {\n      list.style.transform = `translate${ resolve( 'X' ) }(${ preventLoop ? position : loop( position ) }px)`;\n    }\n  }\n\n  /**\n   * Loops the provided position if it exceeds bounds.\n   *\n   * @param position - A position to loop.\n   */\n  function loop( position: number ): number {\n    if ( ! waiting && Splide.is( LOOP ) ) {\n      const diff        = orient( position - getPosition() );\n      const exceededMin = exceededLimit( false, position ) && diff < 0;\n      const exceededMax = exceededLimit( true, position ) && diff > 0;\n\n      if ( exceededMin || exceededMax ) {\n        position = shift( position, exceededMax );\n      }\n    }\n\n    return position;\n  }\n\n  /**\n   * Adds or subtracts the slider width to the provided position.\n   *\n   * @param position  - A position to shift.\n   * @param backwards - Determines whether to shift the slider backwards or forwards.\n   *\n   * @return The shifted position.\n   */\n  function shift( position: number, backwards: boolean ): number {\n    const excess = position - getLimit( backwards );\n    const size   = sliderSize();\n    position -= sign( excess ) * size * ceil( abs( excess ) / size );\n    return position;\n  }\n\n  /**\n   * Cancels transition.\n   */\n  function cancel(): void {\n    waiting = false;\n    translate( getPosition() );\n    Components.Transition.cancel();\n  }\n\n  /**\n   * Returns the closest index to the position.\n   *\n   * @param position - A position to convert.\n   *\n   * @return The closest index to the position.\n   */\n  function toIndex( position: number ): number {\n    const Slides = Components.Slides.get();\n\n    let index       = 0;\n    let minDistance = Infinity;\n\n    for ( let i = 0; i < Slides.length; i++ ) {\n      const slideIndex = Slides[ i ].index;\n      const distance   = abs( toPosition( slideIndex, true ) - position );\n\n      if ( distance <= minDistance ) {\n        minDistance = distance;\n        index       = slideIndex;\n      } else {\n        break;\n      }\n    }\n\n    return index;\n  }\n\n  /**\n   * Converts the slide index to the position.\n   *\n   * @param index    - An index to convert.\n   * @param trimming - Optional. Whether to trim edge spaces or not.\n   *\n   * @return The position corresponding with the index.\n   */\n  function toPosition( index: number, trimming?: boolean ): number {\n    const position = orient( totalSize( index - 1 ) - offset( index ) );\n    return trimming ? trim( position ) : position;\n  }\n\n  /**\n   * Returns the current position.\n   *\n   * @return The position of the list element.\n   */\n  function getPosition(): number {\n    const left = resolve( 'left' );\n    return rect( list )[ left ] - rect( track )[ left ] + orient( getPadding( false ) );\n  }\n\n  /**\n   * Trims spaces on the edge of the slider.\n   *\n   * @param position - A position to trim.\n   *\n   * @return A trimmed position.\n   */\n  function trim( position: number ): number {\n    if ( options.trimSpace && Splide.is( SLIDE ) ) {\n      position = clamp( position, 0, orient( sliderSize() - listSize() ) );\n    }\n\n    return position;\n  }\n\n  /**\n   * Returns the offset amount.\n   *\n   * @param index - An index.\n   */\n  function offset( index: number ): number {\n    const { focus } = options;\n    return focus === 'center' ? ( listSize() - slideSize( index, true ) ) / 2 : +focus * slideSize( index ) || 0;\n  }\n\n  /**\n   * Returns the limit number that the slider can move to.\n   *\n   * @param max - Determines whether to return the maximum or minimum limit.\n   *\n   * @return The border number.\n   */\n  function getLimit( max: boolean ): number {\n    return toPosition( max ? Components.Controller.getEnd() : 0, !! options.trimSpace );\n  }\n\n  /**\n   * Checks if the slider can move now or not.\n   *\n   * @return `true` if the slider can move, or otherwise `false`.\n   */\n  function isBusy(): boolean {\n    return !! waiting;\n  }\n\n  /**\n   * Checks if the provided position exceeds the minimum or maximum limit or not.\n   *\n   * @param max      - Optional. `true` for testing max, `false` for min, and `undefined` for both.\n   * @param position - Optional. A position to test. If omitted, tests the current position.\n   *\n   * @return `true` if the position exceeds the limit, or otherwise `false`.\n   */\n  function exceededLimit( max?: boolean | undefined, position?: number ): boolean {\n    position = isUndefined( position ) ? getPosition() : position;\n    const exceededMin = max !== true && orient( position ) < orient( getLimit( false ) );\n    const exceededMax = max !== false && orient( position ) > orient( getLimit( true ) );\n    return exceededMin || exceededMax;\n  }\n\n  return {\n    mount,\n    destroy,\n    move,\n    jump,\n    translate,\n    shift,\n    cancel,\n    toIndex,\n    toPosition,\n    getPosition,\n    getLimit,\n    isBusy,\n    exceededLimit,\n  };\n}\n","import { EVENT_REFRESH, EVENT_UPDATED } from '../../constants/events';\nimport { DEFAULT_EVENT_PRIORITY } from '../../constants/priority';\nimport { LOOP, SLIDE } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { AnyFunction, BaseComponent, Components, Options } from '../../types';\nimport { approximatelyEqual, between, clamp, floor, isString, isUndefined, max } from '../../utils';\n\n\n/**\n * The interface for the Controller component.\n *\n * @since 3.0.0\n */\nexport interface ControllerComponent extends BaseComponent {\n  go( control: number | string, allowSameIndex?: boolean, callback?: AnyFunction ): void;\n  scroll( destination: number, useIndex?: boolean, snap?: boolean, duration?: number, callback?: AnyFunction ): void;\n  getNext( destination?: boolean ): number;\n  getPrev( destination?: boolean ): number;\n  getEnd(): number;\n  setIndex( index: number ): void;\n  getIndex( prev?: boolean ): number;\n  toIndex( page: number ): number;\n  toPage( index: number ): number;\n  toDest( position: number ): number;\n  hasFocus(): boolean;\n}\n\n/**\n * The component for controlling the slider.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Controller component object.\n */\nexport function Controller( Splide: Splide, Components: Components, options: Options ): ControllerComponent {\n  const { on } = EventInterface( Splide );\n  const { Move } = Components;\n  const { getPosition, getLimit } = Move;\n  const { isEnough, getLength } = Components.Slides;\n  const isLoop  = Splide.is( LOOP );\n  const isSlide = Splide.is( SLIDE );\n\n  /**\n   * The current index.\n   */\n  let currIndex = options.start || 0;\n\n  /**\n   * The previous index.\n   */\n  let prevIndex = currIndex;\n\n  /**\n   * The latest number of slides.\n   */\n  let slideCount: number;\n\n  /**\n   * The latest `perMove` value.\n   */\n  let perMove: number;\n\n  /**\n   * The latest `perMove` value.\n   */\n  let perPage: number;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    init();\n    on( [ EVENT_UPDATED, EVENT_REFRESH ], init, DEFAULT_EVENT_PRIORITY - 1 );\n  }\n\n  /**\n   * Initializes some parameters.\n   * Needs to check the slides length since the current index may be out of the range after refresh.\n   */\n  function init(): void {\n    slideCount = getLength( true );\n    perMove    = options.perMove;\n    perPage    = options.perPage;\n    currIndex  = clamp( currIndex, 0, slideCount - 1 );\n  }\n\n  /**\n   * Moves the slider by the control pattern.\n   *\n   * @see `Splide#go()`\n   *\n   * @param control        - A control pattern.\n   * @param allowSameIndex - Optional. Determines whether to allow to go to the current index or not.\n   * @param callback       - Optional. A callback function invoked after transition ends.\n   */\n  function go( control: number | string, allowSameIndex?: boolean, callback?: AnyFunction ): void {\n    const dest = parse( control );\n\n    if ( options.useScroll ) {\n      scroll( dest, true, true, options.speed, callback );\n    } else {\n      const index = loop( dest );\n\n      if ( index > -1 && ! Move.isBusy() && ( allowSameIndex || index !== currIndex ) ) {\n        setIndex( index );\n        Move.move( dest, index, prevIndex, callback );\n      }\n    }\n  }\n\n  /**\n   * Scrolls the slider to the specified destination with updating indices.\n   *\n   * @param destination - A position or an index to scroll to.\n   * @param useIndex    - Optional. Whether to use an index as a destination or not.\n   * @param snap        - Optional. Whether to snap the closest slide or not.\n   * @param duration    - Optional. Specifies the scroll duration.\n   * @param callback    - Optional. A callback function invoked after scroll ends.\n   */\n  function scroll(\n    destination: number,\n    useIndex?: boolean,\n    snap?: boolean,\n    duration?: number,\n    callback?: AnyFunction\n  ): void {\n    const dest = useIndex ? destination : toDest( destination );\n\n    Components.Scroll.scroll( useIndex || snap ? Move.toPosition( dest, true ) : destination, duration, () => {\n      setIndex( Move.toIndex( Move.getPosition() ) );\n      callback && callback();\n    } );\n  }\n\n  /**\n   * Parses the control and returns a slide index.\n   *\n   * @param control - A control pattern to parse.\n   *\n   * @return A `dest` index.\n   */\n  function parse( control: number | string ): number {\n    let index = currIndex;\n\n    if ( isString( control ) ) {\n      const [ , indicator, number ] = control.match( /([+\\-<>])(\\d+)?/ ) || [];\n\n      if ( indicator === '+' || indicator === '-' ) {\n        index = computeDestIndex( currIndex + +`${ indicator }${ +number || 1 }`, currIndex, true );\n      } else if ( indicator === '>' ) {\n        index = number ? toIndex( +number ) : getNext( true );\n      } else if ( indicator === '<' ) {\n        index = getPrev( true );\n      }\n    } else {\n      if ( isLoop ) {\n        index = clamp( control, -perPage, slideCount + perPage - 1 );\n      } else {\n        index = clamp( control, 0, getEnd() );\n      }\n    }\n\n    return index;\n  }\n\n  /**\n   * Returns a next destination index.\n   *\n   * @param destination - Optional. Determines whether to get a destination index or a slide one.\n   *\n   * @return A next index if available, or otherwise `-1`.\n   */\n  function getNext( destination?: boolean ): number {\n    return getAdjacent( false, destination );\n  }\n\n  /**\n   * Returns a previous destination index.\n   *\n   * @param destination - Optional. Determines whether to get a destination index or a slide one.\n   *\n   * @return A previous index if available, or otherwise `-1`.\n   */\n  function getPrev( destination?: boolean ): number {\n    return getAdjacent( true, destination );\n  }\n\n  /**\n   * Returns an adjacent destination index.\n   *\n   * @param prev        - Determines whether to return a previous or next index.\n   * @param destination - Optional. Determines whether to get a destination index or a slide one.\n   *\n   * @return An adjacent index if available, or otherwise `-1`.\n   */\n  function getAdjacent( prev: boolean, destination?: boolean ): number {\n    const number = perMove || ( hasFocus() ? 1 : perPage );\n    const dest   = computeDestIndex( currIndex + number * ( prev ? -1 : 1 ), currIndex );\n\n    if ( dest === -1 && isSlide ) {\n      if ( ! approximatelyEqual( getPosition(), getLimit( ! prev ), 1 ) ) {\n        return prev ? 0 : getEnd();\n      }\n    }\n\n    return destination ? dest : loop( dest );\n  }\n\n  /**\n   * Converts the desired destination index to the valid one.\n   * - This may return clone indices if the editor is the loop mode,\n   *   or `-1` if there is no slide to go.\n   * - There are still slides where the slider can go if borders are between `from` and `dest`.\n   *\n   * @param dest        - The desired destination.\n   * @param from        - A base index.\n   * @param incremental - Optional. Whether the control is incremental or not.\n   *\n   * @return A converted destination index, including clones.\n   */\n  function computeDestIndex( dest: number, from: number, incremental?: boolean ): number {\n    if ( isEnough() ) {\n      const end = getEnd();\n\n      // Will overrun:\n      if ( dest < 0 || dest > end ) {\n        if ( between( 0, dest, from, true ) || between( end, from, dest, true ) ) {\n          dest = toIndex( toPage( dest ) );\n        } else {\n          if ( isLoop ) {\n            dest = perMove\n              ? dest\n              : dest < 0 ? - ( slideCount % perPage || perPage ) : slideCount;\n          } else if ( options.rewind ) {\n            dest = dest < 0 ? end : 0;\n          } else {\n            dest = -1;\n          }\n        }\n      } else {\n        if ( ! isLoop && ! incremental && dest !== from ) {\n          dest = perMove ? dest : toIndex( toPage( from ) + ( dest < from ? -1 : 1 ) );\n        }\n      }\n    } else {\n      dest = -1;\n    }\n\n    return dest;\n  }\n\n  /**\n   * Returns the end index where the slider can go.\n   * For example, if the slider has 10 slides and the `perPage` option is 3,\n   * the slider can go to the slide 8 (the index is 7).\n   *\n   * @return An end index.\n   */\n  function getEnd(): number {\n    let end = slideCount - perPage;\n\n    if ( hasFocus() || ( isLoop && perMove ) ) {\n      end = slideCount - 1;\n    }\n\n    return max( end, 0 );\n  }\n\n  /**\n   * Loops the provided index only in the loop mode.\n   *\n   * @param index - An index to loop.\n   *\n   * @return A looped index.\n   */\n  function loop( index: number ): number {\n    if ( isLoop ) {\n      return isEnough() ? index % slideCount + ( index < 0 ? slideCount : 0 ) : -1;\n    }\n\n    return index;\n  }\n\n  /**\n   * Converts the page index to the slide index.\n   *\n   * @param page - A page index to convert.\n   *\n   * @return A slide index.\n   */\n  function toIndex( page: number ): number {\n    return clamp( hasFocus() ? page : perPage * page, 0, getEnd() );\n  }\n\n  /**\n   * Converts the slide index to the page index.\n   *\n   * @param index - An index to convert.\n   */\n  function toPage( index: number ): number {\n    if ( ! hasFocus() ) {\n      index = between( index, slideCount - perPage, slideCount - 1 ) ? slideCount - 1 : index;\n      index = floor( index / perPage );\n    }\n\n    return index;\n  }\n\n  /**\n   * Converts the destination position to the dest index.\n   *\n   * @param destination - A position to convert.\n   *\n   * @return A dest index.\n   */\n  function toDest( destination: number ): number {\n    const closest = Move.toIndex( destination );\n    return isSlide ? clamp( closest, 0, getEnd() ) : closest;\n  }\n\n  /**\n   * Sets a new index and retains old one.\n   *\n   * @param index - A new index to set.\n   */\n  function setIndex( index: number ): void {\n    if ( index !== currIndex ) {\n      prevIndex = currIndex;\n      currIndex = index;\n    }\n  }\n\n  /**\n   * Returns the current/previous index.\n   *\n   * @param prev - Optional. Whether to return previous index or not.\n   */\n  function getIndex( prev?: boolean ): number {\n    return prev ? prevIndex : currIndex;\n  }\n\n  /**\n   * Verifies if the focus option is available or not.\n   *\n   * @return `true` if the slider has the focus option.\n   */\n  function hasFocus(): boolean {\n    return ! isUndefined( options.focus ) || options.isNavigation;\n  }\n\n  return {\n    mount,\n    go,\n    scroll,\n    getNext,\n    getPrev,\n    getEnd,\n    setIndex,\n    getIndex,\n    toIndex,\n    toPage,\n    toDest,\n    hasFocus,\n  };\n}\n","/**\r\n * The namespace for SVG elements.\r\n */\r\nexport const XML_NAME_SPACE = 'http://www.w3.org/2000/svg';\r\n\r\n/**\r\n * The arrow path.\r\n */\r\nexport const PATH = 'm15.5 0.932-4.3 4.38 14.5 14.6-14.5 14.5 4.3 4.4 14.6-14.6 4.4-4.3-4.4-4.4-14.6-14.6z';\r\n\r\n/**\r\n * SVG width and height.\r\n */\r\nexport const SIZE = 40;\r\n","import { ALL_ATTRIBUTES, ARIA_CONTROLS, ARIA_LABEL } from '../../constants/attributes';\r\nimport {\r\n  EVENT_ARROWS_MOUNTED,\r\n  EVENT_ARROWS_UPDATED,\r\n  EVENT_MOUNTED,\r\n  EVENT_MOVED,\r\n  EVENT_REFRESH,\r\n  EVENT_SCROLLED,\r\n  EVENT_UPDATED,\r\n} from '../../constants/events';\r\nimport { EventInterface } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport { append, before, child, create, display, parseHtml, remove, removeAttribute, setAttribute } from '../../utils';\r\nimport { PATH, SIZE, XML_NAME_SPACE } from './path';\r\n\r\n\r\n/**\r\n * The interface for the Arrows component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface ArrowsComponent extends BaseComponent {\r\n  arrows: { prev?: HTMLButtonElement, next?: HTMLButtonElement };\r\n}\r\n\r\n/**\r\n * The component for handling previous and next arrows.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return An Arrows component object.\r\n */\r\nexport function Arrows( Splide: Splide, Components: Components, options: Options ): ArrowsComponent {\r\n  const { on, bind, emit } = EventInterface( Splide );\r\n  const { classes, i18n } = options;\r\n  const { Elements, Controller } = Components;\r\n\r\n  /**\r\n   * The wrapper element.\r\n   */\r\n  let wrapper = Elements.arrows;\r\n\r\n  /**\r\n   * The previous arrow element.\r\n   */\r\n  let prev = Elements.prev;\r\n\r\n  /**\r\n   * The next arrow element.\r\n   */\r\n  let next = Elements.next;\r\n\r\n  /**\r\n   * Indicates whether the component creates arrows or retrieved from the DOM.\r\n   */\r\n  let created: boolean;\r\n\r\n  /**\r\n   * An object with previous and next arrows.\r\n   */\r\n  const arrows: ArrowsComponent[ 'arrows' ] = {};\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    init();\r\n    on( EVENT_UPDATED, init );\r\n  }\r\n\r\n  /**\r\n   * Initializes the component.\r\n   */\r\n  function init(): void {\r\n    if ( options.arrows ) {\r\n      if ( ! prev || ! next ) {\r\n        createArrows();\r\n      }\r\n    }\r\n\r\n    if ( prev && next ) {\r\n      if ( ! arrows.prev ) {\r\n        const { id } = Elements.track;\r\n\r\n        setAttribute( prev, ARIA_CONTROLS, id );\r\n        setAttribute( next, ARIA_CONTROLS, id );\r\n\r\n        arrows.prev = prev;\r\n        arrows.next = next;\r\n\r\n        listen();\r\n\r\n        emit( EVENT_ARROWS_MOUNTED, prev, next );\r\n      } else {\r\n        display( wrapper, options.arrows === false ? 'none' : '' );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroys the component.\r\n   */\r\n  function destroy(): void {\r\n    if ( created ) {\r\n      remove( wrapper );\r\n    } else {\r\n      removeAttribute( prev, ALL_ATTRIBUTES );\r\n      removeAttribute( next, ALL_ATTRIBUTES );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Listens to some events.\r\n   */\r\n  function listen(): void {\r\n    const { go } = Controller;\r\n    on( [ EVENT_MOUNTED, EVENT_MOVED, EVENT_UPDATED, EVENT_REFRESH, EVENT_SCROLLED ], update );\r\n    bind( next, 'click', () => { go( '>', true ) } );\r\n    bind( prev, 'click', () => { go( '<', true ) } );\r\n  }\r\n\r\n  /**\r\n   * Create arrows and append them to the slider.\r\n   */\r\n  function createArrows(): void {\r\n    wrapper = create( 'div', classes.arrows );\r\n    prev    = createArrow( true );\r\n    next    = createArrow( false );\r\n    created = true;\r\n\r\n    append( wrapper, [ prev, next ] );\r\n    before( wrapper, child( options.arrows === 'slider' && Elements.slider || Splide.root ) );\r\n  }\r\n\r\n  /**\r\n   * Creates an arrow button.\r\n   *\r\n   * @param prev - Determines whether to create a previous or next arrow.\r\n   *\r\n   * @return A created button element.\r\n   */\r\n  function createArrow( prev: boolean ): HTMLButtonElement {\r\n    const arrow = `<button class=\"${ classes.arrow } ${ prev ? classes.prev : classes.next }\" type=\"button\">`\r\n      +\t`<svg xmlns=\"${ XML_NAME_SPACE }\" viewBox=\"0 0 ${ SIZE } ${ SIZE }\" width=\"${ SIZE }\" height=\"${ SIZE }\">`\r\n      + `<path d=\"${ options.arrowPath || PATH }\" />`;\r\n\r\n    return parseHtml<HTMLButtonElement>( arrow );\r\n  }\r\n\r\n  /**\r\n   * Updates status of arrows, such as `disabled` and `aria-label`.\r\n   */\r\n  function update(): void {\r\n    const index     = Splide.index;\r\n    const prevIndex = Controller.getPrev();\r\n    const nextIndex = Controller.getNext();\r\n    const prevLabel = prevIndex > -1 && index < prevIndex ? i18n.last : i18n.prev;\r\n    const nextLabel = nextIndex > -1 && index > nextIndex ? i18n.first : i18n.next;\r\n\r\n    prev.disabled = prevIndex < 0;\r\n    next.disabled = nextIndex < 0;\r\n\r\n    setAttribute( prev, ARIA_LABEL, prevLabel );\r\n    setAttribute( next, ARIA_LABEL, nextLabel );\r\n\r\n    emit( EVENT_ARROWS_UPDATED, prev, next, prevIndex, nextIndex );\r\n  }\r\n\r\n  return {\r\n    arrows,\r\n    mount,\r\n    destroy,\r\n  };\r\n}\r\n","import { ARIA_CONTROLS, ARIA_LABEL } from '../../constants/attributes';\nimport {\n  EVENT_AUTOPLAY_PAUSE,\n  EVENT_AUTOPLAY_PLAY,\n  EVENT_AUTOPLAY_PLAYING,\n  EVENT_MOVE,\n  EVENT_REFRESH,\n  EVENT_SCROLL,\n} from '../../constants/events';\nimport { EventInterface, RequestInterval } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport { setAttribute, style } from '../../utils';\n\n\n/**\n * The interface for the Autoplay component.\n *\n * @since 3.0.0\n */\nexport interface AutoplayComponent extends BaseComponent {\n  play(): void;\n  pause(): void;\n  isPaused(): boolean;\n}\n\n/**\n * The component for auto playing sliders.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return An Autoplay component object.\n */\nexport function Autoplay( Splide: Splide, Components: Components, options: Options ): AutoplayComponent {\n  const { on, bind, emit } = EventInterface( Splide );\n  const { Elements } = Components;\n  const interval = RequestInterval( options.interval, Splide.go.bind( Splide, '>' ), update );\n  const { isPaused } = interval;\n\n  /**\n   * Indicates whether the slider is hovered or not.\n   */\n  let hovered: boolean;\n\n  /**\n   * Indicates whether one of slider elements has focus or not.\n   */\n  let focused: boolean;\n\n  /**\n   * Turns into `true` when autoplay is manually paused.\n   */\n  let paused: boolean;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    const { autoplay } = options;\n\n    if ( autoplay ) {\n      initButton( true );\n      initButton( false );\n      listen();\n\n      if ( autoplay !== 'pause' ) {\n        play();\n      }\n    }\n  }\n\n  /**\n   * Initializes a play/pause button.\n   *\n   * @param forPause - Determines whether to initialize a pause or play button.\n   */\n  function initButton( forPause: boolean ): void {\n    const prop   = forPause ? 'pause' : 'play';\n    const button = Elements[ prop ];\n\n    if ( button ) {\n      setAttribute( button, ARIA_CONTROLS, Elements.track.id );\n      setAttribute( button, ARIA_LABEL, options.i18n[ prop ] );\n\n      bind( button, 'click', forPause ? pause : play );\n    }\n  }\n\n  /**\n   * Listens to some events.\n   */\n  function listen(): void {\n    const { root } = Elements;\n\n    if ( options.pauseOnHover ) {\n      bind( root, 'mouseenter mouseleave', e => {\n        hovered = e.type === 'mouseenter';\n        autoToggle();\n      } );\n    }\n\n    if ( options.pauseOnFocus ) {\n      bind( root, 'focusin focusout', e => {\n        focused = e.type === 'focusin';\n        autoToggle();\n      } );\n    }\n\n    on( [ EVENT_MOVE, EVENT_SCROLL, EVENT_REFRESH ], interval.rewind );\n  }\n\n  /**\n   * Starts autoplay and clears all flags.\n   */\n  function play(): void {\n    if ( isPaused() && Components.Slides.isEnough() ) {\n      interval.start( ! options.resetProgress );\n      focused = hovered = paused = false;\n      emit( EVENT_AUTOPLAY_PLAY );\n    }\n  }\n\n  /**\n   * Pauses autoplay.\n   *\n   * @param manual - If `true`, autoplay keeps paused until `play()` is explicitly called.\n   */\n  function pause( manual = true ): void {\n    if ( ! isPaused() ) {\n      interval.pause();\n      emit( EVENT_AUTOPLAY_PAUSE );\n    }\n\n    paused = manual;\n  }\n\n  /**\n   * Toggles play/pause according to current flags.\n   * If autoplay is manually paused, this will do nothing.\n   */\n  function autoToggle(): void {\n    if ( ! paused ) {\n      if ( ! hovered && ! focused ) {\n        play();\n      } else {\n        pause( false );\n      }\n    }\n  }\n\n  /**\n   * Called on every animation frame when auto playing.\n   *\n   * @param rate - The progress rate between 0 to 1.\n   */\n  function update( rate: number ): void {\n    const { bar } = Elements;\n\n    if ( bar ) {\n      style( bar, 'width', `${ rate * 100 }%` );\n    }\n\n    emit( EVENT_AUTOPLAY_PLAYING, rate );\n  }\n\n  return {\n    mount,\n    destroy: interval.cancel,\n    play,\n    pause,\n    isPaused,\n  };\n}\n","import { EVENT_LAZYLOAD_LOADED, EVENT_MOUNTED, EVENT_REFRESH, EVENT_UPDATED } from '../../constants/events';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport { child, display } from '../../utils';\nimport { SlideComponent } from '../Slides/Slide';\n\n\n/**\n * The interface for the Cover component.\n *\n * @since 3.0.0\n */\nexport interface CoverComponent extends BaseComponent {\n}\n\n/**\n * The component for setting the image as the slide background.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Cover component object.\n */\nexport function Cover( Splide: Splide, Components: Components, options: Options ): CoverComponent {\n  const { on } = EventInterface( Splide );\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    if ( options.cover ) {\n      on( EVENT_LAZYLOAD_LOADED, ( img, Slide ) => { toggle( true, img, Slide ) } );\n      on( [ EVENT_MOUNTED, EVENT_UPDATED, EVENT_REFRESH ], apply.bind( null, true ) );\n    }\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    apply( false );\n  }\n\n  /**\n   * Sets/removes the background image to/from all slides.\n   *\n   * @param cover - If `false`, removes the background image.\n   */\n  function apply( cover: boolean ): void {\n    Components.Slides.forEach( Slide => {\n      const img = child<HTMLImageElement>( Slide.container || Slide.slide, 'img' );\n\n      if ( img && img.src ) {\n        toggle( cover, img, Slide );\n      }\n    } );\n  }\n\n  /**\n   * Sets/removes the background image to/from the parent element.\n   *\n   * @param cover - If `false`, removes the background image.\n   * @param img   - A target image element.\n   * @param Slide - A SlideComponent object where the image belongs.\n   */\n  function toggle( cover: boolean, img: HTMLImageElement, Slide: SlideComponent ): void {\n    Slide.style( 'background', cover ? `center/cover no-repeat url(\"${ img.src }\")` : '', true );\n    display( img, cover ? 'none' : '' );\n  }\n\n  return {\n    mount,\n    destroy,\n  };\n}\n","/**\r\n * Triggers the bounce effect when the diff becomes less than this value.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const BOUNCE_DIFF_THRESHOLD = 10;\r\n\r\n/**\r\n * The duration of the bounce effect.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const BOUNCE_DURATION = 600;\r\n\r\n/**\r\n * The friction factor.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const FRICTION_FACTOR = 0.6;\r\n\r\n/**\r\n * The velocity to calculate the scroll duration.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const BASE_VELOCITY = 1.5;\r\n\r\n/**\r\n * The minimum duration of scroll.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const MIN_DURATION = 800;\r\n","import { EVENT_MOVE, EVENT_REFRESH, EVENT_SCROLL, EVENT_SCROLLED, EVENT_UPDATED } from '../../constants/events';\nimport { SLIDE } from '../../constants/types';\nimport { EventInterface, RequestInterval, RequestIntervalInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { AnyFunction, BaseComponent, Components, Options } from '../../types';\nimport { abs, between, max } from '../../utils';\nimport { BASE_VELOCITY, BOUNCE_DIFF_THRESHOLD, BOUNCE_DURATION, FRICTION_FACTOR, MIN_DURATION } from './constants';\n\n\n/**\n * The interface for the Scroll component.\n *\n * @since 3.0.0\n */\nexport interface ScrollComponent extends BaseComponent {\n  scroll( position: number, duration?: number, callback?: AnyFunction ): void;\n  cancel(): void;\n}\n\n/**\n * The component for scrolling the slider.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Scroll component object.\n */\nexport function Scroll( Splide: Splide, Components: Components, options: Options ): ScrollComponent {\n  const { on, emit } = EventInterface( Splide );\n  const { Move } = Components;\n  const { getPosition, getLimit, exceededLimit } = Move;\n\n  /**\n   * Retains the active RequestInterval object.\n   */\n  let interval: RequestIntervalInterface;\n\n  /**\n   * Holds the callback function.\n   */\n  let scrollCallback: AnyFunction;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    on( EVENT_MOVE, clear );\n    on( [ EVENT_UPDATED, EVENT_REFRESH ], cancel );\n  }\n\n  /**\n   * Scrolls the slider to the provided destination.\n   *\n   * @param destination        - The destination to scroll to.\n   * @param duration           - Optional. The scroll duration. If omitted, calculates it by the distance.\n   * @param callback           - Optional. A callback invoked after scroll ends.\n   * @param suppressConstraint - Optional. Whether to suppress constraint process when the slider exceeds bounds.\n   */\n  function scroll(\n    destination: number,\n    duration?: number,\n    callback?: AnyFunction,\n    suppressConstraint?: boolean\n  ): void {\n    const start = getPosition();\n    let friction = 1;\n\n    duration       = duration || computeDuration( abs( destination - start ) );\n    scrollCallback = callback;\n    clear();\n\n    interval = RequestInterval( duration, onScrolled, rate => {\n      const position = getPosition();\n      const target   = start + ( destination - start ) * easing( rate );\n      const diff     = ( target - getPosition() ) * friction;\n\n      Move.translate( position + diff );\n\n      if ( Splide.is( SLIDE ) && ! suppressConstraint && exceededLimit() ) {\n        friction *= FRICTION_FACTOR;\n\n        if ( abs( diff ) < BOUNCE_DIFF_THRESHOLD ) {\n          bounce( exceededLimit( false ) );\n        }\n      }\n    }, 1 );\n\n    emit( EVENT_SCROLL );\n    interval.start();\n  }\n\n  /**\n   * Triggers the bounce effect when the slider reaches bounds.\n   *\n   * @param backwards - The direction the slider is going towards.\n   */\n  function bounce( backwards: boolean ): void {\n    scroll( getLimit( ! backwards ), BOUNCE_DURATION, null, true );\n  }\n\n  /**\n   * Called when scroll ends or has been just canceled.\n   */\n  function onScrolled(): void {\n    const position = getPosition();\n    const index = Move.toIndex( position );\n\n    if ( ! between( index, 0, Splide.length - 1 ) ) {\n      Move.translate( Move.shift( position, index > 0 ), true );\n    }\n\n    scrollCallback && scrollCallback();\n    emit( EVENT_SCROLLED );\n  }\n\n  /**\n   * Computes the scroll duration by the distance and the base velocity.\n   *\n   * @param distance - Distance in pixel.\n   *\n   * @return The duration for scroll.\n   */\n  function computeDuration( distance: number ): number {\n    return max( distance / BASE_VELOCITY, MIN_DURATION );\n  }\n\n  /**\n   * Clears the active interval.\n   */\n  function clear(): void {\n    if ( interval ) {\n      interval.cancel();\n    }\n  }\n\n  /**\n   * Cancels the active interval and emits the `scrolled` event.\n   */\n  function cancel(): void {\n    if ( interval && ! interval.isPaused() ) {\n      clear();\n      onScrolled();\n    }\n  }\n\n  /**\n   * The easing function.\n   *\n   * @param t - A value to ease.\n   *\n   * @return An eased value.\n   */\n  function easing( t: number ): number {\n    const { easingFunc } = options;\n    return easingFunc ? easingFunc( t ) : 1 - Math.pow( 1 - t, 4 );\n  }\n\n  return {\n    mount,\n    destroy: clear,\n    scroll,\n    cancel,\n  };\n}\n","/**\n * The power of the friction.\n *\n * @since 3.0.0\n */\nexport const FRICTION = 5;\n\n/**\n * If the user stops dragging for this duration with keeping the pointer down, updates the base coord and time.\n *\n * @since 3.0.0\n */\nexport const LOG_INTERVAL = 200;\n\n/**\n * Start events for dragging.\n *\n * @since 3.0.0\n */\nexport const POINTER_DOWN_EVENTS = 'touchstart mousedown';\n\n/**\n * Update events for dragging.\n *\n * @since 3.0.0\n */\nexport const POINTER_MOVE_EVENTS = 'touchmove mousemove';\n\n/**\n * End events for dragging.\n *\n * @since 3.0.0\n */\nexport const POINTER_UP_EVENTS = 'touchend touchcancel mouseup';\n","import { EVENT_DRAG, EVENT_DRAGGED, EVENT_DRAGGING, EVENT_MOUNTED, EVENT_UPDATED } from '../../constants/events';\nimport { FADE, LOOP, SLIDE } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport { abs, isObject, min, noop, prevent, sign } from '../../utils';\nimport { FRICTION, LOG_INTERVAL, POINTER_DOWN_EVENTS, POINTER_MOVE_EVENTS, POINTER_UP_EVENTS } from './constants';\n\n\n/**\n * The interface for the Drag component.\n *\n * @since 3.0.0\n */\nexport interface DragComponent extends BaseComponent {\n  disable( disabled: boolean ): void\n}\n\n/**\n * The component for dragging the slider.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Drag component object.\n */\nexport function Drag( Splide: Splide, Components: Components, options: Options ): DragComponent {\n  const { on, emit, bind, unbind } = EventInterface( Splide );\n  const { Move, Scroll, Controller } = Components;\n  const { track } = Components.Elements;\n  const { resolve, orient } = Components.Direction;\n  const { getPosition, exceededLimit } = Move;\n  const listenerOptions = { passive: false, capture: true };\n\n  /**\n   * The base slider position to calculate the delta of coords.\n   */\n  let basePosition: number;\n\n  /**\n   * The base event object saved per specific sampling interval.\n   */\n  let baseEvent: TouchEvent | MouseEvent;\n\n  /**\n   * Holds the previous base event object.\n   */\n  let prevBaseEvent: TouchEvent | MouseEvent;\n\n  /**\n   * Keeps the last TouchEvent/MouseEvent object on pointermove.\n   */\n  let lastEvent: TouchEvent | MouseEvent;\n\n  /**\n   * Indicates whether the drag mode is `free` or not.\n   */\n  let isFree: boolean;\n\n  /**\n   * Indicates whether the user is dragging the slider or not.\n   */\n  let isDragging: boolean;\n\n  /**\n   * Indicates whether the slider exceeds limits or not.\n   * This must not be `undefined` for strict comparison.\n   */\n  let hasExceeded = false;\n\n  /**\n   * Turns into `true` when the user starts dragging the slider.\n   */\n  let clickPrevented: boolean;\n\n  /**\n   * Indicates whether the drag component is now disabled or not.\n   */\n  let disabled: boolean;\n\n  /**\n   * The target element to attach listeners.\n   */\n  let target: Window | HTMLElement;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    bind( track, POINTER_MOVE_EVENTS, noop, listenerOptions );\n    bind( track, POINTER_UP_EVENTS, noop, listenerOptions );\n    bind( track, POINTER_DOWN_EVENTS, onPointerDown, listenerOptions );\n    bind( track, 'click', onClick, { capture: true } );\n    bind( track, 'dragstart', prevent );\n\n    on( [ EVENT_MOUNTED, EVENT_UPDATED ], init );\n  }\n\n  /**\n   * Initializes the component.\n   */\n  function init(): void {\n    const { drag } = options;\n    disable( ! drag );\n    isFree = drag === 'free';\n  }\n\n  /**\n   * Called when the user clicks or touches the slider.\n   * Needs to prevent the default behaviour when the slider is busy to deny any action, such as dragging images.\n   * Note that IE does not support MouseEvent and TouchEvent constructors.\n   *\n   * @param e - A TouchEvent or MouseEvent object\n   */\n  function onPointerDown( e: TouchEvent | MouseEvent ): void {\n    if ( ! disabled ) {\n      const isTouch = isTouchEvent( e );\n\n      if ( isTouch || ! e.button ) {\n        if ( ! Move.isBusy() ) {\n          target         = isTouch ? track : window;\n          prevBaseEvent  = null;\n          lastEvent      = null;\n          clickPrevented = false;\n\n          bind( target, POINTER_MOVE_EVENTS, onPointerMove, listenerOptions );\n          bind( target, POINTER_UP_EVENTS, onPointerUp, listenerOptions );\n          Move.cancel();\n          Scroll.cancel();\n          save( e );\n        } else {\n          prevent( e, true );\n        }\n      }\n    }\n  }\n\n  /**\n   * Called while the user moves the pointer on the slider.\n   *\n   * @param e - A TouchEvent or MouseEvent object\n   */\n  function onPointerMove( e: TouchEvent | MouseEvent ): void {\n    if ( ! lastEvent ) {\n      emit( EVENT_DRAG );\n    }\n\n    lastEvent = e;\n\n    if ( e.cancelable ) {\n      if ( isDragging ) {\n        const expired  = timeOf( e ) - timeOf( baseEvent ) > LOG_INTERVAL;\n        const exceeded = hasExceeded !== ( hasExceeded = exceededLimit() );\n\n        if ( expired || exceeded ) {\n          save( e );\n        }\n\n        Move.translate( basePosition + constrain( coordOf( e ) - coordOf( baseEvent ) ) );\n        emit( EVENT_DRAGGING );\n        clickPrevented = true;\n        prevent( e );\n      } else {\n        const diff = abs( coordOf( e ) - coordOf( baseEvent ) );\n        let { dragMinThreshold: thresholds } = options;\n        thresholds = isObject( thresholds ) ? thresholds : { mouse: 0, touch: +thresholds || 10 };\n        isDragging = diff > ( isTouchEvent( e ) ? thresholds.touch : thresholds.mouse );\n\n        if ( isSliderDirection() ) {\n          prevent( e );\n        }\n      }\n    }\n  }\n\n  /**\n   * Called when the user releases pointing devices.\n   * Be aware that the TouchEvent object provided by the `touchend` does not contain `Touch` objects,\n   * which means the last touch position is not available.\n   *\n   * @param e - A TouchEvent or MouseEvent object\n   */\n  function onPointerUp( e: TouchEvent | MouseEvent ): void {\n    unbind( target, POINTER_MOVE_EVENTS, onPointerMove );\n    unbind( target, POINTER_UP_EVENTS, onPointerUp );\n\n    if ( lastEvent ) {\n      if ( isDragging || ( e.cancelable && isSliderDirection() ) ) {\n        const velocity    = computeVelocity( e );\n        const destination = computeDestination( velocity );\n\n        if ( isFree ) {\n          Controller.scroll( destination );\n        } else if ( Splide.is( FADE ) ) {\n          Controller.go( Splide.index + orient( sign( velocity ) ) );\n        } else {\n          Controller.go( Controller.toDest( destination ), true );\n        }\n\n        prevent( e );\n      }\n\n      emit( EVENT_DRAGGED );\n    }\n\n    isDragging = false;\n  }\n\n  /**\n   * Saves data at the specific moment.\n   *\n   * @param e  A TouchEvent or MouseEvent object\n   */\n  function save( e: TouchEvent | MouseEvent ): void {\n    prevBaseEvent = baseEvent;\n    baseEvent     = e;\n    basePosition  = getPosition();\n  }\n\n  /**\n   * Called when the track element is clicked.\n   * Disables click any elements inside it while dragging.\n   *\n   * @param e - A MouseEvent object.\n   */\n  function onClick( e: MouseEvent ): void {\n    if ( ! disabled && clickPrevented ) {\n      prevent( e, true );\n    }\n  }\n\n  /**\n   * Checks whether dragging towards the slider or scroll direction.\n   *\n   * @return `true` if going towards the slider direction, or otherwise `false`.\n   */\n  function isSliderDirection(): boolean {\n    const diffX = abs( coordOf( lastEvent ) - coordOf( baseEvent ) );\n    const diffY = abs( coordOf( lastEvent, true ) - coordOf( baseEvent, true ) );\n    return diffX > diffY;\n  }\n\n  /**\n   * Computes the drag velocity.\n   *\n   * @param e - A TouchEvent or MouseEvent object\n   *\n   * @return The drag velocity.\n   */\n  function computeVelocity( e: TouchEvent | MouseEvent ): number {\n    if ( Splide.is( LOOP ) || ! hasExceeded ) {\n      const base      = baseEvent === lastEvent && prevBaseEvent || baseEvent;\n      const diffCoord = coordOf( lastEvent ) - coordOf( base );\n      const diffTime  = timeOf( e ) - timeOf( base );\n      const isFlick   = timeOf( e ) - timeOf( lastEvent ) < LOG_INTERVAL;\n\n      if ( diffTime && isFlick ) {\n        return diffCoord / diffTime;\n      }\n    }\n\n    return 0;\n  }\n\n  /**\n   * Computes the destination by the velocity and the `flickPower` option.\n   *\n   * @param velocity - The drag velocity.\n   *\n   * @return The destination.\n   */\n  function computeDestination( velocity: number ): number {\n    return getPosition() + sign( velocity ) * min(\n      abs( velocity ) * ( options.flickPower || 600 ),\n      isFree ? Infinity : Components.Layout.listSize() * ( options.flickMaxPages || 1 )\n    );\n  }\n\n  /**\n   * Returns the `pageX` and `pageY` coordinates provided by the event.\n   * Be aware that IE does not support both TouchEvent and MouseEvent constructors.\n   *\n   * @param e          - A TouchEvent or MouseEvent object.\n   * @param orthogonal - Optional. If `true`, returns the coord of the orthogonal axis against the drag one.\n   *\n   * @return A pageX or pageY coordinate.\n   */\n  function coordOf( e: TouchEvent | MouseEvent, orthogonal?: boolean ): number {\n    return ( isTouchEvent( e ) ? e.touches[ 0 ] : e )[ `page${ resolve( orthogonal ? 'Y' : 'X' ) }` ];\n  }\n\n  /**\n   * Returns the time stamp in the provided event object.\n   *\n   * @param e - A TouchEvent or MouseEvent object.\n   *\n   * @return A time stamp.\n   */\n  function timeOf( e: TouchEvent | MouseEvent ): number {\n    return e.timeStamp;\n  }\n\n  /**\n   * Checks if the provided event is TouchEvent or MouseEvent.\n   *\n   * @param e - An event to check.\n   *\n   * @return `true` if the `e` is TouchEvent.\n   */\n  function isTouchEvent( e: TouchEvent | MouseEvent ): e is TouchEvent {\n    return typeof TouchEvent !== 'undefined' && e instanceof TouchEvent;\n  }\n\n  /**\n   * Reduces the distance to move by the predefined friction.\n   * This does nothing when the slider type is not `slide`, or the position is inside borders.\n   *\n   * @param diff - Diff to constrain.\n   *\n   * @return The constrained diff.\n   */\n  function constrain( diff: number ): number {\n    return diff / ( hasExceeded && Splide.is( SLIDE ) ? FRICTION : 1 );\n  }\n\n  /**\n   * Disables the component.\n   *\n   * @param value - Set `true` to disable the component.\n   */\n  function disable( value: boolean ): void {\n    disabled = value;\n  }\n\n  return {\n    mount,\n    disable,\n  };\n}\n","import { TAB_INDEX } from '../../constants/attributes';\r\nimport { EVENT_UPDATED } from '../../constants/events';\r\nimport { EventInterface } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport { includes, isHTMLElement, removeAttribute, setAttribute } from '../../utils';\r\n\r\n\r\n/**\r\n * The interface for the Keyboard component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface KeyboardComponent extends BaseComponent {\r\n}\r\n\r\n/**\r\n * The collection of arrow keys of IE.\r\n *\r\n * @since 3.0.0\r\n */\r\nconst IE_ARROW_KEYS = [ 'Left', 'Right', 'Up', 'Down' ];\r\n\r\n/**\r\n * The component for controlling the slider by keyboards.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return A Keyboard component object.\r\n */\r\nexport function Keyboard( Splide: Splide, Components: Components, options: Options ): KeyboardComponent {\r\n  const { on, bind, unbind } = EventInterface( Splide );\r\n  const { root } = Components.Elements;\r\n  const { resolve } = Components.Direction;\r\n\r\n  /**\r\n   * The target element of the keyboard event.\r\n   */\r\n  let target: Window | HTMLElement;\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    init();\r\n\r\n    on( EVENT_UPDATED, () => {\r\n      destroy();\r\n      init();\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Initializes the component.\r\n   */\r\n  function init(): void {\r\n    const { keyboard = 'global' } = options;\r\n\r\n    if ( keyboard ) {\r\n      if ( keyboard === 'focused' ) {\r\n        target = root;\r\n        setAttribute( root, TAB_INDEX, 0 );\r\n      } else {\r\n        target = window;\r\n      }\r\n\r\n      bind( target, 'keydown', onKeydown );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroys the component.\r\n   */\r\n  function destroy() {\r\n    unbind( target, 'keydown' );\r\n\r\n    if ( isHTMLElement( target ) ) {\r\n      removeAttribute( target, TAB_INDEX );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Called when any key is pressed on the target.\r\n   *\r\n   * @param e - A KeyboardEvent object.\r\n   */\r\n  function onKeydown( e: KeyboardEvent ): void {\r\n    const { key } = e;\r\n    const normalizedKey = includes( IE_ARROW_KEYS, key ) ? `Arrow${ key }` : key;\r\n\r\n    if ( normalizedKey === resolve( 'ArrowLeft' ) ) {\r\n      Splide.go( '<' );\r\n    } else if ( normalizedKey === resolve( 'ArrowRight' ) ) {\r\n      Splide.go( '>' );\r\n    }\r\n  }\r\n\r\n  return {\r\n    mount,\r\n    destroy,\r\n  };\r\n}\r\n","import { DATA_ATTRIBUTE } from '../../constants/project';\r\n\r\n\r\n/**\r\n * The data attribute for the src value.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const SRC_DATA_ATTRIBUTE = `${ DATA_ATTRIBUTE }-lazy`;\r\n\r\n/**\r\n * The data attribute for the srcset value.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const SRCSET_DATA_ATTRIBUTE = `${ SRC_DATA_ATTRIBUTE }-srcset`;\r\n\r\n/**\r\n * The selector string for images to load.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const IMAGE_SELECTOR = `[${ SRC_DATA_ATTRIBUTE }], [${ SRCSET_DATA_ATTRIBUTE }]`;\r\n","import { ROLE } from '../../constants/attributes';\r\nimport { CLASS_LOADING } from '../../constants/classes';\r\nimport {\r\n  EVENT_LAZYLOAD_LOADED,\r\n  EVENT_MOUNTED,\r\n  EVENT_MOVED,\r\n  EVENT_REFRESH,\r\n  EVENT_RESIZE,\r\n} from '../../constants/events';\r\nimport { EventInterface } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport {\r\n  addClass,\r\n  create,\r\n  display,\r\n  getAttribute,\r\n  queryAll,\r\n  remove,\r\n  removeAttribute,\r\n  removeClass,\r\n  setAttribute,\r\n} from '../../utils';\r\nimport { SlideComponent } from '../Slides/Slide';\r\nimport { IMAGE_SELECTOR, SRC_DATA_ATTRIBUTE, SRCSET_DATA_ATTRIBUTE } from './constants';\r\n\r\n\r\n/**\r\n * The interface for the LazyLoad component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface LazyLoadComponent extends BaseComponent {\r\n}\r\n\r\n/**\r\n * The interface for all components.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface LazyLoadImagesData {\r\n  _img: HTMLImageElement;\r\n  _spinner: HTMLSpanElement;\r\n  _Slide: SlideComponent;\r\n  src: string | null;\r\n  srcset: string | null;\r\n}\r\n\r\n/**\r\n * The component for lazily loading images.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return An LazyLoad component object.\r\n */\r\nexport function LazyLoad( Splide: Splide, Components: Components, options: Options ): LazyLoadComponent {\r\n  const { on, off, bind, emit } = EventInterface( Splide );\r\n  const isSequential = options.lazyLoad === 'sequential';\r\n\r\n  /**\r\n   * Stores data of images.\r\n   */\r\n  let images: LazyLoadImagesData[] = [];\r\n\r\n  /**\r\n   * The current index of images.\r\n   */\r\n  let index = 0;\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    if ( options.lazyLoad ) {\r\n      on( [ EVENT_MOUNTED, EVENT_REFRESH ], () => {\r\n        destroy();\r\n        init();\r\n      } );\r\n\r\n      if ( ! isSequential ) {\r\n        on( [ EVENT_MOUNTED, EVENT_REFRESH, EVENT_MOVED ], observe );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Finds images that contain specific data attributes.\r\n   */\r\n  function init() {\r\n    Components.Slides.forEach( _Slide => {\r\n      queryAll<HTMLImageElement>( _Slide.slide, IMAGE_SELECTOR ).forEach( _img => {\r\n        const src    = getAttribute( _img, SRC_DATA_ATTRIBUTE );\r\n        const srcset = getAttribute( _img, SRCSET_DATA_ATTRIBUTE );\r\n\r\n        if ( src !== _img.src || srcset !== _img.srcset ) {\r\n          const _spinner = create( 'span', options.classes.spinner, _img.parentElement );\r\n          setAttribute( _spinner, ROLE, 'presentation' );\r\n          images.push( { _img, _Slide, src, srcset, _spinner } );\r\n          display( _img, 'none' );\r\n        }\r\n      } );\r\n    } );\r\n\r\n    if ( isSequential ) {\r\n      loadNext();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroys the component.\r\n   */\r\n  function destroy() {\r\n    index  = 0;\r\n    images = [];\r\n  }\r\n\r\n  /**\r\n   * Checks how close each image is from the active slide, and determines whether to start loading or not.\r\n   * The last `+1` is for the current page.\r\n   */\r\n  function observe(): void {\r\n    images = images.filter( data => {\r\n      if ( data._Slide.isWithin( Splide.index, options.perPage * ( ( options.preloadPages || 1 ) + 1 ) ) ) {\r\n        return load( data );\r\n      }\r\n\r\n      return true;\r\n    } );\r\n\r\n    if ( ! images.length ) {\r\n      off( EVENT_MOVED );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Starts loading the image in the data.\r\n   *\r\n   * @param data - A LazyLoadImagesData object.\r\n   */\r\n  function load( data: LazyLoadImagesData ): void {\r\n    const { _img } = data;\r\n\r\n    addClass( data._Slide.slide, CLASS_LOADING );\r\n    bind( _img, 'load error', e => { onLoad( data, e.type === 'error' ) } );\r\n\r\n    [ 'src', 'srcset' ].forEach( name => {\r\n      if ( data[ name ] ) {\r\n        setAttribute( _img, name, data[ name ] );\r\n        removeAttribute( _img, name === 'src' ? SRC_DATA_ATTRIBUTE : SRCSET_DATA_ATTRIBUTE );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Called when the image is loaded or any error occurs.\r\n   *\r\n   * @param data  - A LazyLoadImagesData object.\r\n   * @param error - `true` if this method is called on error.\r\n   */\r\n  function onLoad( data: LazyLoadImagesData, error: boolean ): void {\r\n    const { _Slide } = data;\r\n\r\n    removeClass( _Slide.slide, CLASS_LOADING );\r\n\r\n    if ( ! error ) {\r\n      remove( data._spinner );\r\n      display( data._img, '' );\r\n      emit( EVENT_LAZYLOAD_LOADED, data._img, _Slide );\r\n      emit( EVENT_RESIZE );\r\n    }\r\n\r\n    if ( isSequential ) {\r\n      loadNext();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Starts loading a next image.\r\n   */\r\n  function loadNext(): void {\r\n    if ( index < images.length ) {\r\n      load( images[ index++ ] );\r\n    }\r\n  }\r\n\r\n  return {\r\n    mount,\r\n    destroy,\r\n  };\r\n}\r\n","import { ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL } from '../../constants/attributes';\nimport { CLASS_ACTIVE } from '../../constants/classes';\nimport {\n  EVENT_MOVE,\n  EVENT_PAGINATION_MOUNTED,\n  EVENT_PAGINATION_UPDATED,\n  EVENT_REFRESH,\n  EVENT_SCROLLED,\n  EVENT_UPDATED,\n} from '../../constants/events';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { BaseComponent, Components, Options } from '../../types';\nimport {\n  addClass,\n  ceil,\n  create,\n  empty,\n  focus,\n  format,\n  remove,\n  removeAttribute,\n  removeClass,\n  setAttribute,\n} from '../../utils';\n\n\n/**\n * The interface for the Pagination component.\n *\n * @since 3.0.0\n */\nexport interface PaginationComponent extends BaseComponent {\n  items: PaginationItem[];\n  getAt( index: number ): PaginationItem;\n}\n\n/**\n * The interface for data of the pagination.\n *\n * @since 3.0.0\n */\nexport interface PaginationData {\n  list: HTMLUListElement;\n  items: PaginationItem[];\n}\n\n/**\n * The interface for each pagination item.\n *\n * @since 3.0.0\n */\nexport interface PaginationItem {\n  li: HTMLLIElement;\n  button: HTMLButtonElement;\n  page: number;\n}\n\n/**\n * The component for handling previous and next arrows.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Arrows component object.\n */\nexport function Pagination( Splide: Splide, Components: Components, options: Options ): PaginationComponent {\n  const { on, emit, bind, unbind } = EventInterface( Splide );\n  const { Slides, Elements, Controller } = Components;\n  const { hasFocus, getIndex } = Controller;\n\n  /**\n   * Stores all pagination items.\n   */\n  const items: PaginationItem[] = [];\n\n  /**\n   * The pagination element.\n   */\n  let list: HTMLUListElement;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    init();\n    on( [ EVENT_UPDATED, EVENT_REFRESH ], init );\n    on( [ EVENT_MOVE, EVENT_SCROLLED ], update );\n  }\n\n  /**\n   * Initializes the pagination.\n   */\n  function init(): void {\n    destroy();\n\n    if ( options.pagination && Slides.isEnough() ) {\n      createPagination();\n      emit( EVENT_PAGINATION_MOUNTED, { list, items }, getAt( Splide.index ) );\n      update();\n    }\n  }\n\n  /**\n   * Destroys the component.\n   */\n  function destroy(): void {\n    if ( list ) {\n      remove( list );\n      items.forEach( item => { unbind( item.button, 'click' ) } );\n      empty( items );\n      list = null;\n    }\n  }\n\n  /**\n   * Creates the pagination element and appends it to the slider.\n   */\n  function createPagination(): void {\n    const { length } = Splide;\n    const { classes, i18n, perPage } = options;\n    const parent = options.pagination === 'slider' && Elements.slider || Elements.root;\n    const max    = hasFocus() ? length : ceil( length / perPage );\n\n    list = create( 'ul', classes.pagination, parent );\n\n    for ( let i = 0; i < max; i++ ) {\n      const li       = create( 'li', null, list );\n      const button   = create( 'button', { class: classes.page, type: 'button' }, li );\n      const controls = Slides.getIn( i ).map( Slide => Slide.slide.id );\n      const text     = ! hasFocus() && perPage > 1 ? i18n.pageX : i18n.slideX;\n\n      bind( button, 'click', onClick.bind( null, i ) );\n\n      setAttribute( button, ARIA_CONTROLS, controls.join( ' ' ) );\n      setAttribute( button, ARIA_LABEL, format( text, i + 1 ) );\n\n      items.push( { li, button, page: i } );\n    }\n  }\n\n  /**\n   * Called when the user clicks each pagination dot.\n   * Moves the focus to the active slide for accessibility.\n   *\n   * @link https://www.w3.org/WAI/tutorials/carousels/functionality/\n   *\n   * @param page - A clicked page index.\n   */\n  function onClick( page: number ): void {\n    Controller.go( `>${ page }`, true, () => {\n      const Slide = Slides.getAt( Controller.toIndex( page ) );\n      Slide && focus( Slide.slide );\n    } );\n  }\n\n  /**\n   * Returns the pagination item at the specified index.\n   *\n   * @param index - An index.\n   *\n   * @return A pagination item object if available, or otherwise `undefined`.\n   */\n  function getAt( index: number ): PaginationItem | undefined {\n    return items[ Controller.toPage( index ) ];\n  }\n\n  /**\n   * Updates the pagination status.\n   */\n  function update(): void {\n    const prev = getAt( getIndex( true ) );\n    const curr = getAt( getIndex() );\n\n    if ( prev ) {\n      removeClass( prev.button, CLASS_ACTIVE );\n      removeAttribute( prev.button, ARIA_CURRENT );\n    }\n\n    if ( curr ) {\n      addClass( curr.button, CLASS_ACTIVE );\n      setAttribute( curr.button, ARIA_CURRENT, true );\n    }\n\n    emit( EVENT_PAGINATION_UPDATED, { list, items }, prev, curr );\n  }\n\n  return {\n    items,\n    mount,\n    destroy,\n    getAt,\n  };\n}\n","import { ALL_ATTRIBUTES, ARIA_ORIENTATION, ROLE } from '../../constants/attributes';\r\nimport { TTB } from '../../constants/directions';\r\nimport {\r\n  EVENT_CLICK,\r\n  EVENT_MOUNTED,\r\n  EVENT_MOVE,\r\n  EVENT_NAVIGATION_MOUNTED,\r\n  EVENT_SLIDE_KEYDOWN,\r\n  EVENT_UPDATED,\r\n} from '../../constants/events';\r\nimport { LOOP } from '../../constants/types';\r\nimport { EventInterface } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport { empty, includes, prevent, removeAttribute, setAttribute } from '../../utils';\r\nimport { SlideComponent } from '../Slides/Slide';\r\n\r\n\r\n/**\r\n * The interface for the Sync component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface SyncComponent extends BaseComponent {\r\n}\r\n\r\n/**\r\n * The keys for triggering the navigation slide.\r\n *\r\n * @since 3.0.0\r\n */\r\nconst TRIGGER_KEYS = [ ' ', 'Enter', 'Spacebar' ];\r\n\r\n/**\r\n * The component for syncing multiple sliders.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return A Sync component object.\r\n */\r\nexport function Sync( Splide: Splide, Components: Components, options: Options ): SyncComponent {\r\n  const { splides } = Splide;\r\n  const { list } = Components.Elements;\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    if ( options.isNavigation ) {\r\n      navigate();\r\n    } else {\r\n      sync();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroys the component.\r\n   */\r\n  function destroy(): void {\r\n    removeAttribute( list, ALL_ATTRIBUTES );\r\n  }\r\n\r\n  /**\r\n   * Syncs the current index among all slides.\r\n   * The `processed` array prevents recursive call of handlers.\r\n   */\r\n  function sync(): void {\r\n    const processed: Splide[] = [];\r\n\r\n    splides.concat( Splide ).forEach( ( splide, index, instances ) => {\r\n      EventInterface( splide ).on( EVENT_MOVE, ( index, prev, dest ) => {\r\n        instances.forEach( instance => {\r\n          if ( instance !== splide && ! includes( processed, splide ) ) {\r\n            processed.push( instance );\r\n            instance.go( instance.is( LOOP ) ? dest : index );\r\n          }\r\n        } );\r\n\r\n        empty( processed );\r\n      } );\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Makes slides clickable and moves the slider to the index of clicked slide.\r\n   * Note that the direction of `menu` is implicitly `vertical` as default.\r\n   */\r\n  function navigate(): void {\r\n    const { on, emit } = EventInterface( Splide );\r\n\r\n    on( EVENT_CLICK, onClick );\r\n    on( EVENT_SLIDE_KEYDOWN, onKeydown );\r\n    on( [ EVENT_MOUNTED, EVENT_UPDATED ], update );\r\n\r\n    setAttribute( list, ROLE, 'menu' );\r\n\r\n    emit( EVENT_NAVIGATION_MOUNTED, Splide.splides );\r\n  }\r\n\r\n  /**\r\n   * Update attributes.\r\n   */\r\n  function update(): void {\r\n    setAttribute( list, ARIA_ORIENTATION, options.direction !== TTB ? 'horizontal' : null );\r\n  }\r\n\r\n  /**\r\n   * Called when the navigation slide is clicked.\r\n   *\r\n   * @param Slide - A clicked Slide component.\r\n   */\r\n  function onClick( Slide: SlideComponent ): void {\r\n    Splide.go( Slide.index );\r\n  }\r\n\r\n  /**\r\n   * Called when any key is pressed on the navigation slide.\r\n   *\r\n   * @param Slide - A Slide component.\r\n   * @param e     - A KeyboardEvent object.\r\n   */\r\n  function onKeydown( Slide: SlideComponent, e: KeyboardEvent ): void {\r\n    if ( includes( TRIGGER_KEYS, e.key ) ) {\r\n      onClick( Slide );\r\n      prevent( e );\r\n    }\r\n  }\r\n\r\n  return {\r\n    mount,\r\n    destroy,\r\n  };\r\n}\r\n","import { EventInterface } from '../../constructors';\r\nimport { Splide } from '../../core/Splide/Splide';\r\nimport { BaseComponent, Components, Options } from '../../types';\r\nimport { prevent } from '../../utils';\r\n\r\n\r\n/**\r\n * The interface for the Wheel component.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport interface WheelComponent extends BaseComponent {\r\n}\r\n\r\n/**\r\n * The component for observing the mouse wheel and moving the slider.\r\n *\r\n * @since 3.0.0\r\n *\r\n * @param Splide     - A Splide instance.\r\n * @param Components - A collection of components.\r\n * @param options    - Options.\r\n *\r\n * @return A Wheel component object.\r\n */\r\nexport function Wheel( Splide: Splide, Components: Components, options: Options ): WheelComponent {\r\n  const { bind } = EventInterface( Splide );\r\n\r\n  /**\r\n   * Called when the component is mounted.\r\n   */\r\n  function mount(): void {\r\n    if ( options.wheel ) {\r\n      bind( Components.Elements.track, 'wheel', onWheel, { passive: false, capture: true } );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Called when the user rotates the mouse wheel.\r\n   *\r\n   * @param e - A WheelEvent object.\r\n   */\r\n  function onWheel( e: WheelEvent ): void {\r\n    const { deltaY } = e;\r\n\r\n    if ( deltaY ) {\r\n      Splide.go( deltaY < 0 ? '<' : '>' );\r\n      prevent( e );\r\n    }\r\n  }\r\n\r\n  return {\r\n    mount,\r\n  };\r\n}\r\n","/**\r\n * The collection of i18n strings.\r\n *\r\n * @since 3.0.0\r\n */\r\nexport const I18N = {\r\n  prev  : 'Previous slide',\r\n  next  : 'Next slide',\r\n  first : 'Go to first slide',\r\n  last  : 'Go to last slide',\r\n  slideX: 'Go to slide %s',\r\n  pageX : 'Go to page %s',\r\n  play  : 'Start autoplay',\r\n  pause : 'Pause autoplay',\r\n};\r\n","import { Options } from '../types';\nimport { CLASSES } from './classes';\nimport { I18N } from './i18n';\n\n\n/**\n * The collection of default options.\n * Note that this collection does not contain all options.\n *\n * @since 3.0.0\n */\nexport const DEFAULTS: Options = {\n  type             : 'slide',\n  speed            : 400,\n  waitForTransition: true,\n  perPage          : 1,\n  arrows           : true,\n  pagination       : true,\n  interval         : 5000,\n  pauseOnHover     : true,\n  pauseOnFocus     : true,\n  resetProgress    : true,\n  easing           : 'cubic-bezier(0.25, 1, 0.5, 1)',\n  drag             : true,\n  direction        : 'ltr',\n  slideFocus       : true,\n  trimSpace        : true,\n  focusableNodes   : 'a, button, textarea, input, select, iframe',\n  classes          : CLASSES,\n  i18n             : I18N,\n};\n","import { EVENT_MOUNTED, EVENT_REFRESH } from '../../constants/events';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { Components, Options, TransitionComponent } from '../../types';\nimport { nextTick, noop, rect, unit, style } from '../../utils';\n\n\n/**\n * The component for the fade transition.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Transition component object.\n */\nexport function Fade( Splide: Splide, Components: Components, options: Options ): TransitionComponent {\n  const { on } = EventInterface( Splide );\n\n  /**\n   * Called when the component is mounted.\n   * The nextTick disables the initial fade transition of the first slide.\n   */\n  function mount(): void {\n    on( [ EVENT_MOUNTED, EVENT_REFRESH ], () => {\n      nextTick( () => {\n        Components.Slides.style( 'transition', `opacity ${ options.speed }ms ${ options.easing }` );\n      } );\n    } );\n  }\n\n  /**\n   * Starts the transition.\n   * Explicitly sets the track height to avoid it will collapse in Safari.\n   *\n   * @param index - A destination index.\n   * @param done  - The callback function that must be called after the transition ends.\n   */\n  function start( index: number, done: () => void ): void {\n    const { track } = Components.Elements;\n    style( track, 'height', unit( rect( track ).height ) );\n\n    nextTick( () => {\n      done();\n      style( track, 'height', '' );\n    } );\n  }\n\n  return {\n    mount,\n    start,\n    cancel: noop,\n  };\n}\n","import { SLIDE } from '../../constants/types';\nimport { EventInterface } from '../../constructors';\nimport { Splide } from '../../core/Splide/Splide';\nimport { Components, Options, TransitionComponent } from '../../types';\nimport { abs, style } from '../../utils';\n\n\n/**\n * The component for the slide transition.\n *\n * @since 3.0.0\n *\n * @param Splide     - A Splide instance.\n * @param Components - A collection of components.\n * @param options    - Options.\n *\n * @return A Transition component object.\n */\nexport function Slide( Splide: Splide, Components: Components, options: Options ): TransitionComponent {\n  const { bind } = EventInterface( Splide );\n  const { Move, Controller } = Components;\n  const { list } = Components.Elements;\n\n  /**\n   * Holds the `done` callback function.\n   */\n  let endCallback: () => void;\n\n  /**\n   * Called when the component is mounted.\n   */\n  function mount(): void {\n    bind( list, 'transitionend', e => {\n      if ( e.target === list && endCallback ) {\n        cancel();\n        endCallback();\n      }\n    } );\n  }\n\n  /**\n   * Starts the transition.\n   * The Move component calls this method just before the slider moves.\n   *\n   * @param index - A destination index.\n   * @param done  - The callback function that must be called after the transition ends.\n   */\n  function start( index: number, done: () => void ): void {\n    const destination = Move.toPosition( index, true );\n    const position    = Move.getPosition();\n    const speed       = getSpeed( index );\n\n    if ( abs( destination - position ) >= 1 && speed >= 1 ) {\n      apply( `transform ${ speed }ms ${ options.easing }` );\n      Move.translate( destination, true );\n      endCallback = done;\n    } else {\n      Move.jump( index );\n      done();\n    }\n  }\n\n  /**\n   * Cancels the transition.\n   */\n  function cancel(): void {\n    apply( '' );\n  }\n\n  /**\n   * Returns the transition speed.\n   *\n   * @param index - A destination index.\n   */\n  function getSpeed( index: number ): number {\n    const { rewindSpeed } = options;\n\n    if ( Splide.is( SLIDE ) && rewindSpeed ) {\n      const prev = Controller.getIndex( true );\n      const end  = Controller.getEnd();\n\n      if ( ( prev === 0 && index >= end ) || ( prev >= end && index === 0 ) ) {\n        return rewindSpeed;\n      }\n    }\n\n    return options.speed;\n  }\n\n  /**\n   * Applies the transition CSS property to the list element.\n   *\n   * @param transition - A transition CSS value.\n   */\n  function apply( transition: string ): void {\n    style( list, 'transition', transition );\n  }\n\n  return {\n    mount,\n    start,\n    cancel,\n  };\n}\n","import * as ComponentConstructors from '../../components';\nimport { SlideMatcher } from '../../components/Slides/Slides';\nimport { CLASS_INITIALIZED } from '../../constants/classes';\nimport { DEFAULTS } from '../../constants/defaults';\nimport { EVENT_DESTROY, EVENT_MOUNTED, EVENT_READY, EVENT_REFRESH, EVENT_UPDATED } from '../../constants/events';\nimport { DEFAULT_USER_EVENT_PRIORITY } from '../../constants/priority';\nimport { CREATED, DESTROYED, IDLE, STATES } from '../../constants/states';\nimport { FADE } from '../../constants/types';\nimport { EventBus, EventBusCallback, EventBusObject, State, StateObject } from '../../constructors';\nimport { Fade, Slide } from '../../transitions';\nimport { ComponentConstructor, Components, EventMap, Options } from '../../types';\nimport { addClass, assert, assign, empty, forOwn, isString, merge, query, slice } from '../../utils';\n\n\n/**\n * The frontend class for the Splide slider.\n *\n * @since 3.0.0\n */\nexport class Splide {\n  /**\n   * Changes the default options for all Splide instances.\n   */\n  static defaults: Options = {};\n\n  /**\n   * The collection of state numbers.\n   */\n  static readonly STATES = STATES;\n\n  /**\n   * The root element where the Splide is applied.\n   */\n  readonly root: HTMLElement;\n\n  /**\n   * The EventBusObject object.\n   */\n  readonly event: EventBusObject = EventBus();\n\n  /**\n   * The collection of all component objects.\n   */\n  readonly Components: Components = {} as Components;\n\n  /**\n   * The StateObject object.\n   */\n  readonly state: StateObject = State( CREATED );\n\n  /**\n   * Splide instances to sync with.\n   */\n  readonly splides: Splide[] = [];\n\n  /**\n   * The collection of options.\n   */\n  private readonly _options: Options = {};\n\n  /**\n   * The collection of all components.\n   */\n  private _Components: Components;\n\n  /**\n   * The collection of extensions.\n   */\n  private _Extensions: Record<string, ComponentConstructor> = {};\n\n  /**\n   * The Transition component.\n   */\n  private _Transition: ComponentConstructor;\n\n  /**\n   * The Splide constructor.\n   *\n   * @param target  - The selector for the target element, or the element itself.\n   * @param options - Optional. An object with options.\n   */\n  constructor( target: string | HTMLElement, options?: Options ) {\n    const root = isString( target ) ? query<HTMLElement>( document, target ) : target;\n    assert( root, `${ root } is invalid.` );\n\n    this.root = root;\n\n    merge( DEFAULTS, Splide.defaults );\n    merge( merge( this._options, DEFAULTS ), options || {} );\n  }\n\n  /**\n   * Initializes the instance.\n   *\n   * @param Extensions - Optional. An object with extensions.\n   * @param Transition - Optional. A Transition component.\n   *\n   * @return `this`\n   */\n  mount( Extensions?: Record<string, ComponentConstructor>, Transition?: ComponentConstructor ): this {\n    const { state, Components } = this;\n    assert( state.is( [ CREATED, DESTROYED ] ), 'Already mounted!' );\n\n    state.set( CREATED );\n\n    this._Components = Components;\n    this._Transition = Transition || this._Transition || ( this.is( FADE ) ? Fade : Slide );\n    this._Extensions = Extensions || this._Extensions;\n\n    const Constructors = assign( {}, ComponentConstructors, this._Extensions, { Transition: this._Transition } );\n\n    forOwn( Constructors, ( Component, key ) => {\n      const component = Component( this, Components, this._options );\n      Components[ key ] = component;\n      component.setup && component.setup();\n    } );\n\n    forOwn( Components, component => {\n      component.mount && component.mount();\n    } );\n\n    this.emit( EVENT_MOUNTED );\n\n    addClass( this.root, CLASS_INITIALIZED );\n\n    state.set( IDLE );\n    this.emit( EVENT_READY );\n\n    return this;\n  }\n\n  /**\n   * Syncs the slider with the provided one.\n   * This method must be called before the `mount()`.\n   *\n   * @example\n   * ```ts\n   * var primary   = new Splide();\n   * var secondary = new Splide();\n   *\n   * primary.sync( secondary );\n   * primary.mount();\n   * secondary.mount();\n   * ```\n   *\n   * @param splide - A Splide instance to sync with.\n   *\n   * @return `this`\n   */\n  sync( splide: Splide ): this {\n    this.splides.push( splide );\n    splide.splides.push( this );\n    return this;\n  }\n\n  /**\n   * Moves the slider with the following control pattern.\n   *\n   * | Pattern | Description |\n   * |---|---|\n   * | `i` | Goes to the slide `i` |\n   * | `'+${i}'` | Increments the slide index by `i` |\n   * | `'-${i}'` | Decrements the slide index by `i` |\n   * | `'>'` | Goes to the next page |\n   * | `'<'` | Goes to the previous page |\n   * | `>${i}` | Goes to the page `i` |\n   *\n   * In most cases, `'>'` and `'<'` notations are enough to control the slider\n   * because they respect `perPage` and `perMove` options.\n   *\n   * @example\n   * ```ts\n   * var splide = new Splide();\n   *\n   * // Goes to the slide 1:\n   * splide.go( 1 );\n   *\n   * // Increments the index:\n   * splide.go( '+2' );\n   *\n   * // Goes to the next page:\n   * splide.go( '>' );\n   *\n   * // Goes to the page 2:\n   * splide.go( '>2' );\n   * ```\n   *\n   * @param control - A control pattern.\n   *\n   * @return `this`\n   */\n  go( control: number | string ): this {\n    this._Components.Controller.go( control );\n    return this;\n  }\n\n  /**\n   * Registers an event handler.\n   *\n   * @example\n   * ```ts\n   * var splide = new Splide();\n   *\n   * // Listens to a single event:\n   * splide.on( 'move', function() {} );\n   *\n   * // Listens to multiple events:\n   * splide.on( 'move resize', function() {} );\n   *\n   * // Appends a namespace:\n   * splide.on( 'move.myNamespace resize.myNamespace', function() {} );\n   * ```\n   *\n   * @param events   - An event name or names separated by spaces. Use a dot(.) to append a namespace.\n   * @param callback - A callback function.\n   *\n   * @return `this`\n   */\n  on<K extends keyof EventMap>( events: K, callback: EventMap[ K ] ): this;\n  on( events: string | string[], callback: EventBusCallback ): this {\n    this.event.on( events, callback, null, DEFAULT_USER_EVENT_PRIORITY );\n    return this;\n  }\n\n  /**\n   * Removes the registered all handlers for the specified event or events.\n   * If you want to only remove a particular handler, use namespace to identify it.\n   *\n   * @example\n   * ```ts\n   * var splide = new Splide();\n   *\n   * // Removes all handlers assigned to \"move\":\n   * splide.off( 'move' );\n   *\n   * // Only removes handlers that belong to the specified namespace:\n   * splide.off( 'move.myNamespace' );\n   * ```\n   *\n   * @param events - An event name or names separated by spaces. Use a dot(.) to append a namespace.\n   *\n   * @return `this`\n   */\n  off<K extends keyof EventMap>( events: K | K[] | string | string[] ): this {\n    this.event.off( events );\n    return this;\n  }\n\n  /**\n   * Emits an event and triggers registered handlers.\n   *\n   * @param event - An event name to emit.\n   * @param args  - Optional. Any number of arguments to pass to handlers.\n   *\n   * @return `this`\n   */\n  emit<K extends keyof EventMap>( event: K, ...args: Parameters<EventMap[ K ]> ): this;\n  emit( event: string, ...args: any[] ): this;\n  emit( event: string ): this {\n    // eslint-disable-next-line prefer-rest-params, prefer-spread\n    this.event.emit( event, ...slice( arguments, 1 ) );\n    return this;\n  }\n\n  /**\n   * Inserts a slide at the specified position.\n   *\n   * @example\n   * ```ts\n   * var splide = new Splide();\n   * splide.mount();\n   *\n   * // Adds the slide by the HTML:\n   * splide.add( '<li></li> );\n   *\n   * // or adds the element:\n   * splide.add( document.createElement( 'li' ) );\n   * ```\n   *\n   * @param slides - A slide element, an HTML string that represents a slide, or an array with them.\n   * @param index  - Optional. An index to insert a slide at.\n   *\n   * @return `this`\n   */\n  add( slides: string | HTMLElement | Array<string | HTMLElement>, index?: number ): this {\n    this._Components.Slides.add( slides, index );\n    return this;\n  }\n\n  /**\n   * Removes slides that match the matcher\n   * that can be an index, an array with indices, a selector, or an iteratee function.\n   *\n   * @param matcher - An index, an array with indices, a selector string, or an iteratee function.\n   */\n  remove( matcher: SlideMatcher ): this {\n    this._Components.Slides.remove( matcher );\n    return this;\n  }\n\n  /**\n   * Checks the slider type.\n   *\n   * @param type - A type to test.\n   *\n   * @return `true` if the type matches the current one, or otherwise `false`.\n   */\n  is( type: string ): boolean {\n    return this._options.type === type;\n  }\n\n  /**\n   * Refreshes the slider.\n   *\n   * @return `this`\n   */\n  refresh(): this {\n    this.emit( EVENT_REFRESH );\n    return this;\n  }\n\n  /**\n   * Destroys the slider.\n   *\n   * @param completely - Optional. If `true`, Splide will not remount the slider by breakpoints.\n   *\n   * @return `this`\n   */\n  destroy( completely = true ): this {\n    const { event, state } = this;\n\n    if ( state.is( CREATED ) ) {\n      // Postpones destruction requested before the slider becomes ready.\n      event.on( EVENT_READY, this.destroy.bind( this, completely ), this );\n    } else {\n      forOwn( this._Components, component => {\n        component.destroy && component.destroy( completely );\n      } );\n\n      event.emit( EVENT_DESTROY );\n      event.destroy();\n      completely && empty( this.splides );\n      state.set( DESTROYED );\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns options.\n   *\n   * @return An object with the latest options.\n   */\n  get options(): Options {\n    return this._options;\n  }\n\n  /**\n   * Merges options to the current options and emits `updated` event.\n   *\n   * @param options - An object with new options.\n   */\n  set options( options: Options ) {\n    const { _options } = this;\n    merge( _options, options );\n\n    if ( ! this.state.is( CREATED ) ) {\n      this.emit( EVENT_UPDATED, _options );\n    }\n  }\n\n  /**\n   * Returns the number of slides without clones.\n   *\n   * @return The number of slides.\n   */\n  get length(): number {\n    return this._Components.Slides.getLength( true );\n  }\n\n  /**\n   * Returns the active slide index.\n   *\n   * @return The active slide index.\n   */\n  get index(): number {\n    return this._Components.Controller.getIndex();\n  }\n}\n"],"names":["PROJECT_CODE","DATA_ATTRIBUTE","CREATED","MOUNTED","IDLE","MOVING","DESTROYED","STATES","DEFAULT_EVENT_PRIORITY","DEFAULT_USER_EVENT_PRIORITY","array","length","subject","isNull","Array","isArray","HTMLElement","value","values","iteratee","forEach","indexOf","items","push","toArray","arrayProto","prototype","arrayLike","start","end","slice","call","predicate","filter","elm","classes","add","name","classList","isString","split","parent","children","appendChild","bind","nodes","ref","parentNode","insertBefore","node","selector","matches","child","firstElementChild","object","keys","Object","i","key","arguments","source","isObject","merge","attrs","removeAttribute","attr","value2","setAttribute","String","tag","document","createElement","addClass","append","prop","isUndefined","getComputedStyle","style","style2","display2","focus","preventScroll","getAttribute","className","contains","target","getBoundingClientRect","removeChild","div","create","rect","width","html","DOMParser","parseFromString","body","e","stopPropagation","preventDefault","stopImmediatePropagation","querySelector","querySelectorAll","condition","message","Error","callback","noop","func","requestAnimationFrame","min","Math","max","floor","ceil","abs","x","y","epsilon","number","minOrMax","maxOrMin","exclusive","minimum","maximum","string","replacements","replace","replacement","ids","prefix","pad","handlers","events","priority","event","namespace","_event","_callback","_namespace","_priority","_key","sort","handler1","handler2","eventHandlers","handler","apply","join","fragments","eventNS","on","off","offBy","emit","destroy","EVENT_MOUNTED","EVENT_READY","EVENT_MOVE","EVENT_MOVED","EVENT_CLICK","EVENT_ACTIVE","EVENT_INACTIVE","EVENT_VISIBLE","EVENT_HIDDEN","EVENT_SLIDE_KEYDOWN","EVENT_REFRESH","EVENT_UPDATED","EVENT_RESIZE","EVENT_RESIZED","EVENT_REPOSITIONED","EVENT_DRAG","EVENT_DRAGGING","EVENT_DRAGGED","EVENT_SCROLL","EVENT_SCROLLED","EVENT_DESTROY","EVENT_ARROWS_MOUNTED","EVENT_ARROWS_UPDATED","EVENT_PAGINATION_MOUNTED","EVENT_PAGINATION_UPDATED","EVENT_NAVIGATION_MOUNTED","EVENT_AUTOPLAY_PLAY","EVENT_AUTOPLAY_PLAYING","EVENT_AUTOPLAY_PAUSE","EVENT_LAZYLOAD_LOADED","Splide2","listeners","targets","options","event2","addEventListener","listener","removeEventListener","unbind","data","interval","onInterval","onUpdate","limit","now","Date","startTime","rate","id","paused","count","elapsed","pause","update","resume","cancel","rewind","isPaused","initialState","state","states","includes","set","is","duration","RequestInterval","throttled","Components2","throttledObserve","Throttle","observe","initialOptions","points","currPoint","JSON","parse","root","breakpoints","isMin","mediaQuery","n","m","map","point","matchMedia","completely","item","find","item2","newOptions","mount","setup","RTL","TTB","ORIENTATION_MAP","marginRight","autoWidth","fixedWidth","paddingLeft","paddingRight","left","right","X","Y","ArrowLeft","ArrowRight","axisOnly","direction","index","resolve","orient","CLASS_ROOT","CLASS_SLIDER","CLASS_TRACK","CLASS_LIST","CLASS_SLIDE","CLASS_CLONE","CLASS_CONTAINER","CLASS_ARROWS","CLASS_ARROW","CLASS_ARROW_PREV","CLASS_ARROW_NEXT","CLASS_PAGINATION","CLASS_PAGINATION_PAGE","CLASS_PROGRESS","CLASS_PROGRESS_BAR","CLASS_AUTOPLAY","CLASS_PLAY","CLASS_PAUSE","CLASS_SPINNER","CLASS_INITIALIZED","CLASS_ACTIVE","CLASS_PREV","CLASS_NEXT","CLASS_VISIBLE","CLASS_LOADING","STATUS_CLASSES","CLASSES","slide","clone","arrows","arrow","prev","next","pagination","page","spinner","EventInterface","elements","slides","slider","track","list","getClasses","refresh","query","autoplay","bar","play","uniqueId","type","drag","isNavigation","assign","ROLE","ARIA_CONTROLS","ARIA_CURRENT","ARIA_LABEL","ARIA_HIDDEN","TAB_INDEX","DISABLED","ARIA_ORIENTATION","ALL_ATTRIBUTES","SLIDE","LOOP","FADE","slideIndex","destroyEvents","Components","updateOnMove","Direction","styles","isClone","container","focusableNodes","queryAll","destroyed","onMove","idx","label","format","i18n","slideX","controls","splides","splide","dest","currIndex","isActive","isVisible","active","hasClass","visible","ariaHidden","slideFocus","useContainer","trackRect","Elements","slideRect","from","distance","diff","isWithin","Slides2","Slide1","Slide2","Slide","excludeClones","Controller","toIndex","hasFocus","perPage","between","parseHtml","isHTMLElement","before","matcher","isFunction","images","img","register","get","getIn","getAt","remove","getLength","isEnough","Slides","vertical","window","init","resize","unit","cssPadding","cssTrackHeight","gap","cssSlideWidth","cssSlideHeight","padding","height","cssHeight","heightRatio","cssSlideSize","fixedHeight","autoHeight","withoutGap","getGap","totalSize","parseFloat","listSize","slideSize","sliderSize","getPadding","clones","cloneCount","computeCloneCount","isHead","cloneDeep","cloneNode","clones2","fixedSize","measure","fixedCount","baseCount","flickMaxPages","Layout","waiting","reposition","Scroll","isBusy","position","getPosition","looping","waitForTransition","Transition","jump","trimSpace","go","toPosition","preventLoop","transform","loop","exceededMin","exceededLimit","exceededMax","shift","backwards","excess","getLimit","size","sign","minDistance","Infinity","trimming","offset","trim","clamp","getEnd","move","translate","Move","isLoop","isSlide","prevIndex","slideCount","perMove","control","allowSameIndex","useScroll","speed","destination","useIndex","snap","toDest","scroll","match","indicator","computeDestIndex","getNext","getPrev","getAdjacent","approximatelyEqual","incremental","toPage","closest","setIndex","getIndex","XML_NAME_SPACE","PATH","SIZE","wrapper","created","createArrow","prev2","arrowPath","nextIndex","prevLabel","last","nextLabel","first","disabled","hovered","focused","forPause","button","pauseOnHover","pauseOnFocus","resetProgress","manual","cover","src","BOUNCE_DIFF_THRESHOLD","BOUNCE_DURATION","FRICTION_FACTOR","BASE_VELOCITY","MIN_DURATION","scrollCallback","clear","suppressConstraint","friction","computeDuration","onScrolled","easing","t","easingFunc","pow","FRICTION","LOG_INTERVAL","POINTER_DOWN_EVENTS","POINTER_MOVE_EVENTS","POINTER_UP_EVENTS","listenerOptions","passive","capture","basePosition","baseEvent","prevBaseEvent","lastEvent","isFree","isDragging","hasExceeded","clickPrevented","onPointerDown","onClick","prevent","isTouch","isTouchEvent","onPointerMove","onPointerUp","cancelable","expired","timeOf","exceeded","constrain","coordOf","thresholds","dragMinThreshold","mouse","touch","isSliderDirection","velocity","computeVelocity","computeDestination","diffX","diffY","base","diffCoord","diffTime","isFlick","flickPower","orthogonal","touches","timeStamp","TouchEvent","disable","IE_ARROW_KEYS","keyboard","onKeydown","normalizedKey","SRC_DATA_ATTRIBUTE","SRCSET_DATA_ATTRIBUTE","IMAGE_SELECTOR","isSequential","lazyLoad","_Slide","_img","srcset","_spinner","parentElement","preloadPages","load","error","li","class","text","pageX","curr","TRIGGER_KEYS","processed","concat","instances","index2","instance","wheel","onWheel","deltaY","I18N","DEFAULTS","done","endCallback","getSpeed","rewindSpeed","transition","EventBus","State","_Splide","defaults","_options","Extensions","_Components","_Transition","Fade","_Extensions","Constructors","ComponentConstructors","Component","component","sync","empty","Splide"],"mappings":"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"}
ÿØÿà JFIF    ÿþ$ ÿØÿà JFIF    ÿþ$ ÿÂ