slickless 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slickless.js","names":[],"sources":["../src/defaults.ts","../src/utils.ts","../src/slickless.ts","../src/index.ts"],"sourcesContent":["import type { SlicklessOptions } from \"./types\";\n\nexport const DEFAULTS: SlicklessOptions = {\n arrows: true,\n dots: false,\n autoplay: false,\n autoplaySpeed: 3000,\n speed: 400,\n cssEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n slidesToShow: 1,\n slidesToScroll: 1,\n infinite: true,\n fade: false,\n vertical: false,\n initialSlide: 0,\n variableWidth: false,\n centerMode: false,\n centerPadding: \"50px\",\n rtl: false,\n draggable: true,\n swipeThreshold: 24,\n pauseOnHover: true,\n pauseOnFocus: true,\n accessibility: true,\n adaptiveHeight: false,\n lazyLoad: false,\n respectReducedMotion: true,\n prevArrow: null,\n nextArrow: null,\n customPaging: null,\n ariaRoleDescription: \"carousel\",\n responsive: null,\n asNavFor: null,\n focusOnSelect: false,\n autoplayDirection: \"forward\",\n};\n\nexport function mergeOptions(\n base: SlicklessOptions,\n override: Partial<SlicklessOptions>,\n): SlicklessOptions {\n return { ...base, ...override };\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n }\n return el;\n}\n\nexport function ensureNumber(value: unknown, fallback: number): number {\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function resolveElement(\n selectorOrElement: string | HTMLElement | null,\n): HTMLElement | null {\n if (!selectorOrElement) return null;\n if (typeof selectorOrElement === \"string\") {\n return document.querySelector<HTMLElement>(selectorOrElement);\n }\n return selectorOrElement;\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(() => resolve(), 16);\n }\n });\n}\n","import { DEFAULTS, mergeOptions } from \"./defaults\";\nimport type {\n AfterChangeDetail,\n BeforeChangeDetail,\n BreakpointDetail,\n EdgeDetail,\n LazyLoadDetail,\n ResponsiveBreakpoint,\n SlicklessOptions,\n SwipeDetail,\n} from \"./types\";\nimport { clamp, createEl, mod, prefersReducedMotion, resolveElement } from \"./utils\";\n\ninterface Pointer {\n id: number;\n startX: number;\n startY: number;\n startTime: number;\n startTransform: number;\n active: boolean;\n decided: boolean;\n isHorizontal: boolean;\n}\n\nconst CLASS = {\n root: \"slickless\",\n initialized: \"slickless--initialized\",\n viewport: \"slickless__viewport\",\n track: \"slickless__track\",\n slide: \"slickless__slide\",\n slideActive: \"slickless__slide--active\",\n slideCenter: \"slickless__slide--center\",\n slideCloned: \"slickless__slide--cloned\",\n slideCurrent: \"slickless__slide--current\",\n arrow: \"slickless__arrow\",\n arrowPrev: \"slickless__arrow--prev\",\n arrowNext: \"slickless__arrow--next\",\n arrowDisabled: \"slickless__arrow--disabled\",\n dots: \"slickless__dots\",\n dot: \"slickless__dot\",\n dotBullet: \"slickless__dot--bullet\",\n dotActive: \"slickless__dot--active\",\n vertical: \"slickless--vertical\",\n fade: \"slickless--fade\",\n rtl: \"slickless--rtl\",\n dragging: \"slickless--dragging\",\n centerMode: \"slickless--center\",\n adaptive: \"slickless--adaptive-height\",\n};\n\nexport class Slickless {\n readonly root: HTMLElement;\n private userOptions: Partial<SlicklessOptions>;\n options: SlicklessOptions;\n\n private originalChildren: HTMLElement[] = [];\n private slides: HTMLElement[] = [];\n private track!: HTMLElement;\n private viewport!: HTMLElement;\n private prevArrow: HTMLElement | null = null;\n private nextArrow: HTMLElement | null = null;\n private dotsList: HTMLElement | null = null;\n private cloneCount = 0;\n\n private currentIndex = 0;\n /** Track index we are animating toward. Lets layout reads use the future\n * slide for height-syncing while the transform is still in flight. */\n private animatingTo: number | null = null;\n private slideCount = 0;\n private animating = false;\n /** Last observed root width — used to ignore height-only ResizeObserver\n * fires (e.g. when adaptiveHeight changes the viewport height). */\n private lastRootWidth = 0;\n private destroyed = false;\n private currentBreakpoint: number | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private autoplayTimer: ReturnType<typeof setTimeout> | null = null;\n private autoplayPaused = false;\n private listeners: Map<string, Set<(detail: unknown) => void>> = new Map();\n private pointer: Pointer | null = null;\n private pointerHandlers: {\n down?: (e: Event) => void;\n move?: (e: Event) => void;\n up?: (e: Event) => void;\n cancel?: (e: Event) => void;\n } = {};\n private linkedNav: Slickless | null = null;\n private linkedFromExternal = false;\n\n constructor(root: string | HTMLElement, options: Partial<SlicklessOptions> = {}) {\n const el = typeof root === \"string\" ? document.querySelector<HTMLElement>(root) : root;\n if (!el) throw new Error(`[slickless] Root element not found: ${String(root)}`);\n this.root = el;\n this.userOptions = options;\n this.options = mergeOptions(DEFAULTS, options);\n this.init();\n }\n\n private init(): void {\n this.captureChildren();\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(this.options.initialSlide, true);\n if (this.options.autoplay) this.play();\n this.linkAsNavFor();\n (this.root as HTMLElement & { __slickless?: Slickless }).__slickless = this;\n this.root.classList.add(CLASS.initialized);\n // Defer the init event so callers can subscribe immediately after\n // `new Slickless(...)` returns.\n const emitInit = () => {\n if (!this.destroyed) this.emit(\"init\", { slickless: this });\n };\n if (typeof queueMicrotask === \"function\") queueMicrotask(emitInit);\n else Promise.resolve().then(emitInit);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) {\n this.root.appendChild(child);\n child.removeAttribute(\"aria-hidden\");\n child.removeAttribute(\"tabindex\");\n child.removeAttribute(\"role\");\n child.removeAttribute(\"aria-roledescription\");\n child.removeAttribute(\"aria-label\");\n child.style.cssText = \"\";\n }\n this.root.className = this.root.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"slickless\"))\n .join(\" \")\n .trim();\n this.root.removeAttribute(\"role\");\n this.root.removeAttribute(\"aria-roledescription\");\n this.root.removeAttribute(\"dir\");\n\n this.destroyed = true;\n this.emit(\"destroy\", { slickless: this });\n this.listeners.clear();\n }\n\n reInit(): void {\n const wasIndex = this.currentIndex;\n const wasAutoplaying = this.options.autoplay && !this.autoplayPaused;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) this.root.appendChild(child);\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(clamp(wasIndex, 0, this.slideCount - 1), true);\n if (wasAutoplaying) this.play();\n this.emit(\"reInit\", { slickless: this });\n }\n\n private captureChildren(): void {\n if (this.originalChildren.length === 0) {\n this.originalChildren = Array.from(this.root.children) as HTMLElement[];\n }\n }\n\n private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (this.options.infinite && !this.options.fade && this.slideCount > 0) {\n // For variableWidth we can't predict how many slides the viewport will\n // hold (each slide has its own intrinsic width), so clone the full set\n // at both ends. For fixed-width layouts, slidesToShow tells us exactly\n // how many neighbours need to be available beyond the current window.\n const desired = this.options.variableWidth\n ? this.slideCount\n : Math.max(this.options.slidesToShow, 1);\n this.cloneCount = Math.min(desired, this.slideCount);\n const head = realSlides.slice(-this.cloneCount).map((s) => this.cloneSlide(s));\n const tail = realSlides.slice(0, this.cloneCount).map((s) => this.cloneSlide(s));\n this.slides = [...head, ...realSlides, ...tail];\n } else {\n this.cloneCount = 0;\n this.slides = realSlides;\n }\n\n for (const slide of this.slides) this.track.appendChild(slide);\n this.viewport.appendChild(this.track);\n this.root.appendChild(this.viewport);\n\n if (this.options.arrows && this.slideCount > this.options.slidesToShow) {\n this.buildArrows();\n }\n if (this.options.dots && this.slideCount > 0) {\n this.buildDots();\n }\n\n this.applyLayout();\n this.applyLazyLoad();\n }\n\n private wrapAsSlide(child: HTMLElement, index: number): HTMLElement {\n const slide = createEl(\"div\", CLASS.slide, {\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": `${index + 1} of ${this.originalChildren.length}`,\n \"data-slick-index\": String(index),\n });\n slide.appendChild(child);\n return slide;\n }\n\n private cloneSlide(original: HTMLElement): HTMLElement {\n const clone = original.cloneNode(true) as HTMLElement;\n clone.classList.add(CLASS.slideCloned);\n clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n private indexToOffset(trackIndex: number): number {\n if (this.options.variableWidth) {\n let offset = 0;\n for (let i = 0; i < trackIndex; i++) {\n const s = this.slides[i];\n if (!s) continue;\n const r = s.getBoundingClientRect();\n offset += this.options.vertical ? r.height : r.width;\n }\n if (this.options.centerMode) {\n const focused = this.slides[trackIndex];\n if (focused) {\n const r = focused.getBoundingClientRect();\n offset -=\n (this.viewportSize() - (this.options.vertical ? r.height : r.width)) / 2;\n }\n }\n return offset;\n }\n const size = this.slideSize();\n let offset = trackIndex * size;\n if (this.options.centerMode) {\n offset -= (this.viewportSize() - size) / 2;\n } else if (!this.options.infinite && !this.options.fade) {\n // Don't translate past the end — keeps the last \"window\" of slides flush\n // with the viewport even when `goTo` targets a later index than fits.\n const maxOffset = Math.max(0, (this.slideCount - this.options.slidesToShow) * size);\n offset = Math.min(offset, maxOffset);\n }\n return offset;\n }\n\n private translateTo(offset: number, animate: boolean): void {\n const speed = animate ? this.effectiveSpeed() : 0;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transition = speed > 0 ? `transform ${speed}ms ${this.options.cssEase}` : \"\";\n this.track.style.transform = `translate${axis}(${dir * offset}px)`;\n }\n\n next(): void {\n this.goTo(this.currentIndex + this.options.slidesToScroll);\n }\n\n prev(): void {\n this.goTo(this.currentIndex - this.options.slidesToScroll);\n }\n\n goTo(index: number, immediate = false): void {\n if (this.destroyed) return;\n if (this.slideCount === 0) return;\n // Lock out new navigation while a transition is in flight. Rapid clicks\n // beyond the current animation are simply dropped — predictable beats\n // clever here.\n if (this.animating && !immediate) return;\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!wrapEnabled) {\n // Clamp to any valid slide index. The visual translation is clamped\n // separately in indexToOffset so the track doesn't reveal empty space.\n // This separation lets callers focus a specific slide (asNavFor /\n // focusOnSelect) even when every slide already fits in the viewport.\n const maxIndex = Math.max(0, this.slideCount - 1);\n if (target < 0) {\n this.emit(\"edge\", { direction: this.options.rtl ? \"right\" : \"left\" } satisfies EdgeDetail);\n target = 0;\n }\n if (target > maxIndex) {\n this.emit(\"edge\", { direction: this.options.rtl ? \"left\" : \"right\" } satisfies EdgeDetail);\n target = maxIndex;\n }\n }\n\n const previous = this.currentIndex;\n const detail: BeforeChangeDetail = {\n currentSlide: previous,\n nextSlide: wrapEnabled ? mod(target, this.slideCount) : target,\n };\n this.emit(\"beforeChange\", detail);\n\n if (!wrapEnabled || this.options.fade) {\n this.currentIndex = target;\n this.applyLayout();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n this.notifyLinked();\n return;\n }\n\n this.animating = true;\n const trackIndex = target + this.cloneCount;\n this.animatingTo = trackIndex;\n const offset = this.indexToOffset(trackIndex);\n this.translateTo(offset, !immediate);\n // Start the height transition at the same instant as the slide transform\n // so they animate together. Without this the viewport would only resize\n // after the slide finished moving, which felt like a delayed reflow.\n this.updateAdaptiveHeight(trackIndex);\n // Same idea for center mode — toggle the `--center` class on the target\n // slide right away so its scale-up animates concurrently with the track\n // translate instead of popping in after the slide settles.\n this.updateCenterMode(trackIndex);\n // And the dots: highlight the upcoming page as soon as navigation starts,\n // so the indicator tracks the slide instead of lagging behind it.\n this.updateDots(mod(target, this.slideCount));\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n const wrapped = mod(target, this.slideCount);\n const needsSnap = wrapped !== target;\n this.currentIndex = wrapped;\n if (needsSnap) {\n const newTrackIndex = wrapped + this.cloneCount;\n // Suppress per-slide transitions across the snap so that handing the\n // center class from the clone we animated into to the real slide\n // doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n this.animatingTo = null;\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n this.notifyLinked();\n };\n\n if (immediate || this.effectiveSpeed() === 0) {\n finish();\n } else {\n const onEnd = (e: TransitionEvent) => {\n // Only react to the track's own transform transition. Without these\n // filters, descendant transitions (e.g. center-mode slide scale) fire\n // transitionend on this listener too and finish the animation early,\n // which makes rapid arrow clicks visually jump.\n if (e.target !== this.track) return;\n if (e.propertyName !== \"transform\") return;\n this.track.removeEventListener(\"transitionend\", onEnd);\n finish();\n };\n this.track.addEventListener(\"transitionend\", onEnd);\n setTimeout(() => {\n if (this.animating) {\n this.track.removeEventListener(\"transitionend\", onEnd);\n finish();\n }\n }, this.effectiveSpeed() + 50);\n }\n }\n\n play(): void {\n if (this.destroyed) return;\n this.options.autoplay = true;\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n\n pause(): void {\n this.autoplayPaused = true;\n if (this.autoplayTimer) {\n clearTimeout(this.autoplayTimer);\n this.autoplayTimer = null;\n }\n }\n\n private scheduleAutoplay(): void {\n if (!this.options.autoplay || this.autoplayPaused) return;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n this.autoplayTimer = setTimeout(() => {\n if (this.options.autoplayDirection === \"backward\") this.prev();\n else this.next();\n this.scheduleAutoplay();\n }, this.options.autoplaySpeed);\n }\n\n on<T = unknown>(event: string, handler: (detail: T) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(handler as (detail: unknown) => void);\n return () => set.delete(handler as (detail: unknown) => void);\n }\n\n off(event: string, handler: (detail: unknown) => void): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n private emit(event: string, detail: unknown): void {\n this.listeners.get(event)?.forEach((fn) => fn(detail));\n this.root.dispatchEvent(new CustomEvent(`slickless:${event}`, { detail, bubbles: false }));\n }\n\n private handlePrevClick = (e: Event): void => {\n e.preventDefault();\n this.prev();\n };\n\n private handleNextClick = (e: Event): void => {\n e.preventDefault();\n this.next();\n };\n\n private handleResize = (): void => {\n // Height-only changes (e.g. adaptiveHeight resizing the viewport) shouldn't\n // re-snap the track transform — that interrupts in-flight slide animations.\n const width = this.root.getBoundingClientRect().width;\n if (width === this.lastRootWidth) return;\n this.lastRootWidth = width;\n this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable && !this.options.fade) this.bindPointerEvents();\n if (this.options.focusOnSelect) this.bindFocusOnSelect();\n }\n\n private unbindEvents(): void {\n this.root.removeEventListener(\"keydown\", this.handleKey);\n this.root.removeEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.removeEventListener(\"focusin\", this.handleFocusIn);\n this.root.removeEventListener(\"focusout\", this.handleFocusOut);\n if (typeof window !== \"undefined\")\n window.removeEventListener(\"resize\", this.handleResize);\n if (this.prevArrow) this.prevArrow.removeEventListener(\"click\", this.handlePrevClick);\n if (this.nextArrow) this.nextArrow.removeEventListener(\"click\", this.handleNextClick);\n this.unbindPointerEvents();\n }\n\n private bindPointerEvents(): void {\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = this.parseTranslate();\n this.pointer = {\n id: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n startTime: performance.now(),\n startTransform,\n active: true,\n decided: false,\n isHorizontal: !this.options.vertical,\n };\n this.track.style.transition = \"\";\n this.root.classList.add(CLASS.dragging);\n };\n\n const onMove = (e: PointerEvent) => {\n if (!this.pointer || !this.pointer.active || this.pointer.id !== e.pointerId) return;\n const dx = e.clientX - this.pointer.startX;\n const dy = e.clientY - this.pointer.startY;\n if (!this.pointer.decided) {\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n if (absX < 6 && absY < 6) return;\n this.pointer.isHorizontal = absX > absY;\n this.pointer.decided = true;\n if (this.options.vertical ? this.pointer.isHorizontal : !this.pointer.isHorizontal) {\n this.pointer.active = false;\n this.root.classList.remove(CLASS.dragging);\n return;\n }\n }\n const delta = this.options.vertical ? dy : dx;\n const dir = this.options.rtl && !this.options.vertical ? -1 : 1;\n const newOffset = this.pointer.startTransform - dir * delta;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const transformDir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transform = `translate${axis}(${transformDir * newOffset}px)`;\n if (typeof (e as PointerEvent).preventDefault === \"function\") e.preventDefault();\n };\n\n const onUp = (e: PointerEvent) => {\n if (!this.pointer || this.pointer.id !== e.pointerId) return;\n const wasActive = this.pointer.active;\n const dx = e.clientX - this.pointer.startX;\n const dy = e.clientY - this.pointer.startY;\n const elapsed = performance.now() - this.pointer.startTime;\n this.root.classList.remove(CLASS.dragging);\n this.pointer = null;\n if (!wasActive) return;\n\n const delta = this.options.vertical ? dy : dx;\n const velocity = Math.abs(delta) / Math.max(1, elapsed);\n const threshold = this.options.swipeThreshold;\n\n const swiped = Math.abs(delta) > threshold || velocity > 0.6;\n if (swiped) {\n const goPrev = this.options.rtl && !this.options.vertical ? delta < 0 : delta > 0;\n if (goPrev) {\n this.emit(\"swipe\", {\n direction: this.options.vertical ? \"down\" : \"right\",\n } satisfies SwipeDetail);\n this.prev();\n } else {\n this.emit(\"swipe\", {\n direction: this.options.vertical ? \"up\" : \"left\",\n } satisfies SwipeDetail);\n this.next();\n }\n } else {\n this.goTo(this.currentIndex, true);\n }\n };\n\n const onCancel = (e: PointerEvent) => {\n if (!this.pointer || this.pointer.id !== e.pointerId) return;\n this.root.classList.remove(CLASS.dragging);\n this.pointer = null;\n this.goTo(this.currentIndex, true);\n };\n\n const downHandler = onDown as (e: Event) => void;\n const moveHandler = onMove as (e: Event) => void;\n const upHandler = onUp as (e: Event) => void;\n const cancelHandler = onCancel as (e: Event) => void;\n this.pointerHandlers = {\n down: downHandler,\n move: moveHandler,\n up: upHandler,\n cancel: cancelHandler,\n };\n this.viewport.addEventListener(\"pointerdown\", downHandler);\n window.addEventListener(\"pointermove\", moveHandler, { passive: false });\n window.addEventListener(\"pointerup\", upHandler);\n window.addEventListener(\"pointercancel\", cancelHandler);\n }\n\n private unbindPointerEvents(): void {\n const { down, move, up, cancel } = this.pointerHandlers;\n if (!down) return;\n this.viewport.removeEventListener(\"pointerdown\", down);\n if (move) window.removeEventListener(\"pointermove\", move);\n if (up) window.removeEventListener(\"pointerup\", up);\n if (cancel) window.removeEventListener(\"pointercancel\", cancel);\n this.pointerHandlers = {};\n }\n\n private parseTranslate(): number {\n const t = this.track.style.transform;\n const m = /translate[XY]\\((-?\\d+(?:\\.\\d+)?)px\\)/.exec(t);\n if (!m || !m[1]) return this.indexToOffset(this.realToTrackIndex(this.currentIndex));\n const v = parseFloat(m[1]);\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n return v / dir;\n }\n\n private bindFocusOnSelect(): void {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.addEventListener(\"click\", () => {\n const realIndex = i - this.cloneCount;\n if (realIndex >= 0 && realIndex < this.slideCount) this.goTo(realIndex);\n });\n }\n }\n\n private realToTrackIndex(realIndex: number): number {\n return realIndex + this.cloneCount;\n }\n\n private updateAria(): void {\n const trackIndex = this.realToTrackIndex(this.currentIndex);\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Slickless={}))})(this,function(e){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var t={arrows:!0,dots:!1,autoplay:!1,autoplaySpeed:3e3,speed:400,cssEase:`cubic-bezier(0.22, 1, 0.36, 1)`,slidesToShow:1,slidesToScroll:1,infinite:!0,fade:!1,vertical:!1,initialSlide:0,variableWidth:!1,centerMode:!1,centerPadding:`50px`,rtl:!1,draggable:!0,swipeThreshold:24,pauseOnHover:!0,pauseOnFocus:!0,accessibility:!0,adaptiveHeight:!1,lazyLoad:!1,respectReducedMotion:!0,prevArrow:null,nextArrow:null,customPaging:null,ariaRoleDescription:`carousel`,responsive:null,asNavFor:null,focusOnSelect:!1,autoplayDirection:`forward`};function n(e,t){return{...e,...t}}function r(e,t,n){return Math.max(t,Math.min(n,e))}function i(e,t){return(e%t+t)%t}function a(){return typeof window>`u`||!window.matchMedia?!1:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function o(e,t,n){let r=document.createElement(e);if(t&&(r.className=t),n)for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function s(e){return e?typeof e==`string`?document.querySelector(e):e:null}var c={root:`slickless`,initialized:`slickless--initialized`,viewport:`slickless__viewport`,track:`slickless__track`,slide:`slickless__slide`,slideActive:`slickless__slide--active`,slideCenter:`slickless__slide--center`,slideCloned:`slickless__slide--cloned`,slideCurrent:`slickless__slide--current`,arrow:`slickless__arrow`,arrowPrev:`slickless__arrow--prev`,arrowNext:`slickless__arrow--next`,arrowDisabled:`slickless__arrow--disabled`,dots:`slickless__dots`,dot:`slickless__dot`,dotBullet:`slickless__dot--bullet`,dotActive:`slickless__dot--active`,vertical:`slickless--vertical`,fade:`slickless--fade`,rtl:`slickless--rtl`,dragging:`slickless--dragging`,centerMode:`slickless--center`,adaptive:`slickless--adaptive-height`},l=class{constructor(e,r={}){this.originalChildren=[],this.slides=[],this.prevArrow=null,this.nextArrow=null,this.dotsList=null,this.cloneCount=0,this.currentIndex=0,this.animatingTo=null,this.slideCount=0,this.animating=!1,this.lastRootWidth=0,this.destroyed=!1,this.currentBreakpoint=null,this.resizeObserver=null,this.autoplayTimer=null,this.autoplayPaused=!1,this.listeners=new Map,this.pointer=null,this.pointerHandlers={},this.linkedNav=null,this.linkedFromExternal=!1,this.handlePrevClick=e=>{e.preventDefault(),this.prev()},this.handleNextClick=e=>{e.preventDefault(),this.next()},this.handleResize=()=>{let e=this.root.getBoundingClientRect().width;e!==this.lastRootWidth&&(this.lastRootWidth=e,this.applyResponsive(),this.applyLayout())},this.handleKey=e=>{this.options.accessibility&&(e.key===`ArrowLeft`?(e.preventDefault(),this.options.rtl?this.next():this.prev()):e.key===`ArrowRight`?(e.preventDefault(),this.options.rtl?this.prev():this.next()):e.key===`Home`?(e.preventDefault(),this.goTo(0)):e.key===`End`&&(e.preventDefault(),this.goTo(this.slideCount-1)))},this.handleMouseEnter=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleMouseLeave=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!1,this.scheduleAutoplay())},this.handleFocusIn=()=>{this.options.pauseOnFocus&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleFocusOut=e=>{if(this.options.pauseOnFocus&&this.options.autoplay){let t=e.relatedTarget;(!t||!this.root.contains(t))&&(this.autoplayPaused=!1,this.scheduleAutoplay())}};let i=typeof e==`string`?document.querySelector(e):e;if(!i)throw Error(`[slickless] Root element not found: ${String(e)}`);this.root=i,this.userOptions=r,this.options=n(t,r),this.init()}init(){this.captureChildren(),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(this.options.initialSlide,!0),this.options.autoplay&&this.play(),this.linkAsNavFor(),this.root.__slickless=this,this.root.classList.add(c.initialized);let e=()=>{this.destroyed||this.emit(`init`,{slickless:this})};typeof queueMicrotask==`function`?queueMicrotask(e):Promise.resolve().then(e)}destroy(){if(!this.destroyed){this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e),e.removeAttribute(`aria-hidden`),e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-roledescription`),e.removeAttribute(`aria-label`),e.style.cssText=``;this.root.className=this.root.className.split(/\s+/).filter(e=>!e.startsWith(`slickless`)).join(` `).trim(),this.root.removeAttribute(`role`),this.root.removeAttribute(`aria-roledescription`),this.root.removeAttribute(`dir`),this.destroyed=!0,this.emit(`destroy`,{slickless:this}),this.listeners.clear()}}reInit(){let e=this.currentIndex,i=this.options.autoplay&&!this.autoplayPaused;this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e);this.options=n(t,this.userOptions),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(r(e,0,this.slideCount-1),!0),i&&this.play(),this.emit(`reInit`,{slickless:this})}captureChildren(){this.originalChildren.length===0&&(this.originalChildren=Array.from(this.root.children))}applyResponsive(){let e=this.options.responsive;if(!e||e.length===0||typeof window>`u`)return;let r=window.innerWidth,i=[...e].sort((e,t)=>e.breakpoint-t.breakpoint),a=null;for(let e of i)if(r<=e.breakpoint){a=e;break}let o=a?a.breakpoint:null;if(o===this.currentBreakpoint)return;if(this.currentBreakpoint=o,a){if(a.settings===`unslick`){this.destroy();return}this.options=n(n(t,this.userOptions),a.settings)}else this.options=n(t,this.userOptions);let s={breakpoint:o};this.emit(`breakpoint`,s)}build(){this.root.innerHTML=``,this.root.classList.add(c.root),this.root.classList.toggle(c.vertical,this.options.vertical),this.root.classList.toggle(c.fade,this.options.fade),this.root.classList.toggle(c.rtl,this.options.rtl),this.root.classList.toggle(c.centerMode,this.options.centerMode),this.root.classList.toggle(c.adaptive,this.options.adaptiveHeight),this.root.style.setProperty(`--slickless-transition-duration`,`${this.effectiveSpeed()}ms`),this.root.setAttribute(`role`,`region`),this.root.setAttribute(`aria-roledescription`,this.options.ariaRoleDescription),this.options.rtl&&this.root.setAttribute(`dir`,`rtl`),this.viewport=o(`div`,c.viewport),this.track=o(`div`,c.track,{role:`presentation`});let e=this.originalChildren.map((e,t)=>this.wrapAsSlide(e,t));if(this.slideCount=e.length,this.options.infinite&&!this.options.fade&&this.slideCount>0){let t=this.options.variableWidth?this.slideCount:Math.max(this.options.slidesToShow,1);this.cloneCount=Math.min(t,this.slideCount);let n=e.slice(-this.cloneCount).map(e=>this.cloneSlide(e)),r=e.slice(0,this.cloneCount).map(e=>this.cloneSlide(e));this.slides=[...n,...e,...r]}else this.cloneCount=0,this.slides=e;for(let e of this.slides)this.track.appendChild(e);this.viewport.appendChild(this.track),this.root.appendChild(this.viewport),this.options.arrows&&this.slideCount>this.options.slidesToShow&&this.buildArrows(),this.options.dots&&this.slideCount>0&&this.buildDots(),this.applyLayout(),this.applyLazyLoad()}wrapAsSlide(e,t){let n=o(`div`,c.slide,{role:`group`,"aria-roledescription":`slide`,"aria-label":`${t+1} of ${this.originalChildren.length}`,"data-slick-index":String(t)});return n.appendChild(e),n}cloneSlide(e){let t=e.cloneNode(!0);return t.classList.add(c.slideCloned),t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`tabindex`,`-1`),t}buildArrows(){let e=this.options.prevArrow,t=this.options.nextArrow;this.prevArrow=this.resolveArrow(e,`prev`),this.nextArrow=this.resolveArrow(t,`next`),this.root.appendChild(this.prevArrow),this.root.appendChild(this.nextArrow),this.prevArrow.addEventListener(`click`,this.handlePrevClick),this.nextArrow.addEventListener(`click`,this.handleNextClick)}resolveArrow(e,t){let n;if(e instanceof HTMLElement)n=e.cloneNode(!0);else if(typeof e==`string`&&e.trim()){let t=document.createElement(`div`);t.innerHTML=e.trim(),n=t.firstElementChild??o(`button`)}else n=o(`button`,``,{type:`button`}),n.innerHTML=t===`prev`?`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 6l-6 6 6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 6l6 6-6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;return n.classList.add(c.arrow,t===`prev`?c.arrowPrev:c.arrowNext),n.setAttribute(`aria-label`,t===`prev`?`Previous slide`:`Next slide`),n.tagName!==`BUTTON`&&n.setAttribute(`role`,`button`),n}buildDots(){this.dotsList=o(`ul`,c.dots,{role:`tablist`});let e=this.pageCount();for(let t=0;t<e;t++){let n=o(`li`,``,{role:`presentation`}),r=t*this.options.slidesToScroll,i=this.options.customPaging?this.options.customPaging(t,e):o(`button`,`${c.dot} ${c.dotBullet}`,{type:`button`,"aria-label":`Go to slide ${t+1}`,role:`tab`}),a=typeof i==`string`?this.htmlToElement(i):i;a.classList.add(c.dot),a.setAttribute(`data-slick-target`,String(r)),a.addEventListener(`click`,()=>this.goTo(r)),n.appendChild(a),this.dotsList.appendChild(n)}this.root.appendChild(this.dotsList)}htmlToElement(e){let t=document.createElement(`div`);t.innerHTML=e.trim();let n=t.firstElementChild;if(n)return n;let r=o(`button`,``,{type:`button`});return r.textContent=e,r}viewportSize(){let e=this.viewport.getBoundingClientRect();return this.options.vertical?e.height:e.width}slideSize(){if(this.options.variableWidth){let e=this.slides[this.cloneCount];if(e){let t=e.getBoundingClientRect();return this.options.vertical?t.height:t.width}}let e=this.viewportSize();if(this.options.centerMode){let t=this.parseCenterPadding(e);return Math.max(1,(e-2*t)/Math.max(1,this.options.slidesToShow))}return e/Math.max(1,this.options.slidesToShow)}parseCenterPadding(e){let t=(this.options.centerPadding??``).trim();if(!t)return 0;let n=/^(-?\d+(?:\.\d+)?)\s*(px|%)?$/.exec(t);if(!n||n[1]===void 0)return 0;let r=parseFloat(n[1]);return!Number.isFinite(r)||r<0?0:(n[2]??`px`)===`%`?r/100*e:r}applyLayout(){if(this.slideCount===0)return;if(this.viewportSize(),this.options.fade){this.track.style.transform=``;for(let e=0;e<this.slides.length;e++){let t=this.slides[e];t&&(t.style.position=`absolute`,t.style.top=`0`,t.style.left=`0`,t.style.width=`100%`,t.style.height=`100%`,t.style.opacity=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.zIndex=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.transition=`opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`,t.style.pointerEvents=e===this.realToTrackIndex(this.currentIndex)?`auto`:`none`)}this.updateAria(),this.updateArrows(),this.updateDots();return}let e=this.options.variableWidth?null:this.slideSize();for(let t of this.slides)t.style.position=``,t.style.top=``,t.style.left=``,t.style.height=``,t.style.opacity=``,t.style.zIndex=``,t.style.transition=``,t.style.pointerEvents=``,e!==null&&(this.options.vertical?(t.style.width=`100%`,t.style.height=`${e}px`):(t.style.height=``,t.style.width=`${e}px`));this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)),!1),this.updateAria(),this.updateArrows(),this.updateDots(),this.updateAdaptiveHeight()}effectiveSpeed(){return this.options.respectReducedMotion&&a()?0:this.options.speed}indexToOffset(e){if(this.options.variableWidth){let t=0;for(let n=0;n<e;n++){let e=this.slides[n];if(!e)continue;let r=e.getBoundingClientRect();t+=this.options.vertical?r.height:r.width}if(this.options.centerMode){let n=this.slides[e];if(n){let e=n.getBoundingClientRect();t-=(this.viewportSize()-(this.options.vertical?e.height:e.width))/2}}return t}let t=this.slideSize(),n=e*t;if(this.options.centerMode)n-=(this.viewportSize()-t)/2;else if(!this.options.infinite&&!this.options.fade){let e=Math.max(0,(this.slideCount-this.options.slidesToShow)*t);n=Math.min(n,e)}return n}translateTo(e,t){let n=t?this.effectiveSpeed():0,r=this.options.vertical?`Y`:`X`,i=this.options.rtl&&!this.options.vertical?1:-1;this.track.style.transition=n>0?`transform ${n}ms ${this.options.cssEase}`:``,this.track.style.transform=`translate${r}(${i*e}px)`}next(){this.goTo(this.currentIndex+this.options.slidesToScroll)}prev(){this.goTo(this.currentIndex-this.options.slidesToScroll)}goTo(e,t=!1){if(this.destroyed||this.slideCount===0||this.animating&&!t)return;let n=e,r=this.options.infinite&&!this.options.fade;if(!r){let e=Math.max(0,this.slideCount-1);n<0&&(this.emit(`edge`,{direction:this.options.rtl?`right`:`left`}),n=0),n>e&&(this.emit(`edge`,{direction:this.options.rtl?`left`:`right`}),n=e)}let a={currentSlide:this.currentIndex,nextSlide:r?i(n,this.slideCount):n};if(this.emit(`beforeChange`,a),!r||this.options.fade){this.currentIndex=n,this.applyLayout();let e={currentSlide:this.currentIndex};this.emit(`afterChange`,e),this.applyLazyLoad(),this.notifyLinked();return}this.animating=!0;let o=n+this.cloneCount;this.animatingTo=o;let s=this.indexToOffset(o);this.translateTo(s,!t),this.updateAdaptiveHeight(o),this.updateCenterMode(o),this.updateDots(i(n,this.slideCount));let c=!1,l=()=>{if(c)return;c=!0,this.animating=!1;let e=i(n,this.slideCount),t=e!==n;if(this.currentIndex=e,t){let t=e+this.cloneCount;this.suppressSlideTransitionsForOneFrame(),this.translateTo(this.indexToOffset(t),!1)}this.animatingTo=null,this.updateAria(),this.updateArrows(),this.updateDots();let r={currentSlide:this.currentIndex};this.emit(`afterChange`,r),this.applyLazyLoad(),this.notifyLinked()};if(t||this.effectiveSpeed()===0)l();else{let e=t=>{t.target===this.track&&t.propertyName===`transform`&&(this.track.removeEventListener(`transitionend`,e),l())};this.track.addEventListener(`transitionend`,e),setTimeout(()=>{this.animating&&(this.track.removeEventListener(`transitionend`,e),l())},this.effectiveSpeed()+50)}}play(){this.destroyed||(this.options.autoplay=!0,this.autoplayPaused=!1,this.scheduleAutoplay())}pause(){this.autoplayPaused=!0,this.autoplayTimer&&=(clearTimeout(this.autoplayTimer),null)}scheduleAutoplay(){!this.options.autoplay||this.autoplayPaused||(this.autoplayTimer&&clearTimeout(this.autoplayTimer),this.autoplayTimer=setTimeout(()=>{this.options.autoplayDirection===`backward`?this.prev():this.next(),this.scheduleAutoplay()},this.options.autoplaySpeed))}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set);let n=this.listeners.get(e);return n.add(t),()=>n.delete(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t)),this.root.dispatchEvent(new CustomEvent(`slickless:${e}`,{detail:t,bubbles:!1}))}bindEvents(){this.root.addEventListener(`keydown`,this.handleKey),this.root.addEventListener(`mouseenter`,this.handleMouseEnter),this.root.addEventListener(`mouseleave`,this.handleMouseLeave),this.root.addEventListener(`focusin`,this.handleFocusIn),this.root.addEventListener(`focusout`,this.handleFocusOut),this.root.setAttribute(`tabindex`,`0`),typeof ResizeObserver<`u`?(this.resizeObserver=new ResizeObserver(()=>this.handleResize()),this.resizeObserver.observe(this.root)):typeof window<`u`&&window.addEventListener(`resize`,this.handleResize),this.options.draggable&&!this.options.fade&&this.bindPointerEvents(),this.options.focusOnSelect&&this.bindFocusOnSelect()}unbindEvents(){this.root.removeEventListener(`keydown`,this.handleKey),this.root.removeEventListener(`mouseenter`,this.handleMouseEnter),this.root.removeEventListener(`mouseleave`,this.handleMouseLeave),this.root.removeEventListener(`focusin`,this.handleFocusIn),this.root.removeEventListener(`focusout`,this.handleFocusOut),typeof window<`u`&&window.removeEventListener(`resize`,this.handleResize),this.prevArrow&&this.prevArrow.removeEventListener(`click`,this.handlePrevClick),this.nextArrow&&this.nextArrow.removeEventListener(`click`,this.handleNextClick),this.unbindPointerEvents()}bindPointerEvents(){let e=e=>{if(this.animating||e.button!==void 0&&e.button!==0)return;let t=this.parseTranslate();this.pointer={id:e.pointerId,startX:e.clientX,startY:e.clientY,startTime:performance.now(),startTransform:t,active:!0,decided:!1,isHorizontal:!this.options.vertical},this.track.style.transition=``,this.root.classList.add(c.dragging)},t=e=>{if(!this.pointer||!this.pointer.active||this.pointer.id!==e.pointerId)return;let t=e.clientX-this.pointer.startX,n=e.clientY-this.pointer.startY;if(!this.pointer.decided){let e=Math.abs(t),r=Math.abs(n);if(e<6&&r<6)return;if(this.pointer.isHorizontal=e>r,this.pointer.decided=!0,this.options.vertical?this.pointer.isHorizontal:!this.pointer.isHorizontal){this.pointer.active=!1,this.root.classList.remove(c.dragging);return}}let r=this.options.vertical?n:t,i=this.options.rtl&&!this.options.vertical?-1:1,a=this.pointer.startTransform-i*r,o=this.options.vertical?`Y`:`X`,s=this.options.rtl&&!this.options.vertical?1:-1;this.track.style.transform=`translate${o}(${s*a}px)`,typeof e.preventDefault==`function`&&e.preventDefault()},n=e=>{if(!this.pointer||this.pointer.id!==e.pointerId)return;let t=this.pointer.active,n=e.clientX-this.pointer.startX,r=e.clientY-this.pointer.startY,i=performance.now()-this.pointer.startTime;if(this.root.classList.remove(c.dragging),this.pointer=null,!t)return;let a=this.options.vertical?r:n,o=Math.abs(a)/Math.max(1,i),s=this.options.swipeThreshold;Math.abs(a)>s||o>.6?(this.options.rtl&&!this.options.vertical?a<0:a>0)?(this.emit(`swipe`,{direction:this.options.vertical?`down`:`right`}),this.prev()):(this.emit(`swipe`,{direction:this.options.vertical?`up`:`left`}),this.next()):this.goTo(this.currentIndex,!0)},r=e=>{!this.pointer||this.pointer.id!==e.pointerId||(this.root.classList.remove(c.dragging),this.pointer=null,this.goTo(this.currentIndex,!0))},i=e,a=t,o=n,s=r;this.pointerHandlers={down:i,move:a,up:o,cancel:s},this.viewport.addEventListener(`pointerdown`,i),window.addEventListener(`pointermove`,a,{passive:!1}),window.addEventListener(`pointerup`,o),window.addEventListener(`pointercancel`,s)}unbindPointerEvents(){let{down:e,move:t,up:n,cancel:r}=this.pointerHandlers;e&&(this.viewport.removeEventListener(`pointerdown`,e),t&&window.removeEventListener(`pointermove`,t),n&&window.removeEventListener(`pointerup`,n),r&&window.removeEventListener(`pointercancel`,r),this.pointerHandlers={})}parseTranslate(){let e=this.track.style.transform,t=/translate[XY]\((-?\d+(?:\.\d+)?)px\)/.exec(e);return!t||!t[1]?this.indexToOffset(this.realToTrackIndex(this.currentIndex)):parseFloat(t[1])/(this.options.rtl&&!this.options.vertical?1:-1)}bindFocusOnSelect(){for(let e=0;e<this.slides.length;e++){let t=this.slides[e];t&&t.addEventListener(`click`,()=>{let t=e-this.cloneCount;t>=0&&t<this.slideCount&&this.goTo(t)})}}realToTrackIndex(e){return e+this.cloneCount}updateAria(){let e=this.realToTrackIndex(this.currentIndex);for(let t=0;t<this.slides.length;t++){let n=this.slides[t];if(!n)continue;let r=this.isSlideInActiveRange(t,e),i=t===e;n.classList.toggle(c.slideActive,r),n.classList.toggle(c.slideCurrent,i),n.classList.contains(c.slideCloned)||(n.setAttribute(`aria-hidden`,r?`false`:`true`),n.setAttribute(`tabindex`,r?`0`:`-1`))}this.updateCenterMode(e)}suppressSlideTransitionsForOneFrame(){this.root.classList.add(`slickless--snap`),this.root.offsetWidth,typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>{requestAnimationFrame(()=>this.root.classList.remove(`slickless--snap`))}):setTimeout(()=>this.root.classList.remove(`slickless--snap`),16)}updateCenterMode(e){if(this.options.centerMode)for(let t=0;t<this.slides.length;t++){let n=this.slides[t];n&&n.classList.toggle(c.slideCenter,t===e)}}isSlideInActiveRange(e,t){let n=Math.max(1,this.options.slidesToShow);if(this.options.centerMode){let r=Math.floor(n/2);return e>=t-r&&e<t+n-r}return e>=t&&e<t+n}updateArrows(){if(!this.prevArrow||!this.nextArrow)return;if(this.options.infinite||this.options.fade){this.prevArrow.classList.remove(c.arrowDisabled),this.nextArrow.classList.remove(c.arrowDisabled),this.prevArrow.removeAttribute(`aria-disabled`),this.nextArrow.removeAttribute(`aria-disabled`);return}let e=this.currentIndex<=0,t=this.currentIndex>=this.slideCount-this.options.slidesToShow;this.prevArrow.classList.toggle(c.arrowDisabled,e),this.nextArrow.classList.toggle(c.arrowDisabled,t),this.prevArrow.setAttribute(`aria-disabled`,String(e)),this.nextArrow.setAttribute(`aria-disabled`,String(t)),this.prevArrow.tagName===`BUTTON`&&(this.prevArrow.disabled=!1),this.nextArrow.tagName===`BUTTON`&&(this.nextArrow.disabled=!1)}pageCount(){if(this.slideCount===0)return 0;let e=Math.ceil((this.slideCount-(this.options.infinite?0:this.options.slidesToShow-1))/Math.max(1,this.options.slidesToScroll));return Math.max(1,e)}updateDots(e){if(!this.dotsList)return;let t=e??this.currentIndex,n=Math.floor(t/Math.max(1,this.options.slidesToScroll));this.dotsList.querySelectorAll(`.${c.dot}`).forEach((e,t)=>{e.classList.toggle(c.dotActive,t===n),e.setAttribute(`aria-selected`,t===n?`true`:`false`)})}updateAdaptiveHeight(e){if(!this.options.adaptiveHeight||this.options.vertical)return;let t=e??this.animatingTo??this.realToTrackIndex(this.currentIndex),n=this.slides[t];if(!n)return;let r=n.getBoundingClientRect().height;r>0&&(this.viewport.style.height=`${r}px`)}applyLazyLoad(){if(!this.options.lazyLoad)return;if(this.options.lazyLoad===`progressive`){this.loadImagesIn(this.slides);return}let e=Math.max(1,this.options.slidesToShow),t=this.realToTrackIndex(this.currentIndex),n=t-1,r=t+e+1,a=[];for(let e=n;e<r;e++){let t=this.options.infinite?i(e,this.slides.length):e;if(t<0||t>=this.slides.length)continue;let n=this.slides[t];n&&a.push(n)}this.loadImagesIn(a)}loadImagesIn(e){for(let t of e)t.querySelectorAll(`img[data-lazy]`).forEach(e=>this.activateLazyImage(e))}activateLazyImage(e){let t=e.getAttribute(`data-lazy`);t&&(e.removeAttribute(`data-lazy`),e.addEventListener(`load`,()=>this.emit(`lazyLoaded`,{image:e,src:t}),{once:!0}),e.addEventListener(`error`,()=>this.emit(`lazyLoadError`,{image:e,src:t}),{once:!0}),e.src=t)}linkAsNavFor(){let e=this.options.asNavFor;if(!e)return;let t=s(e);if(!t)return;let n=t.__slickless;n&&(this.linkedNav=n,n.on(`afterChange`,e=>{this.linkedFromExternal||=(this.linkedFromExternal=!0,this.goTo(e.currentSlide),!1)}))}notifyLinked(){this.linkedNav&&(this.linkedFromExternal||=(this.linkedFromExternal=!0,this.linkedNav.goTo(this.currentIndex),!1))}getCurrentSlide(){return this.currentIndex}getSlideCount(){return this.slideCount}getSlides(){return this.slides.slice(this.cloneCount,this.cloneCount+this.slideCount)}setOptions(e,t=!0){this.userOptions={...this.userOptions,...e},t?this.reInit():this.options=n(this.options,e)}refresh(){this.destroyed||this.applyLayout()}addSlide(e,t){typeof t==`number`?this.originalChildren.splice(t,0,e):this.originalChildren.push(e),this.reInit()}removeSlide(e){e<0||e>=this.originalChildren.length||(this.originalChildren.splice(e,1),this.reInit())}};function u(e,t={}){return new l(e,t)}var d=l;e.DEFAULTS=t,e.Slickless=l,e.default=d,e.slickless=u});
2
+ //# sourceMappingURL=slickless.umd.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slickless.umd.cjs","names":[],"sources":["../src/defaults.ts","../src/utils.ts","../src/slickless.ts","../src/index.ts"],"sourcesContent":["import type { SlicklessOptions } from \"./types\";\n\nexport const DEFAULTS: SlicklessOptions = {\n arrows: true,\n dots: false,\n autoplay: false,\n autoplaySpeed: 3000,\n speed: 400,\n cssEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n slidesToShow: 1,\n slidesToScroll: 1,\n infinite: true,\n fade: false,\n vertical: false,\n initialSlide: 0,\n variableWidth: false,\n centerMode: false,\n centerPadding: \"50px\",\n rtl: false,\n draggable: true,\n swipeThreshold: 24,\n pauseOnHover: true,\n pauseOnFocus: true,\n accessibility: true,\n adaptiveHeight: false,\n lazyLoad: false,\n respectReducedMotion: true,\n prevArrow: null,\n nextArrow: null,\n customPaging: null,\n ariaRoleDescription: \"carousel\",\n responsive: null,\n asNavFor: null,\n focusOnSelect: false,\n autoplayDirection: \"forward\",\n};\n\nexport function mergeOptions(\n base: SlicklessOptions,\n override: Partial<SlicklessOptions>,\n): SlicklessOptions {\n return { ...base, ...override };\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n }\n return el;\n}\n\nexport function ensureNumber(value: unknown, fallback: number): number {\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function resolveElement(\n selectorOrElement: string | HTMLElement | null,\n): HTMLElement | null {\n if (!selectorOrElement) return null;\n if (typeof selectorOrElement === \"string\") {\n return document.querySelector<HTMLElement>(selectorOrElement);\n }\n return selectorOrElement;\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(() => resolve(), 16);\n }\n });\n}\n","import { DEFAULTS, mergeOptions } from \"./defaults\";\nimport type {\n AfterChangeDetail,\n BeforeChangeDetail,\n BreakpointDetail,\n EdgeDetail,\n LazyLoadDetail,\n ResponsiveBreakpoint,\n SlicklessOptions,\n SwipeDetail,\n} from \"./types\";\nimport { clamp, createEl, mod, prefersReducedMotion, resolveElement } from \"./utils\";\n\ninterface Pointer {\n id: number;\n startX: number;\n startY: number;\n startTime: number;\n startTransform: number;\n active: boolean;\n decided: boolean;\n isHorizontal: boolean;\n}\n\nconst CLASS = {\n root: \"slickless\",\n initialized: \"slickless--initialized\",\n viewport: \"slickless__viewport\",\n track: \"slickless__track\",\n slide: \"slickless__slide\",\n slideActive: \"slickless__slide--active\",\n slideCenter: \"slickless__slide--center\",\n slideCloned: \"slickless__slide--cloned\",\n slideCurrent: \"slickless__slide--current\",\n arrow: \"slickless__arrow\",\n arrowPrev: \"slickless__arrow--prev\",\n arrowNext: \"slickless__arrow--next\",\n arrowDisabled: \"slickless__arrow--disabled\",\n dots: \"slickless__dots\",\n dot: \"slickless__dot\",\n dotBullet: \"slickless__dot--bullet\",\n dotActive: \"slickless__dot--active\",\n vertical: \"slickless--vertical\",\n fade: \"slickless--fade\",\n rtl: \"slickless--rtl\",\n dragging: \"slickless--dragging\",\n centerMode: \"slickless--center\",\n adaptive: \"slickless--adaptive-height\",\n};\n\nexport class Slickless {\n readonly root: HTMLElement;\n private userOptions: Partial<SlicklessOptions>;\n options: SlicklessOptions;\n\n private originalChildren: HTMLElement[] = [];\n private slides: HTMLElement[] = [];\n private track!: HTMLElement;\n private viewport!: HTMLElement;\n private prevArrow: HTMLElement | null = null;\n private nextArrow: HTMLElement | null = null;\n private dotsList: HTMLElement | null = null;\n private cloneCount = 0;\n\n private currentIndex = 0;\n /** Track index we are animating toward. Lets layout reads use the future\n * slide for height-syncing while the transform is still in flight. */\n private animatingTo: number | null = null;\n private slideCount = 0;\n private animating = false;\n /** Last observed root width — used to ignore height-only ResizeObserver\n * fires (e.g. when adaptiveHeight changes the viewport height). */\n private lastRootWidth = 0;\n private destroyed = false;\n private currentBreakpoint: number | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private autoplayTimer: ReturnType<typeof setTimeout> | null = null;\n private autoplayPaused = false;\n private listeners: Map<string, Set<(detail: unknown) => void>> = new Map();\n private pointer: Pointer | null = null;\n private pointerHandlers: {\n down?: (e: Event) => void;\n move?: (e: Event) => void;\n up?: (e: Event) => void;\n cancel?: (e: Event) => void;\n } = {};\n private linkedNav: Slickless | null = null;\n private linkedFromExternal = false;\n\n constructor(root: string | HTMLElement, options: Partial<SlicklessOptions> = {}) {\n const el = typeof root === \"string\" ? document.querySelector<HTMLElement>(root) : root;\n if (!el) throw new Error(`[slickless] Root element not found: ${String(root)}`);\n this.root = el;\n this.userOptions = options;\n this.options = mergeOptions(DEFAULTS, options);\n this.init();\n }\n\n private init(): void {\n this.captureChildren();\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(this.options.initialSlide, true);\n if (this.options.autoplay) this.play();\n this.linkAsNavFor();\n (this.root as HTMLElement & { __slickless?: Slickless }).__slickless = this;\n this.root.classList.add(CLASS.initialized);\n // Defer the init event so callers can subscribe immediately after\n // `new Slickless(...)` returns.\n const emitInit = () => {\n if (!this.destroyed) this.emit(\"init\", { slickless: this });\n };\n if (typeof queueMicrotask === \"function\") queueMicrotask(emitInit);\n else Promise.resolve().then(emitInit);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) {\n this.root.appendChild(child);\n child.removeAttribute(\"aria-hidden\");\n child.removeAttribute(\"tabindex\");\n child.removeAttribute(\"role\");\n child.removeAttribute(\"aria-roledescription\");\n child.removeAttribute(\"aria-label\");\n child.style.cssText = \"\";\n }\n this.root.className = this.root.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"slickless\"))\n .join(\" \")\n .trim();\n this.root.removeAttribute(\"role\");\n this.root.removeAttribute(\"aria-roledescription\");\n this.root.removeAttribute(\"dir\");\n\n this.destroyed = true;\n this.emit(\"destroy\", { slickless: this });\n this.listeners.clear();\n }\n\n reInit(): void {\n const wasIndex = this.currentIndex;\n const wasAutoplaying = this.options.autoplay && !this.autoplayPaused;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) this.root.appendChild(child);\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(clamp(wasIndex, 0, this.slideCount - 1), true);\n if (wasAutoplaying) this.play();\n this.emit(\"reInit\", { slickless: this });\n }\n\n private captureChildren(): void {\n if (this.originalChildren.length === 0) {\n this.originalChildren = Array.from(this.root.children) as HTMLElement[];\n }\n }\n\n private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (this.options.infinite && !this.options.fade && this.slideCount > 0) {\n // For variableWidth we can't predict how many slides the viewport will\n // hold (each slide has its own intrinsic width), so clone the full set\n // at both ends. For fixed-width layouts, slidesToShow tells us exactly\n // how many neighbours need to be available beyond the current window.\n const desired = this.options.variableWidth\n ? this.slideCount\n : Math.max(this.options.slidesToShow, 1);\n this.cloneCount = Math.min(desired, this.slideCount);\n const head = realSlides.slice(-this.cloneCount).map((s) => this.cloneSlide(s));\n const tail = realSlides.slice(0, this.cloneCount).map((s) => this.cloneSlide(s));\n this.slides = [...head, ...realSlides, ...tail];\n } else {\n this.cloneCount = 0;\n this.slides = realSlides;\n }\n\n for (const slide of this.slides) this.track.appendChild(slide);\n this.viewport.appendChild(this.track);\n this.root.appendChild(this.viewport);\n\n if (this.options.arrows && this.slideCount > this.options.slidesToShow) {\n this.buildArrows();\n }\n if (this.options.dots && this.slideCount > 0) {\n this.buildDots();\n }\n\n this.applyLayout();\n this.applyLazyLoad();\n }\n\n private wrapAsSlide(child: HTMLElement, index: number): HTMLElement {\n const slide = createEl(\"div\", CLASS.slide, {\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": `${index + 1} of ${this.originalChildren.length}`,\n \"data-slick-index\": String(index),\n });\n slide.appendChild(child);\n return slide;\n }\n\n private cloneSlide(original: HTMLElement): HTMLElement {\n const clone = original.cloneNode(true) as HTMLElement;\n clone.classList.add(CLASS.slideCloned);\n clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n private indexToOffset(trackIndex: number): number {\n if (this.options.variableWidth) {\n let offset = 0;\n for (let i = 0; i < trackIndex; i++) {\n const s = this.slides[i];\n if (!s) continue;\n const r = s.getBoundingClientRect();\n offset += this.options.vertical ? r.height : r.width;\n }\n if (this.options.centerMode) {\n const focused = this.slides[trackIndex];\n if (focused) {\n const r = focused.getBoundingClientRect();\n offset -=\n (this.viewportSize() - (this.options.vertical ? r.height : r.width)) / 2;\n }\n }\n return offset;\n }\n const size = this.slideSize();\n let offset = trackIndex * size;\n if (this.options.centerMode) {\n offset -= (this.viewportSize() - size) / 2;\n } else if (!this.options.infinite && !this.options.fade) {\n // Don't translate past the end — keeps the last \"window\" of slides flush\n // with the viewport even when `goTo` targets a later index than fits.\n const maxOffset = Math.max(0, (this.slideCount - this.options.slidesToShow) * size);\n offset = Math.min(offset, maxOffset);\n }\n return offset;\n }\n\n private translateTo(offset: number, animate: boolean): void {\n const speed = animate ? this.effectiveSpeed() : 0;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transition = speed > 0 ? `transform ${speed}ms ${this.options.cssEase}` : \"\";\n this.track.style.transform = `translate${axis}(${dir * offset}px)`;\n }\n\n next(): void {\n this.goTo(this.currentIndex + this.options.slidesToScroll);\n }\n\n prev(): void {\n this.goTo(this.currentIndex - this.options.slidesToScroll);\n }\n\n goTo(index: number, immediate = false): void {\n if (this.destroyed) return;\n if (this.slideCount === 0) return;\n // Lock out new navigation while a transition is in flight. Rapid clicks\n // beyond the current animation are simply dropped — predictable beats\n // clever here.\n if (this.animating && !immediate) return;\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!wrapEnabled) {\n // Clamp to any valid slide index. The visual translation is clamped\n // separately in indexToOffset so the track doesn't reveal empty space.\n // This separation lets callers focus a specific slide (asNavFor /\n // focusOnSelect) even when every slide already fits in the viewport.\n const maxIndex = Math.max(0, this.slideCount - 1);\n if (target < 0) {\n this.emit(\"edge\", { direction: this.options.rtl ? \"right\" : \"left\" } satisfies EdgeDetail);\n target = 0;\n }\n if (target > maxIndex) {\n this.emit(\"edge\", { direction: this.options.rtl ? \"left\" : \"right\" } satisfies EdgeDetail);\n target = maxIndex;\n }\n }\n\n const previous = this.currentIndex;\n const detail: BeforeChangeDetail = {\n currentSlide: previous,\n nextSlide: wrapEnabled ? mod(target, this.slideCount) : target,\n };\n this.emit(\"beforeChange\", detail);\n\n if (!wrapEnabled || this.options.fade) {\n this.currentIndex = target;\n this.applyLayout();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n this.notifyLinked();\n return;\n }\n\n this.animating = true;\n const trackIndex = target + this.cloneCount;\n this.animatingTo = trackIndex;\n const offset = this.indexToOffset(trackIndex);\n this.translateTo(offset, !immediate);\n // Start the height transition at the same instant as the slide transform\n // so they animate together. Without this the viewport would only resize\n // after the slide finished moving, which felt like a delayed reflow.\n this.updateAdaptiveHeight(trackIndex);\n // Same idea for center mode — toggle the `--center` class on the target\n // slide right away so its scale-up animates concurrently with the track\n // translate instead of popping in after the slide settles.\n this.updateCenterMode(trackIndex);\n // And the dots: highlight the upcoming page as soon as navigation starts,\n // so the indicator tracks the slide instead of lagging behind it.\n this.updateDots(mod(target, this.slideCount));\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n const wrapped = mod(target, this.slideCount);\n const needsSnap = wrapped !== target;\n this.currentIndex = wrapped;\n if (needsSnap) {\n const newTrackIndex = wrapped + this.cloneCount;\n // Suppress per-slide transitions across the snap so that handing the\n // center class from the clone we animated into to the real slide\n // doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n this.animatingTo = null;\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n this.notifyLinked();\n };\n\n if (immediate || this.effectiveSpeed() === 0) {\n finish();\n } else {\n const onEnd = (e: TransitionEvent) => {\n // Only react to the track's own transform transition. Without these\n // filters, descendant transitions (e.g. center-mode slide scale) fire\n // transitionend on this listener too and finish the animation early,\n // which makes rapid arrow clicks visually jump.\n if (e.target !== this.track) return;\n if (e.propertyName !== \"transform\") return;\n this.track.removeEventListener(\"transitionend\", onEnd);\n finish();\n };\n this.track.addEventListener(\"transitionend\", onEnd);\n setTimeout(() => {\n if (this.animating) {\n this.track.removeEventListener(\"transitionend\", onEnd);\n finish();\n }\n }, this.effectiveSpeed() + 50);\n }\n }\n\n play(): void {\n if (this.destroyed) return;\n this.options.autoplay = true;\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n\n pause(): void {\n this.autoplayPaused = true;\n if (this.autoplayTimer) {\n clearTimeout(this.autoplayTimer);\n this.autoplayTimer = null;\n }\n }\n\n private scheduleAutoplay(): void {\n if (!this.options.autoplay || this.autoplayPaused) return;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n this.autoplayTimer = setTimeout(() => {\n if (this.options.autoplayDirection === \"backward\") this.prev();\n else this.next();\n this.scheduleAutoplay();\n }, this.options.autoplaySpeed);\n }\n\n on<T = unknown>(event: string, handler: (detail: T) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(handler as (detail: unknown) => void);\n return () => set.delete(handler as (detail: unknown) => void);\n }\n\n off(event: string, handler: (detail: unknown) => void): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n private emit(event: string, detail: unknown): void {\n this.listeners.get(event)?.forEach((fn) => fn(detail));\n this.root.dispatchEvent(new CustomEvent(`slickless:${event}`, { detail, bubbles: false }));\n }\n\n private handlePrevClick = (e: Event): void => {\n e.preventDefault();\n this.prev();\n };\n\n private handleNextClick = (e: Event): void => {\n e.preventDefault();\n this.next();\n };\n\n private handleResize = (): void => {\n // Height-only changes (e.g. adaptiveHeight resizing the viewport) shouldn't\n // re-snap the track transform — that interrupts in-flight slide animations.\n const width = this.root.getBoundingClientRect().width;\n if (width === this.lastRootWidth) return;\n this.lastRootWidth = width;\n this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable && !this.options.fade) this.bindPointerEvents();\n if (this.options.focusOnSelect) this.bindFocusOnSelect();\n }\n\n private unbindEvents(): void {\n this.root.removeEventListener(\"keydown\", this.handleKey);\n this.root.removeEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.removeEventListener(\"focusin\", this.handleFocusIn);\n this.root.removeEventListener(\"focusout\", this.handleFocusOut);\n if (typeof window !== \"undefined\")\n window.removeEventListener(\"resize\", this.handleResize);\n if (this.prevArrow) this.prevArrow.removeEventListener(\"click\", this.handlePrevClick);\n if (this.nextArrow) this.nextArrow.removeEventListener(\"click\", this.handleNextClick);\n this.unbindPointerEvents();\n }\n\n private bindPointerEvents(): void {\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = this.parseTranslate();\n this.pointer = {\n id: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n startTime: performance.now(),\n startTransform,\n active: true,\n decided: false,\n isHorizontal: !this.options.vertical,\n };\n this.track.style.transition = \"\";\n this.root.classList.add(CLASS.dragging);\n };\n\n const onMove = (e: PointerEvent) => {\n if (!this.pointer || !this.pointer.active || this.pointer.id !== e.pointerId) return;\n const dx = e.clientX - this.pointer.startX;\n const dy = e.clientY - this.pointer.startY;\n if (!this.pointer.decided) {\n const absX = Math.abs(dx);\n const absY = Math.abs(dy);\n if (absX < 6 && absY < 6) return;\n this.pointer.isHorizontal = absX > absY;\n this.pointer.decided = true;\n if (this.options.vertical ? this.pointer.isHorizontal : !this.pointer.isHorizontal) {\n this.pointer.active = false;\n this.root.classList.remove(CLASS.dragging);\n return;\n }\n }\n const delta = this.options.vertical ? dy : dx;\n const dir = this.options.rtl && !this.options.vertical ? -1 : 1;\n const newOffset = this.pointer.startTransform - dir * delta;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const transformDir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transform = `translate${axis}(${transformDir * newOffset}px)`;\n if (typeof (e as PointerEvent).preventDefault === \"function\") e.preventDefault();\n };\n\n const onUp = (e: PointerEvent) => {\n if (!this.pointer || this.pointer.id !== e.pointerId) return;\n const wasActive = this.pointer.active;\n const dx = e.clientX - this.pointer.startX;\n const dy = e.clientY - this.pointer.startY;\n const elapsed = performance.now() - this.pointer.startTime;\n this.root.classList.remove(CLASS.dragging);\n this.pointer = null;\n if (!wasActive) return;\n\n const delta = this.options.vertical ? dy : dx;\n const velocity = Math.abs(delta) / Math.max(1, elapsed);\n const threshold = this.options.swipeThreshold;\n\n const swiped = Math.abs(delta) > threshold || velocity > 0.6;\n if (swiped) {\n const goPrev = this.options.rtl && !this.options.vertical ? delta < 0 : delta > 0;\n if (goPrev) {\n this.emit(\"swipe\", {\n direction: this.options.vertical ? \"down\" : \"right\",\n } satisfies SwipeDetail);\n this.prev();\n } else {\n this.emit(\"swipe\", {\n direction: this.options.vertical ? \"up\" : \"left\",\n } satisfies SwipeDetail);\n this.next();\n }\n } else {\n this.goTo(this.currentIndex, true);\n }\n };\n\n const onCancel = (e: PointerEvent) => {\n if (!this.pointer || this.pointer.id !== e.pointerId) return;\n this.root.classList.remove(CLASS.dragging);\n this.pointer = null;\n this.goTo(this.currentIndex, true);\n };\n\n const downHandler = onDown as (e: Event) => void;\n const moveHandler = onMove as (e: Event) => void;\n const upHandler = onUp as (e: Event) => void;\n const cancelHandler = onCancel as (e: Event) => void;\n this.pointerHandlers = {\n down: downHandler,\n move: moveHandler,\n up: upHandler,\n cancel: cancelHandler,\n };\n this.viewport.addEventListener(\"pointerdown\", downHandler);\n window.addEventListener(\"pointermove\", moveHandler, { passive: false });\n window.addEventListener(\"pointerup\", upHandler);\n window.addEventListener(\"pointercancel\", cancelHandler);\n }\n\n private unbindPointerEvents(): void {\n const { down, move, up, cancel } = this.pointerHandlers;\n if (!down) return;\n this.viewport.removeEventListener(\"pointerdown\", down);\n if (move) window.removeEventListener(\"pointermove\", move);\n if (up) window.removeEventListener(\"pointerup\", up);\n if (cancel) window.removeEventListener(\"pointercancel\", cancel);\n this.pointerHandlers = {};\n }\n\n private parseTranslate(): number {\n const t = this.track.style.transform;\n const m = /translate[XY]\\((-?\\d+(?:\\.\\d+)?)px\\)/.exec(t);\n if (!m || !m[1]) return this.indexToOffset(this.realToTrackIndex(this.currentIndex));\n const v = parseFloat(m[1]);\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n return v / dir;\n }\n\n private bindFocusOnSelect(): void {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.addEventListener(\"click\", () => {\n const realIndex = i - this.cloneCount;\n if (realIndex >= 0 && realIndex < this.slideCount) this.goTo(realIndex);\n });\n }\n }\n\n private realToTrackIndex(realIndex: number): number {\n return realIndex + this.cloneCount;\n }\n\n private updateAria(): void {\n const trackIndex = this.realToTrackIndex(this.currentIndex);\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ export type EasingFunction = (t: number) => number;
2
+ export type Direction = "ltr" | "rtl";
3
+ export interface ResponsiveBreakpoint {
4
+ /** Max-width breakpoint in px (mobile-first sense: applies below this width). */
5
+ breakpoint: number;
6
+ /** Options to merge when this breakpoint is active. Set to "unslick" to destroy on this breakpoint. */
7
+ settings: Partial<SlicklessOptions> | "unslick";
8
+ }
9
+ export interface SlicklessOptions {
10
+ /** Enable next/prev arrows. */
11
+ arrows: boolean;
12
+ /** Enable dot navigation. */
13
+ dots: boolean;
14
+ /** Automatically rotate slides. */
15
+ autoplay: boolean;
16
+ /** Autoplay interval in ms. */
17
+ autoplaySpeed: number;
18
+ /** Transition duration in ms. */
19
+ speed: number;
20
+ /** Easing function name (CSS easing) or a function. */
21
+ cssEase: string;
22
+ /** Slides visible at once. */
23
+ slidesToShow: number;
24
+ /** Slides to scroll per advance. */
25
+ slidesToScroll: number;
26
+ /** Loop slides infinitely. */
27
+ infinite: boolean;
28
+ /** Use fade transition instead of slide. */
29
+ fade: boolean;
30
+ /** Vertical mode. */
31
+ vertical: boolean;
32
+ /** Initial slide index. */
33
+ initialSlide: number;
34
+ /** Variable-width slides (use each slide's natural width). */
35
+ variableWidth: boolean;
36
+ /** Center mode — focused slide in the middle. */
37
+ centerMode: boolean;
38
+ /** Padding around the focused slide in center mode (e.g., "50px"). */
39
+ centerPadding: string;
40
+ /** Right-to-left direction. */
41
+ rtl: boolean;
42
+ /** Enable touch/mouse drag. */
43
+ draggable: boolean;
44
+ /** Distance in px needed to trigger a swipe. */
45
+ swipeThreshold: number;
46
+ /** Pause autoplay on hover. */
47
+ pauseOnHover: boolean;
48
+ /** Pause autoplay on focus. */
49
+ pauseOnFocus: boolean;
50
+ /** Enable arrow keys navigation. */
51
+ accessibility: boolean;
52
+ /** Adapt height to current slide. */
53
+ adaptiveHeight: boolean;
54
+ /** Lazy load images. "ondemand" loads as slides approach view; "progressive" loads sequentially. */
55
+ lazyLoad: "ondemand" | "progressive" | false;
56
+ /** Respect prefers-reduced-motion. */
57
+ respectReducedMotion: boolean;
58
+ /** Custom previous arrow HTML or element. */
59
+ prevArrow: string | HTMLElement | null;
60
+ /** Custom next arrow HTML or element. */
61
+ nextArrow: string | HTMLElement | null;
62
+ /** Custom dot renderer: (slideIndex) => HTMLElement | string. */
63
+ customPaging: ((slideIndex: number, total: number) => HTMLElement | string) | null;
64
+ /** ARIA roledescription for the carousel. */
65
+ ariaRoleDescription: string;
66
+ /** Responsive breakpoint settings. */
67
+ responsive: ResponsiveBreakpoint[] | null;
68
+ /** Linked carousel selector or instance for as-nav-for sync. */
69
+ asNavFor: string | HTMLElement | null;
70
+ /** Focus on select (clicking a slide focuses it). */
71
+ focusOnSelect: boolean;
72
+ /** Auto-play direction: forward or backward. */
73
+ autoplayDirection: "forward" | "backward";
74
+ }
75
+ export type SlicklessEvent = "init" | "beforeChange" | "afterChange" | "destroy" | "reInit" | "swipe" | "edge" | "lazyLoadError" | "lazyLoaded" | "breakpoint";
76
+ export interface BeforeChangeDetail {
77
+ currentSlide: number;
78
+ nextSlide: number;
79
+ }
80
+ export interface AfterChangeDetail {
81
+ currentSlide: number;
82
+ }
83
+ export interface SwipeDetail {
84
+ direction: "left" | "right" | "up" | "down";
85
+ }
86
+ export interface EdgeDetail {
87
+ direction: "left" | "right" | "up" | "down";
88
+ }
89
+ export interface BreakpointDetail {
90
+ breakpoint: number | null;
91
+ }
92
+ export interface LazyLoadDetail {
93
+ image: HTMLImageElement;
94
+ src: string;
95
+ }
@@ -0,0 +1,7 @@
1
+ export declare function clamp(value: number, min: number, max: number): number;
2
+ export declare function mod(n: number, m: number): number;
3
+ export declare function prefersReducedMotion(): boolean;
4
+ export declare function createEl<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, attrs?: Record<string, string>): HTMLElementTagNameMap[K];
5
+ export declare function ensureNumber(value: unknown, fallback: number): number;
6
+ export declare function resolveElement(selectorOrElement: string | HTMLElement | null): HTMLElement | null;
7
+ export declare function nextFrame(): Promise<void>;
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "slickless",
3
+ "version": "0.1.0",
4
+ "description": "A jQuery-free port of slick carousel — small, accessible, framework-agnostic.",
5
+ "type": "module",
6
+ "main": "./dist/slickless.umd.cjs",
7
+ "module": "./dist/slickless.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/slickless.js",
13
+ "require": "./dist/slickless.umd.cjs"
14
+ },
15
+ "./style.css": "./dist/slickless.css",
16
+ "./css": "./dist/slickless.css"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "scripts": {
24
+ "dev": "vite --config vite.demo.config.ts",
25
+ "build": "vite build && tsc -p tsconfig.build.json --emitDeclarationOnly",
26
+ "build:demo": "vite build --config vite.demo.config.ts",
27
+ "test": "vitest run",
28
+ "typecheck": "tsc --noEmit",
29
+ "prepublishOnly": "bun run build"
30
+ },
31
+ "keywords": [
32
+ "carousel",
33
+ "slider",
34
+ "slick",
35
+ "slideshow",
36
+ "jquery-free",
37
+ "vanilla",
38
+ "typescript",
39
+ "accessible"
40
+ ],
41
+ "author": "yfxie",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/yfxie/slickless.git"
46
+ },
47
+ "homepage": "https://yfxie.github.io/slickless/",
48
+ "bugs": {
49
+ "url": "https://github.com/yfxie/slickless/issues"
50
+ },
51
+ "sideEffects": [
52
+ "*.css"
53
+ ],
54
+ "devDependencies": {
55
+ "@types/bun": "latest",
56
+ "@types/node": "^22.10.0",
57
+ "happy-dom": "^20.9.0",
58
+ "typescript": "^5.7.2",
59
+ "vite": "^8.0.14",
60
+ "vite-plugin-dts": "^5.0.1",
61
+ "vitest": "^4.1.7"
62
+ }
63
+ }