slickless 0.1.9 → 0.1.11

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/README.md CHANGED
@@ -6,6 +6,7 @@ A jQuery-free rewrite of slick. Same option names, no runtime dependencies, ~8 K
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/slickless.svg)](https://www.npmjs.com/package/slickless)
8
8
  [![bundle](https://img.shields.io/bundlephobia/minzip/slickless)](https://bundlephobia.com/package/slickless)
9
+ [![coverage](https://img.shields.io/codecov/c/github/yfxie/slickless)](https://codecov.io/gh/yfxie/slickless)
9
10
  [![license](https://img.shields.io/npm/l/slickless.svg)](./LICENSE)
10
11
 
11
12
  [Live demo, options, API, recipes →](https://yfxie.github.io/slickless/)
package/README.zh-TW.md CHANGED
@@ -6,6 +6,7 @@ slick carousel 拿掉 jQuery 的重寫版。選項名稱不變,零執行期依
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/slickless.svg)](https://www.npmjs.com/package/slickless)
8
8
  [![bundle](https://img.shields.io/bundlephobia/minzip/slickless)](https://bundlephobia.com/package/slickless)
9
+ [![coverage](https://img.shields.io/codecov/c/github/yfxie/slickless)](https://codecov.io/gh/yfxie/slickless)
9
10
  [![license](https://img.shields.io/npm/l/slickless.svg)](./LICENSE)
10
11
 
11
12
  [線上範例、選項、API、樣式技巧 →](https://yfxie.github.io/slickless/)
@@ -94,6 +94,7 @@ export declare class Slickless {
94
94
  private bindFocusOnSelect;
95
95
  private realToTrackIndex;
96
96
  private updateAria;
97
+ private updateSlideClasses;
97
98
  private suppressSlideTransitionsForOneFrame;
98
99
  private updateCenterMode;
99
100
  private isSlideInActiveRange;
package/dist/slickless.js CHANGED
@@ -118,7 +118,8 @@ var s = {
118
118
  this.root = i, this.userOptions = r, this.options = t(e, r), this.init();
119
119
  }
120
120
  init() {
121
- 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(s.initialized);
121
+ if (this.captureChildren(), this.applyResponsive(), this.destroyed) return;
122
+ 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(s.initialized);
122
123
  let e = () => {
123
124
  this.destroyed || this.emit("init", { slickless: this });
124
125
  };
@@ -135,7 +136,7 @@ var s = {
135
136
  let r = this.currentIndex, i = this.options.autoplay && !this.autoplayPaused;
136
137
  this.pause(), this.unbindEvents(), this.resizeObserver && this.resizeObserver.disconnect(), this.root.innerHTML = "";
137
138
  for (let e of this.originalChildren) this.root.appendChild(e);
138
- this.options = t(e, this.userOptions), this.applyResponsive(), this.build(), this.bindEvents(), this.goTo(n(r, 0, this.slideCount - 1), !0), i && this.play(), this.emit("reInit", { slickless: this });
139
+ this.options = t(e, this.userOptions), this.applyResponsive(), !this.destroyed && (this.build(), this.bindEvents(), this.goTo(n(r, 0, this.slideCount - 1), !0), i && this.play(), this.emit("reInit", { slickless: this }));
139
140
  }
140
141
  captureChildren() {
141
142
  this.originalChildren.length === 0 && (this.originalChildren = Array.from(this.root.children));
@@ -312,17 +313,17 @@ var s = {
312
313
  currentSlide: this.currentIndex,
313
314
  nextSlide: i ? r(n, this.slideCount) : n
314
315
  };
315
- if (this.emit("beforeChange", a), this.options.fade) {
316
+ if (this.emit("beforeChange", a), this.notifyLinked(a.nextSlide), this.options.fade) {
316
317
  this.currentIndex = n, this.applyLayout();
317
318
  let e = { currentSlide: this.currentIndex };
318
- this.emit("afterChange", e), this.applyLazyLoad(), this.notifyLinked();
319
+ this.emit("afterChange", e), this.applyLazyLoad();
319
320
  return;
320
321
  }
321
322
  this.animating = !0;
322
323
  let o = n + this.cloneCount;
323
324
  this.animatingTo = o;
324
325
  let s = this.indexToOffset(o);
325
- this.translateTo(s, !t), this.updateAdaptiveHeight(o), this.updateCenterMode(o), this.updateDots(i ? r(n, this.slideCount) : n);
326
+ this.translateTo(s, !t), this.updateAdaptiveHeight(o), this.updateCenterMode(o), this.updateDots(i ? r(n, this.slideCount) : n), this.updateSlideClasses(o);
326
327
  let c = !1, l = () => {
327
328
  if (c) return;
328
329
  if (c = !0, this.animating = !1, i) {
@@ -334,7 +335,7 @@ var s = {
334
335
  } else this.currentIndex = n;
335
336
  this.animatingTo = null, this.updateAria(), this.updateArrows(), this.updateDots();
336
337
  let e = { currentSlide: this.currentIndex };
337
- this.emit("afterChange", e), this.applyLazyLoad(), this.notifyLinked();
338
+ this.emit("afterChange", e), this.applyLazyLoad();
338
339
  };
339
340
  if (t || this.effectiveSpeed() === 0) l();
340
341
  else {
@@ -455,14 +456,21 @@ var s = {
455
456
  }
456
457
  }
457
458
  }
459
+ this.updateSlideClasses(e);
458
460
  for (let t = 0; t < this.slides.length; t++) {
459
461
  let n = this.slides[t];
460
462
  if (!n) continue;
461
- let r = this.isSlideInActiveRange(t, e), i = t === e, a = n.classList.contains(s.slideCloned);
462
- n.classList.toggle(s.slideActive, r), n.classList.toggle(s.slideCurrent, i), r ? (n.removeAttribute("inert"), a || n.setAttribute("tabindex", "0")) : (n.setAttribute("inert", ""), n.removeAttribute("tabindex"));
463
+ let r = this.isSlideInActiveRange(t, e), i = n.classList.contains(s.slideCloned);
464
+ r ? (n.removeAttribute("inert"), i || n.setAttribute("tabindex", "0")) : (n.setAttribute("inert", ""), n.removeAttribute("tabindex"));
463
465
  }
464
466
  n && t && t.focus({ preventScroll: !0 }), this.updateCenterMode(e);
465
467
  }
468
+ updateSlideClasses(e) {
469
+ for (let t = 0; t < this.slides.length; t++) {
470
+ let n = this.slides[t];
471
+ n && (n.classList.toggle(s.slideActive, this.isSlideInActiveRange(t, e)), n.classList.toggle(s.slideCurrent, t === e));
472
+ }
473
+ }
466
474
  suppressSlideTransitionsForOneFrame() {
467
475
  this.root.classList.add("slickless--snap"), this.root.offsetWidth, typeof requestAnimationFrame == "function" ? requestAnimationFrame(() => {
468
476
  requestAnimationFrame(() => this.root.classList.remove("slickless--snap"));
@@ -475,6 +483,7 @@ var s = {
475
483
  }
476
484
  }
477
485
  isSlideInActiveRange(e, t) {
486
+ if (this.allSlidesFit()) return !0;
478
487
  let n = Math.max(1, this.options.slidesToShow);
479
488
  if (this.options.centerMode) {
480
489
  let r = Math.floor(n / 2);
@@ -544,12 +553,12 @@ var s = {
544
553
  let t = o(e);
545
554
  if (!t) return;
546
555
  let n = t.__slickless;
547
- n && (this.linkedNav = n, n.on("afterChange", (e) => {
548
- this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.goTo(e.currentSlide), !1);
556
+ n && (this.linkedNav = n, n.on("beforeChange", (e) => {
557
+ this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.goTo(e.nextSlide), !1);
549
558
  }));
550
559
  }
551
- notifyLinked() {
552
- this.linkedNav && (this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.linkedNav.goTo(this.currentIndex), !1));
560
+ notifyLinked(e) {
561
+ this.linkedNav && (this.linkedFromExternal ||= (this.linkedFromExternal = !0, this.linkedNav.goTo(e), !1));
553
562
  }
554
563
  getCurrentSlide() {
555
564
  return this.currentIndex;
@@ -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":"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"}
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 // A breakpoint resolving to \"unslick\" at construction time destroys the\n // instance from inside applyResponsive(). Bail out before build() so we\n // leave the element as plain markup instead of half-wrapping it and then\n // flagging it destroyed. (The resize path already guards this via\n // handleResize; construction needs the same check.)\n if (this.destroyed) return;\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 // Same guard as init(): if the active breakpoint resolved to \"unslick\",\n // applyResponsive() already destroyed us — don't rebuild over the top.\n // Note: applyResponsive() only destroys when the active breakpoint actually\n // changed, so mutating an already-active breakpoint's settings from\n // non-unslick to \"unslick\" won't tear down here. That edge is out of scope.\n if (this.destroyed) return;\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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"}
@@ -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(){if(this.captureChildren(),this.applyResponsive(),this.destroyed)return;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.destroyed&&(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 // A breakpoint resolving to \"unslick\" at construction time destroys the\n // instance from inside applyResponsive(). Bail out before build() so we\n // leave the element as plain markup instead of half-wrapping it and then\n // flagging it destroyed. (The resize path already guards this via\n // handleResize; construction needs the same check.)\n if (this.destroyed) return;\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 // Same guard as init(): if the active breakpoint resolved to \"unslick\",\n // applyResponsive() already destroyed us — don't rebuild over the top.\n // Note: applyResponsive() only destroys when the active breakpoint actually\n // changed, so mutating an already-active breakpoint's settings from\n // non-unslick to \"unslick\" won't tear down here. That edge is out of scope.\n if (this.destroyed) return;\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":"6SAEA,IAAa,EAA6B,CACxC,OAAQ,GACR,KAAM,GACN,SAAU,GACV,cAAe,IACf,MAAO,IACP,QAAS,iCACT,aAAc,EACd,eAAgB,EAChB,SAAU,GACV,KAAM,GACN,SAAU,GACV,aAAc,EACd,cAAe,GACf,WAAY,GACZ,cAAe,OACf,IAAK,GACL,UAAW,GACX,eAAgB,GAChB,aAAc,GACd,aAAc,GACd,cAAe,GACf,eAAgB,GAChB,SAAU,GACV,qBAAsB,GACtB,UAAW,KACX,UAAW,KACX,aAAc,KACd,oBAAqB,WACrB,WAAY,KACZ,SAAU,KACV,cAAe,GACf,kBAAmB,SACrB,EAEA,SAAgB,EACd,EACA,EACkB,CAClB,MAAO,CAAE,GAAG,EAAM,GAAG,CAAS,CAChC,CC1CA,SAAgB,EAAM,EAAe,EAAa,EAAqB,CACrE,OAAO,KAAK,IAAI,EAAK,KAAK,IAAI,EAAK,CAAK,CAAC,CAC3C,CAEA,SAAgB,EAAI,EAAW,EAAmB,CAChD,OAAS,EAAI,EAAK,GAAK,CACzB,CAEA,SAAgB,GAAgC,CAE9C,OADI,OAAO,OAAW,KAAe,CAAC,OAAO,WAAmB,GACzD,OAAO,WAAW,kCAAkC,EAAE,OAC/D,CAEA,SAAgB,EACd,EACA,EACA,EAC0B,CAC1B,IAAM,EAAK,SAAS,cAAc,CAAG,EAErC,GADI,IAAW,EAAG,UAAY,GAC1B,EACF,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,CAAK,EAAG,EAAG,aAAa,EAAG,CAAC,EAElE,OAAO,CACT,CAOA,SAAgB,EACd,EACoB,CAKpB,OAJK,EACD,OAAO,GAAsB,SACxB,SAAS,cAA2B,CAAiB,EAEvD,EAJwB,IAKjC,CCfA,IAAM,EAAQ,CACZ,KAAM,YACN,YAAa,yBACb,SAAU,sBACV,MAAO,mBACP,MAAO,mBACP,YAAa,2BACb,YAAa,2BACb,YAAa,2BACb,aAAc,4BACd,MAAO,mBACP,UAAW,yBACX,UAAW,yBACX,cAAe,6BACf,KAAM,kBACN,IAAK,iBACL,UAAW,yBACX,UAAW,yBACX,SAAU,sBACV,KAAM,kBACN,IAAK,iBACL,SAAU,sBACV,WAAY,oBACZ,SAAU,4BACZ,EAEa,EAAb,KAAuB,CAuCrB,YAAY,EAA4B,EAAqC,CAAC,EAAG,uBAlCvC,CAAC,cACX,CAAC,iBAGO,oBACA,mBACD,qBAClB,oBAEE,mBAGc,qBAChB,iBACD,sBAGI,iBACJ,0BACuB,yBACK,wBACc,yBACrC,kBACwC,IAAI,iBACnC,0BAM9B,CAAC,iBACiC,6BACT,wBAunBF,GAAmB,CAC5C,EAAE,eAAe,EACjB,KAAK,KAAK,CACZ,uBAE2B,GAAmB,CAC5C,EAAE,eAAe,EACjB,KAAK,KAAK,CACZ,wBAEmC,CAGjC,IAAM,EAAQ,KAAK,KAAK,sBAAsB,EAAE,MAC5C,OAAU,KAAK,cAEnB,IADA,KAAK,cAAgB,EACjB,KAAK,gBAAgB,EAAG,CAIrB,KAAK,WAAW,KAAK,OAAO,EACjC,MACF,CACA,KAAK,YAAY,CADjB,CAEF,iBAEqB,GAA2B,CACzC,KAAK,QAAQ,gBACd,EAAE,MAAQ,aACZ,EAAE,eAAe,EACb,KAAK,QAAQ,IAAK,KAAK,KAAK,EAC3B,KAAK,KAAK,GACN,EAAE,MAAQ,cACnB,EAAE,eAAe,EACb,KAAK,QAAQ,IAAK,KAAK,KAAK,EAC3B,KAAK,KAAK,GACN,EAAE,MAAQ,QACnB,EAAE,eAAe,EACjB,KAAK,KAAK,CAAC,GACF,EAAE,MAAQ,QACnB,EAAE,eAAe,EACjB,KAAK,KAAK,KAAK,WAAa,CAAC,GAEjC,4BAEuC,CACjC,KAAK,QAAQ,cAAgB,KAAK,QAAQ,WAC5C,KAAK,eAAiB,GAClB,KAAK,eAAe,aAAa,KAAK,aAAa,EAE3D,4BAEuC,CACjC,KAAK,QAAQ,cAAgB,KAAK,QAAQ,WAC5C,KAAK,eAAiB,GACtB,KAAK,iBAAiB,EAE1B,yBAEoC,CAC9B,KAAK,QAAQ,cAAgB,KAAK,QAAQ,WAC5C,KAAK,eAAiB,GAClB,KAAK,eAAe,aAAa,KAAK,aAAa,EAE3D,sBAE0B,GAAwB,CAChD,GAAI,KAAK,QAAQ,cAAgB,KAAK,QAAQ,SAAU,CACtD,IAAM,EAAO,EAAE,eACX,CAAC,GAAQ,CAAC,KAAK,KAAK,SAAS,CAAI,KACnC,KAAK,eAAiB,GACtB,KAAK,iBAAiB,EAE1B,CACF,EA9rBE,IAAM,EAAK,OAAO,GAAS,SAAW,SAAS,cAA2B,CAAI,EAAI,EAClF,GAAI,CAAC,EAAI,MAAU,MAAM,uCAAuC,OAAO,CAAI,GAAG,EAC9E,KAAK,KAAO,EACZ,KAAK,YAAc,EACnB,KAAK,QAAU,EAAa,EAAU,CAAO,EAC7C,KAAK,KAAK,CACZ,CAEA,MAAqB,CAQnB,GAPA,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAMjB,KAAK,UAAW,OACpB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,KAAK,KAAK,QAAQ,aAAc,EAAI,EACrC,KAAK,QAAQ,UAAU,KAAK,KAAK,EACrC,KAAK,aAAa,EAClB,KAAM,KAAmD,YAAc,KACvE,KAAK,KAAK,UAAU,IAAI,EAAM,WAAW,EAGzC,IAAM,MAAiB,CAChB,KAAK,WAAW,KAAK,KAAK,OAAQ,CAAE,UAAW,IAAK,CAAC,CAC5D,EACI,OAAO,gBAAmB,WAAY,eAAe,CAAQ,EAC5D,QAAQ,QAAQ,EAAE,KAAK,CAAQ,CACtC,CAEA,SAAgB,CACV,SAAK,UAKT,CAJA,KAAK,MAAM,EACX,KAAK,aAAa,EACd,KAAK,gBAAgB,KAAK,eAAe,WAAW,EAExD,KAAK,KAAK,UAAY,GACtB,IAAK,IAAM,KAAS,KAAK,iBACvB,KAAK,KAAK,YAAY,CAAK,EAC3B,EAAM,gBAAgB,aAAa,EACnC,EAAM,gBAAgB,UAAU,EAChC,EAAM,gBAAgB,MAAM,EAC5B,EAAM,gBAAgB,sBAAsB,EAC5C,EAAM,gBAAgB,YAAY,EAClC,EAAM,MAAM,QAAU,GAExB,KAAK,KAAK,UAAY,KAAK,KAAK,UAC7B,MAAM,KAAK,EACX,OAAQ,GAAM,CAAC,EAAE,WAAW,WAAW,CAAC,EACxC,KAAK,GAAG,EACR,KAAK,EACR,KAAK,KAAK,gBAAgB,MAAM,EAChC,KAAK,KAAK,gBAAgB,sBAAsB,EAChD,KAAK,KAAK,gBAAgB,KAAK,EAE/B,KAAK,UAAY,GACjB,KAAK,KAAK,UAAW,CAAE,UAAW,IAAK,CAAC,EACxC,KAAK,UAAU,MAAM,CArBC,CAsBxB,CAEA,QAAe,CACb,IAAM,EAAW,KAAK,aAChB,EAAiB,KAAK,QAAQ,UAAY,CAAC,KAAK,eACtD,KAAK,MAAM,EACX,KAAK,aAAa,EACd,KAAK,gBAAgB,KAAK,eAAe,WAAW,EACxD,KAAK,KAAK,UAAY,GACtB,IAAK,IAAM,KAAS,KAAK,iBAAkB,KAAK,KAAK,YAAY,CAAK,EACtE,KAAK,QAAU,EAAa,EAAU,KAAK,WAAW,EACtD,KAAK,gBAAgB,EAMjB,MAAK,YACT,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,KAAK,EAAM,EAAU,EAAG,KAAK,WAAa,CAAC,EAAG,EAAI,EACnD,GAAgB,KAAK,KAAK,EAC9B,KAAK,KAAK,SAAU,CAAE,UAAW,IAAK,CAAC,EACzC,CAEA,iBAAgC,CAC1B,KAAK,iBAAiB,SAAW,IACnC,KAAK,iBAAmB,MAAM,KAAK,KAAK,KAAK,QAAQ,EAEzD,CAWA,iBAAmC,CACjC,IAAM,EAAa,KAAK,QAAQ,WAEhC,GADI,CAAC,GAAc,EAAW,SAAW,GACrC,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAM,EAAQ,OAAO,WACf,EAAiC,CAAC,GAAG,CAAU,EAAE,MACpD,EAAG,IAAM,EAAE,WAAa,EAAE,UAC7B,EACI,EAAsC,KAC1C,IAAK,IAAM,KAAQ,EACjB,GAAI,GAAS,EAAK,WAAY,CAC5B,EAAS,EACT,KACF,CAEF,IAAM,EAAQ,EAAS,EAAO,WAAa,KACrC,EAAU,IAAU,KAAK,kBAY/B,MAXA,MAAK,kBAAoB,EACrB,GAAQ,WAAa,WACnB,GAAS,KAAK,QAAQ,EACnB,IAET,KAAK,QAAU,EACX,EAAa,EAAa,EAAU,KAAK,WAAW,EAAG,EAAO,QAAQ,EACtE,EAAa,EAAU,KAAK,WAAW,EACvC,GACF,KAAK,KAAK,aAAc,CAAE,WAAY,CAAM,CAAC,EAExC,EACT,CAEA,OAAsB,CACpB,KAAK,KAAK,UAAY,GACtB,KAAK,KAAK,UAAU,IAAI,EAAM,IAAI,EAClC,KAAK,KAAK,UAAU,OAAO,EAAM,SAAU,KAAK,QAAQ,QAAQ,EAChE,KAAK,KAAK,UAAU,OAAO,EAAM,KAAM,KAAK,QAAQ,IAAI,EACxD,KAAK,KAAK,UAAU,OAAO,EAAM,IAAK,KAAK,QAAQ,GAAG,EACtD,KAAK,KAAK,UAAU,OAAO,EAAM,WAAY,KAAK,QAAQ,UAAU,EACpE,KAAK,KAAK,UAAU,OAAO,EAAM,SAAU,KAAK,QAAQ,cAAc,EAGtE,KAAK,KAAK,MAAM,YACd,kCACA,GAAG,KAAK,eAAe,EAAE,GAC3B,EACA,KAAK,KAAK,aAAa,OAAQ,QAAQ,EACvC,KAAK,KAAK,aAAa,uBAAwB,KAAK,QAAQ,mBAAmB,EAC3E,KAAK,QAAQ,KAAK,KAAK,KAAK,aAAa,MAAO,KAAK,EAEzD,KAAK,SAAW,EAAS,MAAO,EAAM,QAAQ,EAC9C,KAAK,MAAQ,EAAS,MAAO,EAAM,MAAO,CAAE,KAAM,cAAe,CAAC,EAElE,IAAM,EAAa,KAAK,iBAAiB,KAAK,EAAO,IAAM,KAAK,YAAY,EAAO,CAAC,CAAC,EAGrF,GAFA,KAAK,WAAa,EAAW,OAG3B,KAAK,QAAQ,UACb,CAAC,KAAK,QAAQ,MACd,KAAK,WAAa,GAClB,CAAC,KAAK,aAAa,EACnB,CAKA,IAAM,EAAU,KAAK,QAAQ,cACzB,KAAK,WACL,KAAK,IAAI,KAAK,QAAQ,aAAc,CAAC,EACzC,KAAK,WAAa,KAAK,IAAI,EAAS,KAAK,UAAU,EACnD,IAAM,EAAO,EAAW,MAAM,CAAC,KAAK,UAAU,EAAE,IAAK,GAAM,KAAK,WAAW,CAAC,CAAC,EACvE,EAAO,EAAW,MAAM,EAAG,KAAK,UAAU,EAAE,IAAK,GAAM,KAAK,WAAW,CAAC,CAAC,EAC/E,KAAK,OAAS,CAAC,GAAG,EAAM,GAAG,EAAY,GAAG,CAAI,CAChD,MACE,KAAK,WAAa,EAClB,KAAK,OAAS,EAGhB,IAAK,IAAM,KAAS,KAAK,OAAQ,KAAK,MAAM,YAAY,CAAK,EAC7D,KAAK,SAAS,YAAY,KAAK,KAAK,EACpC,KAAK,KAAK,YAAY,KAAK,QAAQ,EAE/B,KAAK,QAAQ,QAAU,KAAK,WAAa,KAAK,QAAQ,cACxD,KAAK,YAAY,EAGf,KAAK,QAAQ,MAAQ,CAAC,KAAK,aAAa,GAC1C,KAAK,UAAU,EAGjB,KAAK,YAAY,EACjB,KAAK,cAAc,CACrB,CAEA,YAAoB,EAAoB,EAA4B,CAClE,IAAM,EAAQ,EAAS,MAAO,EAAM,MAAO,CACzC,KAAM,QACN,uBAAwB,QACxB,aAAc,GAAG,EAAQ,EAAE,MAAM,KAAK,iBAAiB,SACvD,mBAAoB,OAAO,CAAK,CAClC,CAAC,EAED,OADA,EAAM,YAAY,CAAK,EAChB,CACT,CAEA,WAAmB,EAAoC,CACrD,IAAM,EAAQ,EAAS,UAAU,EAAI,EAKrC,OAJA,EAAM,UAAU,IAAI,EAAM,WAAW,EAI9B,CACT,CAEA,aAA4B,CAC1B,IAAM,EAAW,KAAK,QAAQ,UACxB,EAAW,KAAK,QAAQ,UAC9B,KAAK,UAAY,KAAK,aAAa,EAAU,MAAM,EACnD,KAAK,UAAY,KAAK,aAAa,EAAU,MAAM,EACnD,KAAK,KAAK,YAAY,KAAK,SAAS,EACpC,KAAK,KAAK,YAAY,KAAK,SAAS,EACpC,KAAK,UAAU,iBAAiB,QAAS,KAAK,eAAe,EAC7D,KAAK,UAAU,iBAAiB,QAAS,KAAK,eAAe,CAC/D,CAEA,aAAqB,EAAqC,EAAmC,CAC3F,IAAI,EACJ,GAAI,aAAkB,YACpB,EAAK,EAAO,UAAU,EAAI,OACrB,GAAI,OAAO,GAAW,UAAY,EAAO,KAAK,EAAG,CACtD,IAAM,EAAM,SAAS,cAAc,KAAK,EACxC,EAAI,UAAY,EAAO,KAAK,EAC5B,EAAM,EAAI,mBAAqC,EAAS,QAAQ,CAClE,MACE,EAAK,EAAS,SAAU,GAAI,CAAE,KAAM,QAAS,CAAC,EAC9C,EAAG,UACD,IAAQ,OACJ,iLACA,+KAKR,OAHA,EAAG,UAAU,IAAI,EAAM,MAAO,IAAQ,OAAS,EAAM,UAAY,EAAM,SAAS,EAChF,EAAG,aAAa,aAAc,IAAQ,OAAS,iBAAmB,YAAY,EAC1E,EAAG,UAAY,UAAU,EAAG,aAAa,OAAQ,QAAQ,EACtD,CACT,CAEA,WAA0B,CACxB,KAAK,SAAW,EAAS,KAAM,EAAM,KAAM,CAAE,KAAM,SAAU,CAAC,EAC9D,IAAM,EAAY,KAAK,UAAU,EACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,IAAK,CAClC,IAAM,EAAK,EAAS,KAAM,GAAI,CAAE,KAAM,cAAe,CAAC,EAChD,EAAS,EAAI,KAAK,QAAQ,eAE1B,EADgB,KAAK,QAAQ,aAE/B,KAAK,QAAQ,aAAc,EAAG,CAAS,EACvC,EAAS,SAAU,GAAG,EAAM,IAAI,GAAG,EAAM,YAAa,CACpD,KAAM,SACN,aAAc,eAAe,EAAI,IACjC,KAAM,KACR,CAAC,EACC,EAAS,OAAO,GAAU,SAAW,KAAK,cAAc,CAAK,EAAI,EAGvE,EAAO,UAAU,IAAI,EAAM,GAAG,EAC9B,EAAO,aAAa,oBAAqB,OAAO,CAAM,CAAC,EACvD,EAAO,iBAAiB,YAAe,KAAK,KAAK,CAAM,CAAC,EACxD,EAAG,YAAY,CAAM,EACrB,KAAK,SAAS,YAAY,CAAE,CAC9B,CACA,KAAK,KAAK,YAAY,KAAK,QAAQ,CACrC,CAEA,cAAsB,EAA2B,CAC/C,IAAM,EAAM,SAAS,cAAc,KAAK,EACxC,EAAI,UAAY,EAAK,KAAK,EAC1B,IAAM,EAAK,EAAI,kBACf,GAAI,EAAI,OAAO,EACf,IAAM,EAAM,EAAS,SAAU,GAAI,CAAE,KAAM,QAAS,CAAC,EAErD,MADA,GAAI,YAAc,EACX,CACT,CAEA,cAA+B,CAC7B,IAAM,EAAO,KAAK,SAAS,sBAAsB,EACjD,OAAO,KAAK,QAAQ,SAAW,EAAK,OAAS,EAAK,KACpD,CAEA,WAA4B,CAC1B,GAAI,KAAK,QAAQ,cAAe,CAC9B,IAAM,EAAO,KAAK,OAAO,KAAK,YAC9B,GAAI,EAAM,CACR,IAAM,EAAI,EAAK,sBAAsB,EACrC,OAAO,KAAK,QAAQ,SAAW,EAAE,OAAS,EAAE,KAC9C,CACF,CACA,IAAM,EAAK,KAAK,aAAa,EAC7B,GAAI,KAAK,QAAQ,WAAY,CAG3B,IAAM,EAAM,KAAK,mBAAmB,CAAE,EACtC,OAAO,KAAK,IAAI,GAAI,EAAK,EAAI,GAAO,KAAK,IAAI,EAAG,KAAK,QAAQ,YAAY,CAAC,CAC5E,CACA,OAAO,EAAK,KAAK,IAAI,EAAG,KAAK,QAAQ,YAAY,CACnD,CAMA,mBAA2B,EAA8B,CACvD,IAAM,GAAO,KAAK,QAAQ,eAAiB,IAAI,KAAK,EACpD,GAAI,CAAC,EAAK,MAAO,GACjB,IAAM,EAAQ,gCAAgC,KAAK,CAAG,EACtD,GAAI,CAAC,GAAS,EAAM,KAAO,IAAA,GAAW,MAAO,GAC7C,IAAM,EAAQ,WAAW,EAAM,EAAE,EAGjC,MAFI,CAAC,OAAO,SAAS,CAAK,GAAK,EAAQ,EAAU,GACpC,EAAM,IAAM,QACT,IAAO,EAAQ,IAAO,EAAe,CACvD,CAEA,aAA4B,CAC1B,GAAI,KAAK,aAAe,EAAG,OAG3B,GAFW,KAAK,aAAa,EAEzB,KAAK,QAAQ,KAAM,CACrB,KAAK,MAAM,MAAM,UAAY,GAC7B,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACrB,IACL,EAAM,MAAM,QAAU,IAAM,KAAK,iBAAiB,KAAK,YAAY,EAAI,IAAM,IAC7E,EAAM,MAAM,OAAS,IAAM,KAAK,iBAAiB,KAAK,YAAY,EAAI,IAAM,IAC5E,EAAM,MAAM,WAAa,WAAW,KAAK,eAAe,EAAE,KAAK,KAAK,QAAQ,UAC5E,EAAM,MAAM,cACV,IAAM,KAAK,iBAAiB,KAAK,YAAY,EAAI,OAAS,OAC9D,CACA,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,MACF,CAIA,IAAM,EAAY,KAAK,QAAQ,cAAgB,KAAO,KAAK,UAAU,EAErE,IAAK,IAAM,KAAS,KAAK,OACvB,EAAM,MAAM,SAAW,GACvB,EAAM,MAAM,IAAM,GAClB,EAAM,MAAM,KAAO,GACnB,EAAM,MAAM,OAAS,GACrB,EAAM,MAAM,QAAU,GACtB,EAAM,MAAM,OAAS,GACrB,EAAM,MAAM,WAAa,GACzB,EAAM,MAAM,cAAgB,GACxB,IAAc,OACZ,KAAK,QAAQ,UACf,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,GAAG,EAAU,MAElC,EAAM,MAAM,OAAS,GACrB,EAAM,MAAM,MAAQ,GAAG,EAAU,MAKvC,KAAK,YAAY,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,EAAG,EAAK,EACpF,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,qBAAqB,CAC5B,CAEA,gBAAiC,CAE/B,OADI,KAAK,QAAQ,sBAAwB,EAAqB,EAAU,EACjE,KAAK,QAAQ,KACtB,CAOA,cAAgC,CAE9B,OADI,KAAK,QAAQ,cAAsB,GAChC,KAAK,WAAa,GAAK,KAAK,YAAc,KAAK,QAAQ,YAChE,CAEA,cAAsB,EAA4B,CAIhD,GAAI,KAAK,aAAa,GAAK,CAAC,KAAK,QAAQ,WAAY,MAAO,GAC5D,GAAI,KAAK,QAAQ,cAAe,CAC9B,IAAI,EAAS,EACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,IAAK,CACnC,IAAM,EAAI,KAAK,OAAO,GACtB,GAAI,CAAC,EAAG,SACR,IAAM,EAAI,EAAE,sBAAsB,EAClC,GAAU,KAAK,QAAQ,SAAW,EAAE,OAAS,EAAE,KACjD,CACA,GAAI,KAAK,QAAQ,WAAY,CAC3B,IAAM,EAAU,KAAK,OAAO,GAC5B,GAAI,EAAS,CACX,IAAM,EAAI,EAAQ,sBAAsB,EACxC,IACG,KAAK,aAAa,GAAK,KAAK,QAAQ,SAAW,EAAE,OAAS,EAAE,QAAU,CAC3E,CACF,CACA,OAAO,CACT,CACA,IAAM,EAAO,KAAK,UAAU,EACxB,EAAS,EAAa,EAC1B,GAAI,KAAK,QAAQ,WACf,IAAW,KAAK,aAAa,EAAI,GAAQ,OACpC,GAAI,CAAC,KAAK,QAAQ,UAAY,CAAC,KAAK,QAAQ,KAAM,CAGvD,IAAM,EAAY,KAAK,IAAI,GAAI,KAAK,WAAa,KAAK,QAAQ,cAAgB,CAAI,EAClF,EAAS,KAAK,IAAI,EAAQ,CAAS,CACrC,CACA,OAAO,CACT,CAEA,YAAoB,EAAgB,EAAwB,CAC1D,IAAM,EAAQ,EAAU,KAAK,eAAe,EAAI,EAC1C,EAAO,KAAK,QAAQ,SAAW,IAAM,IACrC,EAAM,KAAK,QAAQ,KAAO,CAAC,KAAK,QAAQ,SAAW,EAAI,GAC7D,KAAK,MAAM,MAAM,WAAa,EAAQ,EAAI,aAAa,EAAM,KAAK,KAAK,QAAQ,UAAY,GAC3F,KAAK,MAAM,MAAM,UAAY,YAAY,EAAK,GAAG,EAAM,EAAO,IAChE,CAEA,MAAa,CACX,KAAK,KAAK,KAAK,aAAe,KAAK,QAAQ,cAAc,CAC3D,CAEA,MAAa,CACX,KAAK,KAAK,KAAK,aAAe,KAAK,QAAQ,cAAc,CAC3D,CAEA,KAAK,EAAe,EAAY,GAAa,CAM3C,GALI,KAAK,WACL,KAAK,aAAe,GAIpB,KAAK,WAAa,CAAC,EAAW,OAO9B,KAAK,QAAQ,UAAY,CAAC,KAAK,gBACjC,KAAK,iBAAiB,EAGxB,IAAI,EAAS,EACP,EAAc,KAAK,QAAQ,UAAY,CAAC,KAAK,QAAQ,KAE3D,GAAK,KAAK,QAAQ,SAgBP,KAAK,QAAQ,OAGtB,EAAS,EAAI,EAAQ,KAAK,UAAU,OAnBV,CAO1B,IAAM,EAAW,KAAK,IAAI,EAAG,KAAK,WAAa,CAAC,EAC5C,EAAS,IACX,KAAK,KAAK,OAAQ,CAAE,UAAW,KAAK,QAAQ,IAAM,QAAU,MAAO,CAAsB,EACzF,EAAS,GAEP,EAAS,IACX,KAAK,KAAK,OAAQ,CAAE,UAAW,KAAK,QAAQ,IAAM,OAAS,OAAQ,CAAsB,EACzF,EAAS,EAEb,CAOA,IAAM,EAA6B,CACjC,aAFe,KAAK,aAGpB,UAAW,EAAc,EAAI,EAAQ,KAAK,UAAU,EAAI,CAC1D,EAOA,GANA,KAAK,KAAK,eAAgB,CAAM,EAIhC,KAAK,aAAa,EAAO,SAAS,EAE9B,KAAK,QAAQ,KAAM,CAGrB,KAAK,aAAe,EACpB,KAAK,YAAY,EACjB,IAAM,EAA2B,CAAE,aAAc,KAAK,YAAa,EACnE,KAAK,KAAK,cAAe,CAAK,EAC9B,KAAK,cAAc,EACnB,MACF,CAIA,KAAK,UAAY,GACjB,IAAM,EAAa,EAAS,KAAK,WACjC,KAAK,YAAc,EACnB,IAAM,EAAS,KAAK,cAAc,CAAU,EAC5C,KAAK,YAAY,EAAQ,CAAC,CAAS,EAInC,KAAK,qBAAqB,CAAU,EAIpC,KAAK,iBAAiB,CAAU,EAGhC,KAAK,WAAW,EAAc,EAAI,EAAQ,KAAK,UAAU,EAAI,CAAM,EAOnE,KAAK,mBAAmB,CAAU,EAElC,IAAI,EAAW,GACT,MAAe,CACnB,GAAI,EAAU,OAOd,GANA,EAAW,GACX,KAAK,UAAY,GAKb,EAAa,CACf,IAAM,EAAU,EAAI,EAAQ,KAAK,UAAU,EACrC,EAAY,IAAY,EAE9B,GADA,KAAK,aAAe,EAChB,EAAW,CACb,IAAM,EAAgB,EAAU,KAAK,WAIrC,KAAK,oCAAoC,EACzC,KAAK,YAAY,KAAK,cAAc,CAAa,EAAG,EAAK,CAC3D,CACF,MACE,KAAK,aAAe,EAEtB,KAAK,YAAc,KACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,IAAM,EAA2B,CAAE,aAAc,KAAK,YAAa,EACnE,KAAK,KAAK,cAAe,CAAK,EAC9B,KAAK,cAAc,CACrB,EAEA,GAAI,GAAa,KAAK,eAAe,IAAM,EACzC,EAAO,MACF,CACL,IAAM,EAAS,GAAuB,CAKhC,EAAE,SAAW,KAAK,OAClB,EAAE,eAAiB,cACvB,KAAK,MAAM,oBAAoB,gBAAiB,CAAK,EACrD,EAAO,EACT,EACA,KAAK,MAAM,iBAAiB,gBAAiB,CAAK,EAClD,eAAiB,CACX,KAAK,YACP,KAAK,MAAM,oBAAoB,gBAAiB,CAAK,EACrD,EAAO,EAEX,EAAG,KAAK,eAAe,EAAI,EAAE,CAC/B,CACF,CAEA,MAAa,CACP,KAAK,WAEL,KAAK,aAAa,IACtB,KAAK,QAAQ,SAAW,GACxB,KAAK,eAAiB,GACtB,KAAK,iBAAiB,EACxB,CAEA,OAAc,CACZ,KAAK,eAAiB,GACtB,AAEE,KAAK,iBADL,aAAa,KAAK,aAAa,EACV,KAEzB,CAEA,kBAAiC,CAC3B,CAAC,KAAK,QAAQ,UAAY,KAAK,iBAC/B,KAAK,eAAe,aAAa,KAAK,aAAa,EACvD,KAAK,cAAgB,eAAiB,CAChC,KAAK,QAAQ,oBAAsB,WAAY,KAAK,KAAK,EACxD,KAAK,KAAK,EACf,KAAK,iBAAiB,CACxB,EAAG,KAAK,QAAQ,aAAa,EAC/B,CAEA,GAAgB,EAAe,EAA0C,CAClE,KAAK,UAAU,IAAI,CAAK,GAAG,KAAK,UAAU,IAAI,EAAO,IAAI,GAAK,EACnE,IAAM,EAAM,KAAK,UAAU,IAAI,CAAK,EAEpC,OADA,EAAI,IAAI,CAAoC,MAC/B,EAAI,OAAO,CAAoC,CAC9D,CAEA,IAAI,EAAe,EAA0C,CAC3D,KAAK,UAAU,IAAI,CAAK,GAAG,OAAO,CAAO,CAC3C,CAEA,KAAa,EAAe,EAAuB,CACjD,KAAK,UAAU,IAAI,CAAK,GAAG,QAAS,GAAO,EAAG,CAAM,CAAC,EACrD,KAAK,KAAK,cAAc,IAAI,YAAY,aAAa,IAAS,CAAE,SAAQ,QAAS,EAAM,CAAC,CAAC,CAC3F,CA8EA,YAA2B,CACzB,KAAK,KAAK,iBAAiB,UAAW,KAAK,SAAS,EACpD,KAAK,KAAK,iBAAiB,aAAc,KAAK,gBAAgB,EAC9D,KAAK,KAAK,iBAAiB,aAAc,KAAK,gBAAgB,EAC9D,KAAK,KAAK,iBAAiB,UAAW,KAAK,aAAa,EACxD,KAAK,KAAK,iBAAiB,WAAY,KAAK,cAAc,EAC1D,KAAK,KAAK,aAAa,WAAY,GAAG,EAElC,OAAO,eAAmB,KAC5B,KAAK,eAAiB,IAAI,mBAAqB,KAAK,aAAa,CAAC,EAClE,KAAK,eAAe,QAAQ,KAAK,IAAI,GAC5B,OAAO,OAAW,KAC3B,OAAO,iBAAiB,SAAU,KAAK,YAAY,EAGjD,KAAK,QAAQ,WAAW,KAAK,kBAAkB,EAC/C,KAAK,QAAQ,eAAe,KAAK,kBAAkB,CACzD,CAEA,cAA6B,CAC3B,KAAK,KAAK,oBAAoB,UAAW,KAAK,SAAS,EACvD,KAAK,KAAK,oBAAoB,aAAc,KAAK,gBAAgB,EACjE,KAAK,KAAK,oBAAoB,aAAc,KAAK,gBAAgB,EACjE,KAAK,KAAK,oBAAoB,UAAW,KAAK,aAAa,EAC3D,KAAK,KAAK,oBAAoB,WAAY,KAAK,cAAc,EACzD,OAAO,OAAW,KACpB,OAAO,oBAAoB,SAAU,KAAK,YAAY,EACpD,KAAK,WAAW,KAAK,UAAU,oBAAoB,QAAS,KAAK,eAAe,EAChF,KAAK,WAAW,KAAK,UAAU,oBAAoB,QAAS,KAAK,eAAe,EACpF,KAAK,oBAAoB,CAC3B,CAEA,mBAAkC,CAKhC,IAAM,MAA+B,CAAC,KAAK,QAAQ,KAE7C,EAAU,GAAoB,CAElC,GADI,KAAK,WACL,EAAE,SAAW,IAAA,IAAa,EAAE,SAAW,EAAG,OAC9C,IAAM,EAAiB,EAAc,EAAI,KAAK,eAAe,EAAI,EACjE,KAAK,QAAU,CACb,GAAI,EAAE,UACN,OAAQ,EAAE,QACV,OAAQ,EAAE,QACV,UAAW,YAAY,IAAI,EAC3B,iBACA,OAAQ,GACR,QAAS,GACT,aAAc,CAAC,KAAK,QAAQ,QAC9B,EACI,EAAc,IAAG,KAAK,MAAM,MAAM,WAAa,IACnD,KAAK,KAAK,UAAU,IAAI,EAAM,QAAQ,CACxC,EAEM,EAAU,GAAoB,CAClC,GAAI,CAAC,KAAK,SAAW,CAAC,KAAK,QAAQ,QAAU,KAAK,QAAQ,KAAO,EAAE,UAAW,OAC9E,IAAM,EAAK,EAAE,QAAU,KAAK,QAAQ,OAC9B,EAAK,EAAE,QAAU,KAAK,QAAQ,OACpC,GAAI,CAAC,KAAK,QAAQ,QAAS,CACzB,IAAM,EAAO,KAAK,IAAI,CAAE,EAClB,EAAO,KAAK,IAAI,CAAE,EACxB,GAAI,EAAO,GAAK,EAAO,EAAG,OAG1B,GAFA,KAAK,QAAQ,aAAe,EAAO,EACnC,KAAK,QAAQ,QAAU,GACnB,KAAK,QAAQ,SAAW,KAAK,QAAQ,aAAe,CAAC,KAAK,QAAQ,aAAc,CAClF,KAAK,QAAQ,OAAS,GACtB,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,EACzC,MACF,CACF,CACA,GAAI,EAAc,EAAG,CACnB,IAAM,EAAQ,KAAK,QAAQ,SAAW,EAAK,EACrC,EAAM,KAAK,QAAQ,KAAO,CAAC,KAAK,QAAQ,SAAW,GAAK,EACxD,EAAY,KAAK,QAAQ,eAAiB,EAAM,EAChD,EAAO,KAAK,QAAQ,SAAW,IAAM,IACrC,EAAe,KAAK,QAAQ,KAAO,CAAC,KAAK,QAAQ,SAAW,EAAI,GACtE,KAAK,MAAM,MAAM,UAAY,YAAY,EAAK,GAAG,EAAe,EAAU,IAC5E,CACI,OAAQ,EAAmB,gBAAmB,YAAY,EAAE,eAAe,CACjF,EAEM,EAAQ,GAAoB,CAChC,GAAI,CAAC,KAAK,SAAW,KAAK,QAAQ,KAAO,EAAE,UAAW,OACtD,IAAM,EAAY,KAAK,QAAQ,OACzB,EAAK,EAAE,QAAU,KAAK,QAAQ,OAC9B,EAAK,EAAE,QAAU,KAAK,QAAQ,OAC9B,EAAU,YAAY,IAAI,EAAI,KAAK,QAAQ,UAGjD,GAFA,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,EACzC,KAAK,QAAU,KACX,CAAC,EAAW,OAEhB,IAAM,EAAQ,KAAK,QAAQ,SAAW,EAAK,EACrC,EAAW,KAAK,IAAI,CAAK,EAAI,KAAK,IAAI,EAAG,CAAO,EAChD,EAAY,KAAK,QAAQ,eAEhB,KAAK,IAAI,CAAK,EAAI,GAAa,EAAW,IAExC,KAAK,QAAQ,KAAO,CAAC,KAAK,QAAQ,SAAW,EAAQ,EAAI,EAAQ,IAE9E,KAAK,KAAK,QAAS,CACjB,UAAW,KAAK,QAAQ,SAAW,OAAS,OAC9C,CAAuB,EACvB,KAAK,KAAK,IAEV,KAAK,KAAK,QAAS,CACjB,UAAW,KAAK,QAAQ,SAAW,KAAO,MAC5C,CAAuB,EACvB,KAAK,KAAK,GAEH,EAAc,GAGvB,KAAK,KAAK,KAAK,aAAc,EAAI,CAErC,EAEM,EAAY,GAAoB,CAChC,CAAC,KAAK,SAAW,KAAK,QAAQ,KAAO,EAAE,YAC3C,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,EACzC,KAAK,QAAU,KACX,EAAc,GAAG,KAAK,KAAK,KAAK,aAAc,EAAI,EACxD,EAEM,EAAc,EACd,EAAc,EACd,EAAY,EACZ,EAAgB,EACtB,KAAK,gBAAkB,CACrB,KAAM,EACN,KAAM,EACN,GAAI,EACJ,OAAQ,CACV,EACA,KAAK,SAAS,iBAAiB,cAAe,CAAW,EACzD,OAAO,iBAAiB,cAAe,EAAa,CAAE,QAAS,EAAM,CAAC,EACtE,OAAO,iBAAiB,YAAa,CAAS,EAC9C,OAAO,iBAAiB,gBAAiB,CAAa,CACxD,CAEA,qBAAoC,CAClC,GAAM,CAAE,OAAM,OAAM,KAAI,UAAW,KAAK,gBACnC,IACL,KAAK,SAAS,oBAAoB,cAAe,CAAI,EACjD,GAAM,OAAO,oBAAoB,cAAe,CAAI,EACpD,GAAI,OAAO,oBAAoB,YAAa,CAAE,EAC9C,GAAQ,OAAO,oBAAoB,gBAAiB,CAAM,EAC9D,KAAK,gBAAkB,CAAC,EAC1B,CAEA,gBAAiC,CAC/B,IAAM,EAAI,KAAK,MAAM,MAAM,UACrB,EAAI,uCAAuC,KAAK,CAAC,EAIvD,MAHI,CAAC,GAAK,CAAC,EAAE,GAAW,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,EACzE,WAAW,EAAE,EAEhB,GADK,KAAK,QAAQ,KAAO,CAAC,KAAK,QAAQ,SAAW,EAAI,GAE/D,CAEA,mBAAkC,CAChC,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACrB,GACL,EAAM,iBAAiB,YAAe,CACpC,IAAM,EAAY,EAAI,KAAK,WACvB,GAAa,GAAK,EAAY,KAAK,YAAY,KAAK,KAAK,CAAS,CACxE,CAAC,CACH,CACF,CAEA,iBAAyB,EAA2B,CAClD,OAAO,EAAY,KAAK,UAC1B,CAEA,YAA2B,CACzB,IAAM,EAAa,KAAK,iBAAiB,KAAK,YAAY,EACpD,EAAc,KAAK,OAAO,GAQ5B,EAAiB,GACrB,GAAI,OAAO,SAAa,KAAe,EAAa,CAClD,IAAM,EAAU,SAAS,cACzB,GAAI,GAAW,IAAY,SAAS,KAClC,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACrB,MACD,MAAK,qBAAqB,EAAG,CAAU,GACvC,EAAM,SAAS,CAAO,EAAG,CAC3B,EAAiB,GACjB,KACF,CACF,CAEJ,CAEA,KAAK,mBAAmB,CAAU,EAClC,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GAC1B,GAAI,CAAC,EAAO,SACZ,IAAM,EAAW,KAAK,qBAAqB,EAAG,CAAU,EAClD,EAAW,EAAM,UAAU,SAAS,EAAM,WAAW,EACvD,GACF,EAAM,gBAAgB,OAAO,EAIxB,GAAU,EAAM,aAAa,WAAY,GAAG,IAEjD,EAAM,aAAa,QAAS,EAAE,EAC9B,EAAM,gBAAgB,UAAU,EAEpC,CAEI,GAAkB,GACpB,EAAY,MAAM,CAAE,cAAe,EAAK,CAAC,EAK3C,KAAK,iBAAiB,CAAU,CAClC,CAEA,mBAA2B,EAAiC,CAC1D,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACrB,IACL,EAAM,UAAU,OACd,EAAM,YACN,KAAK,qBAAqB,EAAG,CAAiB,CAChD,EACA,EAAM,UAAU,OAAO,EAAM,aAAc,IAAM,CAAiB,EACpE,CACF,CAEA,qCAAoD,CAClD,KAAK,KAAK,UAAU,IAAI,iBAAiB,EAEzC,KAAU,KAAK,YACX,OAAO,uBAA0B,WACnC,0BAA4B,CAG1B,0BAA4B,KAAK,KAAK,UAAU,OAAO,iBAAiB,CAAC,CAC3E,CAAC,EAED,eAAiB,KAAK,KAAK,UAAU,OAAO,iBAAiB,EAAG,EAAE,CAEtE,CAEA,iBAAyB,EAA0B,CAC5C,QAAK,QAAQ,WAClB,IAAK,IAAI,EAAI,EAAG,EAAI,KAAK,OAAO,OAAQ,IAAK,CAC3C,IAAM,EAAQ,KAAK,OAAO,GACrB,GACL,EAAM,UAAU,OAAO,EAAM,YAAa,IAAM,CAAU,CAC5D,CACF,CAEA,qBAA6B,EAAyB,EAAoC,CAOxF,GAAI,KAAK,aAAa,EAAG,MAAO,GAChC,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,QAAQ,YAAY,EAClD,GAAI,KAAK,QAAQ,WAAY,CAC3B,IAAM,EAAO,KAAK,MAAM,EAAO,CAAC,EAChC,OACE,GAAmB,EAAoB,GACvC,EAAkB,EAAoB,EAAO,CAEjD,CACA,OACE,GAAmB,GAAqB,EAAkB,EAAoB,CAElF,CAEA,cAA6B,CAC3B,GAAI,CAAC,KAAK,WAAa,CAAC,KAAK,UAAW,OACxC,GAAI,KAAK,QAAQ,UAAY,KAAK,QAAQ,KAAM,CAC9C,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,EACnD,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,EACnD,KAAK,UAAU,gBAAgB,eAAe,EAC9C,KAAK,UAAU,gBAAgB,eAAe,EAC9C,MACF,CACA,IAAM,EAAU,KAAK,cAAgB,EAC/B,EAAQ,KAAK,cAAgB,KAAK,WAAa,KAAK,QAAQ,aAClE,KAAK,UAAU,UAAU,OAAO,EAAM,cAAe,CAAO,EAC5D,KAAK,UAAU,UAAU,OAAO,EAAM,cAAe,CAAK,EAC1D,KAAK,UAAU,aAAa,gBAAiB,OAAO,CAAO,CAAC,EAC5D,KAAK,UAAU,aAAa,gBAAiB,OAAO,CAAK,CAAC,EAKtD,KAAK,UAAU,UAAY,WAC7B,KAAM,UAAgC,SAAW,IAC/C,KAAK,UAAU,UAAY,WAC7B,KAAM,UAAgC,SAAW,GACrD,CAEA,WAA4B,CAC1B,GAAI,KAAK,aAAe,EAAG,MAAO,GAClC,IAAM,EAAQ,KAAK,MAChB,KAAK,YAAc,KAAK,QAAQ,SAAW,EAAI,KAAK,QAAQ,aAAe,IAC1E,KAAK,IAAI,EAAG,KAAK,QAAQ,cAAc,CAC3C,EACA,OAAO,KAAK,IAAI,EAAG,CAAK,CAC1B,CAEA,WAAmB,EAA0B,CAC3C,GAAI,CAAC,KAAK,SAAU,OACpB,IAAM,EAAM,GAAa,KAAK,aACxB,EAAU,KAAK,MAAM,EAAM,KAAK,IAAI,EAAG,KAAK,QAAQ,cAAc,CAAC,EAEzE,KADmB,SAAS,iBAAiB,IAAI,EAAM,KACvD,EAAM,SAAS,EAAI,IAAM,CACvB,EAAG,UAAU,OAAO,EAAM,UAAW,IAAM,CAAO,EAClD,EAAG,aAAa,gBAAiB,IAAM,EAAU,OAAS,OAAO,CACnE,CAAC,CACH,CAEA,qBAA6B,EAA2B,CACtD,GAAI,CAAC,KAAK,QAAQ,gBAAkB,KAAK,QAAQ,SAAU,OAI3D,IAAM,EAAM,GAAc,KAAK,aAAe,KAAK,iBAAiB,KAAK,YAAY,EAC/E,EAAQ,KAAK,OAAO,GAC1B,GAAI,CAAC,EAAO,OACZ,IAAM,EAAI,EAAM,sBAAsB,EAAE,OACpC,EAAI,IAAG,KAAK,SAAS,MAAM,OAAS,GAAG,EAAE,IAC/C,CAEA,eAA8B,CAC5B,GAAI,CAAC,KAAK,QAAQ,SAAU,OAC5B,GAAI,KAAK,QAAQ,WAAa,cAAe,CAC3C,KAAK,aAAa,KAAK,MAAM,EAC7B,MACF,CACA,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,QAAQ,YAAY,EAC5C,EAAe,KAAK,iBAAiB,KAAK,YAAY,EAEtD,EAAQ,EAAe,EACvB,EAAM,EAAe,EAAO,EAC5B,EAAyB,CAAC,EAChC,IAAK,IAAI,EAAI,EAAO,EAAI,EAAK,IAAK,CAIhC,IAAM,EAAM,KAAK,QAAQ,SAAW,EAAI,EAAG,KAAK,OAAO,MAAM,EAAI,EACjE,GAAI,EAAM,GAAK,GAAO,KAAK,OAAO,OAAQ,SAC1C,IAAM,EAAI,KAAK,OAAO,GAClB,GAAG,EAAQ,KAAK,CAAC,CACvB,CACA,KAAK,aAAa,CAAO,CAC3B,CAEA,aAAqB,EAA6B,CAChD,IAAK,IAAM,KAAS,EAElB,EADmB,iBAAmC,gBACtD,EAAK,QAAS,GAAQ,KAAK,kBAAkB,CAAG,CAAC,CAErD,CAEA,kBAA0B,EAA6B,CACrD,IAAM,EAAM,EAAI,aAAa,WAAW,EACnC,IACL,EAAI,gBAAgB,WAAW,EAC/B,EAAI,iBACF,WACM,KAAK,KAAK,aAAc,CAAE,MAAO,EAAK,KAAI,CAA0B,EAC1E,CAAE,KAAM,EAAK,CACf,EACA,EAAI,iBACF,YACM,KAAK,KAAK,gBAAiB,CAAE,MAAO,EAAK,KAAI,CAA0B,EAC7E,CAAE,KAAM,EAAK,CACf,EACA,EAAI,IAAM,EACZ,CAEA,cAA6B,CAC3B,IAAM,EAAM,KAAK,QAAQ,SACzB,GAAI,CAAC,EAAK,OACV,IAAM,EAAK,EAAyC,CAAS,EAC7D,GAAI,CAAC,EAAI,OACT,IAAM,EAAY,EAAiD,YAC/D,IACF,KAAK,UAAY,EAIjB,EAAS,GAAuB,eAAiB,GAAW,CACtD,AAGJ,KAAK,sBAFL,KAAK,mBAAqB,GAC1B,KAAK,KAAK,EAAO,SAAS,EACA,GAC5B,CAAC,EAEL,CAEA,aAAqB,EAA2B,CACzC,KAAK,YACN,AAGJ,KAAK,sBAFL,KAAK,mBAAqB,GAC1B,KAAK,UAAU,KAAK,CAAW,EACL,IAC5B,CAEA,iBAA0B,CACxB,OAAO,KAAK,YACd,CAEA,eAAwB,CACtB,OAAO,KAAK,UACd,CAEA,WAA2B,CACzB,OAAO,KAAK,OAAO,MAAM,KAAK,WAAY,KAAK,WAAa,KAAK,UAAU,CAC7E,CAEA,WAAW,EAAoC,EAAU,GAAY,CACnE,KAAK,YAAc,CAAE,GAAG,KAAK,YAAa,GAAG,CAAQ,EACjD,EACF,KAAK,OAAO,EAEZ,KAAK,QAAU,EAAa,KAAK,QAAS,CAAO,CAErD,CAQA,SAAgB,CACV,KAAK,WACT,KAAK,YAAY,CACnB,CAEA,SAAS,EAAsB,EAAsB,CAC/C,OAAO,GAAU,SACnB,KAAK,iBAAiB,OAAO,EAAO,EAAG,CAAO,EAE9C,KAAK,iBAAiB,KAAK,CAAO,EAEpC,KAAK,OAAO,CACd,CAEA,YAAY,EAAqB,CAC3B,EAAQ,GAAK,GAAS,KAAK,iBAAiB,SAChD,KAAK,iBAAiB,OAAO,EAAO,CAAC,EACrC,KAAK,OAAO,EACd,CACF,ECvtCA,SAAgB,EACd,EACA,EAAqC,CAAC,EAC1B,CACZ,OAAO,IAAI,EAAW,EAAM,CAAO,CACrC,CAEA,IAAA,EAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slickless",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "A jQuery-free port of slick carousel — small, accessible, framework-agnostic.",
5
5
  "type": "module",
6
6
  "main": "./dist/slickless.umd.cjs",
@@ -25,6 +25,7 @@
25
25
  "build": "vite build && tsc -p tsconfig.build.json --emitDeclarationOnly",
26
26
  "build:demo": "vite build --config vite.demo.config.ts",
27
27
  "test": "vitest run",
28
+ "test:coverage": "vitest run --coverage",
28
29
  "typecheck": "tsc --noEmit",
29
30
  "prepublishOnly": "bun run build"
30
31
  },
@@ -54,6 +55,7 @@
54
55
  "devDependencies": {
55
56
  "@types/bun": "latest",
56
57
  "@types/node": "^22.10.0",
58
+ "@vitest/coverage-v8": "^4.1.7",
57
59
  "happy-dom": "^20.9.0",
58
60
  "typescript": "^5.7.2",
59
61
  "vite": "^8.0.14",