{"version":3,"file":"splide-extension-grid.min.js","sources":["../../src/js/node_modules/@splidejs/splide/dist/js/splide.esm.js","../../src/js/node_modules/@splidejs/splide/src/js/utils/array/empty/empty.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/type/type.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/array/toArray/toArray.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/array/forEach/forEach.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/array/push/push.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/array/index.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/arrayLike/slice/slice.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/toggleClass/toggleClass.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/addClass/addClass.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/append/append.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/matches/matches.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/children/children.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/child/child.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/object/forOwn/forOwn.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/object/assign/assign.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/removeAttribute/removeAttribute.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/setAttribute/setAttribute.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/create/create.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/style/style.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/hasClass/hasClass.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/remove/remove.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/queryAll/queryAll.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/removeClass/removeClass.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/dom/unit/unit.ts","../../src/js/node_modules/@splidejs/splide/src/js/constants/project.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/error/assert/assert.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/math/math/math.ts","../../src/js/node_modules/@splidejs/splide/src/js/utils/string/pad/pad.ts","../../src/js/src/js/constants/classes.ts","../../src/js/src/js/constants/defaults.ts","../../src/js/src/js/extensions/Grid/Dimension.ts","../../src/js/src/js/extensions/Grid/Layout.ts","../../src/js/src/js/extensions/Grid/Grid.ts","../../src/js/src/js/build/default.ts"],"sourcesContent":["/*!\n * Splide.js\n * Version : 3.6.11\n * License : MIT\n * Copyright: 2022 Naotoshi Fujita\n */\nconst PROJECT_CODE = \"splide\";\nconst DATA_ATTRIBUTE = `data-${PROJECT_CODE}`;\n\nconst CREATED = 1;\nconst MOUNTED = 2;\nconst IDLE = 3;\nconst MOVING = 4;\nconst DESTROYED = 5;\nconst STATES = {\n CREATED,\n MOUNTED,\n IDLE,\n MOVING,\n DESTROYED\n};\n\nconst DEFAULT_EVENT_PRIORITY = 10;\nconst DEFAULT_USER_EVENT_PRIORITY = 20;\n\nfunction empty(array) {\n array.length = 0;\n}\n\nfunction isObject(subject) {\n return !isNull(subject) && typeof subject === \"object\";\n}\nfunction isArray(subject) {\n return Array.isArray(subject);\n}\nfunction isFunction(subject) {\n return typeof subject === \"function\";\n}\nfunction isString(subject) {\n return typeof subject === \"string\";\n}\nfunction isUndefined(subject) {\n return typeof subject === \"undefined\";\n}\nfunction isNull(subject) {\n return subject === null;\n}\nfunction isHTMLElement(subject) {\n return subject instanceof HTMLElement;\n}\n\nfunction toArray(value) {\n return isArray(value) ? value : [value];\n}\n\nfunction forEach(values, iteratee) {\n toArray(values).forEach(iteratee);\n}\n\nfunction includes(array, value) {\n return array.indexOf(value) > -1;\n}\n\nfunction push(array, items) {\n array.push(...toArray(items));\n return array;\n}\n\nconst arrayProto = Array.prototype;\n\nfunction slice(arrayLike, start, end) {\n return arrayProto.slice.call(arrayLike, start, end);\n}\n\nfunction find(arrayLike, predicate) {\n return slice(arrayLike).filter(predicate)[0];\n}\n\nfunction toggleClass(elm, classes, add) {\n if (elm) {\n forEach(classes, (name) => {\n if (name) {\n elm.classList[add ? \"add\" : \"remove\"](name);\n }\n });\n }\n}\n\nfunction addClass(elm, classes) {\n toggleClass(elm, isString(classes) ? classes.split(\" \") : classes, true);\n}\n\nfunction append(parent, children) {\n forEach(children, parent.appendChild.bind(parent));\n}\n\nfunction before(nodes, ref) {\n forEach(nodes, (node) => {\n const parent = ref.parentNode;\n if (parent) {\n parent.insertBefore(node, ref);\n }\n });\n}\n\nfunction matches(elm, selector) {\n return isHTMLElement(elm) && (elm[\"msMatchesSelector\"] || elm.matches).call(elm, selector);\n}\n\nfunction children(parent, selector) {\n return parent ? slice(parent.children).filter((child) => matches(child, selector)) : [];\n}\n\nfunction child(parent, selector) {\n return selector ? children(parent, selector)[0] : parent.firstElementChild;\n}\n\nfunction forOwn(object, iteratee, right) {\n if (object) {\n let keys = Object.keys(object);\n keys = right ? keys.reverse() : keys;\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \"__proto__\") {\n if (iteratee(object[key], key) === false) {\n break;\n }\n }\n }\n }\n return object;\n}\n\nfunction assign(object) {\n slice(arguments, 1).forEach((source) => {\n forOwn(source, (value, key) => {\n object[key] = source[key];\n });\n });\n return object;\n}\n\nfunction merge(object, source) {\n forOwn(source, (value, key) => {\n if (isArray(value)) {\n object[key] = value.slice();\n } else if (isObject(value)) {\n object[key] = merge(isObject(object[key]) ? object[key] : {}, value);\n } else {\n object[key] = value;\n }\n });\n return object;\n}\n\nfunction removeAttribute(elm, attrs) {\n if (elm) {\n forEach(attrs, (attr) => {\n elm.removeAttribute(attr);\n });\n }\n}\n\nfunction setAttribute(elm, attrs, value) {\n if (isObject(attrs)) {\n forOwn(attrs, (value2, name) => {\n setAttribute(elm, name, value2);\n });\n } else {\n isNull(value) ? removeAttribute(elm, attrs) : elm.setAttribute(attrs, String(value));\n }\n}\n\nfunction create(tag, attrs, parent) {\n const elm = document.createElement(tag);\n if (attrs) {\n isString(attrs) ? addClass(elm, attrs) : setAttribute(elm, attrs);\n }\n parent && append(parent, elm);\n return elm;\n}\n\nfunction style(elm, prop, value) {\n if (isUndefined(value)) {\n return getComputedStyle(elm)[prop];\n }\n if (!isNull(value)) {\n const { style: style2 } = elm;\n value = `${value}`;\n if (style2[prop] !== value) {\n style2[prop] = value;\n }\n }\n}\n\nfunction display(elm, display2) {\n style(elm, \"display\", display2);\n}\n\nfunction focus(elm) {\n elm[\"setActive\"] && elm[\"setActive\"]() || elm.focus({ preventScroll: true });\n}\n\nfunction getAttribute(elm, attr) {\n return elm.getAttribute(attr);\n}\n\nfunction hasClass(elm, className) {\n return elm && elm.classList.contains(className);\n}\n\nfunction rect(target) {\n return target.getBoundingClientRect();\n}\n\nfunction remove(nodes) {\n forEach(nodes, (node) => {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n });\n}\n\nfunction measure(parent, value) {\n if (isString(value)) {\n const div = create(\"div\", { style: `width: ${value}; position: absolute;` }, parent);\n value = rect(div).width;\n remove(div);\n }\n return value;\n}\n\nfunction parseHtml(html) {\n return child(new DOMParser().parseFromString(html, \"text/html\").body);\n}\n\nfunction prevent(e, stopPropagation) {\n e.preventDefault();\n if (stopPropagation) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n}\n\nfunction query(parent, selector) {\n return parent && parent.querySelector(selector);\n}\n\nfunction queryAll(parent, selector) {\n return slice(parent.querySelectorAll(selector));\n}\n\nfunction removeClass(elm, classes) {\n toggleClass(elm, classes, false);\n}\n\nfunction unit(value) {\n return isString(value) ? value : value ? `${value}px` : \"\";\n}\n\nfunction assert(condition, message = \"\") {\n if (!condition) {\n throw new Error(`[${PROJECT_CODE}] ${message}`);\n }\n}\n\nfunction nextTick(callback) {\n setTimeout(callback);\n}\n\nconst noop = () => {\n};\n\nfunction raf(func) {\n return requestAnimationFrame(func);\n}\n\nconst { min, max, floor, ceil, abs } = Math;\n\nfunction approximatelyEqual(x, y, epsilon) {\n return abs(x - y) < epsilon;\n}\n\nfunction between(number, minOrMax, maxOrMin, exclusive) {\n const minimum = min(minOrMax, maxOrMin);\n const maximum = max(minOrMax, maxOrMin);\n return exclusive ? minimum < number && number < maximum : minimum <= number && number <= maximum;\n}\n\nfunction clamp(number, x, y) {\n const minimum = min(x, y);\n const maximum = max(x, y);\n return min(max(minimum, number), maximum);\n}\n\nfunction sign(x) {\n return +(x > 0) - +(x < 0);\n}\n\nfunction camelToKebab(string) {\n return string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction format(string, replacements) {\n forEach(replacements, (replacement) => {\n string = string.replace(\"%s\", `${replacement}`);\n });\n return string;\n}\n\nfunction pad(number) {\n return number < 10 ? `0${number}` : `${number}`;\n}\n\nconst ids = {};\nfunction uniqueId(prefix) {\n return `${prefix}${pad(ids[prefix] = (ids[prefix] || 0) + 1)}`;\n}\n\nfunction EventBus() {\n let handlers = {};\n function on(events, callback, key, priority = DEFAULT_EVENT_PRIORITY) {\n forEachEvent(events, (event, namespace) => {\n handlers[event] = handlers[event] || [];\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 function off(events, key) {\n forEachEvent(events, (event, namespace) => {\n const eventHandlers = handlers[event];\n handlers[event] = eventHandlers && eventHandlers.filter((handler) => {\n return handler._key ? handler._key !== key : key || handler._namespace !== namespace;\n });\n });\n }\n function offBy(key) {\n forOwn(handlers, (eventHandlers, event) => {\n off(event, key);\n });\n }\n function emit(event) {\n (handlers[event] || []).forEach((handler) => {\n handler._callback.apply(handler, slice(arguments, 1));\n });\n }\n function destroy() {\n handlers = {};\n }\n function forEachEvent(events, iteratee) {\n toArray(events).join(\" \").split(\" \").forEach((eventNS) => {\n const fragments = eventNS.split(\".\");\n iteratee(fragments[0], fragments[1]);\n });\n }\n return {\n on,\n off,\n offBy,\n emit,\n destroy\n };\n}\n\nconst EVENT_MOUNTED = \"mounted\";\nconst EVENT_READY = \"ready\";\nconst EVENT_MOVE = \"move\";\nconst EVENT_MOVED = \"moved\";\nconst EVENT_SHIFTED = \"shifted\";\nconst EVENT_CLICK = \"click\";\nconst EVENT_ACTIVE = \"active\";\nconst EVENT_INACTIVE = \"inactive\";\nconst EVENT_VISIBLE = \"visible\";\nconst EVENT_HIDDEN = \"hidden\";\nconst EVENT_SLIDE_KEYDOWN = \"slide:keydown\";\nconst EVENT_REFRESH = \"refresh\";\nconst EVENT_UPDATED = \"updated\";\nconst EVENT_RESIZE = \"resize\";\nconst EVENT_RESIZED = \"resized\";\nconst EVENT_REPOSITIONED = \"repositioned\";\nconst EVENT_DRAG = \"drag\";\nconst EVENT_DRAGGING = \"dragging\";\nconst EVENT_DRAGGED = \"dragged\";\nconst EVENT_SCROLL = \"scroll\";\nconst EVENT_SCROLLED = \"scrolled\";\nconst EVENT_DESTROY = \"destroy\";\nconst EVENT_ARROWS_MOUNTED = \"arrows:mounted\";\nconst EVENT_ARROWS_UPDATED = \"arrows:updated\";\nconst EVENT_PAGINATION_MOUNTED = \"pagination:mounted\";\nconst EVENT_PAGINATION_UPDATED = \"pagination:updated\";\nconst EVENT_NAVIGATION_MOUNTED = \"navigation:mounted\";\nconst EVENT_AUTOPLAY_PLAY = \"autoplay:play\";\nconst EVENT_AUTOPLAY_PLAYING = \"autoplay:playing\";\nconst EVENT_AUTOPLAY_PAUSE = \"autoplay:pause\";\nconst EVENT_LAZYLOAD_LOADED = \"lazyload:loaded\";\n\nfunction EventInterface(Splide2) {\n const { event } = Splide2;\n const key = {};\n let listeners = [];\n function on(events, callback, priority) {\n event.on(events, callback, key, priority);\n }\n function off(events) {\n event.off(events, key);\n }\n function bind(targets, events, callback, options) {\n forEachEvent(targets, events, (target, event2) => {\n listeners.push([target, event2, callback, options]);\n target.addEventListener(event2, callback, options);\n });\n }\n function unbind(targets, events, callback) {\n forEachEvent(targets, events, (target, event2) => {\n listeners = listeners.filter((listener) => {\n if (listener[0] === target && listener[1] === event2 && (!callback || listener[2] === callback)) {\n target.removeEventListener(event2, listener[2], listener[3]);\n return false;\n }\n return true;\n });\n });\n }\n function forEachEvent(targets, events, iteratee) {\n forEach(targets, (target) => {\n if (target) {\n events.split(\" \").forEach(iteratee.bind(null, target));\n }\n });\n }\n function destroy() {\n listeners = listeners.filter((data) => unbind(data[0], data[1]));\n event.offBy(key);\n }\n event.on(EVENT_DESTROY, destroy, key);\n return {\n on,\n off,\n emit: event.emit,\n bind,\n unbind,\n destroy\n };\n}\n\nfunction RequestInterval(interval, onInterval, onUpdate, limit) {\n const { now } = Date;\n let startTime;\n let rate = 0;\n let id;\n let paused = true;\n let count = 0;\n function update() {\n if (!paused) {\n const elapsed = now() - startTime;\n if (elapsed >= interval) {\n rate = 1;\n startTime = now();\n } else {\n rate = elapsed / interval;\n }\n if (onUpdate) {\n onUpdate(rate);\n }\n if (rate === 1) {\n onInterval();\n if (limit && ++count >= limit) {\n return pause();\n }\n }\n raf(update);\n }\n }\n function start(resume) {\n !resume && cancel();\n startTime = now() - (resume ? rate * interval : 0);\n paused = false;\n raf(update);\n }\n function pause() {\n paused = true;\n }\n function rewind() {\n startTime = now();\n rate = 0;\n if (onUpdate) {\n onUpdate(rate);\n }\n }\n function cancel() {\n cancelAnimationFrame(id);\n rate = 0;\n id = 0;\n paused = true;\n }\n function set(time) {\n interval = time;\n }\n function isPaused() {\n return paused;\n }\n return {\n start,\n rewind,\n pause,\n cancel,\n set,\n isPaused\n };\n}\n\nfunction State(initialState) {\n let state = initialState;\n function set(value) {\n state = value;\n }\n function is(states) {\n return includes(toArray(states), state);\n }\n return { set, is };\n}\n\nfunction Throttle(func, duration) {\n let interval;\n function throttled() {\n if (!interval) {\n interval = RequestInterval(duration || 0, () => {\n func.apply(this, arguments);\n interval = null;\n }, null, 1);\n interval.start();\n }\n }\n return throttled;\n}\n\nfunction Options(Splide2, Components2, options) {\n const throttledObserve = Throttle(observe);\n let initialOptions;\n let points;\n let currPoint;\n function setup() {\n try {\n merge(options, JSON.parse(getAttribute(Splide2.root, DATA_ATTRIBUTE)));\n } catch (e) {\n assert(false, e.message);\n }\n initialOptions = merge({}, options);\n const { breakpoints } = options;\n if (breakpoints) {\n const isMin = options.mediaQuery === \"min\";\n points = Object.keys(breakpoints).sort((n, m) => isMin ? +m - +n : +n - +m).map((point) => [\n point,\n matchMedia(`(${isMin ? \"min\" : \"max\"}-width:${point}px)`)\n ]);\n observe();\n }\n }\n function mount() {\n if (points) {\n addEventListener(\"resize\", throttledObserve);\n }\n }\n function destroy(completely) {\n if (completely) {\n removeEventListener(\"resize\", throttledObserve);\n }\n }\n function observe() {\n const item = find(points, (item2) => item2[1].matches) || [];\n if (item[0] !== currPoint) {\n onMatch(currPoint = item[0]);\n }\n }\n function onMatch(point) {\n const newOptions = options.breakpoints[point] || initialOptions;\n if (newOptions.destroy) {\n Splide2.options = initialOptions;\n Splide2.destroy(newOptions.destroy === \"completely\");\n } else {\n if (Splide2.state.is(DESTROYED)) {\n destroy(true);\n Splide2.mount();\n }\n Splide2.options = newOptions;\n }\n }\n return {\n setup,\n mount,\n destroy\n };\n}\n\nconst RTL = \"rtl\";\nconst TTB = \"ttb\";\n\nconst ORIENTATION_MAP = {\n marginRight: [\"marginBottom\", \"marginLeft\"],\n autoWidth: [\"autoHeight\"],\n fixedWidth: [\"fixedHeight\"],\n paddingLeft: [\"paddingTop\", \"paddingRight\"],\n paddingRight: [\"paddingBottom\", \"paddingLeft\"],\n width: [\"height\"],\n left: [\"top\", \"right\"],\n right: [\"bottom\", \"left\"],\n x: [\"y\"],\n X: [\"Y\"],\n Y: [\"X\"],\n ArrowLeft: [\"ArrowUp\", \"ArrowRight\"],\n ArrowRight: [\"ArrowDown\", \"ArrowLeft\"]\n};\nfunction Direction(Splide2, Components2, options) {\n function resolve(prop, axisOnly) {\n const { direction } = options;\n const index = direction === RTL && !axisOnly ? 1 : direction === TTB ? 0 : -1;\n return ORIENTATION_MAP[prop][index] || prop;\n }\n function orient(value) {\n return value * (options.direction === RTL ? 1 : -1);\n }\n return {\n resolve,\n orient\n };\n}\n\nconst CLASS_ROOT = PROJECT_CODE;\nconst CLASS_SLIDER = `${PROJECT_CODE}__slider`;\nconst CLASS_TRACK = `${PROJECT_CODE}__track`;\nconst CLASS_LIST = `${PROJECT_CODE}__list`;\nconst CLASS_SLIDE = `${PROJECT_CODE}__slide`;\nconst CLASS_CLONE = `${CLASS_SLIDE}--clone`;\nconst CLASS_CONTAINER = `${CLASS_SLIDE}__container`;\nconst CLASS_ARROWS = `${PROJECT_CODE}__arrows`;\nconst CLASS_ARROW = `${PROJECT_CODE}__arrow`;\nconst CLASS_ARROW_PREV = `${CLASS_ARROW}--prev`;\nconst CLASS_ARROW_NEXT = `${CLASS_ARROW}--next`;\nconst CLASS_PAGINATION = `${PROJECT_CODE}__pagination`;\nconst CLASS_PAGINATION_PAGE = `${CLASS_PAGINATION}__page`;\nconst CLASS_PROGRESS = `${PROJECT_CODE}__progress`;\nconst CLASS_PROGRESS_BAR = `${CLASS_PROGRESS}__bar`;\nconst CLASS_AUTOPLAY = `${PROJECT_CODE}__autoplay`;\nconst CLASS_PLAY = `${PROJECT_CODE}__play`;\nconst CLASS_PAUSE = `${PROJECT_CODE}__pause`;\nconst CLASS_SPINNER = `${PROJECT_CODE}__spinner`;\nconst CLASS_INITIALIZED = \"is-initialized\";\nconst CLASS_ACTIVE = \"is-active\";\nconst CLASS_PREV = \"is-prev\";\nconst CLASS_NEXT = \"is-next\";\nconst CLASS_VISIBLE = \"is-visible\";\nconst CLASS_LOADING = \"is-loading\";\nconst STATUS_CLASSES = [CLASS_ACTIVE, CLASS_VISIBLE, CLASS_PREV, CLASS_NEXT, CLASS_LOADING];\nconst CLASSES = {\n slide: CLASS_SLIDE,\n clone: CLASS_CLONE,\n arrows: CLASS_ARROWS,\n arrow: CLASS_ARROW,\n prev: CLASS_ARROW_PREV,\n next: CLASS_ARROW_NEXT,\n pagination: CLASS_PAGINATION,\n page: CLASS_PAGINATION_PAGE,\n spinner: CLASS_SPINNER\n};\n\nfunction Elements(Splide2, Components2, options) {\n const { on } = EventInterface(Splide2);\n const { root } = Splide2;\n const elements = {};\n const slides = [];\n let classes;\n let slider;\n let track;\n let list;\n function setup() {\n collect();\n identify();\n addClass(root, classes = getClasses());\n }\n function mount() {\n on(EVENT_REFRESH, refresh, DEFAULT_EVENT_PRIORITY - 2);\n on(EVENT_UPDATED, update);\n }\n function destroy() {\n [root, track, list].forEach((elm) => {\n removeAttribute(elm, \"style\");\n });\n empty(slides);\n removeClass(root, classes);\n }\n function refresh() {\n destroy();\n setup();\n }\n function update() {\n removeClass(root, classes);\n addClass(root, classes = getClasses());\n }\n function collect() {\n slider = child(root, `.${CLASS_SLIDER}`);\n track = query(root, `.${CLASS_TRACK}`);\n list = child(track, `.${CLASS_LIST}`);\n assert(track && list, \"A track/list element is missing.\");\n push(slides, children(list, `.${CLASS_SLIDE}:not(.${CLASS_CLONE})`));\n const autoplay = find(`.${CLASS_AUTOPLAY}`);\n const arrows = find(`.${CLASS_ARROWS}`);\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 function identify() {\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 function find(selector) {\n return child(root, selector) || child(slider, selector);\n }\n function getClasses() {\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 return assign(elements, {\n setup,\n mount,\n destroy\n });\n}\n\nconst ROLE = \"role\";\nconst ARIA_CONTROLS = \"aria-controls\";\nconst ARIA_CURRENT = \"aria-current\";\nconst ARIA_LABEL = \"aria-label\";\nconst ARIA_HIDDEN = \"aria-hidden\";\nconst TAB_INDEX = \"tabindex\";\nconst DISABLED = \"disabled\";\nconst ARIA_ORIENTATION = \"aria-orientation\";\nconst ALL_ATTRIBUTES = [\n ROLE,\n ARIA_CONTROLS,\n ARIA_CURRENT,\n ARIA_LABEL,\n ARIA_HIDDEN,\n ARIA_ORIENTATION,\n TAB_INDEX,\n DISABLED\n];\n\nconst SLIDE = \"slide\";\nconst LOOP = \"loop\";\nconst FADE = \"fade\";\n\nfunction Slide$1(Splide2, index, slideIndex, slide) {\n const { on, emit, bind, destroy: destroyEvents } = EventInterface(Splide2);\n const { Components, root, options } = Splide2;\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 let destroyed;\n function mount() {\n if (!isClone) {\n slide.id = `${root.id}-slide${pad(index + 1)}`;\n }\n bind(slide, \"click keydown\", (e) => {\n emit(e.type === \"click\" ? EVENT_CLICK : EVENT_SLIDE_KEYDOWN, self, e);\n });\n on([EVENT_REFRESH, EVENT_REPOSITIONED, EVENT_SHIFTED, EVENT_MOVED, EVENT_SCROLLED], update);\n on(EVENT_NAVIGATION_MOUNTED, initNavigation);\n if (updateOnMove) {\n on(EVENT_MOVE, onMove);\n }\n }\n function destroy() {\n destroyed = true;\n destroyEvents();\n removeClass(slide, STATUS_CLASSES);\n removeAttribute(slide, ALL_ATTRIBUTES);\n setAttribute(slide, \"style\", styles);\n }\n function initNavigation() {\n const idx = isClone ? slideIndex : index;\n const label = format(options.i18n.slideX, idx + 1);\n const controls = Splide2.splides.map((target) => target.splide.root.id).join(\" \");\n setAttribute(slide, ARIA_LABEL, label);\n setAttribute(slide, ARIA_CONTROLS, controls);\n setAttribute(slide, ROLE, \"menuitem\");\n updateActivity(isActive());\n }\n function onMove() {\n if (!destroyed) {\n update();\n }\n }\n function update() {\n if (!destroyed) {\n const { index: currIndex } = Splide2;\n updateActivity(isActive());\n updateVisibility(isVisible());\n toggleClass(slide, CLASS_PREV, index === currIndex - 1);\n toggleClass(slide, CLASS_NEXT, index === currIndex + 1);\n }\n }\n function updateActivity(active) {\n if (active !== hasClass(slide, CLASS_ACTIVE)) {\n toggleClass(slide, CLASS_ACTIVE, active);\n if (isNavigation) {\n setAttribute(slide, ARIA_CURRENT, active || null);\n }\n emit(active ? EVENT_ACTIVE : EVENT_INACTIVE, self);\n }\n }\n function updateVisibility(visible) {\n const hidden = !visible && (!isActive() || isClone);\n setAttribute(slide, ARIA_HIDDEN, hidden || null);\n setAttribute(slide, TAB_INDEX, !hidden && options.slideFocus ? 0 : null);\n if (focusableNodes) {\n focusableNodes.forEach((node) => {\n setAttribute(node, TAB_INDEX, hidden ? -1 : null);\n });\n }\n if (visible !== hasClass(slide, CLASS_VISIBLE)) {\n toggleClass(slide, CLASS_VISIBLE, visible);\n emit(visible ? EVENT_VISIBLE : EVENT_HIDDEN, self);\n }\n }\n function style$1(prop, value, useContainer) {\n style(useContainer && container || slide, prop, value);\n }\n function isActive() {\n const { index: curr } = Splide2;\n return curr === index || options.cloneStatus && curr === slideIndex;\n }\n function isVisible() {\n if (Splide2.is(FADE)) {\n return isActive();\n }\n const trackRect = rect(Components.Elements.track);\n const slideRect = rect(slide);\n const left = resolve(\"left\");\n const right = resolve(\"right\");\n return floor(trackRect[left]) <= ceil(slideRect[left]) && floor(slideRect[right]) <= ceil(trackRect[right]);\n }\n function isWithin(from, distance) {\n let diff = abs(from - index);\n if (!isClone && (options.rewind || Splide2.is(LOOP))) {\n diff = min(diff, Splide2.length - diff);\n }\n return diff <= distance;\n }\n const self = {\n index,\n slideIndex,\n slide,\n container,\n isClone,\n mount,\n destroy,\n update,\n style: style$1,\n isWithin\n };\n return self;\n}\n\nfunction Slides(Splide2, Components2, options) {\n const { on, emit, bind } = EventInterface(Splide2);\n const { slides, list } = Components2.Elements;\n const Slides2 = [];\n function mount() {\n init();\n on(EVENT_REFRESH, refresh);\n on([EVENT_MOUNTED, EVENT_REFRESH], () => {\n Slides2.sort((Slide1, Slide2) => Slide1.index - Slide2.index);\n });\n }\n function init() {\n slides.forEach((slide, index) => {\n register(slide, index, -1);\n });\n }\n function destroy() {\n forEach$1((Slide2) => {\n Slide2.destroy();\n });\n empty(Slides2);\n }\n function refresh() {\n destroy();\n init();\n }\n function update() {\n forEach$1((Slide2) => {\n Slide2.update();\n });\n }\n function register(slide, index, slideIndex) {\n const object = Slide$1(Splide2, index, slideIndex, slide);\n object.mount();\n Slides2.push(object);\n }\n function get(excludeClones) {\n return excludeClones ? filter((Slide2) => !Slide2.isClone) : Slides2;\n }\n function getIn(page) {\n const { Controller } = Components2;\n const index = Controller.toIndex(page);\n const max = Controller.hasFocus() ? 1 : options.perPage;\n return filter((Slide2) => between(Slide2.index, index, index + max - 1));\n }\n function getAt(index) {\n return filter(index)[0];\n }\n function add(items, index) {\n forEach(items, (slide) => {\n if (isString(slide)) {\n slide = parseHtml(slide);\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 emit(EVENT_REFRESH);\n }\n function remove$1(matcher) {\n remove(filter(matcher).map((Slide2) => Slide2.slide));\n emit(EVENT_REFRESH);\n }\n function forEach$1(iteratee, excludeClones) {\n get(excludeClones).forEach(iteratee);\n }\n function filter(matcher) {\n return Slides2.filter(isFunction(matcher) ? matcher : (Slide2) => isString(matcher) ? matches(Slide2.slide, matcher) : includes(toArray(matcher), Slide2.index));\n }\n function style(prop, value, useContainer) {\n forEach$1((Slide2) => {\n Slide2.style(prop, value, useContainer);\n });\n }\n function observeImages(elm, callback) {\n const images = queryAll(elm, \"img\");\n let { length } = images;\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 function getLength(excludeClones) {\n return excludeClones ? slides.length : Slides2.length;\n }\n function isEnough() {\n return Slides2.length > options.perPage;\n }\n return {\n mount,\n destroy,\n update,\n register,\n get,\n getIn,\n getAt,\n add,\n remove: remove$1,\n forEach: forEach$1,\n filter,\n style,\n getLength,\n isEnough\n };\n}\n\nfunction Layout(Splide2, Components2, options) {\n const { on, bind, emit } = EventInterface(Splide2);\n const { Slides } = Components2;\n const { resolve } = Components2.Direction;\n const { root, track, list } = Components2.Elements;\n const { getAt } = Slides;\n let vertical;\n let rootRect;\n function mount() {\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 function init() {\n rootRect = null;\n vertical = options.direction === TTB;\n style(root, \"maxWidth\", unit(options.width));\n style(track, resolve(\"paddingLeft\"), cssPadding(false));\n style(track, resolve(\"paddingRight\"), cssPadding(true));\n resize();\n }\n function resize() {\n const newRect = rect(root);\n if (!rootRect || rootRect.width !== newRect.width || rootRect.height !== newRect.height) {\n style(track, \"height\", cssTrackHeight());\n Slides.style(resolve(\"marginRight\"), unit(options.gap));\n Slides.style(\"width\", cssSlideWidth() || null);\n setSlidesHeight();\n rootRect = newRect;\n emit(EVENT_RESIZED);\n }\n }\n function setSlidesHeight() {\n Slides.style(\"height\", cssSlideHeight() || null, true);\n }\n function cssPadding(right) {\n const { padding } = options;\n const prop = resolve(right ? \"right\" : \"left\");\n return padding && unit(padding[prop] || (isObject(padding) ? 0 : padding)) || \"0px\";\n }\n function cssTrackHeight() {\n let height = \"\";\n if (vertical) {\n height = cssHeight();\n assert(height, \"height or heightRatio is missing.\");\n height = `calc(${height} - ${cssPadding(false)} - ${cssPadding(true)})`;\n }\n return height;\n }\n function cssHeight() {\n return unit(options.height || rect(list).width * options.heightRatio);\n }\n function cssSlideWidth() {\n return options.autoWidth ? \"\" : unit(options.fixedWidth) || (vertical ? \"\" : cssSlideSize());\n }\n function cssSlideHeight() {\n return unit(options.fixedHeight) || (vertical ? options.autoHeight ? \"\" : cssSlideSize() : cssHeight());\n }\n function cssSlideSize() {\n const gap = unit(options.gap);\n return `calc((100%${gap && ` + ${gap}`})/${options.perPage || 1}${gap && ` - ${gap}`})`;\n }\n function listSize() {\n return rect(list)[resolve(\"width\")];\n }\n function slideSize(index, withoutGap) {\n const Slide = getAt(index || 0);\n return Slide ? rect(Slide.slide)[resolve(\"width\")] + (withoutGap ? 0 : getGap()) : 0;\n }\n function totalSize(index, withoutGap) {\n const Slide = getAt(index);\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 return 0;\n }\n function sliderSize() {\n return totalSize(Splide2.length - 1, true) - totalSize(-1, true);\n }\n function getGap() {\n const Slide = getAt(0);\n return Slide && parseFloat(style(Slide.slide, resolve(\"marginRight\"))) || 0;\n }\n function getPadding(right) {\n return parseFloat(style(track, resolve(`padding${right ? \"Right\" : \"Left\"}`))) || 0;\n }\n return {\n mount,\n listSize,\n slideSize,\n sliderSize,\n totalSize,\n getPadding\n };\n}\n\nfunction Clones(Splide2, Components2, options) {\n const { on, emit } = EventInterface(Splide2);\n const { Elements, Slides } = Components2;\n const { resolve } = Components2.Direction;\n const clones = [];\n let cloneCount;\n function mount() {\n init();\n on(EVENT_REFRESH, refresh);\n on([EVENT_UPDATED, EVENT_RESIZE], observe);\n }\n function init() {\n if (cloneCount = computeCloneCount()) {\n generate(cloneCount);\n emit(EVENT_RESIZE);\n }\n }\n function destroy() {\n remove(clones);\n empty(clones);\n }\n function refresh() {\n destroy();\n init();\n }\n function observe() {\n if (cloneCount < computeCloneCount()) {\n emit(EVENT_REFRESH);\n }\n }\n function generate(count) {\n const slides = Slides.get().slice();\n const { length } = slides;\n if (length) {\n while (slides.length < count) {\n push(slides, slides);\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 function cloneDeep(elm, index) {\n const clone = elm.cloneNode(true);\n addClass(clone, options.classes.clone);\n clone.id = `${Splide2.root.id}-clone${pad(index + 1)}`;\n return clone;\n }\n function computeCloneCount() {\n let { clones: clones2 } = options;\n if (!Splide2.is(LOOP)) {\n clones2 = 0;\n } else if (!clones2) {\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\")] && Splide2.length || options.perPage;\n clones2 = baseCount * (options.drag ? (options.flickMaxPages || 1) + 1 : 2);\n }\n return clones2;\n }\n return {\n mount,\n destroy\n };\n}\n\nfunction Move(Splide2, Components2, options) {\n const { on, emit } = EventInterface(Splide2);\n const { slideSize, getPadding, totalSize, listSize, sliderSize } = Components2.Layout;\n const { resolve, orient } = Components2.Direction;\n const { list, track } = Components2.Elements;\n let Transition;\n function mount() {\n Transition = Components2.Transition;\n on([EVENT_MOUNTED, EVENT_RESIZED, EVENT_UPDATED, EVENT_REFRESH], reposition);\n }\n function destroy() {\n removeAttribute(list, \"style\");\n }\n function reposition() {\n if (!isBusy()) {\n Components2.Scroll.cancel();\n jump(Splide2.index);\n emit(EVENT_REPOSITIONED);\n }\n }\n function move(dest, index, prev, callback) {\n if (!isBusy()) {\n const { set } = Splide2.state;\n const position = getPosition();\n if (dest !== index) {\n Transition.cancel();\n translate(shift(position, dest > index), true);\n }\n set(MOVING);\n emit(EVENT_MOVE, index, prev, dest);\n Transition.start(index, () => {\n set(IDLE);\n emit(EVENT_MOVED, index, prev, dest);\n if (options.trimSpace === \"move\" && dest !== prev && position === getPosition()) {\n Components2.Controller.go(dest > prev ? \">\" : \"<\", false, callback);\n } else {\n callback && callback();\n }\n });\n }\n }\n function jump(index) {\n translate(toPosition(index, true));\n }\n function translate(position, preventLoop) {\n if (!Splide2.is(FADE)) {\n const destination = preventLoop ? position : loop(position);\n list.style.transform = `translate${resolve(\"X\")}(${destination}px)`;\n position !== destination && emit(EVENT_SHIFTED);\n }\n }\n function loop(position) {\n if (Splide2.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 if (exceededMin || exceededMax) {\n position = shift(position, exceededMax);\n }\n }\n return position;\n }\n function shift(position, backwards) {\n const excess = position - getLimit(backwards);\n const size = sliderSize();\n position -= orient(size * (ceil(abs(excess) / size) || 1)) * (backwards ? 1 : -1);\n return position;\n }\n function cancel() {\n translate(getPosition());\n Transition.cancel();\n }\n function toIndex(position) {\n const Slides = Components2.Slides.get();\n let index = 0;\n let minDistance = Infinity;\n for (let i = 0; i < Slides.length; i++) {\n const slideIndex = Slides[i].index;\n const distance = abs(toPosition(slideIndex, true) - position);\n if (distance <= minDistance) {\n minDistance = distance;\n index = slideIndex;\n } else {\n break;\n }\n }\n return index;\n }\n function toPosition(index, trimming) {\n const position = orient(totalSize(index - 1) - offset(index));\n return trimming ? trim(position) : position;\n }\n function getPosition() {\n const left = resolve(\"left\");\n return rect(list)[left] - rect(track)[left] + orient(getPadding(false));\n }\n function trim(position) {\n if (options.trimSpace && Splide2.is(SLIDE)) {\n position = clamp(position, 0, orient(sliderSize() - listSize()));\n }\n return position;\n }\n function offset(index) {\n const { focus } = options;\n return focus === \"center\" ? (listSize() - slideSize(index, true)) / 2 : +focus * slideSize(index) || 0;\n }\n function getLimit(max) {\n return toPosition(max ? Components2.Controller.getEnd() : 0, !!options.trimSpace);\n }\n function isBusy() {\n return Splide2.state.is(MOVING) && options.waitForTransition;\n }\n function exceededLimit(max, position) {\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 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\nfunction Controller(Splide2, Components2, options) {\n const { on } = EventInterface(Splide2);\n const { Move } = Components2;\n const { getPosition, getLimit } = Move;\n const { isEnough, getLength } = Components2.Slides;\n const isLoop = Splide2.is(LOOP);\n const isSlide = Splide2.is(SLIDE);\n let currIndex = options.start || 0;\n let prevIndex = currIndex;\n let slideCount;\n let perMove;\n let perPage;\n function mount() {\n init();\n on([EVENT_UPDATED, EVENT_REFRESH], init, DEFAULT_EVENT_PRIORITY - 1);\n }\n function init() {\n slideCount = getLength(true);\n perMove = options.perMove;\n perPage = options.perPage;\n currIndex = clamp(currIndex, 0, slideCount - 1);\n }\n function go(control, allowSameIndex, callback) {\n const dest = parse(control);\n if (options.useScroll) {\n scroll(dest, true, true, options.speed, callback);\n } else {\n const index = loop(dest);\n if (index > -1 && !Move.isBusy() && (allowSameIndex || index !== currIndex)) {\n setIndex(index);\n Move.move(dest, index, prevIndex, callback);\n }\n }\n }\n function scroll(destination, useIndex, snap, duration, callback) {\n const dest = useIndex ? destination : toDest(destination);\n Components2.Scroll.scroll(useIndex || snap ? Move.toPosition(dest, true) : destination, duration, () => {\n setIndex(Move.toIndex(Move.getPosition()));\n callback && callback();\n });\n }\n function parse(control) {\n let index = currIndex;\n if (isString(control)) {\n const [, indicator, number] = control.match(/([+\\-<>])(\\d+)?/) || [];\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 index = isLoop ? control : clamp(control, 0, getEnd());\n }\n return index;\n }\n function getNext(destination) {\n return getAdjacent(false, destination);\n }\n function getPrev(destination) {\n return getAdjacent(true, destination);\n }\n function getAdjacent(prev, destination) {\n const number = perMove || (hasFocus() ? 1 : perPage);\n const dest = computeDestIndex(currIndex + number * (prev ? -1 : 1), currIndex);\n if (dest === -1 && isSlide) {\n if (!approximatelyEqual(getPosition(), getLimit(!prev), 1)) {\n return prev ? 0 : getEnd();\n }\n }\n return destination ? dest : loop(dest);\n }\n function computeDestIndex(dest, from, incremental) {\n if (isEnough()) {\n const end = getEnd();\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 || hasFocus() ? dest : 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 (!incremental && dest !== from) {\n dest = perMove ? dest : toIndex(toPage(from) + (dest < from ? -1 : 1));\n }\n }\n } else {\n dest = -1;\n }\n return dest;\n }\n function getEnd() {\n let end = slideCount - perPage;\n if (hasFocus() || isLoop && perMove) {\n end = slideCount - 1;\n }\n return max(end, 0);\n }\n function loop(index) {\n if (isLoop) {\n return isEnough() ? index % slideCount + (index < 0 ? slideCount : 0) : -1;\n }\n return index;\n }\n function toIndex(page) {\n return clamp(hasFocus() ? page : perPage * page, 0, getEnd());\n }\n function toPage(index) {\n if (!hasFocus()) {\n index = between(index, slideCount - perPage, slideCount - 1) ? slideCount - 1 : index;\n index = floor(index / perPage);\n }\n return index;\n }\n function toDest(destination) {\n const closest = Move.toIndex(destination);\n return isSlide ? clamp(closest, 0, getEnd()) : closest;\n }\n function setIndex(index) {\n if (index !== currIndex) {\n prevIndex = currIndex;\n currIndex = index;\n }\n }\n function getIndex(prev) {\n return prev ? prevIndex : currIndex;\n }\n function hasFocus() {\n return !isUndefined(options.focus) || options.isNavigation;\n }\n return {\n mount,\n go,\n scroll,\n getNext,\n getPrev,\n getAdjacent,\n getEnd,\n setIndex,\n getIndex,\n toIndex,\n toPage,\n toDest,\n hasFocus\n };\n}\n\nconst XML_NAME_SPACE = \"http://www.w3.org/2000/svg\";\nconst 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\";\nconst SIZE = 40;\n\nfunction Arrows(Splide2, Components2, options) {\n const { on, bind, emit } = EventInterface(Splide2);\n const { classes, i18n } = options;\n const { Elements, Controller } = Components2;\n let wrapper = Elements.arrows;\n let prev = Elements.prev;\n let next = Elements.next;\n let created;\n const arrows = {};\n function mount() {\n init();\n on(EVENT_UPDATED, init);\n }\n function init() {\n if (options.arrows) {\n if (!prev || !next) {\n createArrows();\n }\n }\n if (prev && next) {\n if (!arrows.prev) {\n const { id } = Elements.track;\n setAttribute(prev, ARIA_CONTROLS, id);\n setAttribute(next, ARIA_CONTROLS, id);\n arrows.prev = prev;\n arrows.next = next;\n listen();\n emit(EVENT_ARROWS_MOUNTED, prev, next);\n } else {\n display(wrapper, options.arrows === false ? \"none\" : \"\");\n }\n }\n }\n function destroy() {\n if (created) {\n remove(wrapper);\n } else {\n removeAttribute(prev, ALL_ATTRIBUTES);\n removeAttribute(next, ALL_ATTRIBUTES);\n }\n }\n function listen() {\n const { go } = Controller;\n on([EVENT_MOUNTED, EVENT_MOVED, EVENT_UPDATED, EVENT_REFRESH, EVENT_SCROLLED], update);\n bind(next, \"click\", () => {\n go(\">\", true);\n });\n bind(prev, \"click\", () => {\n go(\"<\", true);\n });\n }\n function createArrows() {\n wrapper = create(\"div\", classes.arrows);\n prev = createArrow(true);\n next = createArrow(false);\n created = true;\n append(wrapper, [prev, next]);\n before(wrapper, child(options.arrows === \"slider\" && Elements.slider || Splide2.root));\n }\n function createArrow(prev2) {\n const arrow = ``;\n }\n html() {\n const { rootClass, listTag, arrows, beforeTrack, afterTrack, slider, beforeSlider, afterSlider } = this.config;\n let html = \"\";\n html += `
`;\n html += ``;\n if (slider) {\n html += beforeSlider || \"\";\n html += `
`;\n }\n html += beforeTrack || \"\";\n if (arrows) {\n html += this.renderArrows();\n }\n html += `
`;\n html += `<${listTag} class=\"splide__list\">`;\n html += this.renderSlides();\n html += ``;\n html += `
`;\n html += afterTrack || \"\";\n if (slider) {\n html += `
`;\n html += afterSlider || \"\";\n }\n html += `
`;\n return html;\n }\n}\n\nexport { CLASSES, CLASS_ACTIVE, CLASS_ARROW, CLASS_ARROWS, CLASS_ARROW_NEXT, CLASS_ARROW_PREV, CLASS_AUTOPLAY, CLASS_CLONE, CLASS_CONTAINER, CLASS_INITIALIZED, CLASS_LIST, CLASS_LOADING, CLASS_NEXT, CLASS_PAGINATION, CLASS_PAGINATION_PAGE, CLASS_PAUSE, CLASS_PLAY, CLASS_PREV, CLASS_PROGRESS, CLASS_PROGRESS_BAR, CLASS_ROOT, CLASS_SLIDE, CLASS_SLIDER, CLASS_SPINNER, CLASS_TRACK, CLASS_VISIBLE, EVENT_ACTIVE, EVENT_ARROWS_MOUNTED, EVENT_ARROWS_UPDATED, EVENT_AUTOPLAY_PAUSE, EVENT_AUTOPLAY_PLAY, EVENT_AUTOPLAY_PLAYING, EVENT_CLICK, EVENT_DESTROY, EVENT_DRAG, EVENT_DRAGGED, EVENT_DRAGGING, EVENT_HIDDEN, EVENT_INACTIVE, EVENT_LAZYLOAD_LOADED, EVENT_MOUNTED, EVENT_MOVE, EVENT_MOVED, EVENT_NAVIGATION_MOUNTED, EVENT_PAGINATION_MOUNTED, EVENT_PAGINATION_UPDATED, EVENT_READY, EVENT_REFRESH, EVENT_REPOSITIONED, EVENT_RESIZE, EVENT_RESIZED, EVENT_SCROLL, EVENT_SCROLLED, EVENT_SHIFTED, EVENT_SLIDE_KEYDOWN, EVENT_UPDATED, EVENT_VISIBLE, EventBus, EventInterface, RequestInterval, STATUS_CLASSES, Splide, SplideRenderer, State, Throttle, Splide as default };\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( 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( 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( values: T | T[], iteratee: ( value: T, index: number, array: T[] ) => void ): void {\r\n toArray( values ).forEach( iteratee );\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( 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( arrayLike: ArrayLike, start?: number, end?: number ): T[] {\r\n return arrayProto.slice.call( arrayLike, start, end );\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 { isHTMLElement } from '../../type/type';\n\n\n/**\n * Checks if the element can be selected by the provided selector or not.\n *\n * @param elm - An element to check.\n * @param selector - A selector to test.\n *\n * @return `true` if the selector matches the element, or otherwise `false`.\n */\nexport function matches( elm: Element | EventTarget, selector: string ): boolean {\n return isHTMLElement( elm ) && ( elm[ 'msMatchesSelector' ] || elm.matches ).call( elm, selector );\n}\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( 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( parent: HTMLElement, selector?: string ): E | undefined {\r\n return selector ? children( parent, selector )[ 0 ] : parent.firstElementChild as E;\r\n}\r\n","/**\n * Iterates over the provided object by own enumerable keys with calling the iteratee function.\n *\n * @param object - An object to iterate over.\n * @param iteratee - An iteratee function that takes the value and key as arguments.\n * @param right - If `true`, the method iterates over the object from the end like `forEachRight()`.\n *\n * @return A provided object itself.\n */\nexport function forOwn(\n object: T,\n iteratee: ( value: T[ keyof T ], key: string ) => boolean | void,\n right?: boolean\n): T {\n if ( object ) {\n let keys = Object.keys( object );\n keys = right ? keys.reverse() : keys;\n\n for ( let i = 0; i < keys.length; i++ ) {\n const key = keys[ i ];\n\n if ( key !== '__proto__' ) {\n if ( iteratee( object[ key ], key ) === false ) {\n break;\n }\n }\n }\n }\n\n return object;\n}\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 = Omit & U;\r\n\r\nexport function assign( 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( object: T, source: U ): Assign;\r\n\r\nexport function assign(\r\n object: T, source1: U1, source2: U2\r\n): Assign, U2>;\r\n\r\nexport function assign(\r\n object: T, source1: U1, source2: U2, source3: U3\r\n): Assign, 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( 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 { 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 ): void;\r\n\r\nexport function setAttribute(\r\n elm: Element,\r\n attrs: string | Record,\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(\r\n tag: K,\r\n attrs?: Record | 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[],\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(\r\n tag: K,\r\n attrs?: Record | 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(\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","/**\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","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 { 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( parent: Element | Document, selector: string ): E[] {\r\n return slice( 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","/**\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","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","export const { min, max, floor, ceil, abs } = Math;\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 { CLASS_SLIDE } from '@splidejs/splide';\r\n\r\n\r\nexport const CLASS_SLIDE_ROW = `${ CLASS_SLIDE }__row`;\r\nexport const CLASS_SLIDE_COL = `${ CLASS_SLIDE }--col`;\r\n","import { GridOptions } from '../types/options';\r\n\r\n\r\n/**\r\n * Default options.\r\n *\r\n * @since 0.3.0\r\n */\r\nexport const DEFAULTS: GridOptions = {\r\n rows : 1,\r\n cols : 1,\r\n dimensions: [],\r\n gap : {},\r\n};\r\n","import { isArray, min, assert } from '@splidejs/splide/src/js/utils';\nimport { GridOptions } from '../../types/options';\n\n\n/**\n * The interface for the Dimension sub component.\n *\n * @since 0.3.0\n */\nexport interface DimensionComponent {\n get( index: number ): [ number, number ];\n getAt( index: number ): [ number, number ];\n}\n\n/**\n * The sub component to calculate dimension at the specific index.\n *\n * @param options - Initialized grid options.\n *\n * @return A Dimension sub component.\n */\nexport function Dimension( options: GridOptions ): DimensionComponent {\n /**\n * Retrieves the dimension array from options.\n * If it is not available, returns [ [ options.rows, options.cols ] ].\n *\n * @return An array with dimensions.\n */\n function normalize(): [ number, number ][] {\n const { rows, cols, dimensions } = options;\n return isArray( dimensions ) && dimensions.length ? dimensions : [ [ rows, cols ] ];\n }\n\n /**\n * Returns the dimension (`[ row, col ]`) at the specified index.\n *\n * @param index - An index.\n *\n * @return A tuple with rows and cols.\n */\n function get( index: number ): [ number, number ] {\n const dimensions = normalize();\n return dimensions[ min( index, dimensions.length - 1 ) ];\n }\n\n /**\n * Returns the dimension (`[ row, col ]`) where the slide at the specified index should belong.\n *\n * @param index - A slide index (before they are assigned to cols).\n *\n * @return A tuple with rows and cols.\n */\n function getAt( index: number ): [ number, number ] {\n const dimensions = normalize();\n\n let rows, cols, aggregator = 0;\n\n for ( let i = 0; i < dimensions.length; i++ ) {\n const dimension = dimensions[ i ];\n rows = dimension[ 0 ] || 1;\n cols = dimension[ 1 ] || 1;\n\n aggregator += rows * cols;\n\n if ( index < aggregator ) {\n break;\n }\n }\n\n assert( rows && cols, 'Invalid dimension' );\n\n return [ rows, cols ];\n }\n\n return {\n get,\n getAt,\n };\n}\n","import { CLASS_CONTAINER, EVENT_HIDDEN, EVENT_VISIBLE, EventInterface, SlideComponent, Splide } from '@splidejs/splide';\nimport { child, pad, queryAll, removeAttribute, setAttribute, style, unit } from '@splidejs/splide/src/js/utils';\nimport { CLASS_SLIDE_COL, CLASS_SLIDE_ROW } from '../../constants/classes';\nimport { GridOptions } from '../../types/options';\nimport { DimensionComponent } from './Dimension';\n\n\n/**\n * The interface for the Layout sub component.\n *\n * @since 0.5.0\n */\nexport interface LayoutComponent {\n mount(): void;\n destroy(): void;\n}\n\n/**\n * The sub components to layout grids.\n *\n * @since 0.5.0\n *\n * @param Splide - A Splide instance.\n * @param gridOptions - Initialized grid options.\n * @param Dimension - A Dimension sub component.\n *\n * @return A Layout sub component object.\n */\nexport function Layout( Splide: Splide, gridOptions: GridOptions, Dimension: DimensionComponent ): LayoutComponent {\n const { on, destroy: destroyEvent } = EventInterface( Splide );\n const { Components, options } = Splide;\n const { resolve } = Components.Direction;\n const { forEach } = Components.Slides;\n\n /**\n * Initializes the component.\n */\n function mount(): void {\n layout();\n\n if ( options.slideFocus ) {\n on( EVENT_VISIBLE, onVisible );\n on( EVENT_HIDDEN, onHidden );\n }\n }\n\n /**\n * Destroys the component.\n */\n function destroy(): void {\n forEach( Slide => {\n const { slide } = Slide;\n toggleTabIndex( slide, false );\n\n getRowsIn( slide ).forEach( cell => {\n removeAttribute( cell, 'style' );\n } );\n\n getColsIn( slide ).forEach( colSlide => {\n cover( colSlide, true );\n removeAttribute( colSlide, 'style' );\n } );\n } );\n\n destroyEvent();\n }\n\n /**\n * Layouts grid elements.\n */\n function layout(): void {\n forEach( Slide => {\n const { slide } = Slide;\n const [ rows, cols ] = Dimension.get( Slide.isClone ? Slide.slideIndex : Slide.index );\n\n layoutRow( rows, slide );\n layoutCol( cols, slide );\n\n getColsIn( Slide.slide ).forEach( ( colSlide, index ) => {\n colSlide.id = `${ Slide.slide.id }-col${ pad( index + 1 ) }`;\n\n if ( Splide.options.cover ) {\n cover( colSlide );\n }\n } );\n } );\n }\n\n /**\n * Layouts row elements by CSS.\n *\n * @param rows - A number of rows.\n * @param slide - A slide element.\n */\n function layoutRow( rows: number, slide: HTMLElement ): void {\n const { row: rowGap } = gridOptions.gap;\n const height = `calc(${ 100 / rows }%${ rowGap ? ` - ${ unit( rowGap ) } * ${ ( rows - 1 ) / rows }` : '' })`;\n\n getRowsIn( slide ).forEach( ( rowElm, index, rowElms ) => {\n style( rowElm, 'height', height );\n style( rowElm, 'display', 'flex' );\n style( rowElm, 'margin', `0 0 ${ unit( rowGap ) } 0` );\n style( rowElm, 'padding', 0 );\n\n if ( index === rowElms.length - 1 ) {\n style( rowElm, 'marginBottom', 0 );\n }\n } );\n }\n\n /**\n * Layouts col elements by CSS.\n *\n * @param cols - A number of cols.\n * @param slide - A slide element.\n */\n function layoutCol( cols: number, slide: HTMLElement ): void {\n const { col: colGap } = gridOptions.gap;\n const width = `calc(${ 100 / cols }%${ colGap ? ` - ${ unit( colGap ) } * ${ ( cols - 1 ) / cols }` : '' })`;\n\n getColsIn( slide ).forEach( ( colElm, index, colElms ) => {\n style( colElm, 'width', width );\n\n if ( index !== colElms.length - 1 ) {\n style( colElm, resolve( 'marginRight' ), unit( colGap ) );\n }\n } );\n }\n\n /**\n * Sets the background image to the col element by its own image element.\n *\n * @param colSlide - A col slide element.\n * @param uncover - Optional. If `true`, reset the cover mode.\n */\n function cover( colSlide: HTMLElement, uncover?: boolean ): void {\n const container = child( colSlide, `.${ CLASS_CONTAINER }` );\n const img = child( container || colSlide, 'img' );\n\n if ( img && img.src ) {\n style( container || colSlide, 'background', uncover ? '' : `center/cover no-repeat url(\"${ img.src }\")` );\n style( img, 'display', uncover ? '' : 'none' );\n }\n }\n\n /**\n * Returns row elements in the provided slide.\n *\n * @param slide - A slide element.\n *\n * @return An array with row elements.\n */\n function getRowsIn( slide: HTMLElement ): HTMLElement[] {\n return queryAll( slide, `.${ CLASS_SLIDE_ROW }` );\n }\n\n /**\n * Returns col elements in the provided slide.\n *\n * @param slide - A slide element.\n *\n * @return An array with col elements.\n */\n function getColsIn( slide: HTMLElement ): HTMLElement[] {\n return queryAll( slide, `.${ CLASS_SLIDE_COL }` );\n }\n\n /**\n * Toggles the tab index of col elements.\n *\n * @param slide - A slide element.\n * @param add - Optional. Determines whether to add or remove tab index.\n */\n function toggleTabIndex( slide: HTMLElement, add?: boolean ): void {\n getColsIn( slide ).forEach( colSlide => {\n setAttribute( colSlide, 'tabindex', add ? 0 : null );\n } );\n }\n\n /**\n * Called when any slide becomes visible.\n *\n * @param Slide - A Slide component.\n */\n function onVisible( Slide: SlideComponent ): void {\n toggleTabIndex( Slide.slide, true );\n }\n\n /**\n * Called when any slide gets hidden.\n *\n * @param Slide - A Slide component.\n */\n function onHidden( Slide: SlideComponent ): void {\n toggleTabIndex( Slide.slide, false );\n }\n\n return {\n mount,\n destroy,\n };\n}\n","import {\n BaseComponent, CLASS_ROOT,\n CLASS_SLIDE,\n Components,\n EVENT_REFRESH,\n EVENT_UPDATED,\n EventInterface,\n Options,\n Splide,\n} from '@splidejs/splide';\nimport {\n addClass,\n append,\n assign,\n create,\n remove,\n removeClass,\n isArray,\n push,\n empty,\n hasClass,\n} from '@splidejs/splide/src/js/utils';\nimport { CLASS_SLIDE_COL, CLASS_SLIDE_ROW } from '../../constants/classes';\nimport { DEFAULTS } from '../../constants/defaults';\nimport { GridOptions } from '../../types/options';\nimport { Dimension as DimensionConstructor } from './Dimension';\nimport { Layout as LayoutConstructor } from './Layout';\n\n\n/**\n * Lets the compiler know the Grid component.\n */\ndeclare module '@splidejs/splide' {\n interface Options {\n grid?: GridOptions | null | false;\n }\n\n interface Components {\n Grid?: GridComponent;\n }\n}\n\n/**\n * The interface for the Grid component.\n *\n * @since 0.3.14\n */\nexport interface GridComponent extends BaseComponent {\n}\n\n/**\n * The extension for the grid slider.\n *\n * @since 0.5.0\n *\n * @param Splide - A Splide instance.\n * @param Components - A collection of components.\n * @param options - Options.\n *\n * @return A Video component object.\n */\nexport function Grid( Splide: Splide, Components: Components, options: Options ): GridComponent {\n const { on, off } = EventInterface( Splide );\n const { Elements } = Components;\n\n /**\n * Options for the extension.\n */\n const gridOptions: GridOptions = {};\n\n /**\n * The Dimension sub component.\n */\n const Dimension = DimensionConstructor( gridOptions );\n\n /**\n * The Layout sub component.\n */\n const Layout = LayoutConstructor( Splide, gridOptions, Dimension );\n\n /**\n * The modifier class to add to the root element.\n */\n const modifier = `${ CLASS_ROOT }--grid`;\n\n /**\n * Keeps original slides for restoration.\n */\n const originalSlides: HTMLElement[] = [];\n\n /**\n * Initializes the grid options.\n */\n function setup(): void {\n options.grid = assign( {}, DEFAULTS, options.grid || {} );\n }\n\n /**\n * Called when the extension is mounted.\n */\n function mount(): void {\n init();\n on( EVENT_UPDATED, init );\n }\n\n /**\n * Initializes the extension when the slider gets active, or options are updated.\n */\n function init(): void {\n assign( gridOptions, options.grid || DEFAULTS );\n\n if ( shouldBuild() ) {\n destroy();\n push( originalSlides, Elements.slides );\n addClass( Splide.root, modifier );\n append( Elements.list, build() );\n on( EVENT_REFRESH, layout );\n refresh();\n } else if ( isActive() ) {\n destroy();\n refresh();\n }\n }\n\n /**\n * Destroys the extension.\n * Deconstructs grids and restores original slides to the list element.\n */\n function destroy(): void {\n if ( isActive() ) {\n const { slides } = Elements;\n\n Layout.destroy();\n\n originalSlides.forEach( slide => {\n removeClass( slide, CLASS_SLIDE_COL );\n append( Elements.list, slide );\n } );\n\n remove( slides );\n removeClass( Splide.root, modifier );\n empty( slides );\n push( slides, originalSlides );\n empty( originalSlides );\n\n off( EVENT_REFRESH );\n }\n }\n\n /**\n * Requests to refresh the slider.\n */\n function refresh(): void {\n Splide.refresh();\n }\n\n /**\n * Layouts row and col slides via the Layout sub component.\n * The extension calls this after requesting ths slider to refresh it.\n */\n function layout(): void {\n if ( isActive() ) {\n Layout.mount();\n }\n }\n\n /**\n * Builds grid and returns created outer slide elements.\n *\n * @return An array with outer slides.\n */\n function build(): HTMLElement[] {\n const outerSlides: HTMLElement[] = [];\n\n let row = 0, col = 0;\n let outerSlide: HTMLElement, rowSlide: HTMLElement;\n\n originalSlides.forEach( ( slide, index ) => {\n const [ rows, cols ] = Dimension.getAt( index );\n\n if ( ! col ) {\n if ( ! row ) {\n outerSlide = create( slide.tagName, CLASS_SLIDE );\n outerSlides.push( outerSlide );\n }\n\n rowSlide = buildRow( rows, slide, outerSlide );\n }\n\n buildCol( cols, slide, rowSlide );\n\n if ( ++col >= cols ) {\n col = 0;\n row = ++row >= rows ? 0 : row;\n }\n } );\n\n return outerSlides;\n }\n\n /**\n * Creates an element for a row.\n *\n * @param rows - A number of rows.\n * @param slide - An original slide element.\n * @param outerSlide - An outer slide element.\n *\n * A created element.\n */\n function buildRow( rows: number, slide: HTMLElement, outerSlide: HTMLElement ): HTMLElement {\n const tag = slide.tagName.toLowerCase() === 'li' ? 'ul' : 'div';\n return create( tag, CLASS_SLIDE_ROW, outerSlide );\n }\n\n /**\n * Creates an element for a col.\n * Currently, uses the original slide element itself.\n *\n * @param cols - A number of cols.\n * @param slide - An original slide element.\n * @param rowSlide - A row slide element.\n *\n * @return A created element.\n */\n function buildCol( cols: number, slide: HTMLElement, rowSlide: HTMLElement ): HTMLElement {\n addClass( slide, CLASS_SLIDE_COL );\n append( rowSlide, slide );\n return slide;\n }\n\n /**\n * Tells if the extension should make grids or not by checking the current options.\n *\n * @return `true` if the extension should init grids, or otherwise `false`.\n */\n function shouldBuild(): boolean {\n if ( options.grid ) {\n const { rows, cols, dimensions } = gridOptions;\n return rows > 1 || cols > 1 || ( isArray( dimensions ) && dimensions.length > 0 );\n }\n\n return false;\n }\n\n /**\n * Checks if the grid mode is active or not.\n *\n * @return `true` if the grid extension is active, or `false` if not.\n */\n function isActive(): boolean {\n return hasClass( Splide.root, modifier );\n }\n\n return {\n setup,\n mount,\n destroy,\n };\n}\n","import { Grid } from '../extensions';\r\n\r\n\r\ndeclare global {\r\n interface Window {\r\n splide: Record;\r\n }\r\n}\r\n\r\nif ( typeof window !== 'undefined' ) {\r\n window.splide = window.splide || {};\r\n window.splide.Extensions = window.splide.Extensions || {};\r\n window.splide.Extensions.Grid = Grid;\r\n}\r\n"],"names":["PROJECT_CODE","subject","Array","isArray","value","values","iteratee","forEach","EVENT_VISIBLE","EVENT_HIDDEN","EVENT_REFRESH","EVENT_UPDATED","EVENT_DESTROY","Splide22","event","key","listeners","events","callback","priority","on","off","targets","options","target","event2","push","addEventListener","filter","listener","removeEventListener","split","bind","data","unbind","offBy","destroy","emit","CLASS_ROOT","CLASS_SLIDE","CLASS_CONTAINER","array","length","isNull2","HTMLElement","isArray2","items","toArray2","arrayProto2","prototype","arrayLike","start","end","slice","call","elm","classes","add","name","classList","isString2","parent","children3","appendChild","selector","isHTMLElement2","matches","slice2","children","matches2","child3","children2","firstElementChild","object","right","keys","Object","reverse","i","arguments","source","attrs","removeAttribute","attr","isObject2","value2","removeAttribute2","setAttribute","String","tag","document","createElement","addClass2","setAttribute2","append2","prop","isUndefined2","getComputedStyle","style","style3","className","contains","nodes","node","parentNode","removeChild","querySelectorAll","PROJECT_CODE2","condition","message","Error","Math","min","max","floor","ceil","abs","number","CLASS_SLIDE_ROW","CLASS_SLIDE_COL","DEFAULTS2","rows","cols","dimensions","gap","index","normalize","min2","aggregator","dimension","get","getAt","Splide4","gridOptions","Dimension2","EventInterface","destroyEvent","Components","resolve","Components2","Direction","Slides","slideFocus","onVisible","onHidden","slide","Slide2","cell","colSlide","isClone","slideIndex","id","pad2","cover","rowGap","row","height","unit2","rowElm","rowElms","colGap","col","width","colElm","colElms","uncover","container","child2","img","src","queryAll2","mount","Elements","Dimension","Layout3","Layout2","modifier","originalSlides","grid","assign2","init","shouldBuild","Elements2","slides","root","list","build","layout","isActive","refresh","outerSlides","outerSlide","rowSlide","create2","tagName","buildRow","toLowerCase","hasClass2","setup","window","splide","Extensions","Grid"],"mappings":"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"}