Repository: Splidejs/vue-splide Branch: master Commit: a3657c7b63aa Files: 55 Total size: 197.0 KB Directory structure: gitextract_hmr2hzg6/ ├── .babelrc ├── .editorconfig ├── .eslintrc ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── BUG_REPORT.yml │ │ └── config.yml │ └── pull_request_template.md ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── dist/ │ └── js/ │ ├── vue-splide.cjs.js │ └── vue-splide.esm.js ├── examples/ │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.vue │ │ ├── components/ │ │ │ ├── AutoplayExample.vue │ │ │ ├── BasicExample.vue │ │ │ ├── DynamicSlideExample.vue │ │ │ ├── ReactivityExample.vue │ │ │ ├── ThumbnailsExample.vue │ │ │ └── VideoExample.vue │ │ ├── env.d.ts │ │ ├── main.ts │ │ └── utils/ │ │ ├── generateSlides/ │ │ │ └── generateSlides.ts │ │ └── index.ts │ ├── tsconfig.json │ └── vite.config.ts ├── jest.config.js ├── package.json ├── scripts/ │ └── copy-css.js ├── src/ │ └── js/ │ ├── build/ │ │ └── iife.ts │ ├── components/ │ │ ├── Splide/ │ │ │ └── Splide.vue │ │ ├── SplideSlide/ │ │ │ └── SplideSlide.vue │ │ ├── SplideTrack/ │ │ │ └── SplideTrack.vue │ │ └── index.ts │ ├── constants/ │ │ ├── events.ts │ │ └── keys.ts │ ├── env.d.ts │ ├── index.ts │ ├── plugin/ │ │ └── plugin.ts │ └── utils/ │ ├── forOwn/ │ │ ├── forOwn.ts │ │ └── test/ │ │ └── forOwn.test.ts │ ├── index.ts │ ├── isEqualShallow/ │ │ ├── isEqualShallow.ts │ │ └── test/ │ │ └── isEqualShallow.test.ts │ ├── isObject/ │ │ ├── isObject.ts │ │ └── test/ │ │ └── isObject.test.ts │ └── merge/ │ ├── merge.test.ts │ └── merge.ts ├── tsconfig.json ├── vite/ │ └── vite.config.iife.ts └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "presets": [ "@babel/preset-env" ] } ================================================ FILE: .editorconfig ================================================ root = true [*] indent_style = space indent_size = 2 charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true ================================================ FILE: .eslintrc ================================================ { "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:vue/vue3-recommended" ], "plugins": [ "@typescript-eslint" ], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": 2018, "sourceType": "module" }, "env": { "browser": true }, "ignorePatterns": [ "*.esm.js" ], "rules": { "semi": [ "error", "always", { "omitLastInOneLineBlock": true } ], "space-in-parens": [ "error", "always" ], "array-bracket-spacing": [ "error", "always" ], "object-curly-spacing": [ "error", "always" ], "computed-property-spacing": [ "error", "always" ], "camelcase": "error", "comma-dangle": [ "error", { "arrays": "always-multiline", "objects": "always-multiline", "imports": "always-multiline", "exports": "always-multiline", "functions": "never" } ], "comma-spacing": [ "error", { "before": false, "after": true } ], "eqeqeq": "error", "indent": [ "error", 2, { "SwitchCase": 1, "VariableDeclarator": "first" } ], "no-console": [ "error", { "allow": [ "error" ] } ], "no-empty-function": [ "error", { "allow": [ "methods" ] } ], "@typescript-eslint/no-empty-function": [ "error", { "allow": [ "methods" ] } ], "@typescript-eslint/no-unused-vars": "error", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/explicit-module-boundary-types": [ "error", { "allowArgumentsExplicitlyTypedAsAny": true } ], "@typescript-eslint/ban-types": [ "error", { "types": { "object": false } } ] } } ================================================ FILE: .github/FUNDING.yml ================================================ github: NaotoshiFujita ================================================ FILE: .github/ISSUE_TEMPLATE/BUG_REPORT.yml ================================================ name: Bug Report description: Create a bug report. labels: [ "bug" ] body: - type: markdown attributes: value: | Thank you for taking your time to post a bug report! Please fill out the following form. I might need to close the issue without required fields or e.g. clear repro steps. - type: checkboxes attributes: label: Checks description: Before posting a report, please check following things. options: - label: "Not a duplicate." required: true - label: "Not a question, feature request, or anything other than a bug report directly related to Vue Splide. Use Discussions for these topics: https://github.com/Splidejs/splide/discussions" required: true - type: input id: version attributes: label: Version description: The version where the bug happens. placeholder: x.x.x validations: required: true - type: textarea attributes: label: Description description: Describe the bug. placeholder: Provide a clear and precise description. Feel free to paste your code, screenshort, etc. validations: required: true - type: input id: reproduction-link attributes: label: Reproduction Link description: A link to a reproduction (CodeSandbox, etc.). **Do not link to your project**, it has to be a minimal and fresh reproduction. placeholder: "https://codesandbox.io/" validations: required: false - type: textarea attributes: label: Steps to Reproduce description: Describe steps how to reproduce the bug. value: | 1. 2. ... validations: required: true - type: textarea attributes: label: Expected Behaviour description: Describe what you expected to happen. validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false ================================================ FILE: .github/pull_request_template.md ================================================ ## Related Issues ## Description ================================================ FILE: .gitignore ================================================ node_modules/ .idea/ local/ ================================================ FILE: .npmignore ================================================ node_modules/ images/ examples/ local/ .idea/ .github/ .editorconfig ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2020 Naotoshi Fujita Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

Vue Splide

Vue Splide is the Vue component for the Splide slider/carousel.

Getting Started
Demo
Discussions

## Caveat The latest version only supports **Vue 3**. You have to use the old version (0.3.5) for Vue 2, but the Splide version is also outdated. ## Quick Start Get the latest version from NPM: ``` $ npm install @splidejs/vue-splide ``` Import CSS and components: ```vue ``` Visit [here](https://splidejs.com/integration/vue-splide/) for more details. ## Support Splide Please support the project if you like it! - [GitHub Sponsors](https://github.com/sponsors/NaotoshiFujita) ## License Vue Splide and Splide are released under the MIT license. © 2022 Naotoshi Fujita ================================================ FILE: dist/js/vue-splide.cjs.js ================================================ "use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const vue = require("vue"); function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } /*! * Splide.js * Version : 4.1.3 * License : MIT * Copyright: 2022 Naotoshi Fujita */ var MEDIA_PREFERS_REDUCED_MOTION = "(prefers-reduced-motion: reduce)"; var CREATED = 1; var MOUNTED = 2; var IDLE = 3; var MOVING = 4; var SCROLLING = 5; var DRAGGING = 6; var DESTROYED = 7; var STATES = { CREATED, MOUNTED, IDLE, MOVING, SCROLLING, DRAGGING, DESTROYED }; function empty(array) { array.length = 0; } function slice(arrayLike, start, end) { return Array.prototype.slice.call(arrayLike, start, end); } function apply(func) { return func.bind.apply(func, [null].concat(slice(arguments, 1))); } var nextTick = setTimeout; var noop = function noop2() { }; function raf(func) { return requestAnimationFrame(func); } function typeOf(type, subject) { return typeof subject === type; } function isObject$1(subject) { return !isNull(subject) && typeOf("object", subject); } var isArray = Array.isArray; var isFunction = apply(typeOf, "function"); var isString = apply(typeOf, "string"); var isUndefined = apply(typeOf, "undefined"); function isNull(subject) { return subject === null; } function isHTMLElement(subject) { try { return subject instanceof (subject.ownerDocument.defaultView || window).HTMLElement; } catch (e) { return false; } } function toArray(value) { return isArray(value) ? value : [value]; } function forEach(values, iteratee) { toArray(values).forEach(iteratee); } function includes(array, value) { return array.indexOf(value) > -1; } function push(array, items) { array.push.apply(array, toArray(items)); return array; } function toggleClass(elm, classes, add) { if (elm) { forEach(classes, function(name) { if (name) { elm.classList[add ? "add" : "remove"](name); } }); } } function addClass(elm, classes) { toggleClass(elm, isString(classes) ? classes.split(" ") : classes, true); } function append(parent, children2) { forEach(children2, parent.appendChild.bind(parent)); } function before(nodes, ref) { forEach(nodes, function(node) { var parent = (ref || node).parentNode; if (parent) { parent.insertBefore(node, ref); } }); } function matches(elm, selector) { return isHTMLElement(elm) && (elm["msMatchesSelector"] || elm.matches).call(elm, selector); } function children(parent, selector) { var children2 = parent ? slice(parent.children) : []; return selector ? children2.filter(function(child2) { return matches(child2, selector); }) : children2; } function child(parent, selector) { return selector ? children(parent, selector)[0] : parent.firstElementChild; } var ownKeys = Object.keys; function forOwn$1(object, iteratee, right) { if (object) { (right ? ownKeys(object).reverse() : ownKeys(object)).forEach(function(key) { key !== "__proto__" && iteratee(object[key], key); }); } return object; } function assign(object) { slice(arguments, 1).forEach(function(source) { forOwn$1(source, function(value, key) { object[key] = source[key]; }); }); return object; } function merge$1(object) { slice(arguments, 1).forEach(function(source) { forOwn$1(source, function(value, key) { if (isArray(value)) { object[key] = value.slice(); } else if (isObject$1(value)) { object[key] = merge$1({}, isObject$1(object[key]) ? object[key] : {}, value); } else { object[key] = value; } }); }); return object; } function omit(object, keys) { forEach(keys || ownKeys(object), function(key) { delete object[key]; }); } function removeAttribute(elms, attrs) { forEach(elms, function(elm) { forEach(attrs, function(attr) { elm && elm.removeAttribute(attr); }); }); } function setAttribute(elms, attrs, value) { if (isObject$1(attrs)) { forOwn$1(attrs, function(value2, name) { setAttribute(elms, name, value2); }); } else { forEach(elms, function(elm) { isNull(value) || value === "" ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value)); }); } } function create(tag, attrs, parent) { var elm = document.createElement(tag); if (attrs) { isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs); } parent && append(parent, elm); return elm; } function style(elm, prop, value) { if (isUndefined(value)) { return getComputedStyle(elm)[prop]; } if (!isNull(value)) { elm.style[prop] = "" + value; } } function display(elm, display2) { style(elm, "display", display2); } function focus(elm) { elm["setActive"] && elm["setActive"]() || elm.focus({ preventScroll: true }); } function getAttribute(elm, attr) { return elm.getAttribute(attr); } function hasClass(elm, className) { return elm && elm.classList.contains(className); } function rect(target) { return target.getBoundingClientRect(); } function remove(nodes) { forEach(nodes, function(node) { if (node && node.parentNode) { node.parentNode.removeChild(node); } }); } function parseHtml(html) { return child(new DOMParser().parseFromString(html, "text/html").body); } function prevent(e, stopPropagation) { e.preventDefault(); if (stopPropagation) { e.stopPropagation(); e.stopImmediatePropagation(); } } function query(parent, selector) { return parent && parent.querySelector(selector); } function queryAll(parent, selector) { return selector ? slice(parent.querySelectorAll(selector)) : []; } function removeClass(elm, classes) { toggleClass(elm, classes, false); } function timeOf(e) { return e.timeStamp; } function unit(value) { return isString(value) ? value : value ? value + "px" : ""; } var PROJECT_CODE = "splide"; var DATA_ATTRIBUTE = "data-" + PROJECT_CODE; function assert(condition, message) { if (!condition) { throw new Error("[" + PROJECT_CODE + "] " + (message || "")); } } var min = Math.min, max = Math.max, floor = Math.floor, ceil = Math.ceil, abs = Math.abs; function approximatelyEqual(x, y, epsilon) { return abs(x - y) < epsilon; } function between(number, x, y, exclusive) { var minimum = min(x, y); var maximum = max(x, y); return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum; } function clamp(number, x, y) { var minimum = min(x, y); var maximum = max(x, y); return min(max(minimum, number), maximum); } function sign(x) { return +(x > 0) - +(x < 0); } function format(string, replacements) { forEach(replacements, function(replacement) { string = string.replace("%s", "" + replacement); }); return string; } function pad(number) { return number < 10 ? "0" + number : "" + number; } var ids = {}; function uniqueId(prefix) { return "" + prefix + pad(ids[prefix] = (ids[prefix] || 0) + 1); } function EventBinder() { var listeners = []; function bind(targets, events, callback, options) { forEachEvent(targets, events, function(target, event, namespace) { var isEventTarget = "addEventListener" in target; var remover = isEventTarget ? target.removeEventListener.bind(target, event, callback, options) : target["removeListener"].bind(target, callback); isEventTarget ? target.addEventListener(event, callback, options) : target["addListener"](callback); listeners.push([target, event, namespace, callback, remover]); }); } function unbind(targets, events, callback) { forEachEvent(targets, events, function(target, event, namespace) { listeners = listeners.filter(function(listener) { if (listener[0] === target && listener[1] === event && listener[2] === namespace && (!callback || listener[3] === callback)) { listener[4](); return false; } return true; }); }); } function dispatch(target, type, detail) { var e; var bubbles = true; if (typeof CustomEvent === "function") { e = new CustomEvent(type, { bubbles, detail }); } else { e = document.createEvent("CustomEvent"); e.initCustomEvent(type, bubbles, false, detail); } target.dispatchEvent(e); return e; } function forEachEvent(targets, events, iteratee) { forEach(targets, function(target) { target && forEach(events, function(events2) { events2.split(" ").forEach(function(eventNS) { var fragment = eventNS.split("."); iteratee(target, fragment[0], fragment[1]); }); }); }); } function destroy() { listeners.forEach(function(data) { data[4](); }); empty(listeners); } return { bind, unbind, dispatch, destroy }; } var EVENT_MOUNTED = "mounted"; var EVENT_READY = "ready"; var EVENT_MOVE = "move"; var EVENT_MOVED = "moved"; var EVENT_CLICK = "click"; var EVENT_ACTIVE = "active"; var EVENT_INACTIVE = "inactive"; var EVENT_VISIBLE = "visible"; var EVENT_HIDDEN = "hidden"; var EVENT_REFRESH = "refresh"; var EVENT_UPDATED = "updated"; var EVENT_RESIZE = "resize"; var EVENT_RESIZED = "resized"; var EVENT_DRAG = "drag"; var EVENT_DRAGGING = "dragging"; var EVENT_DRAGGED = "dragged"; var EVENT_SCROLL = "scroll"; var EVENT_SCROLLED = "scrolled"; var EVENT_OVERFLOW = "overflow"; var EVENT_DESTROY = "destroy"; var EVENT_ARROWS_MOUNTED = "arrows:mounted"; var EVENT_ARROWS_UPDATED = "arrows:updated"; var EVENT_PAGINATION_MOUNTED = "pagination:mounted"; var EVENT_PAGINATION_UPDATED = "pagination:updated"; var EVENT_NAVIGATION_MOUNTED = "navigation:mounted"; var EVENT_AUTOPLAY_PLAY = "autoplay:play"; var EVENT_AUTOPLAY_PLAYING = "autoplay:playing"; var EVENT_AUTOPLAY_PAUSE = "autoplay:pause"; var EVENT_LAZYLOAD_LOADED = "lazyload:loaded"; var EVENT_SLIDE_KEYDOWN = "sk"; var EVENT_SHIFTED = "sh"; var EVENT_END_INDEX_CHANGED = "ei"; function EventInterface(Splide2) { var bus = Splide2 ? Splide2.event.bus : document.createDocumentFragment(); var binder = EventBinder(); function on(events, callback) { binder.bind(bus, toArray(events).join(" "), function(e) { callback.apply(callback, isArray(e.detail) ? e.detail : []); }); } function emit(event) { binder.dispatch(bus, event, slice(arguments, 1)); } if (Splide2) { Splide2.event.on(EVENT_DESTROY, binder.destroy); } return assign(binder, { bus, on, off: apply(binder.unbind, bus), emit }); } function RequestInterval(interval, onInterval, onUpdate, limit) { var now = Date.now; var startTime; var rate = 0; var id; var paused = true; var count = 0; function update() { if (!paused) { rate = interval ? min((now() - startTime) / interval, 1) : 1; onUpdate && onUpdate(rate); if (rate >= 1) { onInterval(); startTime = now(); if (limit && ++count >= limit) { return pause(); } } id = raf(update); } } function start(resume) { resume || cancel(); startTime = now() - (resume ? rate * interval : 0); paused = false; id = raf(update); } function pause() { paused = true; } function rewind() { startTime = now(); rate = 0; if (onUpdate) { onUpdate(rate); } } function cancel() { id && cancelAnimationFrame(id); rate = 0; id = 0; paused = true; } function set(time) { interval = time; } function isPaused() { return paused; } return { start, rewind, pause, cancel, set, isPaused }; } function State(initialState) { var state = initialState; function set(value) { state = value; } function is(states) { return includes(toArray(states), state); } return { set, is }; } function Throttle(func, duration) { var interval = RequestInterval(duration || 0, func, null, 1); return function() { interval.isPaused() && interval.start(); }; } function Media(Splide2, Components2, options) { var state = Splide2.state; var breakpoints = options.breakpoints || {}; var reducedMotion = options.reducedMotion || {}; var binder = EventBinder(); var queries = []; function setup() { var isMin = options.mediaQuery === "min"; ownKeys(breakpoints).sort(function(n, m) { return isMin ? +n - +m : +m - +n; }).forEach(function(key) { register(breakpoints[key], "(" + (isMin ? "min" : "max") + "-width:" + key + "px)"); }); register(reducedMotion, MEDIA_PREFERS_REDUCED_MOTION); update(); } function destroy(completely) { if (completely) { binder.destroy(); } } function register(options2, query2) { var queryList = matchMedia(query2); binder.bind(queryList, "change", update); queries.push([options2, queryList]); } function update() { var destroyed = state.is(DESTROYED); var direction = options.direction; var merged = queries.reduce(function(merged2, entry) { return merge$1(merged2, entry[1].matches ? entry[0] : {}); }, {}); omit(options); set(merged); if (options.destroy) { Splide2.destroy(options.destroy === "completely"); } else if (destroyed) { destroy(true); Splide2.mount(); } else { direction !== options.direction && Splide2.refresh(); } } function reduce(enable) { if (matchMedia(MEDIA_PREFERS_REDUCED_MOTION).matches) { enable ? merge$1(options, reducedMotion) : omit(options, ownKeys(reducedMotion)); } } function set(opts, base, notify) { merge$1(options, opts); base && merge$1(Object.getPrototypeOf(options), opts); if (notify || !state.is(CREATED)) { Splide2.emit(EVENT_UPDATED, options); } } return { setup, destroy, reduce, set }; } var ARROW = "Arrow"; var ARROW_LEFT = ARROW + "Left"; var ARROW_RIGHT = ARROW + "Right"; var ARROW_UP = ARROW + "Up"; var ARROW_DOWN = ARROW + "Down"; var RTL = "rtl"; var TTB = "ttb"; var ORIENTATION_MAP = { width: ["height"], left: ["top", "right"], right: ["bottom", "left"], x: ["y"], X: ["Y"], Y: ["X"], ArrowLeft: [ARROW_UP, ARROW_RIGHT], ArrowRight: [ARROW_DOWN, ARROW_LEFT] }; function Direction(Splide2, Components2, options) { function resolve(prop, axisOnly, direction) { direction = direction || options.direction; var index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1; return ORIENTATION_MAP[prop] && ORIENTATION_MAP[prop][index] || prop.replace(/width|left|right/i, function(match, offset) { var replacement = ORIENTATION_MAP[match.toLowerCase()][index] || match; return offset > 0 ? replacement.charAt(0).toUpperCase() + replacement.slice(1) : replacement; }); } function orient(value) { return value * (options.direction === RTL ? 1 : -1); } return { resolve, orient }; } var ROLE = "role"; var TAB_INDEX = "tabindex"; var DISABLED = "disabled"; var ARIA_PREFIX = "aria-"; var ARIA_CONTROLS = ARIA_PREFIX + "controls"; var ARIA_CURRENT = ARIA_PREFIX + "current"; var ARIA_SELECTED = ARIA_PREFIX + "selected"; var ARIA_LABEL = ARIA_PREFIX + "label"; var ARIA_LABELLEDBY = ARIA_PREFIX + "labelledby"; var ARIA_HIDDEN = ARIA_PREFIX + "hidden"; var ARIA_ORIENTATION = ARIA_PREFIX + "orientation"; var ARIA_ROLEDESCRIPTION = ARIA_PREFIX + "roledescription"; var ARIA_LIVE = ARIA_PREFIX + "live"; var ARIA_BUSY = ARIA_PREFIX + "busy"; var ARIA_ATOMIC = ARIA_PREFIX + "atomic"; var ALL_ATTRIBUTES = [ROLE, TAB_INDEX, DISABLED, ARIA_CONTROLS, ARIA_CURRENT, ARIA_LABEL, ARIA_LABELLEDBY, ARIA_HIDDEN, ARIA_ORIENTATION, ARIA_ROLEDESCRIPTION]; var CLASS_PREFIX = PROJECT_CODE + "__"; var STATUS_CLASS_PREFIX = "is-"; var CLASS_ROOT = PROJECT_CODE; var CLASS_TRACK = CLASS_PREFIX + "track"; var CLASS_LIST = CLASS_PREFIX + "list"; var CLASS_SLIDE = CLASS_PREFIX + "slide"; var CLASS_CLONE = CLASS_SLIDE + "--clone"; var CLASS_CONTAINER = CLASS_SLIDE + "__container"; var CLASS_ARROWS = CLASS_PREFIX + "arrows"; var CLASS_ARROW = CLASS_PREFIX + "arrow"; var CLASS_ARROW_PREV = CLASS_ARROW + "--prev"; var CLASS_ARROW_NEXT = CLASS_ARROW + "--next"; var CLASS_PAGINATION = CLASS_PREFIX + "pagination"; var CLASS_PAGINATION_PAGE = CLASS_PAGINATION + "__page"; var CLASS_PROGRESS = CLASS_PREFIX + "progress"; var CLASS_PROGRESS_BAR = CLASS_PROGRESS + "__bar"; var CLASS_TOGGLE = CLASS_PREFIX + "toggle"; var CLASS_SPINNER = CLASS_PREFIX + "spinner"; var CLASS_SR = CLASS_PREFIX + "sr"; var CLASS_INITIALIZED = STATUS_CLASS_PREFIX + "initialized"; var CLASS_ACTIVE = STATUS_CLASS_PREFIX + "active"; var CLASS_PREV = STATUS_CLASS_PREFIX + "prev"; var CLASS_NEXT = STATUS_CLASS_PREFIX + "next"; var CLASS_VISIBLE = STATUS_CLASS_PREFIX + "visible"; var CLASS_LOADING = STATUS_CLASS_PREFIX + "loading"; var CLASS_FOCUS_IN = STATUS_CLASS_PREFIX + "focus-in"; var CLASS_OVERFLOW = STATUS_CLASS_PREFIX + "overflow"; var STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING, CLASS_FOCUS_IN, CLASS_OVERFLOW]; var CLASSES = { slide: CLASS_SLIDE, clone: CLASS_CLONE, arrows: CLASS_ARROWS, arrow: CLASS_ARROW, prev: CLASS_ARROW_PREV, next: CLASS_ARROW_NEXT, pagination: CLASS_PAGINATION, page: CLASS_PAGINATION_PAGE, spinner: CLASS_SPINNER }; function closest(from, selector) { if (isFunction(from.closest)) { return from.closest(selector); } var elm = from; while (elm && elm.nodeType === 1) { if (matches(elm, selector)) { break; } elm = elm.parentElement; } return elm; } var FRICTION = 5; var LOG_INTERVAL = 200; var POINTER_DOWN_EVENTS = "touchstart mousedown"; var POINTER_MOVE_EVENTS = "touchmove mousemove"; var POINTER_UP_EVENTS = "touchend touchcancel mouseup click"; function Elements(Splide2, Components2, options) { var _EventInterface = EventInterface(Splide2), on = _EventInterface.on, bind = _EventInterface.bind; var root = Splide2.root; var i18n = options.i18n; var elements = {}; var slides = []; var rootClasses = []; var trackClasses = []; var track; var list; var isUsingKey; function setup() { collect(); init(); update(); } function mount() { on(EVENT_REFRESH, destroy); on(EVENT_REFRESH, setup); on(EVENT_UPDATED, update); bind(document, POINTER_DOWN_EVENTS + " keydown", function(e) { isUsingKey = e.type === "keydown"; }, { capture: true }); bind(root, "focusin", function() { toggleClass(root, CLASS_FOCUS_IN, !!isUsingKey); }); } function destroy(completely) { var attrs = ALL_ATTRIBUTES.concat("style"); empty(slides); removeClass(root, rootClasses); removeClass(track, trackClasses); removeAttribute([track, list], attrs); removeAttribute(root, completely ? attrs : ["style", ARIA_ROLEDESCRIPTION]); } function update() { removeClass(root, rootClasses); removeClass(track, trackClasses); rootClasses = getClasses(CLASS_ROOT); trackClasses = getClasses(CLASS_TRACK); addClass(root, rootClasses); addClass(track, trackClasses); setAttribute(root, ARIA_LABEL, options.label); setAttribute(root, ARIA_LABELLEDBY, options.labelledby); } function collect() { track = find("." + CLASS_TRACK); list = child(track, "." + CLASS_LIST); assert(track && list, "A track/list element is missing."); push(slides, children(list, "." + CLASS_SLIDE + ":not(." + CLASS_CLONE + ")")); forOwn$1({ arrows: CLASS_ARROWS, pagination: CLASS_PAGINATION, prev: CLASS_ARROW_PREV, next: CLASS_ARROW_NEXT, bar: CLASS_PROGRESS_BAR, toggle: CLASS_TOGGLE }, function(className, key) { elements[key] = find("." + className); }); assign(elements, { root, track, list, slides }); } function init() { var id = root.id || uniqueId(PROJECT_CODE); var role = options.role; root.id = id; track.id = track.id || id + "-track"; list.id = list.id || id + "-list"; if (!getAttribute(root, ROLE) && root.tagName !== "SECTION" && role) { setAttribute(root, ROLE, role); } setAttribute(root, ARIA_ROLEDESCRIPTION, i18n.carousel); setAttribute(list, ROLE, "presentation"); } function find(selector) { var elm = query(root, selector); return elm && closest(elm, "." + CLASS_ROOT) === root ? elm : void 0; } function getClasses(base) { return [base + "--" + options.type, base + "--" + options.direction, options.drag && base + "--draggable", options.isNavigation && base + "--nav", base === CLASS_ROOT && CLASS_ACTIVE]; } return assign(elements, { setup, mount, destroy }); } var SLIDE = "slide"; var LOOP = "loop"; var FADE = "fade"; function Slide$1(Splide2, index, slideIndex, slide) { var event = EventInterface(Splide2); var on = event.on, emit = event.emit, bind = event.bind; var Components = Splide2.Components, root = Splide2.root, options = Splide2.options; var isNavigation = options.isNavigation, updateOnMove = options.updateOnMove, i18n = options.i18n, pagination = options.pagination, slideFocus = options.slideFocus; var resolve = Components.Direction.resolve; var styles = getAttribute(slide, "style"); var label = getAttribute(slide, ARIA_LABEL); var isClone = slideIndex > -1; var container = child(slide, "." + CLASS_CONTAINER); var destroyed; function mount() { if (!isClone) { slide.id = root.id + "-slide" + pad(index + 1); setAttribute(slide, ROLE, pagination ? "tabpanel" : "group"); setAttribute(slide, ARIA_ROLEDESCRIPTION, i18n.slide); setAttribute(slide, ARIA_LABEL, label || format(i18n.slideLabel, [index + 1, Splide2.length])); } listen(); } function listen() { bind(slide, "click", apply(emit, EVENT_CLICK, self)); bind(slide, "keydown", apply(emit, EVENT_SLIDE_KEYDOWN, self)); on([EVENT_MOVED, EVENT_SHIFTED, EVENT_SCROLLED], update); on(EVENT_NAVIGATION_MOUNTED, initNavigation); if (updateOnMove) { on(EVENT_MOVE, onMove); } } function destroy() { destroyed = true; event.destroy(); removeClass(slide, STATUS_CLASSES); removeAttribute(slide, ALL_ATTRIBUTES); setAttribute(slide, "style", styles); setAttribute(slide, ARIA_LABEL, label || ""); } function initNavigation() { var controls = Splide2.splides.map(function(target) { var Slide2 = target.splide.Components.Slides.getAt(index); return Slide2 ? Slide2.slide.id : ""; }).join(" "); setAttribute(slide, ARIA_LABEL, format(i18n.slideX, (isClone ? slideIndex : index) + 1)); setAttribute(slide, ARIA_CONTROLS, controls); setAttribute(slide, ROLE, slideFocus ? "button" : ""); slideFocus && removeAttribute(slide, ARIA_ROLEDESCRIPTION); } function onMove() { if (!destroyed) { update(); } } function update() { if (!destroyed) { var curr = Splide2.index; updateActivity(); updateVisibility(); toggleClass(slide, CLASS_PREV, index === curr - 1); toggleClass(slide, CLASS_NEXT, index === curr + 1); } } function updateActivity() { var active = isActive(); if (active !== hasClass(slide, CLASS_ACTIVE)) { toggleClass(slide, CLASS_ACTIVE, active); setAttribute(slide, ARIA_CURRENT, isNavigation && active || ""); emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self); } } function updateVisibility() { var visible = isVisible(); var hidden = !visible && (!isActive() || isClone); if (!Splide2.state.is([MOVING, SCROLLING])) { setAttribute(slide, ARIA_HIDDEN, hidden || ""); } setAttribute(queryAll(slide, options.focusableNodes || ""), TAB_INDEX, hidden ? -1 : ""); if (slideFocus) { setAttribute(slide, TAB_INDEX, hidden ? -1 : 0); } if (visible !== hasClass(slide, CLASS_VISIBLE)) { toggleClass(slide, CLASS_VISIBLE, visible); emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self); } if (!visible && document.activeElement === slide) { var Slide2 = Components.Slides.getAt(Splide2.index); Slide2 && focus(Slide2.slide); } } function style$1(prop, value, useContainer) { style(useContainer && container || slide, prop, value); } function isActive() { var curr = Splide2.index; return curr === index || options.cloneStatus && curr === slideIndex; } function isVisible() { if (Splide2.is(FADE)) { return isActive(); } var trackRect = rect(Components.Elements.track); var slideRect = rect(slide); var left = resolve("left", true); var right = resolve("right", true); return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]); } function isWithin(from, distance) { var diff = abs(from - index); if (!isClone && (options.rewind || Splide2.is(LOOP))) { diff = min(diff, Splide2.length - diff); } return diff <= distance; } var self = { index, slideIndex, slide, container, isClone, mount, destroy, update, style: style$1, isWithin }; return self; } function Slides(Splide2, Components2, options) { var _EventInterface2 = EventInterface(Splide2), on = _EventInterface2.on, emit = _EventInterface2.emit, bind = _EventInterface2.bind; var _Components2$Elements = Components2.Elements, slides = _Components2$Elements.slides, list = _Components2$Elements.list; var Slides2 = []; function mount() { init(); on(EVENT_REFRESH, destroy); on(EVENT_REFRESH, init); } function init() { slides.forEach(function(slide, index) { register(slide, index, -1); }); } function destroy() { forEach$1(function(Slide2) { Slide2.destroy(); }); empty(Slides2); } function update() { forEach$1(function(Slide2) { Slide2.update(); }); } function register(slide, index, slideIndex) { var object = Slide$1(Splide2, index, slideIndex, slide); object.mount(); Slides2.push(object); Slides2.sort(function(Slide1, Slide2) { return Slide1.index - Slide2.index; }); } function get(excludeClones) { return excludeClones ? filter(function(Slide2) { return !Slide2.isClone; }) : Slides2; } function getIn(page) { var Controller2 = Components2.Controller; var index = Controller2.toIndex(page); var max2 = Controller2.hasFocus() ? 1 : options.perPage; return filter(function(Slide2) { return between(Slide2.index, index, index + max2 - 1); }); } function getAt(index) { return filter(index)[0]; } function add(items, index) { forEach(items, function(slide) { if (isString(slide)) { slide = parseHtml(slide); } if (isHTMLElement(slide)) { var ref = slides[index]; ref ? before(slide, ref) : append(list, slide); addClass(slide, options.classes.slide); observeImages(slide, apply(emit, EVENT_RESIZE)); } }); emit(EVENT_REFRESH); } function remove$1(matcher) { remove(filter(matcher).map(function(Slide2) { return Slide2.slide; })); emit(EVENT_REFRESH); } function forEach$1(iteratee, excludeClones) { get(excludeClones).forEach(iteratee); } function filter(matcher) { return Slides2.filter(isFunction(matcher) ? matcher : function(Slide2) { return isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index); }); } function style2(prop, value, useContainer) { forEach$1(function(Slide2) { Slide2.style(prop, value, useContainer); }); } function observeImages(elm, callback) { var images = queryAll(elm, "img"); var length = images.length; if (length) { images.forEach(function(img) { bind(img, "load error", function() { if (!--length) { callback(); } }); }); } else { callback(); } } function getLength(excludeClones) { return excludeClones ? slides.length : Slides2.length; } function isEnough() { return Slides2.length > options.perPage; } return { mount, destroy, update, register, get, getIn, getAt, add, remove: remove$1, forEach: forEach$1, filter, style: style2, getLength, isEnough }; } function Layout(Splide2, Components2, options) { var _EventInterface3 = EventInterface(Splide2), on = _EventInterface3.on, bind = _EventInterface3.bind, emit = _EventInterface3.emit; var Slides2 = Components2.Slides; var resolve = Components2.Direction.resolve; var _Components2$Elements2 = Components2.Elements, root = _Components2$Elements2.root, track = _Components2$Elements2.track, list = _Components2$Elements2.list; var getAt = Slides2.getAt, styleSlides = Slides2.style; var vertical; var rootRect; var overflow; function mount() { init(); bind(window, "resize load", Throttle(apply(emit, EVENT_RESIZE))); on([EVENT_UPDATED, EVENT_REFRESH], init); on(EVENT_RESIZE, resize); } function init() { vertical = options.direction === TTB; style(root, "maxWidth", unit(options.width)); style(track, resolve("paddingLeft"), cssPadding(false)); style(track, resolve("paddingRight"), cssPadding(true)); resize(true); } function resize(force) { var newRect = rect(root); if (force || rootRect.width !== newRect.width || rootRect.height !== newRect.height) { style(track, "height", cssTrackHeight()); styleSlides(resolve("marginRight"), unit(options.gap)); styleSlides("width", cssSlideWidth()); styleSlides("height", cssSlideHeight(), true); rootRect = newRect; emit(EVENT_RESIZED); if (overflow !== (overflow = isOverflow())) { toggleClass(root, CLASS_OVERFLOW, overflow); emit(EVENT_OVERFLOW, overflow); } } } function cssPadding(right) { var padding = options.padding; var prop = resolve(right ? "right" : "left"); return padding && unit(padding[prop] || (isObject$1(padding) ? 0 : padding)) || "0px"; } function cssTrackHeight() { var height = ""; if (vertical) { height = cssHeight(); assert(height, "height or heightRatio is missing."); height = "calc(" + height + " - " + cssPadding(false) + " - " + cssPadding(true) + ")"; } return height; } function cssHeight() { return unit(options.height || rect(list).width * options.heightRatio); } function cssSlideWidth() { return options.autoWidth ? null : unit(options.fixedWidth) || (vertical ? "" : cssSlideSize()); } function cssSlideHeight() { return unit(options.fixedHeight) || (vertical ? options.autoHeight ? null : cssSlideSize() : cssHeight()); } function cssSlideSize() { var gap = unit(options.gap); return "calc((100%" + (gap && " + " + gap) + ")/" + (options.perPage || 1) + (gap && " - " + gap) + ")"; } function listSize() { return rect(list)[resolve("width")]; } function slideSize(index, withoutGap) { var Slide2 = getAt(index || 0); return Slide2 ? rect(Slide2.slide)[resolve("width")] + (withoutGap ? 0 : getGap()) : 0; } function totalSize(index, withoutGap) { var Slide2 = getAt(index); if (Slide2) { var right = rect(Slide2.slide)[resolve("right")]; var left = rect(list)[resolve("left")]; return abs(right - left) + (withoutGap ? 0 : getGap()); } return 0; } function sliderSize(withoutGap) { return totalSize(Splide2.length - 1) - totalSize(0) + slideSize(0, withoutGap); } function getGap() { var Slide2 = getAt(0); return Slide2 && parseFloat(style(Slide2.slide, resolve("marginRight"))) || 0; } function getPadding(right) { return parseFloat(style(track, resolve("padding" + (right ? "Right" : "Left")))) || 0; } function isOverflow() { return Splide2.is(FADE) || sliderSize(true) > listSize(); } return { mount, resize, listSize, slideSize, sliderSize, totalSize, getPadding, isOverflow }; } var MULTIPLIER = 2; function Clones(Splide2, Components2, options) { var event = EventInterface(Splide2); var on = event.on; var Elements2 = Components2.Elements, Slides2 = Components2.Slides; var resolve = Components2.Direction.resolve; var clones = []; var cloneCount; function mount() { on(EVENT_REFRESH, remount); on([EVENT_UPDATED, EVENT_RESIZE], observe); if (cloneCount = computeCloneCount()) { generate(cloneCount); Components2.Layout.resize(true); } } function remount() { destroy(); mount(); } function destroy() { remove(clones); empty(clones); event.destroy(); } function observe() { var count = computeCloneCount(); if (cloneCount !== count) { if (cloneCount < count || !count) { event.emit(EVENT_REFRESH); } } } function generate(count) { var slides = Slides2.get().slice(); var length = slides.length; if (length) { while (slides.length < count) { push(slides, slides); } push(slides.slice(-count), slides.slice(0, count)).forEach(function(Slide2, index) { var isHead = index < count; var clone = cloneDeep(Slide2.slide, index); isHead ? before(clone, slides[0].slide) : append(Elements2.list, clone); push(clones, clone); Slides2.register(clone, index - count + (isHead ? 0 : length), Slide2.index); }); } } function cloneDeep(elm, index) { var clone = elm.cloneNode(true); addClass(clone, options.classes.clone); clone.id = Splide2.root.id + "-clone" + pad(index + 1); return clone; } function computeCloneCount() { var clones2 = options.clones; if (!Splide2.is(LOOP)) { clones2 = 0; } else if (isUndefined(clones2)) { var fixedSize = options[resolve("fixedWidth")] && Components2.Layout.slideSize(0); var fixedCount = fixedSize && ceil(rect(Elements2.track)[resolve("width")] / fixedSize); clones2 = fixedCount || options[resolve("autoWidth")] && Splide2.length || options.perPage * MULTIPLIER; } return clones2; } return { mount, destroy }; } function Move(Splide2, Components2, options) { var _EventInterface4 = EventInterface(Splide2), on = _EventInterface4.on, emit = _EventInterface4.emit; var set = Splide2.state.set; var _Components2$Layout = Components2.Layout, slideSize = _Components2$Layout.slideSize, getPadding = _Components2$Layout.getPadding, totalSize = _Components2$Layout.totalSize, listSize = _Components2$Layout.listSize, sliderSize = _Components2$Layout.sliderSize; var _Components2$Directio = Components2.Direction, resolve = _Components2$Directio.resolve, orient = _Components2$Directio.orient; var _Components2$Elements3 = Components2.Elements, list = _Components2$Elements3.list, track = _Components2$Elements3.track; var Transition; function mount() { Transition = Components2.Transition; on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition); } function reposition() { if (!Components2.Controller.isBusy()) { Components2.Scroll.cancel(); jump(Splide2.index); Components2.Slides.update(); } } function move(dest, index, prev, callback) { if (dest !== index && canShift(dest > prev)) { cancel(); translate(shift(getPosition(), dest > prev), true); } set(MOVING); emit(EVENT_MOVE, index, prev, dest); Transition.start(index, function() { set(IDLE); emit(EVENT_MOVED, index, prev, dest); callback && callback(); }); } function jump(index) { translate(toPosition(index, true)); } function translate(position, preventLoop) { if (!Splide2.is(FADE)) { var destination = preventLoop ? position : loop(position); style(list, "transform", "translate" + resolve("X") + "(" + destination + "px)"); position !== destination && emit(EVENT_SHIFTED); } } function loop(position) { if (Splide2.is(LOOP)) { var index = toIndex(position); var exceededMax = index > Components2.Controller.getEnd(); var exceededMin = index < 0; if (exceededMin || exceededMax) { position = shift(position, exceededMax); } } return position; } function shift(position, backwards) { var excess = position - getLimit(backwards); var size = sliderSize(); position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1); return position; } function cancel() { translate(getPosition(), true); Transition.cancel(); } function toIndex(position) { var Slides2 = Components2.Slides.get(); var index = 0; var minDistance = Infinity; for (var i = 0; i < Slides2.length; i++) { var slideIndex = Slides2[i].index; var distance = abs(toPosition(slideIndex, true) - position); if (distance <= minDistance) { minDistance = distance; index = slideIndex; } else { break; } } return index; } function toPosition(index, trimming) { var position = orient(totalSize(index - 1) - offset(index)); return trimming ? trim(position) : position; } function getPosition() { var left = resolve("left"); return rect(list)[left] - rect(track)[left] + orient(getPadding(false)); } function trim(position) { if (options.trimSpace && Splide2.is(SLIDE)) { position = clamp(position, 0, orient(sliderSize(true) - listSize())); } return position; } function offset(index) { var focus2 = options.focus; return focus2 === "center" ? (listSize() - slideSize(index, true)) / 2 : +focus2 * slideSize(index) || 0; } function getLimit(max2) { return toPosition(max2 ? Components2.Controller.getEnd() : 0, !!options.trimSpace); } function canShift(backwards) { var shifted = orient(shift(getPosition(), backwards)); return backwards ? shifted >= 0 : shifted <= list[resolve("scrollWidth")] - rect(track)[resolve("width")]; } function exceededLimit(max2, position) { position = isUndefined(position) ? getPosition() : position; var exceededMin = max2 !== true && orient(position) < orient(getLimit(false)); var exceededMax = max2 !== false && orient(position) > orient(getLimit(true)); return exceededMin || exceededMax; } return { mount, move, jump, translate, shift, cancel, toIndex, toPosition, getPosition, getLimit, exceededLimit, reposition }; } function Controller(Splide2, Components2, options) { var _EventInterface5 = EventInterface(Splide2), on = _EventInterface5.on, emit = _EventInterface5.emit; var Move2 = Components2.Move; var getPosition = Move2.getPosition, getLimit = Move2.getLimit, toPosition = Move2.toPosition; var _Components2$Slides = Components2.Slides, isEnough = _Components2$Slides.isEnough, getLength = _Components2$Slides.getLength; var omitEnd = options.omitEnd; var isLoop = Splide2.is(LOOP); var isSlide = Splide2.is(SLIDE); var getNext = apply(getAdjacent, false); var getPrev = apply(getAdjacent, true); var currIndex = options.start || 0; var endIndex; var prevIndex = currIndex; var slideCount; var perMove; var perPage; function mount() { init(); on([EVENT_UPDATED, EVENT_REFRESH, EVENT_END_INDEX_CHANGED], init); on(EVENT_RESIZED, onResized); } function init() { slideCount = getLength(true); perMove = options.perMove; perPage = options.perPage; endIndex = getEnd(); var index = clamp(currIndex, 0, omitEnd ? endIndex : slideCount - 1); if (index !== currIndex) { currIndex = index; Move2.reposition(); } } function onResized() { if (endIndex !== getEnd()) { emit(EVENT_END_INDEX_CHANGED); } } function go(control, allowSameIndex, callback) { if (!isBusy()) { var dest = parse(control); var index = loop(dest); if (index > -1 && (allowSameIndex || index !== currIndex)) { setIndex(index); Move2.move(dest, index, prevIndex, callback); } } } function scroll(destination, duration, snap, callback) { Components2.Scroll.scroll(destination, duration, snap, function() { var index = loop(Move2.toIndex(getPosition())); setIndex(omitEnd ? min(index, endIndex) : index); callback && callback(); }); } function parse(control) { var index = currIndex; if (isString(control)) { var _ref = control.match(/([+\-<>])(\d+)?/) || [], indicator = _ref[1], number = _ref[2]; if (indicator === "+" || indicator === "-") { index = computeDestIndex(currIndex + +("" + indicator + (+number || 1)), currIndex); } else if (indicator === ">") { index = number ? toIndex(+number) : getNext(true); } else if (indicator === "<") { index = getPrev(true); } } else { index = isLoop ? control : clamp(control, 0, endIndex); } return index; } function getAdjacent(prev, destination) { var number = perMove || (hasFocus() ? 1 : perPage); var dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex, !(perMove || hasFocus())); if (dest === -1 && isSlide) { if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) { return prev ? 0 : endIndex; } } return destination ? dest : loop(dest); } function computeDestIndex(dest, from, snapPage) { if (isEnough() || hasFocus()) { var index = computeMovableDestIndex(dest); if (index !== dest) { from = dest; dest = index; snapPage = false; } if (dest < 0 || dest > endIndex) { if (!perMove && (between(0, dest, from, true) || between(endIndex, from, dest, true))) { dest = toIndex(toPage(dest)); } else { if (isLoop) { dest = snapPage ? dest < 0 ? -(slideCount % perPage || perPage) : slideCount : dest; } else if (options.rewind) { dest = dest < 0 ? endIndex : 0; } else { dest = -1; } } } else { if (snapPage && dest !== from) { dest = toIndex(toPage(from) + (dest < from ? -1 : 1)); } } } else { dest = -1; } return dest; } function computeMovableDestIndex(dest) { if (isSlide && options.trimSpace === "move" && dest !== currIndex) { var position = getPosition(); while (position === toPosition(dest, true) && between(dest, 0, Splide2.length - 1, !options.rewind)) { dest < currIndex ? --dest : ++dest; } } return dest; } function loop(index) { return isLoop ? (index + slideCount) % slideCount || 0 : index; } function getEnd() { var end = slideCount - (hasFocus() || isLoop && perMove ? 1 : perPage); while (omitEnd && end-- > 0) { if (toPosition(slideCount - 1, true) !== toPosition(end, true)) { end++; break; } } return clamp(end, 0, slideCount - 1); } function toIndex(page) { return clamp(hasFocus() ? page : perPage * page, 0, endIndex); } function toPage(index) { return hasFocus() ? min(index, endIndex) : floor((index >= endIndex ? slideCount - 1 : index) / perPage); } function toDest(destination) { var closest2 = Move2.toIndex(destination); return isSlide ? clamp(closest2, 0, endIndex) : closest2; } function setIndex(index) { if (index !== currIndex) { prevIndex = currIndex; currIndex = index; } } function getIndex(prev) { return prev ? prevIndex : currIndex; } function hasFocus() { return !isUndefined(options.focus) || options.isNavigation; } function isBusy() { return Splide2.state.is([MOVING, SCROLLING]) && !!options.waitForTransition; } return { mount, go, scroll, getNext, getPrev, getAdjacent, getEnd, setIndex, getIndex, toIndex, toPage, toDest, hasFocus, isBusy }; } var XML_NAME_SPACE = "http://www.w3.org/2000/svg"; var 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"; var SIZE = 40; function Arrows(Splide2, Components2, options) { var event = EventInterface(Splide2); var on = event.on, bind = event.bind, emit = event.emit; var classes = options.classes, i18n = options.i18n; var Elements2 = Components2.Elements, Controller2 = Components2.Controller; var placeholder = Elements2.arrows, track = Elements2.track; var wrapper = placeholder; var prev = Elements2.prev; var next = Elements2.next; var created; var wrapperClasses; var arrows = {}; function mount() { init(); on(EVENT_UPDATED, remount); } function remount() { destroy(); mount(); } function init() { var enabled = options.arrows; if (enabled && !(prev && next)) { createArrows(); } if (prev && next) { assign(arrows, { prev, next }); display(wrapper, enabled ? "" : "none"); addClass(wrapper, wrapperClasses = CLASS_ARROWS + "--" + options.direction); if (enabled) { listen(); update(); setAttribute([prev, next], ARIA_CONTROLS, track.id); emit(EVENT_ARROWS_MOUNTED, prev, next); } } } function destroy() { event.destroy(); removeClass(wrapper, wrapperClasses); if (created) { remove(placeholder ? [prev, next] : wrapper); prev = next = null; } else { removeAttribute([prev, next], ALL_ATTRIBUTES); } } function listen() { on([EVENT_MOUNTED, EVENT_MOVED, EVENT_REFRESH, EVENT_SCROLLED, EVENT_END_INDEX_CHANGED], update); bind(next, "click", apply(go, ">")); bind(prev, "click", apply(go, "<")); } function go(control) { Controller2.go(control, true); } function createArrows() { wrapper = placeholder || create("div", classes.arrows); prev = createArrow(true); next = createArrow(false); created = true; append(wrapper, [prev, next]); !placeholder && before(wrapper, track); } function createArrow(prev2) { var arrow = '