slickless 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/slickless.d.ts +1 -0
- package/dist/slickless.js +18 -10
- package/dist/slickless.js.map +1 -1
- package/dist/slickless.umd.cjs +1 -1
- package/dist/slickless.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/slickless.d.ts
CHANGED
package/dist/slickless.js
CHANGED
|
@@ -312,17 +312,17 @@ var s = {
|
|
|
312
312
|
currentSlide: this.currentIndex,
|
|
313
313
|
nextSlide: i ? r(n, this.slideCount) : n
|
|
314
314
|
};
|
|
315
|
-
if (this.emit("beforeChange", a), this.options.fade) {
|
|
315
|
+
if (this.emit("beforeChange", a), this.notifyLinked(a.nextSlide), this.options.fade) {
|
|
316
316
|
this.currentIndex = n, this.applyLayout();
|
|
317
317
|
let e = { currentSlide: this.currentIndex };
|
|
318
|
-
this.emit("afterChange", e), this.applyLazyLoad()
|
|
318
|
+
this.emit("afterChange", e), this.applyLazyLoad();
|
|
319
319
|
return;
|
|
320
320
|
}
|
|
321
321
|
this.animating = !0;
|
|
322
322
|
let o = n + this.cloneCount;
|
|
323
323
|
this.animatingTo = o;
|
|
324
324
|
let s = this.indexToOffset(o);
|
|
325
|
-
this.translateTo(s, !t), this.updateAdaptiveHeight(o), this.updateCenterMode(o), this.updateDots(i ? r(n, this.slideCount) : n);
|
|
325
|
+
this.translateTo(s, !t), this.updateAdaptiveHeight(o), this.updateCenterMode(o), this.updateDots(i ? r(n, this.slideCount) : n), this.updateSlideClasses(o);
|
|
326
326
|
let c = !1, l = () => {
|
|
327
327
|
if (c) return;
|
|
328
328
|
if (c = !0, this.animating = !1, i) {
|
|
@@ -334,7 +334,7 @@ var s = {
|
|
|
334
334
|
} else this.currentIndex = n;
|
|
335
335
|
this.animatingTo = null, this.updateAria(), this.updateArrows(), this.updateDots();
|
|
336
336
|
let e = { currentSlide: this.currentIndex };
|
|
337
|
-
this.emit("afterChange", e), this.applyLazyLoad()
|
|
337
|
+
this.emit("afterChange", e), this.applyLazyLoad();
|
|
338
338
|
};
|
|
339
339
|
if (t || this.effectiveSpeed() === 0) l();
|
|
340
340
|
else {
|
|
@@ -455,14 +455,21 @@ var s = {
|
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
|
+
this.updateSlideClasses(e);
|
|
458
459
|
for (let t = 0; t < this.slides.length; t++) {
|
|
459
460
|
let n = this.slides[t];
|
|
460
461
|
if (!n) continue;
|
|
461
|
-
let r = this.isSlideInActiveRange(t, e), i =
|
|
462
|
-
|
|
462
|
+
let r = this.isSlideInActiveRange(t, e), i = n.classList.contains(s.slideCloned);
|
|
463
|
+
r ? (n.removeAttribute("inert"), i || n.setAttribute("tabindex", "0")) : (n.setAttribute("inert", ""), n.removeAttribute("tabindex"));
|
|
463
464
|
}
|
|
464
465
|
n && t && t.focus({ preventScroll: !0 }), this.updateCenterMode(e);
|
|
465
466
|
}
|
|
467
|
+
updateSlideClasses(e) {
|
|
468
|
+
for (let t = 0; t < this.slides.length; t++) {
|
|
469
|
+
let n = this.slides[t];
|
|
470
|
+
n && (n.classList.toggle(s.slideActive, this.isSlideInActiveRange(t, e)), n.classList.toggle(s.slideCurrent, t === e));
|
|
471
|
+
}
|
|
472
|
+
}
|
|
466
473
|
suppressSlideTransitionsForOneFrame() {
|
|
467
474
|
this.root.classList.add("slickless--snap"), this.root.offsetWidth, typeof requestAnimationFrame == "function" ? requestAnimationFrame(() => {
|
|
468
475
|
requestAnimationFrame(() => this.root.classList.remove("slickless--snap"));
|
|
@@ -475,6 +482,7 @@ var s = {
|
|
|
475
482
|
}
|
|
476
483
|
}
|
|
477
484
|
isSlideInActiveRange(e, t) {
|
|
485
|
+
if (this.allSlidesFit()) return !0;
|
|
478
486
|
let n = Math.max(1, this.options.slidesToShow);
|
|
479
487
|
if (this.options.centerMode) {
|
|
480
488
|
let r = Math.floor(n / 2);
|
|
@@ -544,12 +552,12 @@ var s = {
|
|
|
544
552
|
let t = o(e);
|
|
545
553
|
if (!t) return;
|
|
546
554
|
let n = t.__slickless;
|
|
547
|
-
n && (this.linkedNav = n, n.on("
|
|
548
|
-
this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.goTo(e.
|
|
555
|
+
n && (this.linkedNav = n, n.on("beforeChange", (e) => {
|
|
556
|
+
this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.goTo(e.nextSlide), !1);
|
|
549
557
|
}));
|
|
550
558
|
}
|
|
551
|
-
notifyLinked() {
|
|
552
|
-
this.linkedNav && (this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.linkedNav.goTo(
|
|
559
|
+
notifyLinked(e) {
|
|
560
|
+
this.linkedNav && (this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.linkedNav.goTo(e), !1));
|
|
553
561
|
}
|
|
554
562
|
getCurrentSlide() {
|
|
555
563
|
return this.currentIndex;
|
package/dist/slickless.js.map
CHANGED
|
@@ -1 +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 /**\n * Evaluate the responsive breakpoint list against the current viewport,\n * re-merging `this.options` from the resolved settings. Always re-applies\n * the merge — callers like `reInit()` reset `options` first and rely on\n * this method to layer the active breakpoint back on top. Returns whether\n * the active breakpoint changed; resize handlers use that to decide\n * between a cheap re-layout and a full rebuild (dots, clones and arrows\n * all depend on the post-breakpoint slidesToShow).\n */\n private applyResponsive(): boolean {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return false;\n if (typeof window === \"undefined\") return false;\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 const changed = newBp !== this.currentBreakpoint;\n this.currentBreakpoint = newBp;\n if (active?.settings === \"unslick\") {\n if (changed) this.destroy();\n return changed;\n }\n this.options = active\n ? mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings)\n : mergeOptions(DEFAULTS, this.userOptions);\n if (changed) {\n this.emit(\"breakpoint\", { breakpoint: newBp });\n }\n return changed;\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 (\n this.options.infinite &&\n !this.options.fade &&\n this.slideCount > 0 &&\n !this.allSlidesFit()\n ) {\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 // Dots are meaningless when every slide is already visible at once.\n if (this.options.dots && !this.allSlidesFit()) {\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 // The clone's inert state is managed by updateAria(): clones briefly\n // become the visually active slide during an infinite wrap, and pointer\n // events / focus must work on them in that window.\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.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 /**\n * Every slide already fits in the viewport — there's nothing to scroll to,\n * so dots, autoplay and clones are all suppressed. variableWidth keeps the\n * usual machinery because per-slide widths aren't predictable upfront.\n */\n private allSlidesFit(): boolean {\n if (this.options.variableWidth) return false;\n return this.slideCount > 0 && this.slideCount <= this.options.slidesToShow;\n }\n\n private indexToOffset(trackIndex: number): number {\n // No room to scroll — track stays put; CSS `justify-content: safe center`\n // handles visual centering. centerMode keeps its own offset math because\n // it already implements per-slide centering.\n if (this.allSlidesFit() && !this.options.centerMode) return 0;\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 // Manual navigation (arrow click, dot click, swipe, asNavFor sync,\n // programmatic goTo) should restart the autoplay countdown so the\n // automatic advance doesn't fire right on top of the user's action.\n // Skipped when autoplay is currently paused (e.g. by hover/focus) —\n // those pauses are released by their own handlers.\n if (this.options.autoplay && !this.autoplayPaused) {\n this.scheduleAutoplay();\n }\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!this.options.infinite) {\n // Finite carousel — clamp the target to a valid slide index and emit\n // `edge` when callers walk past either end. The visual translation is\n // clamped separately in indexToOffset so the track doesn't reveal\n // empty space. This separation lets callers focus a specific slide\n // (asNavFor / focusOnSelect) even when every slide already fits in\n // 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 } else if (this.options.fade) {\n // Fade + infinite has no clones to animate through, but the index\n // still needs to wrap so autoplay / next / prev cycle continuously.\n target = mod(target, this.slideCount);\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 (this.options.fade) {\n // Fade transitions via per-slide opacity — there's no track movement\n // to animate, so applyLayout is the entire visual update.\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 // Slide mode — animate the track transform. Both infinite and finite\n // carousels share this path; only the wrap-snap inside finish() differs.\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(wrapEnabled ? mod(target, this.slideCount) : target);\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n // Infinite carousels may have animated through a clone — snap the\n // track to the equivalent real slide so subsequent navigation has the\n // right starting offset. Finite carousels animated to the actual\n // target index, so nothing to do.\n if (wrapEnabled) {\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\n // the center class from the clone we animated into to the real\n // slide doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n } else {\n this.currentIndex = target;\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 // Nothing to rotate through — silently skip instead of spinning a timer.\n if (this.allSlidesFit()) 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 if (this.applyResponsive()) {\n // Breakpoint changed — slidesToShow, infinite, dots, autoplay etc. may\n // all be different now, so do a full rebuild. reInit preserves the\n // current slide index and autoplay state.\n if (!this.destroyed) this.reInit();\n return;\n }\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.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 // Fade carousels keep gesture detection but skip track-following: the\n // slides are stacked absolutely and crossfade via opacity, so there's\n // nothing to translate while the finger is down. Only the swipe\n // verdict on pointerup matters.\n const followsFinger = (): boolean => !this.options.fade;\n\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = followsFinger() ? this.parseTranslate() : 0;\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 if (followsFinger()) 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 if (followsFinger()) {\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 }\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 if (followsFinger()) {\n // Snap the track back to the resting position. Fade mode never\n // moved the track so there's nothing to snap.\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 if (followsFinger()) 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 const activeSlide = this.slides[trackIndex];\n\n // Detect *before* mutating: is focus inside a slide that's about to be\n // marked inert? Browsers move focus to the document body the moment we\n // apply `inert` to its ancestor, which is functional but jarring. We'd\n // rather re-park focus on the new active slide so keyboard users keep\n // their place. The check has to happen before the attribute loop, because\n // afterwards `document.activeElement` is already body.\n let needsFocusMove = false;\n if (typeof document !== \"undefined\" && activeSlide) {\n const focused = document.activeElement;\n if (focused && focused !== document.body) {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n if (this.isSlideInActiveRange(i, trackIndex)) continue;\n if (slide.contains(focused)) {\n needsFocusMove = true;\n break;\n }\n }\n }\n }\n\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 const isCloned = slide.classList.contains(CLASS.slideCloned);\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (isActive) {\n slide.removeAttribute(\"inert\");\n // Only real slides get a focusable wrapper. Cloned slides defer to\n // their descendants (links, buttons) for tab order so the same logical\n // slide isn't reachable through two wrappers in the same tab cycle.\n if (!isCloned) slide.setAttribute(\"tabindex\", \"0\");\n } else {\n slide.setAttribute(\"inert\", \"\");\n slide.removeAttribute(\"tabindex\");\n }\n }\n\n if (needsFocusMove && activeSlide) {\n activeSlide.focus({ preventScroll: true });\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":";AAEA,IAAa,IAA6B;CACxC,QAAQ;CACR,MAAM;CACN,UAAU;CACV,eAAe;CACf,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CAChB,UAAU;CACV,MAAM;CACN,UAAU;CACV,cAAc;CACd,eAAe;CACf,YAAY;CACZ,eAAe;CACf,KAAK;CACL,WAAW;CACX,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,sBAAsB;CACtB,WAAW;CACX,WAAW;CACX,cAAc;CACd,qBAAqB;CACrB,YAAY;CACZ,UAAU;CACV,eAAe;CACf,mBAAmB;AACrB;AAEA,SAAgB,EACd,GACA,GACkB;CAClB,OAAO;EAAE,GAAG;EAAM,GAAG;CAAS;AAChC;;;AC1CA,SAAgB,EAAM,GAAe,GAAa,GAAqB;CACrE,OAAO,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,CAAK,CAAC;AAC3C;AAEA,SAAgB,EAAI,GAAW,GAAmB;CAChD,QAAS,IAAI,IAAK,KAAK;AACzB;AAEA,SAAgB,IAAgC;CAE9C,OADI,OAAO,SAAW,OAAe,CAAC,OAAO,aAAmB,KACzD,OAAO,WAAW,kCAAkC,EAAE;AAC/D;AAEA,SAAgB,EACd,GACA,GACA,GAC0B;CAC1B,IAAM,IAAK,SAAS,cAAc,CAAG;CAErC,IADI,MAAW,EAAG,YAAY,IAC1B,GACF,KAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAK,GAAG,EAAG,aAAa,GAAG,CAAC;CAElE,OAAO;AACT;AAOA,SAAgB,EACd,GACoB;CAKpB,OAJK,IACD,OAAO,KAAsB,WACxB,SAAS,cAA2B,CAAiB,IAEvD,IAJwB;AAKjC;;;ACfA,IAAM,IAAQ;CACZ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;CACP,OAAO;CACP,aAAa;CACb,aAAa;CACb,aAAa;CACb,cAAc;CACd,OAAO;CACP,WAAW;CACX,WAAW;CACX,eAAe;CACf,MAAM;CACN,KAAK;CACL,WAAW;CACX,WAAW;CACX,UAAU;CACV,MAAM;CACN,KAAK;CACL,UAAU;CACV,YAAY;CACZ,UAAU;AACZ,GAEa,IAAb,MAAuB;CAuCrB,YAAY,GAA4B,IAAqC,CAAC,GAAG;0BAlCvC,CAAC,iBACX,CAAC,oBAGO,uBACA,sBACD,wBAClB,uBAEE,sBAGc,wBAChB,oBACD,yBAGI,oBACJ,6BACuB,4BACK,2BACc,4BACrC,qCACwC,IAAI,IAAI,kBACvC,6BAM9B,CAAC,oBACiC,gCACT,4BAkmBF,MAAmB;GAE5C,AADA,EAAE,eAAe,GACjB,KAAK,KAAK;EACZ,2BAE2B,MAAmB;GAE5C,AADA,EAAE,eAAe,GACjB,KAAK,KAAK;EACZ,6BAEmC;GAGjC,IAAM,IAAQ,KAAK,KAAK,sBAAsB,EAAE;GAC5C,UAAU,KAAK,eAEnB;QADA,KAAK,gBAAgB,GACjB,KAAK,gBAAgB,GAAG;KAI1B,AAAK,KAAK,aAAW,KAAK,OAAO;KACjC;IACF;IACA,KAAK,YAAY;GADjB;EAEF,qBAEqB,MAA2B;GACzC,KAAK,QAAQ,kBACd,EAAE,QAAQ,eACZ,EAAE,eAAe,GACb,KAAK,QAAQ,MAAK,KAAK,KAAK,IAC3B,KAAK,KAAK,KACN,EAAE,QAAQ,gBACnB,EAAE,eAAe,GACb,KAAK,QAAQ,MAAK,KAAK,KAAK,IAC3B,KAAK,KAAK,KACN,EAAE,QAAQ,UACnB,EAAE,eAAe,GACjB,KAAK,KAAK,CAAC,KACF,EAAE,QAAQ,UACnB,EAAE,eAAe,GACjB,KAAK,KAAK,KAAK,aAAa,CAAC;EAEjC,iCAEuC;GACrC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IAClB,KAAK,iBAAe,aAAa,KAAK,aAAa;EAE3D,iCAEuC;GACrC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;EAE1B,8BAEoC;GAClC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IAClB,KAAK,iBAAe,aAAa,KAAK,aAAa;EAE3D,0BAE0B,MAAwB;GAChD,IAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,UAAU;IACtD,IAAM,IAAO,EAAE;IACf,CAAI,CAAC,KAAQ,CAAC,KAAK,KAAK,SAAS,CAAI,OACnC,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;GAE1B;EACF;EAzqBE,IAAM,IAAK,OAAO,KAAS,WAAW,SAAS,cAA2B,CAAI,IAAI;EAClF,IAAI,CAAC,GAAI,MAAU,MAAM,uCAAuC,OAAO,CAAI,GAAG;EAI9E,AAHA,KAAK,OAAO,GACZ,KAAK,cAAc,GACnB,KAAK,UAAU,EAAa,GAAU,CAAO,GAC7C,KAAK,KAAK;CACZ;CAEA,OAAqB;EASnB,AARA,KAAK,gBAAgB,GACrB,KAAK,gBAAgB,GACrB,KAAK,MAAM,GACX,KAAK,WAAW,GAChB,KAAK,KAAK,KAAK,QAAQ,cAAc,EAAI,GACrC,KAAK,QAAQ,YAAU,KAAK,KAAK,GACrC,KAAK,aAAa,GAClB,KAAM,KAAmD,cAAc,MACvE,KAAK,KAAK,UAAU,IAAI,EAAM,WAAW;EAGzC,IAAM,UAAiB;GACrB,AAAK,KAAK,aAAW,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;EAC5D;EACA,AAAI,OAAO,kBAAmB,aAAY,eAAe,CAAQ,IAC5D,QAAQ,QAAQ,EAAE,KAAK,CAAQ;CACtC;CAEA,UAAgB;EACV,UAAK,WAKT;GAJA,KAAK,MAAM,GACX,KAAK,aAAa,GACd,KAAK,kBAAgB,KAAK,eAAe,WAAW,GAExD,KAAK,KAAK,YAAY;GACtB,KAAK,IAAM,KAAS,KAAK,kBAOvB,AANA,KAAK,KAAK,YAAY,CAAK,GAC3B,EAAM,gBAAgB,aAAa,GACnC,EAAM,gBAAgB,UAAU,GAChC,EAAM,gBAAgB,MAAM,GAC5B,EAAM,gBAAgB,sBAAsB,GAC5C,EAAM,gBAAgB,YAAY,GAClC,EAAM,MAAM,UAAU;GAaxB,AAXA,KAAK,KAAK,YAAY,KAAK,KAAK,UAC7B,MAAM,KAAK,EACX,QAAQ,MAAM,CAAC,EAAE,WAAW,WAAW,CAAC,EACxC,KAAK,GAAG,EACR,KAAK,GACR,KAAK,KAAK,gBAAgB,MAAM,GAChC,KAAK,KAAK,gBAAgB,sBAAsB,GAChD,KAAK,KAAK,gBAAgB,KAAK,GAE/B,KAAK,YAAY,IACjB,KAAK,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC,GACxC,KAAK,UAAU,MAAM;EArBC;CAsBxB;CAEA,SAAe;EACb,IAAM,IAAW,KAAK,cAChB,IAAiB,KAAK,QAAQ,YAAY,CAAC,KAAK;EAItD,AAHA,KAAK,MAAM,GACX,KAAK,aAAa,GACd,KAAK,kBAAgB,KAAK,eAAe,WAAW,GACxD,KAAK,KAAK,YAAY;EACtB,KAAK,IAAM,KAAS,KAAK,kBAAkB,KAAK,KAAK,YAAY,CAAK;EAOtE,AANA,KAAK,UAAU,EAAa,GAAU,KAAK,WAAW,GACtD,KAAK,gBAAgB,GACrB,KAAK,MAAM,GACX,KAAK,WAAW,GAChB,KAAK,KAAK,EAAM,GAAU,GAAG,KAAK,aAAa,CAAC,GAAG,EAAI,GACnD,KAAgB,KAAK,KAAK,GAC9B,KAAK,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;CACzC;CAEA,kBAAgC;EAC9B,AAAI,KAAK,iBAAiB,WAAW,MACnC,KAAK,mBAAmB,MAAM,KAAK,KAAK,KAAK,QAAQ;CAEzD;CAWA,kBAAmC;EACjC,IAAM,IAAa,KAAK,QAAQ;EAEhC,IADI,CAAC,KAAc,EAAW,WAAW,KACrC,OAAO,SAAW,KAAa,OAAO;EAC1C,IAAM,IAAQ,OAAO,YACf,IAAiC,CAAC,GAAG,CAAU,EAAE,MACpD,GAAG,MAAM,EAAE,aAAa,EAAE,UAC7B,GACI,IAAsC;EAC1C,KAAK,IAAM,KAAQ,GACjB,IAAI,KAAS,EAAK,YAAY;GAC5B,IAAS;GACT;EACF;EAEF,IAAM,IAAQ,IAAS,EAAO,aAAa,MACrC,IAAU,MAAU,KAAK;EAY/B,OAXA,KAAK,oBAAoB,GACrB,GAAQ,aAAa,aACnB,KAAS,KAAK,QAAQ,GACnB,MAET,KAAK,UAAU,IACX,EAAa,EAAa,GAAU,KAAK,WAAW,GAAG,EAAO,QAAQ,IACtE,EAAa,GAAU,KAAK,WAAW,GACvC,KACF,KAAK,KAAK,cAAc,EAAE,YAAY,EAAM,CAAC,GAExC;CACT;CAEA,QAAsB;EAmBpB,AAlBA,KAAK,KAAK,YAAY,IACtB,KAAK,KAAK,UAAU,IAAI,EAAM,IAAI,GAClC,KAAK,KAAK,UAAU,OAAO,EAAM,UAAU,KAAK,QAAQ,QAAQ,GAChE,KAAK,KAAK,UAAU,OAAO,EAAM,MAAM,KAAK,QAAQ,IAAI,GACxD,KAAK,KAAK,UAAU,OAAO,EAAM,KAAK,KAAK,QAAQ,GAAG,GACtD,KAAK,KAAK,UAAU,OAAO,EAAM,YAAY,KAAK,QAAQ,UAAU,GACpE,KAAK,KAAK,UAAU,OAAO,EAAM,UAAU,KAAK,QAAQ,cAAc,GAGtE,KAAK,KAAK,MAAM,YACd,mCACA,GAAG,KAAK,eAAe,EAAE,GAC3B,GACA,KAAK,KAAK,aAAa,QAAQ,QAAQ,GACvC,KAAK,KAAK,aAAa,wBAAwB,KAAK,QAAQ,mBAAmB,GAC3E,KAAK,QAAQ,OAAK,KAAK,KAAK,aAAa,OAAO,KAAK,GAEzD,KAAK,WAAW,EAAS,OAAO,EAAM,QAAQ,GAC9C,KAAK,QAAQ,EAAS,OAAO,EAAM,OAAO,EAAE,MAAM,eAAe,CAAC;EAElE,IAAM,IAAa,KAAK,iBAAiB,KAAK,GAAO,MAAM,KAAK,YAAY,GAAO,CAAC,CAAC;EAGrF,IAFA,KAAK,aAAa,EAAW,QAG3B,KAAK,QAAQ,YACb,CAAC,KAAK,QAAQ,QACd,KAAK,aAAa,KAClB,CAAC,KAAK,aAAa,GACnB;GAKA,IAAM,IAAU,KAAK,QAAQ,gBACzB,KAAK,aACL,KAAK,IAAI,KAAK,QAAQ,cAAc,CAAC;GACzC,KAAK,aAAa,KAAK,IAAI,GAAS,KAAK,UAAU;GACnD,IAAM,IAAO,EAAW,MAAM,CAAC,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK,WAAW,CAAC,CAAC,GACvE,IAAO,EAAW,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK,WAAW,CAAC,CAAC;GAC/E,KAAK,SAAS;IAAC,GAAG;IAAM,GAAG;IAAY,GAAG;GAAI;EAChD,OAEE,AADA,KAAK,aAAa,GAClB,KAAK,SAAS;EAGhB,KAAK,IAAM,KAAS,KAAK,QAAQ,KAAK,MAAM,YAAY,CAAK;EAa7D,AAZA,KAAK,SAAS,YAAY,KAAK,KAAK,GACpC,KAAK,KAAK,YAAY,KAAK,QAAQ,GAE/B,KAAK,QAAQ,UAAU,KAAK,aAAa,KAAK,QAAQ,gBACxD,KAAK,YAAY,GAGf,KAAK,QAAQ,QAAQ,CAAC,KAAK,aAAa,KAC1C,KAAK,UAAU,GAGjB,KAAK,YAAY,GACjB,KAAK,cAAc;CACrB;CAEA,YAAoB,GAAoB,GAA4B;EAClE,IAAM,IAAQ,EAAS,OAAO,EAAM,OAAO;GACzC,MAAM;GACN,wBAAwB;GACxB,cAAc,GAAG,IAAQ,EAAE,MAAM,KAAK,iBAAiB;GACvD,oBAAoB,OAAO,CAAK;EAClC,CAAC;EAED,OADA,EAAM,YAAY,CAAK,GAChB;CACT;CAEA,WAAmB,GAAoC;EACrD,IAAM,IAAQ,EAAS,UAAU,EAAI;EAKrC,OAJA,EAAM,UAAU,IAAI,EAAM,WAAW,GAI9B;CACT;CAEA,cAA4B;EAC1B,IAAM,IAAW,KAAK,QAAQ,WACxB,IAAW,KAAK,QAAQ;EAM9B,AALA,KAAK,YAAY,KAAK,aAAa,GAAU,MAAM,GACnD,KAAK,YAAY,KAAK,aAAa,GAAU,MAAM,GACnD,KAAK,KAAK,YAAY,KAAK,SAAS,GACpC,KAAK,KAAK,YAAY,KAAK,SAAS,GACpC,KAAK,UAAU,iBAAiB,SAAS,KAAK,eAAe,GAC7D,KAAK,UAAU,iBAAiB,SAAS,KAAK,eAAe;CAC/D;CAEA,aAAqB,GAAqC,GAAmC;EAC3F,IAAI;EACJ,IAAI,aAAkB,aACpB,IAAK,EAAO,UAAU,EAAI;OACrB,IAAI,OAAO,KAAW,YAAY,EAAO,KAAK,GAAG;GACtD,IAAM,IAAM,SAAS,cAAc,KAAK;GAExC,AADA,EAAI,YAAY,EAAO,KAAK,GAC5B,IAAM,EAAI,qBAAqC,EAAS,QAAQ;EAClE,OAEE,AADA,IAAK,EAAS,UAAU,IAAI,EAAE,MAAM,SAAS,CAAC,GAC9C,EAAG,YACD,MAAQ,SACJ,mMACA;EAKR,OAHA,EAAG,UAAU,IAAI,EAAM,OAAO,MAAQ,SAAS,EAAM,YAAY,EAAM,SAAS,GAChF,EAAG,aAAa,cAAc,MAAQ,SAAS,mBAAmB,YAAY,GAC1E,EAAG,YAAY,YAAU,EAAG,aAAa,QAAQ,QAAQ,GACtD;CACT;CAEA,YAA0B;EACxB,KAAK,WAAW,EAAS,MAAM,EAAM,MAAM,EAAE,MAAM,UAAU,CAAC;EAC9D,IAAM,IAAY,KAAK,UAAU;EACjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAW,KAAK;GAClC,IAAM,IAAK,EAAS,MAAM,IAAI,EAAE,MAAM,eAAe,CAAC,GAChD,IAAS,IAAI,KAAK,QAAQ,gBAE1B,IADgB,KAAK,QAAQ,eAE/B,KAAK,QAAQ,aAAc,GAAG,CAAS,IACvC,EAAS,UAAU,GAAG,EAAM,IAAI,GAAG,EAAM,aAAa;IACpD,MAAM;IACN,cAAc,eAAe,IAAI;IACjC,MAAM;GACR,CAAC,GACC,IAAS,OAAO,KAAU,WAAW,KAAK,cAAc,CAAK,IAAI;GAOvE,AAJA,EAAO,UAAU,IAAI,EAAM,GAAG,GAC9B,EAAO,aAAa,qBAAqB,OAAO,CAAM,CAAC,GACvD,EAAO,iBAAiB,eAAe,KAAK,KAAK,CAAM,CAAC,GACxD,EAAG,YAAY,CAAM,GACrB,KAAK,SAAS,YAAY,CAAE;EAC9B;EACA,KAAK,KAAK,YAAY,KAAK,QAAQ;CACrC;CAEA,cAAsB,GAA2B;EAC/C,IAAM,IAAM,SAAS,cAAc,KAAK;EACxC,EAAI,YAAY,EAAK,KAAK;EAC1B,IAAM,IAAK,EAAI;EACf,IAAI,GAAI,OAAO;EACf,IAAM,IAAM,EAAS,UAAU,IAAI,EAAE,MAAM,SAAS,CAAC;EAErD,OADA,EAAI,cAAc,GACX;CACT;CAEA,eAA+B;EAC7B,IAAM,IAAO,KAAK,SAAS,sBAAsB;EACjD,OAAO,KAAK,QAAQ,WAAW,EAAK,SAAS,EAAK;CACpD;CAEA,YAA4B;EAC1B,IAAI,KAAK,QAAQ,eAAe;GAC9B,IAAM,IAAO,KAAK,OAAO,KAAK;GAC9B,IAAI,GAAM;IACR,IAAM,IAAI,EAAK,sBAAsB;IACrC,OAAO,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE;GAC9C;EACF;EACA,IAAM,IAAK,KAAK,aAAa;EAC7B,IAAI,KAAK,QAAQ,YAAY;GAG3B,IAAM,IAAM,KAAK,mBAAmB,CAAE;GACtC,OAAO,KAAK,IAAI,IAAI,IAAK,IAAI,KAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,CAAC;EAC5E;EACA,OAAO,IAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY;CACnD;CAMA,mBAA2B,GAA8B;EACvD,IAAM,KAAO,KAAK,QAAQ,iBAAiB,IAAI,KAAK;EACpD,IAAI,CAAC,GAAK,OAAO;EACjB,IAAM,IAAQ,gCAAgC,KAAK,CAAG;EACtD,IAAI,CAAC,KAAS,EAAM,OAAO,KAAA,GAAW,OAAO;EAC7C,IAAM,IAAQ,WAAW,EAAM,EAAE;EAGjC,OAFI,CAAC,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAU,KACpC,EAAM,MAAM,UACT,MAAO,IAAQ,MAAO,IAAe;CACvD;CAEA,cAA4B;EAC1B,IAAI,KAAK,eAAe,GAAG;EAG3B,IAFW,KAAK,aAAa,GAEzB,KAAK,QAAQ,MAAM;GACrB,KAAK,MAAM,MAAM,YAAY;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;IAC3C,IAAM,IAAQ,KAAK,OAAO;IACrB,MACL,EAAM,MAAM,UAAU,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,MAAM,KAC7E,EAAM,MAAM,SAAS,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,MAAM,KAC5E,EAAM,MAAM,aAAa,WAAW,KAAK,eAAe,EAAE,KAAK,KAAK,QAAQ,WAC5E,EAAM,MAAM,gBACV,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,SAAS;GAC9D;GAGA,AAFA,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW;GAChB;EACF;EAIA,IAAM,IAAY,KAAK,QAAQ,gBAAgB,OAAO,KAAK,UAAU;EAErE,KAAK,IAAM,KAAS,KAAK,QASvB,AARA,EAAM,MAAM,WAAW,IACvB,EAAM,MAAM,MAAM,IAClB,EAAM,MAAM,OAAO,IACnB,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,UAAU,IACtB,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,aAAa,IACzB,EAAM,MAAM,gBAAgB,IACxB,MAAc,SACZ,KAAK,QAAQ,YACf,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,GAAG,EAAU,QAElC,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,QAAQ,GAAG,EAAU;EASvC,AAJA,KAAK,YAAY,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,GAAG,EAAK,GACpF,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW,GAChB,KAAK,qBAAqB;CAC5B;CAEA,iBAAiC;EAE/B,OADI,KAAK,QAAQ,wBAAwB,EAAqB,IAAU,IACjE,KAAK,QAAQ;CACtB;CAOA,eAAgC;EAE9B,OADI,KAAK,QAAQ,gBAAsB,KAChC,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,QAAQ;CAChE;CAEA,cAAsB,GAA4B;EAIhD,IAAI,KAAK,aAAa,KAAK,CAAC,KAAK,QAAQ,YAAY,OAAO;EAC5D,IAAI,KAAK,QAAQ,eAAe;GAC9B,IAAI,IAAS;GACb,KAAK,IAAI,IAAI,GAAG,IAAI,GAAY,KAAK;IACnC,IAAM,IAAI,KAAK,OAAO;IACtB,IAAI,CAAC,GAAG;IACR,IAAM,IAAI,EAAE,sBAAsB;IAClC,KAAU,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE;GACjD;GACA,IAAI,KAAK,QAAQ,YAAY;IAC3B,IAAM,IAAU,KAAK,OAAO;IAC5B,IAAI,GAAS;KACX,IAAM,IAAI,EAAQ,sBAAsB;KACxC,MACG,KAAK,aAAa,KAAK,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE,UAAU;IAC3E;GACF;GACA,OAAO;EACT;EACA,IAAM,IAAO,KAAK,UAAU,GACxB,IAAS,IAAa;EAC1B,IAAI,KAAK,QAAQ,YACf,MAAW,KAAK,aAAa,IAAI,KAAQ;OACpC,IAAI,CAAC,KAAK,QAAQ,YAAY,CAAC,KAAK,QAAQ,MAAM;GAGvD,IAAM,IAAY,KAAK,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,gBAAgB,CAAI;GAClF,IAAS,KAAK,IAAI,GAAQ,CAAS;EACrC;EACA,OAAO;CACT;CAEA,YAAoB,GAAgB,GAAwB;EAC1D,IAAM,IAAQ,IAAU,KAAK,eAAe,IAAI,GAC1C,IAAO,KAAK,QAAQ,WAAW,MAAM,KACrC,IAAM,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;EAE7D,AADA,KAAK,MAAM,MAAM,aAAa,IAAQ,IAAI,aAAa,EAAM,KAAK,KAAK,QAAQ,YAAY,IAC3F,KAAK,MAAM,MAAM,YAAY,YAAY,EAAK,GAAG,IAAM,EAAO;CAChE;CAEA,OAAa;EACX,KAAK,KAAK,KAAK,eAAe,KAAK,QAAQ,cAAc;CAC3D;CAEA,OAAa;EACX,KAAK,KAAK,KAAK,eAAe,KAAK,QAAQ,cAAc;CAC3D;CAEA,KAAK,GAAe,IAAY,IAAa;EAM3C,IALI,KAAK,aACL,KAAK,eAAe,KAIpB,KAAK,aAAa,CAAC,GAAW;EAOlC,AAAI,KAAK,QAAQ,YAAY,CAAC,KAAK,kBACjC,KAAK,iBAAiB;EAGxB,IAAI,IAAS,GACP,IAAc,KAAK,QAAQ,YAAY,CAAC,KAAK,QAAQ;EAE3D,IAAK,KAAK,QAAQ,UAgBX,AAAI,KAAK,QAAQ,SAGtB,IAAS,EAAI,GAAQ,KAAK,UAAU;OAnBV;GAO1B,IAAM,IAAW,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC;GAKhD,AAJI,IAAS,MACX,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,QAAQ,MAAM,UAAU,OAAO,CAAsB,GACzF,IAAS,IAEP,IAAS,MACX,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,QAAQ,MAAM,SAAS,QAAQ,CAAsB,GACzF,IAAS;EAEb;EAOA,IAAM,IAA6B;GACjC,cAFe,KAAK;GAGpB,WAAW,IAAc,EAAI,GAAQ,KAAK,UAAU,IAAI;EAC1D;EAGA,IAFA,KAAK,KAAK,gBAAgB,CAAM,GAE5B,KAAK,QAAQ,MAAM;GAIrB,AADA,KAAK,eAAe,GACpB,KAAK,YAAY;GACjB,IAAM,IAA2B,EAAE,cAAc,KAAK,aAAa;GAGnE,AAFA,KAAK,KAAK,eAAe,CAAK,GAC9B,KAAK,cAAc,GACnB,KAAK,aAAa;GAClB;EACF;EAIA,KAAK,YAAY;EACjB,IAAM,IAAa,IAAS,KAAK;EACjC,KAAK,cAAc;EACnB,IAAM,IAAS,KAAK,cAAc,CAAU;EAY5C,AAXA,KAAK,YAAY,GAAQ,CAAC,CAAS,GAInC,KAAK,qBAAqB,CAAU,GAIpC,KAAK,iBAAiB,CAAU,GAGhC,KAAK,WAAW,IAAc,EAAI,GAAQ,KAAK,UAAU,IAAI,CAAM;EAEnE,IAAI,IAAW,IACT,UAAe;GACnB,IAAI,GAAU;GAOd,IANA,IAAW,IACX,KAAK,YAAY,IAKb,GAAa;IACf,IAAM,IAAU,EAAI,GAAQ,KAAK,UAAU,GACrC,IAAY,MAAY;IAE9B,IADA,KAAK,eAAe,GAChB,GAAW;KACb,IAAM,IAAgB,IAAU,KAAK;KAKrC,AADA,KAAK,oCAAoC,GACzC,KAAK,YAAY,KAAK,cAAc,CAAa,GAAG,EAAK;IAC3D;GACF,OACE,KAAK,eAAe;GAKtB,AAHA,KAAK,cAAc,MACnB,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW;GAChB,IAAM,IAA2B,EAAE,cAAc,KAAK,aAAa;GAGnE,AAFA,KAAK,KAAK,eAAe,CAAK,GAC9B,KAAK,cAAc,GACnB,KAAK,aAAa;EACpB;EAEA,IAAI,KAAa,KAAK,eAAe,MAAM,GACzC,EAAO;OACF;GACL,IAAM,KAAS,MAAuB;IAKhC,EAAE,WAAW,KAAK,SAClB,EAAE,iBAAiB,gBACvB,KAAK,MAAM,oBAAoB,iBAAiB,CAAK,GACrD,EAAO;GACT;GAEA,AADA,KAAK,MAAM,iBAAiB,iBAAiB,CAAK,GAClD,iBAAiB;IACf,AAAI,KAAK,cACP,KAAK,MAAM,oBAAoB,iBAAiB,CAAK,GACrD,EAAO;GAEX,GAAG,KAAK,eAAe,IAAI,EAAE;EAC/B;CACF;CAEA,OAAa;EACP,KAAK,aAEL,KAAK,aAAa,MACtB,KAAK,QAAQ,WAAW,IACxB,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;CACxB;CAEA,QAAc;EAEZ,AADA,KAAK,iBAAiB,IACtB,AAEE,KAAK,mBADL,aAAa,KAAK,aAAa,GACV;CAEzB;CAEA,mBAAiC;EAC3B,CAAC,KAAK,QAAQ,YAAY,KAAK,mBAC/B,KAAK,iBAAe,aAAa,KAAK,aAAa,GACvD,KAAK,gBAAgB,iBAAiB;GAGpC,AAFI,KAAK,QAAQ,sBAAsB,aAAY,KAAK,KAAK,IACxD,KAAK,KAAK,GACf,KAAK,iBAAiB;EACxB,GAAG,KAAK,QAAQ,aAAa;CAC/B;CAEA,GAAgB,GAAe,GAA0C;EACvE,AAAK,KAAK,UAAU,IAAI,CAAK,KAAG,KAAK,UAAU,IAAI,mBAAO,IAAI,IAAI,CAAC;EACnE,IAAM,IAAM,KAAK,UAAU,IAAI,CAAK;EAEpC,OADA,EAAI,IAAI,CAAoC,SAC/B,EAAI,OAAO,CAAoC;CAC9D;CAEA,IAAI,GAAe,GAA0C;EAC3D,KAAK,UAAU,IAAI,CAAK,GAAG,OAAO,CAAO;CAC3C;CAEA,KAAa,GAAe,GAAuB;EAEjD,AADA,KAAK,UAAU,IAAI,CAAK,GAAG,SAAS,MAAO,EAAG,CAAM,CAAC,GACrD,KAAK,KAAK,cAAc,IAAI,YAAY,aAAa,KAAS;GAAE;GAAQ,SAAS;EAAM,CAAC,CAAC;CAC3F;CA8EA,aAA2B;EAgBzB,AAfA,KAAK,KAAK,iBAAiB,WAAW,KAAK,SAAS,GACpD,KAAK,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GAC9D,KAAK,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GAC9D,KAAK,KAAK,iBAAiB,WAAW,KAAK,aAAa,GACxD,KAAK,KAAK,iBAAiB,YAAY,KAAK,cAAc,GAC1D,KAAK,KAAK,aAAa,YAAY,GAAG,GAElC,OAAO,iBAAmB,OAC5B,KAAK,iBAAiB,IAAI,qBAAqB,KAAK,aAAa,CAAC,GAClE,KAAK,eAAe,QAAQ,KAAK,IAAI,KAC5B,OAAO,SAAW,OAC3B,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGjD,KAAK,QAAQ,aAAW,KAAK,kBAAkB,GAC/C,KAAK,QAAQ,iBAAe,KAAK,kBAAkB;CACzD;CAEA,eAA6B;EAU3B,AATA,KAAK,KAAK,oBAAoB,WAAW,KAAK,SAAS,GACvD,KAAK,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GACjE,KAAK,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GACjE,KAAK,KAAK,oBAAoB,WAAW,KAAK,aAAa,GAC3D,KAAK,KAAK,oBAAoB,YAAY,KAAK,cAAc,GACzD,OAAO,SAAW,OACpB,OAAO,oBAAoB,UAAU,KAAK,YAAY,GACpD,KAAK,aAAW,KAAK,UAAU,oBAAoB,SAAS,KAAK,eAAe,GAChF,KAAK,aAAW,KAAK,UAAU,oBAAoB,SAAS,KAAK,eAAe,GACpF,KAAK,oBAAoB;CAC3B;CAEA,oBAAkC;EAKhC,IAAM,UAA+B,CAAC,KAAK,QAAQ,MAE7C,KAAU,MAAoB;GAElC,IADI,KAAK,aACL,EAAE,WAAW,KAAA,KAAa,EAAE,WAAW,GAAG;GAC9C,IAAM,IAAiB,EAAc,IAAI,KAAK,eAAe,IAAI;GAYjE,AAXA,KAAK,UAAU;IACb,IAAI,EAAE;IACN,QAAQ,EAAE;IACV,QAAQ,EAAE;IACV,WAAW,YAAY,IAAI;IAC3B;IACA,QAAQ;IACR,SAAS;IACT,cAAc,CAAC,KAAK,QAAQ;GAC9B,GACI,EAAc,MAAG,KAAK,MAAM,MAAM,aAAa,KACnD,KAAK,KAAK,UAAU,IAAI,EAAM,QAAQ;EACxC,GAEM,KAAU,MAAoB;GAClC,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,UAAU,KAAK,QAAQ,OAAO,EAAE,WAAW;GAC9E,IAAM,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAK,EAAE,UAAU,KAAK,QAAQ;GACpC,IAAI,CAAC,KAAK,QAAQ,SAAS;IACzB,IAAM,IAAO,KAAK,IAAI,CAAE,GAClB,IAAO,KAAK,IAAI,CAAE;IACxB,IAAI,IAAO,KAAK,IAAO,GAAG;IAG1B,IAFA,KAAK,QAAQ,eAAe,IAAO,GACnC,KAAK,QAAQ,UAAU,IACnB,KAAK,QAAQ,WAAW,KAAK,QAAQ,eAAe,CAAC,KAAK,QAAQ,cAAc;KAElF,AADA,KAAK,QAAQ,SAAS,IACtB,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ;KACzC;IACF;GACF;GACA,IAAI,EAAc,GAAG;IACnB,IAAM,IAAQ,KAAK,QAAQ,WAAW,IAAK,GACrC,IAAM,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,KAAK,GACxD,IAAY,KAAK,QAAQ,iBAAiB,IAAM,GAChD,IAAO,KAAK,QAAQ,WAAW,MAAM,KACrC,IAAe,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;IACtE,KAAK,MAAM,MAAM,YAAY,YAAY,EAAK,GAAG,IAAe,EAAU;GAC5E;GACA,AAAI,OAAQ,EAAmB,kBAAmB,cAAY,EAAE,eAAe;EACjF,GAEM,KAAQ,MAAoB;GAChC,IAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,OAAO,EAAE,WAAW;GACtD,IAAM,IAAY,KAAK,QAAQ,QACzB,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAU,YAAY,IAAI,IAAI,KAAK,QAAQ;GAGjD,IAFA,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,GACzC,KAAK,UAAU,MACX,CAAC,GAAW;GAEhB,IAAM,IAAQ,KAAK,QAAQ,WAAW,IAAK,GACrC,IAAW,KAAK,IAAI,CAAK,IAAI,KAAK,IAAI,GAAG,CAAO,GAChD,IAAY,KAAK,QAAQ;GAG/B,AADe,KAAK,IAAI,CAAK,IAAI,KAAa,IAAW,MAExC,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAQ,IAAI,IAAQ,MAE9E,KAAK,KAAK,SAAS,EACjB,WAAW,KAAK,QAAQ,WAAW,SAAS,QAC9C,CAAuB,GACvB,KAAK,KAAK,MAEV,KAAK,KAAK,SAAS,EACjB,WAAW,KAAK,QAAQ,WAAW,OAAO,OAC5C,CAAuB,GACvB,KAAK,KAAK,KAEH,EAAc,KAGvB,KAAK,KAAK,KAAK,cAAc,EAAI;EAErC,GAEM,KAAY,MAAoB;GAChC,CAAC,KAAK,WAAW,KAAK,QAAQ,OAAO,EAAE,cAC3C,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,GACzC,KAAK,UAAU,MACX,EAAc,KAAG,KAAK,KAAK,KAAK,cAAc,EAAI;EACxD,GAEM,IAAc,GACd,IAAc,GACd,IAAY,GACZ,IAAgB;EAUtB,AATA,KAAK,kBAAkB;GACrB,MAAM;GACN,MAAM;GACN,IAAI;GACJ,QAAQ;EACV,GACA,KAAK,SAAS,iBAAiB,eAAe,CAAW,GACzD,OAAO,iBAAiB,eAAe,GAAa,EAAE,SAAS,GAAM,CAAC,GACtE,OAAO,iBAAiB,aAAa,CAAS,GAC9C,OAAO,iBAAiB,iBAAiB,CAAa;CACxD;CAEA,sBAAoC;EAClC,IAAM,EAAE,SAAM,SAAM,OAAI,cAAW,KAAK;EACnC,MACL,KAAK,SAAS,oBAAoB,eAAe,CAAI,GACjD,KAAM,OAAO,oBAAoB,eAAe,CAAI,GACpD,KAAI,OAAO,oBAAoB,aAAa,CAAE,GAC9C,KAAQ,OAAO,oBAAoB,iBAAiB,CAAM,GAC9D,KAAK,kBAAkB,CAAC;CAC1B;CAEA,iBAAiC;EAC/B,IAAM,IAAI,KAAK,MAAM,MAAM,WACrB,IAAI,uCAAuC,KAAK,CAAC;EAIvD,OAHI,CAAC,KAAK,CAAC,EAAE,KAAW,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,IACzE,WAAW,EAAE,EAEhB,KADK,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;CAE/D;CAEA,oBAAkC;EAChC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GACrB,KACL,EAAM,iBAAiB,eAAe;IACpC,IAAM,IAAY,IAAI,KAAK;IAC3B,AAAI,KAAa,KAAK,IAAY,KAAK,cAAY,KAAK,KAAK,CAAS;GACxE,CAAC;EACH;CACF;CAEA,iBAAyB,GAA2B;EAClD,OAAO,IAAY,KAAK;CAC1B;CAEA,aAA2B;EACzB,IAAM,IAAa,KAAK,iBAAiB,KAAK,YAAY,GACpD,IAAc,KAAK,OAAO,IAQ5B,IAAiB;EACrB,IAAI,OAAO,WAAa,OAAe,GAAa;GAClD,IAAM,IAAU,SAAS;GACzB,IAAI,KAAW,MAAY,SAAS,MAClC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;IAC3C,IAAM,IAAQ,KAAK,OAAO;IACrB,SACD,MAAK,qBAAqB,GAAG,CAAU,KACvC,EAAM,SAAS,CAAO,GAAG;KAC3B,IAAiB;KACjB;IACF;GACF;EAEJ;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GAC1B,IAAI,CAAC,GAAO;GACZ,IAAM,IAAW,KAAK,qBAAqB,GAAG,CAAU,GAClD,IAAY,MAAM,GAClB,IAAW,EAAM,UAAU,SAAS,EAAM,WAAW;GAG3D,AAFA,EAAM,UAAU,OAAO,EAAM,aAAa,CAAQ,GAClD,EAAM,UAAU,OAAO,EAAM,cAAc,CAAS,GAChD,KACF,EAAM,gBAAgB,OAAO,GAIxB,KAAU,EAAM,aAAa,YAAY,GAAG,MAEjD,EAAM,aAAa,SAAS,EAAE,GAC9B,EAAM,gBAAgB,UAAU;EAEpC;EAQA,AANI,KAAkB,KACpB,EAAY,MAAM,EAAE,eAAe,GAAK,CAAC,GAK3C,KAAK,iBAAiB,CAAU;CAClC;CAEA,sCAAoD;EAIlD,AAHA,KAAK,KAAK,UAAU,IAAI,iBAAiB,GAEzC,KAAU,KAAK,aACX,OAAO,yBAA0B,aACnC,4BAA4B;GAG1B,4BAA4B,KAAK,KAAK,UAAU,OAAO,iBAAiB,CAAC;EAC3E,CAAC,IAED,iBAAiB,KAAK,KAAK,UAAU,OAAO,iBAAiB,GAAG,EAAE;CAEtE;CAEA,iBAAyB,GAA0B;EAC5C,SAAK,QAAQ,YAClB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GACrB,KACL,EAAM,UAAU,OAAO,EAAM,aAAa,MAAM,CAAU;EAC5D;CACF;CAEA,qBAA6B,GAAyB,GAAoC;EACxF,IAAM,IAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY;EAClD,IAAI,KAAK,QAAQ,YAAY;GAC3B,IAAM,IAAO,KAAK,MAAM,IAAO,CAAC;GAChC,OACE,KAAmB,IAAoB,KACvC,IAAkB,IAAoB,IAAO;EAEjD;EACA,OACE,KAAmB,KAAqB,IAAkB,IAAoB;CAElF;CAEA,eAA6B;EAC3B,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW;EACxC,IAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,MAAM;GAI9C,AAHA,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,GACnD,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,GACnD,KAAK,UAAU,gBAAgB,eAAe,GAC9C,KAAK,UAAU,gBAAgB,eAAe;GAC9C;EACF;EACA,IAAM,IAAU,KAAK,gBAAgB,GAC/B,IAAQ,KAAK,gBAAgB,KAAK,aAAa,KAAK,QAAQ;EAWlE,AAVA,KAAK,UAAU,UAAU,OAAO,EAAM,eAAe,CAAO,GAC5D,KAAK,UAAU,UAAU,OAAO,EAAM,eAAe,CAAK,GAC1D,KAAK,UAAU,aAAa,iBAAiB,OAAO,CAAO,CAAC,GAC5D,KAAK,UAAU,aAAa,iBAAiB,OAAO,CAAK,CAAC,GAKtD,KAAK,UAAU,YAAY,aAC7B,KAAM,UAAgC,WAAW,KAC/C,KAAK,UAAU,YAAY,aAC7B,KAAM,UAAgC,WAAW;CACrD;CAEA,YAA4B;EAC1B,IAAI,KAAK,eAAe,GAAG,OAAO;EAClC,IAAM,IAAQ,KAAK,MAChB,KAAK,cAAc,KAAK,QAAQ,WAAW,IAAI,KAAK,QAAQ,eAAe,MAC1E,KAAK,IAAI,GAAG,KAAK,QAAQ,cAAc,CAC3C;EACA,OAAO,KAAK,IAAI,GAAG,CAAK;CAC1B;CAEA,WAAmB,GAA0B;EAC3C,IAAI,CAAC,KAAK,UAAU;EACpB,IAAM,IAAM,KAAa,KAAK,cACxB,IAAU,KAAK,MAAM,IAAM,KAAK,IAAI,GAAG,KAAK,QAAQ,cAAc,CAAC;EAEzE,KADmB,SAAS,iBAAiB,IAAI,EAAM,KACvD,EAAM,SAAS,GAAI,MAAM;GAEvB,AADA,EAAG,UAAU,OAAO,EAAM,WAAW,MAAM,CAAO,GAClD,EAAG,aAAa,iBAAiB,MAAM,IAAU,SAAS,OAAO;EACnE,CAAC;CACH;CAEA,qBAA6B,GAA2B;EACtD,IAAI,CAAC,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,UAAU;EAI3D,IAAM,IAAM,KAAc,KAAK,eAAe,KAAK,iBAAiB,KAAK,YAAY,GAC/E,IAAQ,KAAK,OAAO;EAC1B,IAAI,CAAC,GAAO;EACZ,IAAM,IAAI,EAAM,sBAAsB,EAAE;EACxC,AAAI,IAAI,MAAG,KAAK,SAAS,MAAM,SAAS,GAAG,EAAE;CAC/C;CAEA,gBAA8B;EAC5B,IAAI,CAAC,KAAK,QAAQ,UAAU;EAC5B,IAAI,KAAK,QAAQ,aAAa,eAAe;GAC3C,KAAK,aAAa,KAAK,MAAM;GAC7B;EACF;EACA,IAAM,IAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,GAC5C,IAAe,KAAK,iBAAiB,KAAK,YAAY,GAEtD,IAAQ,IAAe,GACvB,IAAM,IAAe,IAAO,GAC5B,IAAyB,CAAC;EAChC,KAAK,IAAI,IAAI,GAAO,IAAI,GAAK,KAAK;GAIhC,IAAM,IAAM,KAAK,QAAQ,WAAW,EAAI,GAAG,KAAK,OAAO,MAAM,IAAI;GACjE,IAAI,IAAM,KAAK,KAAO,KAAK,OAAO,QAAQ;GAC1C,IAAM,IAAI,KAAK,OAAO;GACtB,AAAI,KAAG,EAAQ,KAAK,CAAC;EACvB;EACA,KAAK,aAAa,CAAO;CAC3B;CAEA,aAAqB,GAA6B;EAChD,KAAK,IAAM,KAAS,GAElB,EADmB,iBAAmC,gBACtD,EAAK,SAAS,MAAQ,KAAK,kBAAkB,CAAG,CAAC;CAErD;CAEA,kBAA0B,GAA6B;EACrD,IAAM,IAAM,EAAI,aAAa,WAAW;EACnC,MACL,EAAI,gBAAgB,WAAW,GAC/B,EAAI,iBACF,cACM,KAAK,KAAK,cAAc;GAAE,OAAO;GAAK;EAAI,CAA0B,GAC1E,EAAE,MAAM,GAAK,CACf,GACA,EAAI,iBACF,eACM,KAAK,KAAK,iBAAiB;GAAE,OAAO;GAAK;EAAI,CAA0B,GAC7E,EAAE,MAAM,GAAK,CACf,GACA,EAAI,MAAM;CACZ;CAEA,eAA6B;EAC3B,IAAM,IAAM,KAAK,QAAQ;EACzB,IAAI,CAAC,GAAK;EACV,IAAM,IAAK,EAAyC,CAAS;EAC7D,IAAI,CAAC,GAAI;EACT,IAAM,IAAY,EAAiD;EACnE,AAAI,MACF,KAAK,YAAY,GACjB,EAAS,GAAsB,gBAAgB,MAAW;GACpD,AAGJ,KAAK,wBAFL,KAAK,qBAAqB,IAC1B,KAAK,KAAK,EAAO,YAAY,GACH;EAC5B,CAAC;CAEL;CAEA,eAA6B;EACtB,KAAK,cACN,AAGJ,KAAK,wBAFL,KAAK,qBAAqB,IAC1B,KAAK,UAAU,KAAK,KAAK,YAAY,GACX;CAC5B;CAEA,kBAA0B;EACxB,OAAO,KAAK;CACd;CAEA,gBAAwB;EACtB,OAAO,KAAK;CACd;CAEA,YAA2B;EACzB,OAAO,KAAK,OAAO,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;CAC7E;CAEA,WAAW,GAAoC,IAAU,IAAY;EAEnE,AADA,KAAK,cAAc;GAAE,GAAG,KAAK;GAAa,GAAG;EAAQ,GACjD,IACF,KAAK,OAAO,IAEZ,KAAK,UAAU,EAAa,KAAK,SAAS,CAAO;CAErD;CAQA,UAAgB;EACV,KAAK,aACT,KAAK,YAAY;CACnB;CAEA,SAAS,GAAsB,GAAsB;EAMnD,AALI,OAAO,KAAU,WACnB,KAAK,iBAAiB,OAAO,GAAO,GAAG,CAAO,IAE9C,KAAK,iBAAiB,KAAK,CAAO,GAEpC,KAAK,OAAO;CACd;CAEA,YAAY,GAAqB;EAC3B,IAAQ,KAAK,KAAS,KAAK,iBAAiB,WAChD,KAAK,iBAAiB,OAAO,GAAO,CAAC,GACrC,KAAK,OAAO;CACd;AACF;;;AC9qCA,SAAgB,EACd,GACA,IAAqC,CAAC,GAC1B;CACZ,OAAO,IAAI,EAAW,GAAM,CAAO;AACrC;AAEA,IAAA,IAAe"}
|
|
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 /**\n * Evaluate the responsive breakpoint list against the current viewport,\n * re-merging `this.options` from the resolved settings. Always re-applies\n * the merge — callers like `reInit()` reset `options` first and rely on\n * this method to layer the active breakpoint back on top. Returns whether\n * the active breakpoint changed; resize handlers use that to decide\n * between a cheap re-layout and a full rebuild (dots, clones and arrows\n * all depend on the post-breakpoint slidesToShow).\n */\n private applyResponsive(): boolean {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return false;\n if (typeof window === \"undefined\") return false;\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 const changed = newBp !== this.currentBreakpoint;\n this.currentBreakpoint = newBp;\n if (active?.settings === \"unslick\") {\n if (changed) this.destroy();\n return changed;\n }\n this.options = active\n ? mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings)\n : mergeOptions(DEFAULTS, this.userOptions);\n if (changed) {\n this.emit(\"breakpoint\", { breakpoint: newBp });\n }\n return changed;\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 (\n this.options.infinite &&\n !this.options.fade &&\n this.slideCount > 0 &&\n !this.allSlidesFit()\n ) {\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 // Dots are meaningless when every slide is already visible at once.\n if (this.options.dots && !this.allSlidesFit()) {\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 // The clone's inert state is managed by updateAria(): clones briefly\n // become the visually active slide during an infinite wrap, and pointer\n // events / focus must work on them in that window.\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.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 /**\n * Every slide already fits in the viewport — there's nothing to scroll to,\n * so dots, autoplay and clones are all suppressed. variableWidth keeps the\n * usual machinery because per-slide widths aren't predictable upfront.\n */\n private allSlidesFit(): boolean {\n if (this.options.variableWidth) return false;\n return this.slideCount > 0 && this.slideCount <= this.options.slidesToShow;\n }\n\n private indexToOffset(trackIndex: number): number {\n // No room to scroll — track stays put; CSS `justify-content: safe center`\n // handles visual centering. centerMode keeps its own offset math because\n // it already implements per-slide centering.\n if (this.allSlidesFit() && !this.options.centerMode) return 0;\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 // Manual navigation (arrow click, dot click, swipe, asNavFor sync,\n // programmatic goTo) should restart the autoplay countdown so the\n // automatic advance doesn't fire right on top of the user's action.\n // Skipped when autoplay is currently paused (e.g. by hover/focus) —\n // those pauses are released by their own handlers.\n if (this.options.autoplay && !this.autoplayPaused) {\n this.scheduleAutoplay();\n }\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!this.options.infinite) {\n // Finite carousel — clamp the target to a valid slide index and emit\n // `edge` when callers walk past either end. The visual translation is\n // clamped separately in indexToOffset so the track doesn't reveal\n // empty space. This separation lets callers focus a specific slide\n // (asNavFor / focusOnSelect) even when every slide already fits in\n // 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 } else if (this.options.fade) {\n // Fade + infinite has no clones to animate through, but the index\n // still needs to wrap so autoplay / next / prev cycle continuously.\n target = mod(target, this.slideCount);\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 // Sync the linked carousel as soon as the change starts so both animate in\n // parallel. Waiting until afterChange (the previous behaviour) stalled the\n // partner by the source's full speed before it could even begin to move.\n this.notifyLinked(detail.nextSlide);\n\n if (this.options.fade) {\n // Fade transitions via per-slide opacity — there's no track movement\n // to animate, so applyLayout is the entire visual update.\n this.currentIndex = target;\n this.applyLayout();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n return;\n }\n\n // Slide mode — animate the track transform. Both infinite and finite\n // carousels share this path; only the wrap-snap inside finish() differs.\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(wrapEnabled ? mod(target, this.slideCount) : target);\n // Same reasoning for the per-slide `--active`/`--current` classes — CSS\n // hooked off them (e.g. an underline indicator on a focusOnSelect nav\n // strip) should animate in lockstep with the source carousel instead of\n // waiting for the track's own transition to finish. The full a11y state\n // (inert/tabindex/focus) still updates in finish() because that's a\n // settle-state concern, not a visual-feedback one.\n this.updateSlideClasses(trackIndex);\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n // Infinite carousels may have animated through a clone — snap the\n // track to the equivalent real slide so subsequent navigation has the\n // right starting offset. Finite carousels animated to the actual\n // target index, so nothing to do.\n if (wrapEnabled) {\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\n // the center class from the clone we animated into to the real\n // slide doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n } else {\n this.currentIndex = target;\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 };\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 // Nothing to rotate through — silently skip instead of spinning a timer.\n if (this.allSlidesFit()) 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 if (this.applyResponsive()) {\n // Breakpoint changed — slidesToShow, infinite, dots, autoplay etc. may\n // all be different now, so do a full rebuild. reInit preserves the\n // current slide index and autoplay state.\n if (!this.destroyed) this.reInit();\n return;\n }\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.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 // Fade carousels keep gesture detection but skip track-following: the\n // slides are stacked absolutely and crossfade via opacity, so there's\n // nothing to translate while the finger is down. Only the swipe\n // verdict on pointerup matters.\n const followsFinger = (): boolean => !this.options.fade;\n\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = followsFinger() ? this.parseTranslate() : 0;\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 if (followsFinger()) 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 if (followsFinger()) {\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 }\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 if (followsFinger()) {\n // Snap the track back to the resting position. Fade mode never\n // moved the track so there's nothing to snap.\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 if (followsFinger()) 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 const activeSlide = this.slides[trackIndex];\n\n // Detect *before* mutating: is focus inside a slide that's about to be\n // marked inert? Browsers move focus to the document body the moment we\n // apply `inert` to its ancestor, which is functional but jarring. We'd\n // rather re-park focus on the new active slide so keyboard users keep\n // their place. The check has to happen before the attribute loop, because\n // afterwards `document.activeElement` is already body.\n let needsFocusMove = false;\n if (typeof document !== \"undefined\" && activeSlide) {\n const focused = document.activeElement;\n if (focused && focused !== document.body) {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n if (this.isSlideInActiveRange(i, trackIndex)) continue;\n if (slide.contains(focused)) {\n needsFocusMove = true;\n break;\n }\n }\n }\n }\n\n this.updateSlideClasses(trackIndex);\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 isCloned = slide.classList.contains(CLASS.slideCloned);\n if (isActive) {\n slide.removeAttribute(\"inert\");\n // Only real slides get a focusable wrapper. Cloned slides defer to\n // their descendants (links, buttons) for tab order so the same logical\n // slide isn't reachable through two wrappers in the same tab cycle.\n if (!isCloned) slide.setAttribute(\"tabindex\", \"0\");\n } else {\n slide.setAttribute(\"inert\", \"\");\n slide.removeAttribute(\"tabindex\");\n }\n }\n\n if (needsFocusMove && activeSlide) {\n activeSlide.focus({ preventScroll: true });\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 updateSlideClasses(currentTrackIndex: number): void {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(\n CLASS.slideActive,\n this.isSlideInActiveRange(i, currentTrackIndex),\n );\n slide.classList.toggle(CLASS.slideCurrent, i === currentTrackIndex);\n }\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 // All-fit carousels show every slide at once, so the \"active window\"\n // concept doesn't apply — every slide is visible and must stay\n // interactive. Without this, moving currentIndex would mark the\n // already-visible slides outside the [current, current+slidesToShow)\n // range as inert and they'd silently stop accepting clicks (e.g. a\n // focusOnSelect nav strip after picking a non-first item).\n if (this.allSlidesFit()) return true;\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 // Subscribe to `beforeChange` so we react the moment the nav starts\n // moving instead of waiting for its animation to finish — that's what\n // lets both carousels animate in parallel.\n instance.on<BeforeChangeDetail>(\"beforeChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.nextSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(targetIndex: number): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(targetIndex);\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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"}
|
package/dist/slickless.umd.cjs
CHANGED
|
@@ -1,2 +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;if(e!==this.lastRootWidth){if(this.lastRootWidth=e,this.applyResponsive()){this.destroyed||this.reInit();return}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!1;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,s=o!==this.currentBreakpoint;return this.currentBreakpoint=o,a?.settings===`unslick`?(s&&this.destroy(),s):(this.options=a?n(n(t,this.userOptions),a.settings):n(t,this.userOptions),s&&this.emit(`breakpoint`,{breakpoint:o}),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&&!this.allSlidesFit()){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.allSlidesFit()&&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}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.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}allSlidesFit(){return this.options.variableWidth?!1:this.slideCount>0&&this.slideCount<=this.options.slidesToShow}indexToOffset(e){if(this.allSlidesFit()&&!this.options.centerMode)return 0;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;this.options.autoplay&&!this.autoplayPaused&&this.scheduleAutoplay();let n=e,r=this.options.infinite&&!this.options.fade;if(this.options.infinite)this.options.fade&&(n=i(n,this.slideCount));else{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),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(r?i(n,this.slideCount):n);let c=!1,l=()=>{if(c)return;if(c=!0,this.animating=!1,r){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)}}else this.currentIndex=n;this.animatingTo=null,this.updateAria(),this.updateArrows(),this.updateDots();let e={currentSlide:this.currentIndex};this.emit(`afterChange`,e),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.allSlidesFit()||(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.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=()=>!this.options.fade,t=t=>{if(this.animating||t.button!==void 0&&t.button!==0)return;let n=e()?this.parseTranslate():0;this.pointer={id:t.pointerId,startX:t.clientX,startY:t.clientY,startTime:performance.now(),startTransform:n,active:!0,decided:!1,isHorizontal:!this.options.vertical},e()&&(this.track.style.transition=``),this.root.classList.add(c.dragging)},n=t=>{if(!this.pointer||!this.pointer.active||this.pointer.id!==t.pointerId)return;let n=t.clientX-this.pointer.startX,r=t.clientY-this.pointer.startY;if(!this.pointer.decided){let e=Math.abs(n),t=Math.abs(r);if(e<6&&t<6)return;if(this.pointer.isHorizontal=e>t,this.pointer.decided=!0,this.options.vertical?this.pointer.isHorizontal:!this.pointer.isHorizontal){this.pointer.active=!1,this.root.classList.remove(c.dragging);return}}if(e()){let e=this.options.vertical?r:n,t=this.options.rtl&&!this.options.vertical?-1:1,i=this.pointer.startTransform-t*e,a=this.options.vertical?`Y`:`X`,o=this.options.rtl&&!this.options.vertical?1:-1;this.track.style.transform=`translate${a}(${o*i}px)`}typeof t.preventDefault==`function`&&t.preventDefault()},r=t=>{if(!this.pointer||this.pointer.id!==t.pointerId)return;let n=this.pointer.active,r=t.clientX-this.pointer.startX,i=t.clientY-this.pointer.startY,a=performance.now()-this.pointer.startTime;if(this.root.classList.remove(c.dragging),this.pointer=null,!n)return;let o=this.options.vertical?i:r,s=Math.abs(o)/Math.max(1,a),l=this.options.swipeThreshold;Math.abs(o)>l||s>.6?(this.options.rtl&&!this.options.vertical?o<0:o>0)?(this.emit(`swipe`,{direction:this.options.vertical?`down`:`right`}),this.prev()):(this.emit(`swipe`,{direction:this.options.vertical?`up`:`left`}),this.next()):e()&&this.goTo(this.currentIndex,!0)},i=t=>{!this.pointer||this.pointer.id!==t.pointerId||(this.root.classList.remove(c.dragging),this.pointer=null,e()&&this.goTo(this.currentIndex,!0))},a=t,o=n,s=r,l=i;this.pointerHandlers={down:a,move:o,up:s,cancel:l},this.viewport.addEventListener(`pointerdown`,a),window.addEventListener(`pointermove`,o,{passive:!1}),window.addEventListener(`pointerup`,s),window.addEventListener(`pointercancel`,l)}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),t=this.slides[e],n=!1;if(typeof document<`u`&&t){let t=document.activeElement;if(t&&t!==document.body)for(let r=0;r<this.slides.length;r++){let i=this.slides[r];if(i&&!this.isSlideInActiveRange(r,e)&&i.contains(t)){n=!0;break}}}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,a=n.classList.contains(c.slideCloned);n.classList.toggle(c.slideActive,r),n.classList.toggle(c.slideCurrent,i),r?(n.removeAttribute(`inert`),a||n.setAttribute(`tabindex`,`0`)):(n.setAttribute(`inert`,``),n.removeAttribute(`tabindex`))}n&&t&&t.focus({preventScroll:!0}),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});
|
|
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;if(e!==this.lastRootWidth){if(this.lastRootWidth=e,this.applyResponsive()){this.destroyed||this.reInit();return}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!1;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,s=o!==this.currentBreakpoint;return this.currentBreakpoint=o,a?.settings===`unslick`?(s&&this.destroy(),s):(this.options=a?n(n(t,this.userOptions),a.settings):n(t,this.userOptions),s&&this.emit(`breakpoint`,{breakpoint:o}),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&&!this.allSlidesFit()){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.allSlidesFit()&&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}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.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}allSlidesFit(){return this.options.variableWidth?!1:this.slideCount>0&&this.slideCount<=this.options.slidesToShow}indexToOffset(e){if(this.allSlidesFit()&&!this.options.centerMode)return 0;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;this.options.autoplay&&!this.autoplayPaused&&this.scheduleAutoplay();let n=e,r=this.options.infinite&&!this.options.fade;if(this.options.infinite)this.options.fade&&(n=i(n,this.slideCount));else{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),this.notifyLinked(a.nextSlide),this.options.fade){this.currentIndex=n,this.applyLayout();let e={currentSlide:this.currentIndex};this.emit(`afterChange`,e),this.applyLazyLoad();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(r?i(n,this.slideCount):n),this.updateSlideClasses(o);let c=!1,l=()=>{if(c)return;if(c=!0,this.animating=!1,r){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)}}else this.currentIndex=n;this.animatingTo=null,this.updateAria(),this.updateArrows(),this.updateDots();let e={currentSlide:this.currentIndex};this.emit(`afterChange`,e),this.applyLazyLoad()};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.allSlidesFit()||(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.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=()=>!this.options.fade,t=t=>{if(this.animating||t.button!==void 0&&t.button!==0)return;let n=e()?this.parseTranslate():0;this.pointer={id:t.pointerId,startX:t.clientX,startY:t.clientY,startTime:performance.now(),startTransform:n,active:!0,decided:!1,isHorizontal:!this.options.vertical},e()&&(this.track.style.transition=``),this.root.classList.add(c.dragging)},n=t=>{if(!this.pointer||!this.pointer.active||this.pointer.id!==t.pointerId)return;let n=t.clientX-this.pointer.startX,r=t.clientY-this.pointer.startY;if(!this.pointer.decided){let e=Math.abs(n),t=Math.abs(r);if(e<6&&t<6)return;if(this.pointer.isHorizontal=e>t,this.pointer.decided=!0,this.options.vertical?this.pointer.isHorizontal:!this.pointer.isHorizontal){this.pointer.active=!1,this.root.classList.remove(c.dragging);return}}if(e()){let e=this.options.vertical?r:n,t=this.options.rtl&&!this.options.vertical?-1:1,i=this.pointer.startTransform-t*e,a=this.options.vertical?`Y`:`X`,o=this.options.rtl&&!this.options.vertical?1:-1;this.track.style.transform=`translate${a}(${o*i}px)`}typeof t.preventDefault==`function`&&t.preventDefault()},r=t=>{if(!this.pointer||this.pointer.id!==t.pointerId)return;let n=this.pointer.active,r=t.clientX-this.pointer.startX,i=t.clientY-this.pointer.startY,a=performance.now()-this.pointer.startTime;if(this.root.classList.remove(c.dragging),this.pointer=null,!n)return;let o=this.options.vertical?i:r,s=Math.abs(o)/Math.max(1,a),l=this.options.swipeThreshold;Math.abs(o)>l||s>.6?(this.options.rtl&&!this.options.vertical?o<0:o>0)?(this.emit(`swipe`,{direction:this.options.vertical?`down`:`right`}),this.prev()):(this.emit(`swipe`,{direction:this.options.vertical?`up`:`left`}),this.next()):e()&&this.goTo(this.currentIndex,!0)},i=t=>{!this.pointer||this.pointer.id!==t.pointerId||(this.root.classList.remove(c.dragging),this.pointer=null,e()&&this.goTo(this.currentIndex,!0))},a=t,o=n,s=r,l=i;this.pointerHandlers={down:a,move:o,up:s,cancel:l},this.viewport.addEventListener(`pointerdown`,a),window.addEventListener(`pointermove`,o,{passive:!1}),window.addEventListener(`pointerup`,s),window.addEventListener(`pointercancel`,l)}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),t=this.slides[e],n=!1;if(typeof document<`u`&&t){let t=document.activeElement;if(t&&t!==document.body)for(let r=0;r<this.slides.length;r++){let i=this.slides[r];if(i&&!this.isSlideInActiveRange(r,e)&&i.contains(t)){n=!0;break}}}this.updateSlideClasses(e);for(let t=0;t<this.slides.length;t++){let n=this.slides[t];if(!n)continue;let r=this.isSlideInActiveRange(t,e),i=n.classList.contains(c.slideCloned);r?(n.removeAttribute(`inert`),i||n.setAttribute(`tabindex`,`0`)):(n.setAttribute(`inert`,``),n.removeAttribute(`tabindex`))}n&&t&&t.focus({preventScroll:!0}),this.updateCenterMode(e)}updateSlideClasses(e){for(let t=0;t<this.slides.length;t++){let n=this.slides[t];n&&(n.classList.toggle(c.slideActive,this.isSlideInActiveRange(t,e)),n.classList.toggle(c.slideCurrent,t===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){if(this.allSlidesFit())return!0;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(`beforeChange`,e=>{this.linkedFromExternal||=(this.linkedFromExternal=!0,this.goTo(e.nextSlide),!1)}))}notifyLinked(e){this.linkedNav&&(this.linkedFromExternal||=(this.linkedFromExternal=!0,this.linkedNav.goTo(e),!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
2
|
//# sourceMappingURL=slickless.umd.cjs.map
|
|
@@ -1 +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 /**\n * Evaluate the responsive breakpoint list against the current viewport,\n * re-merging `this.options` from the resolved settings. Always re-applies\n * the merge — callers like `reInit()` reset `options` first and rely on\n * this method to layer the active breakpoint back on top. Returns whether\n * the active breakpoint changed; resize handlers use that to decide\n * between a cheap re-layout and a full rebuild (dots, clones and arrows\n * all depend on the post-breakpoint slidesToShow).\n */\n private applyResponsive(): boolean {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return false;\n if (typeof window === \"undefined\") return false;\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 const changed = newBp !== this.currentBreakpoint;\n this.currentBreakpoint = newBp;\n if (active?.settings === \"unslick\") {\n if (changed) this.destroy();\n return changed;\n }\n this.options = active\n ? mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings)\n : mergeOptions(DEFAULTS, this.userOptions);\n if (changed) {\n this.emit(\"breakpoint\", { breakpoint: newBp });\n }\n return changed;\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 (\n this.options.infinite &&\n !this.options.fade &&\n this.slideCount > 0 &&\n !this.allSlidesFit()\n ) {\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 // Dots are meaningless when every slide is already visible at once.\n if (this.options.dots && !this.allSlidesFit()) {\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 // The clone's inert state is managed by updateAria(): clones briefly\n // become the visually active slide during an infinite wrap, and pointer\n // events / focus must work on them in that window.\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.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 /**\n * Every slide already fits in the viewport — there's nothing to scroll to,\n * so dots, autoplay and clones are all suppressed. variableWidth keeps the\n * usual machinery because per-slide widths aren't predictable upfront.\n */\n private allSlidesFit(): boolean {\n if (this.options.variableWidth) return false;\n return this.slideCount > 0 && this.slideCount <= this.options.slidesToShow;\n }\n\n private indexToOffset(trackIndex: number): number {\n // No room to scroll — track stays put; CSS `justify-content: safe center`\n // handles visual centering. centerMode keeps its own offset math because\n // it already implements per-slide centering.\n if (this.allSlidesFit() && !this.options.centerMode) return 0;\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 // Manual navigation (arrow click, dot click, swipe, asNavFor sync,\n // programmatic goTo) should restart the autoplay countdown so the\n // automatic advance doesn't fire right on top of the user's action.\n // Skipped when autoplay is currently paused (e.g. by hover/focus) —\n // those pauses are released by their own handlers.\n if (this.options.autoplay && !this.autoplayPaused) {\n this.scheduleAutoplay();\n }\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!this.options.infinite) {\n // Finite carousel — clamp the target to a valid slide index and emit\n // `edge` when callers walk past either end. The visual translation is\n // clamped separately in indexToOffset so the track doesn't reveal\n // empty space. This separation lets callers focus a specific slide\n // (asNavFor / focusOnSelect) even when every slide already fits in\n // 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 } else if (this.options.fade) {\n // Fade + infinite has no clones to animate through, but the index\n // still needs to wrap so autoplay / next / prev cycle continuously.\n target = mod(target, this.slideCount);\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 (this.options.fade) {\n // Fade transitions via per-slide opacity — there's no track movement\n // to animate, so applyLayout is the entire visual update.\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 // Slide mode — animate the track transform. Both infinite and finite\n // carousels share this path; only the wrap-snap inside finish() differs.\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(wrapEnabled ? mod(target, this.slideCount) : target);\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n // Infinite carousels may have animated through a clone — snap the\n // track to the equivalent real slide so subsequent navigation has the\n // right starting offset. Finite carousels animated to the actual\n // target index, so nothing to do.\n if (wrapEnabled) {\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\n // the center class from the clone we animated into to the real\n // slide doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n } else {\n this.currentIndex = target;\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 // Nothing to rotate through — silently skip instead of spinning a timer.\n if (this.allSlidesFit()) 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 if (this.applyResponsive()) {\n // Breakpoint changed — slidesToShow, infinite, dots, autoplay etc. may\n // all be different now, so do a full rebuild. reInit preserves the\n // current slide index and autoplay state.\n if (!this.destroyed) this.reInit();\n return;\n }\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.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 // Fade carousels keep gesture detection but skip track-following: the\n // slides are stacked absolutely and crossfade via opacity, so there's\n // nothing to translate while the finger is down. Only the swipe\n // verdict on pointerup matters.\n const followsFinger = (): boolean => !this.options.fade;\n\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = followsFinger() ? this.parseTranslate() : 0;\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 if (followsFinger()) 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 if (followsFinger()) {\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 }\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 if (followsFinger()) {\n // Snap the track back to the resting position. Fade mode never\n // moved the track so there's nothing to snap.\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 if (followsFinger()) 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 const activeSlide = this.slides[trackIndex];\n\n // Detect *before* mutating: is focus inside a slide that's about to be\n // marked inert? Browsers move focus to the document body the moment we\n // apply `inert` to its ancestor, which is functional but jarring. We'd\n // rather re-park focus on the new active slide so keyboard users keep\n // their place. The check has to happen before the attribute loop, because\n // afterwards `document.activeElement` is already body.\n let needsFocusMove = false;\n if (typeof document !== \"undefined\" && activeSlide) {\n const focused = document.activeElement;\n if (focused && focused !== document.body) {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n if (this.isSlideInActiveRange(i, trackIndex)) continue;\n if (slide.contains(focused)) {\n needsFocusMove = true;\n break;\n }\n }\n }\n }\n\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 const isCloned = slide.classList.contains(CLASS.slideCloned);\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (isActive) {\n slide.removeAttribute(\"inert\");\n // Only real slides get a focusable wrapper. Cloned slides defer to\n // their descendants (links, buttons) for tab order so the same logical\n // slide isn't reachable through two wrappers in the same tab cycle.\n if (!isCloned) slide.setAttribute(\"tabindex\", \"0\");\n } else {\n slide.setAttribute(\"inert\", \"\");\n slide.removeAttribute(\"tabindex\");\n }\n }\n\n if (needsFocusMove && activeSlide) {\n activeSlide.focus({ preventScroll: true });\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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"}
|
|
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 /**\n * Evaluate the responsive breakpoint list against the current viewport,\n * re-merging `this.options` from the resolved settings. Always re-applies\n * the merge — callers like `reInit()` reset `options` first and rely on\n * this method to layer the active breakpoint back on top. Returns whether\n * the active breakpoint changed; resize handlers use that to decide\n * between a cheap re-layout and a full rebuild (dots, clones and arrows\n * all depend on the post-breakpoint slidesToShow).\n */\n private applyResponsive(): boolean {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return false;\n if (typeof window === \"undefined\") return false;\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 const changed = newBp !== this.currentBreakpoint;\n this.currentBreakpoint = newBp;\n if (active?.settings === \"unslick\") {\n if (changed) this.destroy();\n return changed;\n }\n this.options = active\n ? mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings)\n : mergeOptions(DEFAULTS, this.userOptions);\n if (changed) {\n this.emit(\"breakpoint\", { breakpoint: newBp });\n }\n return changed;\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 (\n this.options.infinite &&\n !this.options.fade &&\n this.slideCount > 0 &&\n !this.allSlidesFit()\n ) {\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 // Dots are meaningless when every slide is already visible at once.\n if (this.options.dots && !this.allSlidesFit()) {\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 // The clone's inert state is managed by updateAria(): clones briefly\n // become the visually active slide during an infinite wrap, and pointer\n // events / focus must work on them in that window.\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.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 /**\n * Every slide already fits in the viewport — there's nothing to scroll to,\n * so dots, autoplay and clones are all suppressed. variableWidth keeps the\n * usual machinery because per-slide widths aren't predictable upfront.\n */\n private allSlidesFit(): boolean {\n if (this.options.variableWidth) return false;\n return this.slideCount > 0 && this.slideCount <= this.options.slidesToShow;\n }\n\n private indexToOffset(trackIndex: number): number {\n // No room to scroll — track stays put; CSS `justify-content: safe center`\n // handles visual centering. centerMode keeps its own offset math because\n // it already implements per-slide centering.\n if (this.allSlidesFit() && !this.options.centerMode) return 0;\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 // Manual navigation (arrow click, dot click, swipe, asNavFor sync,\n // programmatic goTo) should restart the autoplay countdown so the\n // automatic advance doesn't fire right on top of the user's action.\n // Skipped when autoplay is currently paused (e.g. by hover/focus) —\n // those pauses are released by their own handlers.\n if (this.options.autoplay && !this.autoplayPaused) {\n this.scheduleAutoplay();\n }\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!this.options.infinite) {\n // Finite carousel — clamp the target to a valid slide index and emit\n // `edge` when callers walk past either end. The visual translation is\n // clamped separately in indexToOffset so the track doesn't reveal\n // empty space. This separation lets callers focus a specific slide\n // (asNavFor / focusOnSelect) even when every slide already fits in\n // 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 } else if (this.options.fade) {\n // Fade + infinite has no clones to animate through, but the index\n // still needs to wrap so autoplay / next / prev cycle continuously.\n target = mod(target, this.slideCount);\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 // Sync the linked carousel as soon as the change starts so both animate in\n // parallel. Waiting until afterChange (the previous behaviour) stalled the\n // partner by the source's full speed before it could even begin to move.\n this.notifyLinked(detail.nextSlide);\n\n if (this.options.fade) {\n // Fade transitions via per-slide opacity — there's no track movement\n // to animate, so applyLayout is the entire visual update.\n this.currentIndex = target;\n this.applyLayout();\n const after: AfterChangeDetail = { currentSlide: this.currentIndex };\n this.emit(\"afterChange\", after);\n this.applyLazyLoad();\n return;\n }\n\n // Slide mode — animate the track transform. Both infinite and finite\n // carousels share this path; only the wrap-snap inside finish() differs.\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(wrapEnabled ? mod(target, this.slideCount) : target);\n // Same reasoning for the per-slide `--active`/`--current` classes — CSS\n // hooked off them (e.g. an underline indicator on a focusOnSelect nav\n // strip) should animate in lockstep with the source carousel instead of\n // waiting for the track's own transition to finish. The full a11y state\n // (inert/tabindex/focus) still updates in finish() because that's a\n // settle-state concern, not a visual-feedback one.\n this.updateSlideClasses(trackIndex);\n\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n this.animating = false;\n // Infinite carousels may have animated through a clone — snap the\n // track to the equivalent real slide so subsequent navigation has the\n // right starting offset. Finite carousels animated to the actual\n // target index, so nothing to do.\n if (wrapEnabled) {\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\n // the center class from the clone we animated into to the real\n // slide doesn't trigger a second 0.92 → 1 scale animation.\n this.suppressSlideTransitionsForOneFrame();\n this.translateTo(this.indexToOffset(newTrackIndex), false);\n }\n } else {\n this.currentIndex = target;\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 };\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 // Nothing to rotate through — silently skip instead of spinning a timer.\n if (this.allSlidesFit()) 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 if (this.applyResponsive()) {\n // Breakpoint changed — slidesToShow, infinite, dots, autoplay etc. may\n // all be different now, so do a full rebuild. reInit preserves the\n // current slide index and autoplay state.\n if (!this.destroyed) this.reInit();\n return;\n }\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.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 // Fade carousels keep gesture detection but skip track-following: the\n // slides are stacked absolutely and crossfade via opacity, so there's\n // nothing to translate while the finger is down. Only the swipe\n // verdict on pointerup matters.\n const followsFinger = (): boolean => !this.options.fade;\n\n const onDown = (e: PointerEvent) => {\n if (this.animating) return;\n if (e.button !== undefined && e.button !== 0) return;\n const startTransform = followsFinger() ? this.parseTranslate() : 0;\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 if (followsFinger()) 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 if (followsFinger()) {\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 }\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 if (followsFinger()) {\n // Snap the track back to the resting position. Fade mode never\n // moved the track so there's nothing to snap.\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 if (followsFinger()) 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 const activeSlide = this.slides[trackIndex];\n\n // Detect *before* mutating: is focus inside a slide that's about to be\n // marked inert? Browsers move focus to the document body the moment we\n // apply `inert` to its ancestor, which is functional but jarring. We'd\n // rather re-park focus on the new active slide so keyboard users keep\n // their place. The check has to happen before the attribute loop, because\n // afterwards `document.activeElement` is already body.\n let needsFocusMove = false;\n if (typeof document !== \"undefined\" && activeSlide) {\n const focused = document.activeElement;\n if (focused && focused !== document.body) {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n if (this.isSlideInActiveRange(i, trackIndex)) continue;\n if (slide.contains(focused)) {\n needsFocusMove = true;\n break;\n }\n }\n }\n }\n\n this.updateSlideClasses(trackIndex);\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 isCloned = slide.classList.contains(CLASS.slideCloned);\n if (isActive) {\n slide.removeAttribute(\"inert\");\n // Only real slides get a focusable wrapper. Cloned slides defer to\n // their descendants (links, buttons) for tab order so the same logical\n // slide isn't reachable through two wrappers in the same tab cycle.\n if (!isCloned) slide.setAttribute(\"tabindex\", \"0\");\n } else {\n slide.setAttribute(\"inert\", \"\");\n slide.removeAttribute(\"tabindex\");\n }\n }\n\n if (needsFocusMove && activeSlide) {\n activeSlide.focus({ preventScroll: true });\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 updateSlideClasses(currentTrackIndex: number): void {\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(\n CLASS.slideActive,\n this.isSlideInActiveRange(i, currentTrackIndex),\n );\n slide.classList.toggle(CLASS.slideCurrent, i === currentTrackIndex);\n }\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 // All-fit carousels show every slide at once, so the \"active window\"\n // concept doesn't apply — every slide is visible and must stay\n // interactive. Without this, moving currentIndex would mark the\n // already-visible slides outside the [current, current+slidesToShow)\n // range as inert and they'd silently stop accepting clicks (e.g. a\n // focusOnSelect nav strip after picking a non-first item).\n if (this.allSlidesFit()) return true;\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 // Subscribe to `beforeChange` so we react the moment the nav starts\n // moving instead of waiting for its animation to finish — that's what\n // lets both carousels animate in parallel.\n instance.on<BeforeChangeDetail>(\"beforeChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.nextSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(targetIndex: number): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(targetIndex);\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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"}
|