slickless 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/slickless.css +1 -1
- package/dist/slickless.d.ts +6 -0
- package/dist/slickless.js +8 -3
- package/dist/slickless.js.map +1 -1
- package/dist/slickless.umd.cjs +1 -1
- package/dist/slickless.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/slickless.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.slickless{--slickless-arrow-size:44px;--slickless-arrow-color:#0f172a;--slickless-arrow-bg:#fff;--slickless-arrow-bg-hover:#f8fafc;--slickless-arrow-shadow:0 4px 16px -2px #0f172a29, 0 2px 4px -1px #0f172a14;--slickless-arrow-disabled-opacity:.3;--slickless-dot-size:8px;--slickless-dot-color:#0f172a40;--slickless-dot-color-active:#0f172a;--slickless-dot-gap:10px;--slickless-focus-ring:0 0 0 3px #6366f173;box-sizing:border-box;outline:none;min-width:0;position:relative}.slickless *,.slickless :before,.slickless :after{box-sizing:border-box}.slickless:not(.slickless--initialized)>:not(:first-child){display:none}.slickless:focus-visible{box-shadow:var(--slickless-focus-ring);border-radius:4px}.slickless__viewport{touch-action:pan-y;width:100%;min-width:0;position:relative;overflow:hidden}.slickless--vertical .slickless__viewport{touch-action:pan-x;height:100%;min-height:0}.slickless--fade .slickless__viewport{min-height:1px}.slickless__track{will-change:transform;width:100%;min-width:0;display:flex}.slickless--vertical .slickless__track{flex-direction:column;height:100%;min-height:0}.slickless--adaptive-height .slickless__track{align-items:flex-start}.slickless--fade .slickless__track{height:100%;display:block;position:relative}.slickless--dragging .slickless__track{cursor:grabbing}.slickless__slide{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;outline:none;flex:none;position:relative}.slickless__slide>*{width:100%;height:100%}.slickless--fade .slickless__slide{width:100%;position:absolute;top:0;left:0}.slickless__slide:focus-visible{box-shadow:var(--slickless-focus-ring);border-radius:4px}.slickless__arrow{z-index:5;width:var(--slickless-arrow-size);height:var(--slickless-arrow-size);background:var(--slickless-arrow-bg);color:var(--slickless-arrow-color);box-shadow:var(--slickless-arrow-shadow);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;padding:0;transition:background-color .16s,transform .16s,opacity .16s;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}.slickless__arrow:hover{background:var(--slickless-arrow-bg-hover)}.slickless__arrow:active{transform:translateY(-50%)scale(.94)}.slickless__arrow:focus-visible{box-shadow:var(--slickless-arrow-shadow), var(--slickless-focus-ring)}.slickless__arrow--prev{left:12px}.slickless__arrow--next{right:12px}.slickless--rtl .slickless__arrow--prev{left:auto;right:12px}.slickless--rtl .slickless__arrow--next{left:12px;right:auto}.slickless--vertical .slickless__arrow{top:auto;left:50%;transform:translate(-50%)rotate(90deg)}.slickless--vertical .slickless__arrow--prev{top:12px}.slickless--vertical .slickless__arrow--next{bottom:12px;right:auto}.slickless__arrow svg{width:22px;height:22px}.slickless__arrow--disabled{opacity:var(--slickless-arrow-disabled-opacity);cursor:not-allowed}.slickless__arrow--disabled:hover{background:var(--slickless-arrow-bg)}.slickless__dots{justify-content:center;align-items:center;gap:var(--slickless-dot-gap);margin:16px 0 0;padding:0;list-style:none;display:flex}.slickless__dots li{display:inline-flex}.slickless__dot{cursor:pointer}.slickless__dot:focus-visible{box-shadow:var(--slickless-focus-ring)}.slickless__dot--bullet{width:var(--slickless-dot-size);height:var(--slickless-dot-size);background:var(--slickless-dot-color);color:#0000;border:0;border-radius:999px;padding:0;font-size:0;transition:background-color .2s,width .2s}.slickless__dot--bullet:hover{background:var(--slickless-dot-color-active);opacity:.7}.slickless__dot--bullet.slickless__dot--active{background:var(--slickless-dot-color-active);width:calc(var(--slickless-dot-size) * 3);border-radius:999px}.slickless--center .slickless__slide{transition:opacity var(--slickless-transition-duration,.4s) ease, transform var(--slickless-transition-duration,.4s) ease;opacity:.55;transform:scale(.92)}.slickless--center .slickless__slide--center{opacity:1;transform:scale(1)}.slickless--snap .slickless__slide,.slickless--snap .slickless__track{transition:none!important}@media (prefers-reduced-motion:reduce){.slickless__track,.slickless__slide,.slickless__arrow,.slickless__dot{transition-duration:.01ms!important}}
|
|
1
|
+
.slickless{--slickless-arrow-size:44px;--slickless-arrow-color:#0f172a;--slickless-arrow-bg:#fff;--slickless-arrow-bg-hover:#f8fafc;--slickless-arrow-shadow:0 4px 16px -2px #0f172a29, 0 2px 4px -1px #0f172a14;--slickless-arrow-disabled-opacity:.3;--slickless-dot-size:8px;--slickless-dot-color:#0f172a40;--slickless-dot-color-active:#0f172a;--slickless-dot-gap:10px;--slickless-focus-ring:0 0 0 3px #6366f173;box-sizing:border-box;outline:none;min-width:0;position:relative}.slickless *,.slickless :before,.slickless :after{box-sizing:border-box}.slickless:not(.slickless--initialized)>:not(:first-child){display:none}.slickless:focus-visible{box-shadow:var(--slickless-focus-ring);border-radius:4px}.slickless__viewport{touch-action:pan-y;width:100%;min-width:0;position:relative;overflow:hidden}.slickless--vertical .slickless__viewport{touch-action:pan-x;height:100%;min-height:0}.slickless--fade .slickless__viewport{min-height:1px}.slickless__track{will-change:transform;width:100%;min-width:0;display:flex}.slickless--vertical .slickless__track{flex-direction:column;height:100%;min-height:0}.slickless--adaptive-height .slickless__track{align-items:flex-start}.slickless:not(.slickless--center) .slickless__track{justify-content:safe center}.slickless--fade .slickless__track{height:100%;display:block;position:relative}.slickless--dragging .slickless__track{cursor:grabbing}.slickless__slide{-webkit-user-select:none;user-select:none;-webkit-user-drag:none;outline:none;flex:none;position:relative}.slickless__slide>*{width:100%;height:100%}.slickless--fade .slickless__slide{width:100%;position:absolute;top:0;left:0}.slickless__slide:focus-visible{box-shadow:var(--slickless-focus-ring);border-radius:4px}.slickless__arrow{z-index:5;width:var(--slickless-arrow-size);height:var(--slickless-arrow-size);background:var(--slickless-arrow-bg);color:var(--slickless-arrow-color);box-shadow:var(--slickless-arrow-shadow);cursor:pointer;border:0;border-radius:999px;justify-content:center;align-items:center;padding:0;transition:background-color .16s,transform .16s,opacity .16s;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}.slickless__arrow:hover{background:var(--slickless-arrow-bg-hover)}.slickless__arrow:active{transform:translateY(-50%)scale(.94)}.slickless__arrow:focus-visible{box-shadow:var(--slickless-arrow-shadow), var(--slickless-focus-ring)}.slickless__arrow--prev{left:12px}.slickless__arrow--next{right:12px}.slickless--rtl .slickless__arrow--prev{left:auto;right:12px}.slickless--rtl .slickless__arrow--next{left:12px;right:auto}.slickless--vertical .slickless__arrow{top:auto;left:50%;transform:translate(-50%)rotate(90deg)}.slickless--vertical .slickless__arrow--prev{top:12px}.slickless--vertical .slickless__arrow--next{bottom:12px;right:auto}.slickless__arrow svg{width:22px;height:22px}.slickless__arrow--disabled{opacity:var(--slickless-arrow-disabled-opacity);cursor:not-allowed}.slickless__arrow--disabled:hover{background:var(--slickless-arrow-bg)}.slickless__dots{justify-content:center;align-items:center;gap:var(--slickless-dot-gap);margin:16px 0 0;padding:0;list-style:none;display:flex}.slickless__dots li{display:inline-flex}.slickless__dot{cursor:pointer}.slickless__dot:focus-visible{box-shadow:var(--slickless-focus-ring)}.slickless__dot--bullet{width:var(--slickless-dot-size);height:var(--slickless-dot-size);background:var(--slickless-dot-color);color:#0000;border:0;border-radius:999px;padding:0;font-size:0;transition:background-color .2s,width .2s}.slickless__dot--bullet:hover{background:var(--slickless-dot-color-active);opacity:.7}.slickless__dot--bullet.slickless__dot--active{background:var(--slickless-dot-color-active);width:calc(var(--slickless-dot-size) * 3);border-radius:999px}.slickless--center .slickless__slide{transition:opacity var(--slickless-transition-duration,.4s) ease, transform var(--slickless-transition-duration,.4s) ease;opacity:.55;transform:scale(.92)}.slickless--center .slickless__slide--center{opacity:1;transform:scale(1)}.slickless--snap .slickless__slide,.slickless--snap .slickless__track{transition:none!important}@media (prefers-reduced-motion:reduce){.slickless__track,.slickless__slide,.slickless__arrow,.slickless__dot{transition-duration:.01ms!important}}
|
|
2
2
|
/*$vite$:1*/
|
package/dist/slickless.d.ts
CHANGED
|
@@ -52,6 +52,12 @@ export declare class Slickless {
|
|
|
52
52
|
private parseCenterPadding;
|
|
53
53
|
private applyLayout;
|
|
54
54
|
private effectiveSpeed;
|
|
55
|
+
/**
|
|
56
|
+
* Every slide already fits in the viewport — there's nothing to scroll to,
|
|
57
|
+
* so dots, autoplay and clones are all suppressed. variableWidth keeps the
|
|
58
|
+
* usual machinery because per-slide widths aren't predictable upfront.
|
|
59
|
+
*/
|
|
60
|
+
private allSlidesFit;
|
|
55
61
|
private indexToOffset;
|
|
56
62
|
private translateTo;
|
|
57
63
|
next(): void;
|
package/dist/slickless.js
CHANGED
|
@@ -157,7 +157,7 @@ var s = {
|
|
|
157
157
|
build() {
|
|
158
158
|
this.root.innerHTML = "", this.root.classList.add(s.root), this.root.classList.toggle(s.vertical, this.options.vertical), this.root.classList.toggle(s.fade, this.options.fade), this.root.classList.toggle(s.rtl, this.options.rtl), this.root.classList.toggle(s.centerMode, this.options.centerMode), this.root.classList.toggle(s.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 = a("div", s.viewport), this.track = a("div", s.track, { role: "presentation" });
|
|
159
159
|
let e = this.originalChildren.map((e, t) => this.wrapAsSlide(e, t));
|
|
160
|
-
if (this.slideCount = e.length, this.options.infinite && !this.options.fade && this.slideCount > 0) {
|
|
160
|
+
if (this.slideCount = e.length, this.options.infinite && !this.options.fade && this.slideCount > 0 && !this.allSlidesFit()) {
|
|
161
161
|
let t = this.options.variableWidth ? this.slideCount : Math.max(this.options.slidesToShow, 1);
|
|
162
162
|
this.cloneCount = Math.min(t, this.slideCount);
|
|
163
163
|
let n = e.slice(-this.cloneCount).map((e) => this.cloneSlide(e)), r = e.slice(0, this.cloneCount).map((e) => this.cloneSlide(e));
|
|
@@ -168,7 +168,7 @@ var s = {
|
|
|
168
168
|
];
|
|
169
169
|
} else this.cloneCount = 0, this.slides = e;
|
|
170
170
|
for (let e of this.slides) this.track.appendChild(e);
|
|
171
|
-
this.viewport.appendChild(this.track), this.root.appendChild(this.viewport), this.options.arrows && this.slideCount > this.options.slidesToShow && this.buildArrows(), this.options.dots && this.
|
|
171
|
+
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();
|
|
172
172
|
}
|
|
173
173
|
wrapAsSlide(e, t) {
|
|
174
174
|
let n = a("div", s.slide, {
|
|
@@ -262,7 +262,11 @@ var s = {
|
|
|
262
262
|
effectiveSpeed() {
|
|
263
263
|
return this.options.respectReducedMotion && i() ? 0 : this.options.speed;
|
|
264
264
|
}
|
|
265
|
+
allSlidesFit() {
|
|
266
|
+
return this.options.variableWidth ? !1 : this.slideCount > 0 && this.slideCount <= this.options.slidesToShow;
|
|
267
|
+
}
|
|
265
268
|
indexToOffset(e) {
|
|
269
|
+
if (this.allSlidesFit() && !this.options.centerMode) return 0;
|
|
266
270
|
if (this.options.variableWidth) {
|
|
267
271
|
let t = 0;
|
|
268
272
|
for (let n = 0; n < e; n++) {
|
|
@@ -300,6 +304,7 @@ var s = {
|
|
|
300
304
|
}
|
|
301
305
|
goTo(e, t = !1) {
|
|
302
306
|
if (this.destroyed || this.slideCount === 0 || this.animating && !t) return;
|
|
307
|
+
this.options.autoplay && !this.autoplayPaused && this.scheduleAutoplay();
|
|
303
308
|
let n = e, i = this.options.infinite && !this.options.fade;
|
|
304
309
|
if (this.options.infinite) this.options.fade && (n = r(n, this.slideCount));
|
|
305
310
|
else {
|
|
@@ -345,7 +350,7 @@ var s = {
|
|
|
345
350
|
}
|
|
346
351
|
}
|
|
347
352
|
play() {
|
|
348
|
-
this.destroyed || (this.options.autoplay = !0, this.autoplayPaused = !1, this.scheduleAutoplay());
|
|
353
|
+
this.destroyed || this.allSlidesFit() || (this.options.autoplay = !0, this.autoplayPaused = !1, this.scheduleAutoplay());
|
|
349
354
|
}
|
|
350
355
|
pause() {
|
|
351
356
|
this.autoplayPaused = !0, this.autoplayTimer &&= (clearTimeout(this.autoplayTimer), null);
|
package/dist/slickless.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slickless.js","names":[],"sources":["../src/defaults.ts","../src/utils.ts","../src/slickless.ts","../src/index.ts"],"sourcesContent":["import type { SlicklessOptions } from \"./types\";\n\nexport const DEFAULTS: SlicklessOptions = {\n arrows: true,\n dots: false,\n autoplay: false,\n autoplaySpeed: 3000,\n speed: 400,\n cssEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n slidesToShow: 1,\n slidesToScroll: 1,\n infinite: true,\n fade: false,\n vertical: false,\n initialSlide: 0,\n variableWidth: false,\n centerMode: false,\n centerPadding: \"50px\",\n rtl: false,\n draggable: true,\n swipeThreshold: 24,\n pauseOnHover: true,\n pauseOnFocus: true,\n accessibility: true,\n adaptiveHeight: false,\n lazyLoad: false,\n respectReducedMotion: true,\n prevArrow: null,\n nextArrow: null,\n customPaging: null,\n ariaRoleDescription: \"carousel\",\n responsive: null,\n asNavFor: null,\n focusOnSelect: false,\n autoplayDirection: \"forward\",\n};\n\nexport function mergeOptions(\n base: SlicklessOptions,\n override: Partial<SlicklessOptions>,\n): SlicklessOptions {\n return { ...base, ...override };\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n }\n return el;\n}\n\nexport function ensureNumber(value: unknown, fallback: number): number {\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function resolveElement(\n selectorOrElement: string | HTMLElement | null,\n): HTMLElement | null {\n if (!selectorOrElement) return null;\n if (typeof selectorOrElement === \"string\") {\n return document.querySelector<HTMLElement>(selectorOrElement);\n }\n return selectorOrElement;\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(() => resolve(), 16);\n }\n });\n}\n","import { DEFAULTS, mergeOptions } from \"./defaults\";\nimport type {\n AfterChangeDetail,\n BeforeChangeDetail,\n BreakpointDetail,\n EdgeDetail,\n LazyLoadDetail,\n ResponsiveBreakpoint,\n SlicklessOptions,\n SwipeDetail,\n} from \"./types\";\nimport { clamp, createEl, mod, prefersReducedMotion, resolveElement } from \"./utils\";\n\ninterface Pointer {\n id: number;\n startX: number;\n startY: number;\n startTime: number;\n startTransform: number;\n active: boolean;\n decided: boolean;\n isHorizontal: boolean;\n}\n\nconst CLASS = {\n root: \"slickless\",\n initialized: \"slickless--initialized\",\n viewport: \"slickless__viewport\",\n track: \"slickless__track\",\n slide: \"slickless__slide\",\n slideActive: \"slickless__slide--active\",\n slideCenter: \"slickless__slide--center\",\n slideCloned: \"slickless__slide--cloned\",\n slideCurrent: \"slickless__slide--current\",\n arrow: \"slickless__arrow\",\n arrowPrev: \"slickless__arrow--prev\",\n arrowNext: \"slickless__arrow--next\",\n arrowDisabled: \"slickless__arrow--disabled\",\n dots: \"slickless__dots\",\n dot: \"slickless__dot\",\n dotBullet: \"slickless__dot--bullet\",\n dotActive: \"slickless__dot--active\",\n vertical: \"slickless--vertical\",\n fade: \"slickless--fade\",\n rtl: \"slickless--rtl\",\n dragging: \"slickless--dragging\",\n centerMode: \"slickless--center\",\n adaptive: \"slickless--adaptive-height\",\n};\n\nexport class Slickless {\n readonly root: HTMLElement;\n private userOptions: Partial<SlicklessOptions>;\n options: SlicklessOptions;\n\n private originalChildren: HTMLElement[] = [];\n private slides: HTMLElement[] = [];\n private track!: HTMLElement;\n private viewport!: HTMLElement;\n private prevArrow: HTMLElement | null = null;\n private nextArrow: HTMLElement | null = null;\n private dotsList: HTMLElement | null = null;\n private cloneCount = 0;\n\n private currentIndex = 0;\n /** Track index we are animating toward. Lets layout reads use the future\n * slide for height-syncing while the transform is still in flight. */\n private animatingTo: number | null = null;\n private slideCount = 0;\n private animating = false;\n /** Last observed root width — used to ignore height-only ResizeObserver\n * fires (e.g. when adaptiveHeight changes the viewport height). */\n private lastRootWidth = 0;\n private destroyed = false;\n private currentBreakpoint: number | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private autoplayTimer: ReturnType<typeof setTimeout> | null = null;\n private autoplayPaused = false;\n private listeners: Map<string, Set<(detail: unknown) => void>> = new Map();\n private pointer: Pointer | null = null;\n private pointerHandlers: {\n down?: (e: Event) => void;\n move?: (e: Event) => void;\n up?: (e: Event) => void;\n cancel?: (e: Event) => void;\n } = {};\n private linkedNav: Slickless | null = null;\n private linkedFromExternal = false;\n\n constructor(root: string | HTMLElement, options: Partial<SlicklessOptions> = {}) {\n const el = typeof root === \"string\" ? document.querySelector<HTMLElement>(root) : root;\n if (!el) throw new Error(`[slickless] Root element not found: ${String(root)}`);\n this.root = el;\n this.userOptions = options;\n this.options = mergeOptions(DEFAULTS, options);\n this.init();\n }\n\n private init(): void {\n this.captureChildren();\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(this.options.initialSlide, true);\n if (this.options.autoplay) this.play();\n this.linkAsNavFor();\n (this.root as HTMLElement & { __slickless?: Slickless }).__slickless = this;\n this.root.classList.add(CLASS.initialized);\n // Defer the init event so callers can subscribe immediately after\n // `new Slickless(...)` returns.\n const emitInit = () => {\n if (!this.destroyed) this.emit(\"init\", { slickless: this });\n };\n if (typeof queueMicrotask === \"function\") queueMicrotask(emitInit);\n else Promise.resolve().then(emitInit);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) {\n this.root.appendChild(child);\n child.removeAttribute(\"aria-hidden\");\n child.removeAttribute(\"tabindex\");\n child.removeAttribute(\"role\");\n child.removeAttribute(\"aria-roledescription\");\n child.removeAttribute(\"aria-label\");\n child.style.cssText = \"\";\n }\n this.root.className = this.root.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"slickless\"))\n .join(\" \")\n .trim();\n this.root.removeAttribute(\"role\");\n this.root.removeAttribute(\"aria-roledescription\");\n this.root.removeAttribute(\"dir\");\n\n this.destroyed = true;\n this.emit(\"destroy\", { slickless: this });\n this.listeners.clear();\n }\n\n reInit(): void {\n const wasIndex = this.currentIndex;\n const wasAutoplaying = this.options.autoplay && !this.autoplayPaused;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) this.root.appendChild(child);\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(clamp(wasIndex, 0, this.slideCount - 1), true);\n if (wasAutoplaying) this.play();\n this.emit(\"reInit\", { slickless: this });\n }\n\n private captureChildren(): void {\n if (this.originalChildren.length === 0) {\n this.originalChildren = Array.from(this.root.children) as HTMLElement[];\n }\n }\n\n private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (this.options.infinite && !this.options.fade && this.slideCount > 0) {\n // For variableWidth we can't predict how many slides the viewport will\n // hold (each slide has its own intrinsic width), so clone the full set\n // at both ends. For fixed-width layouts, slidesToShow tells us exactly\n // how many neighbours need to be available beyond the current window.\n const desired = this.options.variableWidth\n ? this.slideCount\n : Math.max(this.options.slidesToShow, 1);\n this.cloneCount = Math.min(desired, this.slideCount);\n const head = realSlides.slice(-this.cloneCount).map((s) => this.cloneSlide(s));\n const tail = realSlides.slice(0, this.cloneCount).map((s) => this.cloneSlide(s));\n this.slides = [...head, ...realSlides, ...tail];\n } else {\n this.cloneCount = 0;\n this.slides = realSlides;\n }\n\n for (const slide of this.slides) this.track.appendChild(slide);\n this.viewport.appendChild(this.track);\n this.root.appendChild(this.viewport);\n\n if (this.options.arrows && this.slideCount > this.options.slidesToShow) {\n this.buildArrows();\n }\n if (this.options.dots && this.slideCount > 0) {\n this.buildDots();\n }\n\n this.applyLayout();\n this.applyLazyLoad();\n }\n\n private wrapAsSlide(child: HTMLElement, index: number): HTMLElement {\n const slide = createEl(\"div\", CLASS.slide, {\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": `${index + 1} of ${this.originalChildren.length}`,\n \"data-slick-index\": String(index),\n });\n slide.appendChild(child);\n return slide;\n }\n\n private cloneSlide(original: HTMLElement): HTMLElement {\n const clone = original.cloneNode(true) as HTMLElement;\n clone.classList.add(CLASS.slideCloned);\n clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n private indexToOffset(trackIndex: number): number {\n if (this.options.variableWidth) {\n let offset = 0;\n for (let i = 0; i < trackIndex; i++) {\n const s = this.slides[i];\n if (!s) continue;\n const r = s.getBoundingClientRect();\n offset += this.options.vertical ? r.height : r.width;\n }\n if (this.options.centerMode) {\n const focused = this.slides[trackIndex];\n if (focused) {\n const r = focused.getBoundingClientRect();\n offset -=\n (this.viewportSize() - (this.options.vertical ? r.height : r.width)) / 2;\n }\n }\n return offset;\n }\n const size = this.slideSize();\n let offset = trackIndex * size;\n if (this.options.centerMode) {\n offset -= (this.viewportSize() - size) / 2;\n } else if (!this.options.infinite && !this.options.fade) {\n // Don't translate past the end — keeps the last \"window\" of slides flush\n // with the viewport even when `goTo` targets a later index than fits.\n const maxOffset = Math.max(0, (this.slideCount - this.options.slidesToShow) * size);\n offset = Math.min(offset, maxOffset);\n }\n return offset;\n }\n\n private translateTo(offset: number, animate: boolean): void {\n const speed = animate ? this.effectiveSpeed() : 0;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transition = speed > 0 ? `transform ${speed}ms ${this.options.cssEase}` : \"\";\n this.track.style.transform = `translate${axis}(${dir * offset}px)`;\n }\n\n next(): void {\n this.goTo(this.currentIndex + this.options.slidesToScroll);\n }\n\n prev(): void {\n this.goTo(this.currentIndex - this.options.slidesToScroll);\n }\n\n goTo(index: number, immediate = false): void {\n if (this.destroyed) return;\n if (this.slideCount === 0) return;\n // Lock out new navigation while a transition is in flight. Rapid clicks\n // beyond the current animation are simply dropped — predictable beats\n // clever here.\n if (this.animating && !immediate) return;\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!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 this.options.autoplay = true;\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n\n pause(): void {\n this.autoplayPaused = true;\n if (this.autoplayTimer) {\n clearTimeout(this.autoplayTimer);\n this.autoplayTimer = null;\n }\n }\n\n private scheduleAutoplay(): void {\n if (!this.options.autoplay || this.autoplayPaused) return;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n this.autoplayTimer = setTimeout(() => {\n if (this.options.autoplayDirection === \"backward\") this.prev();\n else this.next();\n this.scheduleAutoplay();\n }, this.options.autoplaySpeed);\n }\n\n on<T = unknown>(event: string, handler: (detail: T) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(handler as (detail: unknown) => void);\n return () => set.delete(handler as (detail: unknown) => void);\n }\n\n off(event: string, handler: (detail: unknown) => void): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n private emit(event: string, detail: unknown): void {\n this.listeners.get(event)?.forEach((fn) => fn(detail));\n this.root.dispatchEvent(new CustomEvent(`slickless:${event}`, { detail, bubbles: false }));\n }\n\n private handlePrevClick = (e: Event): void => {\n e.preventDefault();\n this.prev();\n };\n\n private handleNextClick = (e: Event): void => {\n e.preventDefault();\n this.next();\n };\n\n private handleResize = (): void => {\n // Height-only changes (e.g. adaptiveHeight resizing the viewport) shouldn't\n // re-snap the track transform — that interrupts in-flight slide animations.\n const width = this.root.getBoundingClientRect().width;\n if (width === this.lastRootWidth) return;\n this.lastRootWidth = width;\n this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable) this.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 for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slickless.js","names":[],"sources":["../src/defaults.ts","../src/utils.ts","../src/slickless.ts","../src/index.ts"],"sourcesContent":["import type { SlicklessOptions } from \"./types\";\n\nexport const DEFAULTS: SlicklessOptions = {\n arrows: true,\n dots: false,\n autoplay: false,\n autoplaySpeed: 3000,\n speed: 400,\n cssEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n slidesToShow: 1,\n slidesToScroll: 1,\n infinite: true,\n fade: false,\n vertical: false,\n initialSlide: 0,\n variableWidth: false,\n centerMode: false,\n centerPadding: \"50px\",\n rtl: false,\n draggable: true,\n swipeThreshold: 24,\n pauseOnHover: true,\n pauseOnFocus: true,\n accessibility: true,\n adaptiveHeight: false,\n lazyLoad: false,\n respectReducedMotion: true,\n prevArrow: null,\n nextArrow: null,\n customPaging: null,\n ariaRoleDescription: \"carousel\",\n responsive: null,\n asNavFor: null,\n focusOnSelect: false,\n autoplayDirection: \"forward\",\n};\n\nexport function mergeOptions(\n base: SlicklessOptions,\n override: Partial<SlicklessOptions>,\n): SlicklessOptions {\n return { ...base, ...override };\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n }\n return el;\n}\n\nexport function ensureNumber(value: unknown, fallback: number): number {\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function resolveElement(\n selectorOrElement: string | HTMLElement | null,\n): HTMLElement | null {\n if (!selectorOrElement) return null;\n if (typeof selectorOrElement === \"string\") {\n return document.querySelector<HTMLElement>(selectorOrElement);\n }\n return selectorOrElement;\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(() => resolve(), 16);\n }\n });\n}\n","import { DEFAULTS, mergeOptions } from \"./defaults\";\nimport type {\n AfterChangeDetail,\n BeforeChangeDetail,\n BreakpointDetail,\n EdgeDetail,\n LazyLoadDetail,\n ResponsiveBreakpoint,\n SlicklessOptions,\n SwipeDetail,\n} from \"./types\";\nimport { clamp, createEl, mod, prefersReducedMotion, resolveElement } from \"./utils\";\n\ninterface Pointer {\n id: number;\n startX: number;\n startY: number;\n startTime: number;\n startTransform: number;\n active: boolean;\n decided: boolean;\n isHorizontal: boolean;\n}\n\nconst CLASS = {\n root: \"slickless\",\n initialized: \"slickless--initialized\",\n viewport: \"slickless__viewport\",\n track: \"slickless__track\",\n slide: \"slickless__slide\",\n slideActive: \"slickless__slide--active\",\n slideCenter: \"slickless__slide--center\",\n slideCloned: \"slickless__slide--cloned\",\n slideCurrent: \"slickless__slide--current\",\n arrow: \"slickless__arrow\",\n arrowPrev: \"slickless__arrow--prev\",\n arrowNext: \"slickless__arrow--next\",\n arrowDisabled: \"slickless__arrow--disabled\",\n dots: \"slickless__dots\",\n dot: \"slickless__dot\",\n dotBullet: \"slickless__dot--bullet\",\n dotActive: \"slickless__dot--active\",\n vertical: \"slickless--vertical\",\n fade: \"slickless--fade\",\n rtl: \"slickless--rtl\",\n dragging: \"slickless--dragging\",\n centerMode: \"slickless--center\",\n adaptive: \"slickless--adaptive-height\",\n};\n\nexport class Slickless {\n readonly root: HTMLElement;\n private userOptions: Partial<SlicklessOptions>;\n options: SlicklessOptions;\n\n private originalChildren: HTMLElement[] = [];\n private slides: HTMLElement[] = [];\n private track!: HTMLElement;\n private viewport!: HTMLElement;\n private prevArrow: HTMLElement | null = null;\n private nextArrow: HTMLElement | null = null;\n private dotsList: HTMLElement | null = null;\n private cloneCount = 0;\n\n private currentIndex = 0;\n /** Track index we are animating toward. Lets layout reads use the future\n * slide for height-syncing while the transform is still in flight. */\n private animatingTo: number | null = null;\n private slideCount = 0;\n private animating = false;\n /** Last observed root width — used to ignore height-only ResizeObserver\n * fires (e.g. when adaptiveHeight changes the viewport height). */\n private lastRootWidth = 0;\n private destroyed = false;\n private currentBreakpoint: number | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private autoplayTimer: ReturnType<typeof setTimeout> | null = null;\n private autoplayPaused = false;\n private listeners: Map<string, Set<(detail: unknown) => void>> = new Map();\n private pointer: Pointer | null = null;\n private pointerHandlers: {\n down?: (e: Event) => void;\n move?: (e: Event) => void;\n up?: (e: Event) => void;\n cancel?: (e: Event) => void;\n } = {};\n private linkedNav: Slickless | null = null;\n private linkedFromExternal = false;\n\n constructor(root: string | HTMLElement, options: Partial<SlicklessOptions> = {}) {\n const el = typeof root === \"string\" ? document.querySelector<HTMLElement>(root) : root;\n if (!el) throw new Error(`[slickless] Root element not found: ${String(root)}`);\n this.root = el;\n this.userOptions = options;\n this.options = mergeOptions(DEFAULTS, options);\n this.init();\n }\n\n private init(): void {\n this.captureChildren();\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(this.options.initialSlide, true);\n if (this.options.autoplay) this.play();\n this.linkAsNavFor();\n (this.root as HTMLElement & { __slickless?: Slickless }).__slickless = this;\n this.root.classList.add(CLASS.initialized);\n // Defer the init event so callers can subscribe immediately after\n // `new Slickless(...)` returns.\n const emitInit = () => {\n if (!this.destroyed) this.emit(\"init\", { slickless: this });\n };\n if (typeof queueMicrotask === \"function\") queueMicrotask(emitInit);\n else Promise.resolve().then(emitInit);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) {\n this.root.appendChild(child);\n child.removeAttribute(\"aria-hidden\");\n child.removeAttribute(\"tabindex\");\n child.removeAttribute(\"role\");\n child.removeAttribute(\"aria-roledescription\");\n child.removeAttribute(\"aria-label\");\n child.style.cssText = \"\";\n }\n this.root.className = this.root.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"slickless\"))\n .join(\" \")\n .trim();\n this.root.removeAttribute(\"role\");\n this.root.removeAttribute(\"aria-roledescription\");\n this.root.removeAttribute(\"dir\");\n\n this.destroyed = true;\n this.emit(\"destroy\", { slickless: this });\n this.listeners.clear();\n }\n\n reInit(): void {\n const wasIndex = this.currentIndex;\n const wasAutoplaying = this.options.autoplay && !this.autoplayPaused;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) this.root.appendChild(child);\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(clamp(wasIndex, 0, this.slideCount - 1), true);\n if (wasAutoplaying) this.play();\n this.emit(\"reInit\", { slickless: this });\n }\n\n private captureChildren(): void {\n if (this.originalChildren.length === 0) {\n this.originalChildren = Array.from(this.root.children) as HTMLElement[];\n }\n }\n\n private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (\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 clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n /**\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 this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable) this.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 for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":";AAEA,IAAa,IAA6B;CACxC,QAAQ;CACR,MAAM;CACN,UAAU;CACV,eAAe;CACf,OAAO;CACP,SAAS;CACT,cAAc;CACd,gBAAgB;CAChB,UAAU;CACV,MAAM;CACN,UAAU;CACV,cAAc;CACd,eAAe;CACf,YAAY;CACZ,eAAe;CACf,KAAK;CACL,WAAW;CACX,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,sBAAsB;CACtB,WAAW;CACX,WAAW;CACX,cAAc;CACd,qBAAqB;CACrB,YAAY;CACZ,UAAU;CACV,eAAe;CACf,mBAAmB;AACrB;AAEA,SAAgB,EACd,GACA,GACkB;CAClB,OAAO;EAAE,GAAG;EAAM,GAAG;CAAS;AAChC;;;AC1CA,SAAgB,EAAM,GAAe,GAAa,GAAqB;CACrE,OAAO,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,CAAK,CAAC;AAC3C;AAEA,SAAgB,EAAI,GAAW,GAAmB;CAChD,QAAS,IAAI,IAAK,KAAK;AACzB;AAEA,SAAgB,IAAgC;CAE9C,OADI,OAAO,SAAW,OAAe,CAAC,OAAO,aAAmB,KACzD,OAAO,WAAW,kCAAkC,EAAE;AAC/D;AAEA,SAAgB,EACd,GACA,GACA,GAC0B;CAC1B,IAAM,IAAK,SAAS,cAAc,CAAG;CAErC,IADI,MAAW,EAAG,YAAY,IAC1B,GACF,KAAK,IAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAK,GAAG,EAAG,aAAa,GAAG,CAAC;CAElE,OAAO;AACT;AAOA,SAAgB,EACd,GACoB;CAKpB,OAJK,IACD,OAAO,KAAsB,WACxB,SAAS,cAA2B,CAAiB,IAEvD,IAJwB;AAKjC;;;ACfA,IAAM,IAAQ;CACZ,MAAM;CACN,aAAa;CACb,UAAU;CACV,OAAO;CACP,OAAO;CACP,aAAa;CACb,aAAa;CACb,aAAa;CACb,cAAc;CACd,OAAO;CACP,WAAW;CACX,WAAW;CACX,eAAe;CACf,MAAM;CACN,KAAK;CACL,WAAW;CACX,WAAW;CACX,UAAU;CACV,MAAM;CACN,KAAK;CACL,UAAU;CACV,YAAY;CACZ,UAAU;AACZ,GAEa,IAAb,MAAuB;CAuCrB,YAAY,GAA4B,IAAqC,CAAC,GAAG;0BAlCvC,CAAC,iBACX,CAAC,oBAGO,uBACA,sBACD,wBAClB,uBAEE,sBAGc,wBAChB,oBACD,yBAGI,oBACJ,6BACuB,4BACK,2BACc,4BACrC,qCACwC,IAAI,IAAI,kBACvC,6BAM9B,CAAC,oBACiC,gCACT,4BA6lBF,MAAmB;GAE5C,AADA,EAAE,eAAe,GACjB,KAAK,KAAK;EACZ,2BAE2B,MAAmB;GAE5C,AADA,EAAE,eAAe,GACjB,KAAK,KAAK;EACZ,6BAEmC;GAGjC,IAAM,IAAQ,KAAK,KAAK,sBAAsB,EAAE;GAC5C,MAAU,KAAK,kBACnB,KAAK,gBAAgB,GACrB,KAAK,gBAAgB,GACrB,KAAK,YAAY;EACnB,qBAEqB,MAA2B;GACzC,KAAK,QAAQ,kBACd,EAAE,QAAQ,eACZ,EAAE,eAAe,GACb,KAAK,QAAQ,MAAK,KAAK,KAAK,IAC3B,KAAK,KAAK,KACN,EAAE,QAAQ,gBACnB,EAAE,eAAe,GACb,KAAK,QAAQ,MAAK,KAAK,KAAK,IAC3B,KAAK,KAAK,KACN,EAAE,QAAQ,UACnB,EAAE,eAAe,GACjB,KAAK,KAAK,CAAC,KACF,EAAE,QAAQ,UACnB,EAAE,eAAe,GACjB,KAAK,KAAK,KAAK,aAAa,CAAC;EAEjC,iCAEuC;GACrC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IAClB,KAAK,iBAAe,aAAa,KAAK,aAAa;EAE3D,iCAEuC;GACrC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;EAE1B,8BAEoC;GAClC,AAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAC5C,KAAK,iBAAiB,IAClB,KAAK,iBAAe,aAAa,KAAK,aAAa;EAE3D,0BAE0B,MAAwB;GAChD,IAAI,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,UAAU;IACtD,IAAM,IAAO,EAAE;IACf,CAAI,CAAC,KAAQ,CAAC,KAAK,KAAK,SAAS,CAAI,OACnC,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;GAE1B;EACF;EA9pBE,IAAM,IAAK,OAAO,KAAS,WAAW,SAAS,cAA2B,CAAI,IAAI;EAClF,IAAI,CAAC,GAAI,MAAU,MAAM,uCAAuC,OAAO,CAAI,GAAG;EAI9E,AAHA,KAAK,OAAO,GACZ,KAAK,cAAc,GACnB,KAAK,UAAU,EAAa,GAAU,CAAO,GAC7C,KAAK,KAAK;CACZ;CAEA,OAAqB;EASnB,AARA,KAAK,gBAAgB,GACrB,KAAK,gBAAgB,GACrB,KAAK,MAAM,GACX,KAAK,WAAW,GAChB,KAAK,KAAK,KAAK,QAAQ,cAAc,EAAI,GACrC,KAAK,QAAQ,YAAU,KAAK,KAAK,GACrC,KAAK,aAAa,GAClB,KAAM,KAAmD,cAAc,MACvE,KAAK,KAAK,UAAU,IAAI,EAAM,WAAW;EAGzC,IAAM,UAAiB;GACrB,AAAK,KAAK,aAAW,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;EAC5D;EACA,AAAI,OAAO,kBAAmB,aAAY,eAAe,CAAQ,IAC5D,QAAQ,QAAQ,EAAE,KAAK,CAAQ;CACtC;CAEA,UAAgB;EACV,UAAK,WAKT;GAJA,KAAK,MAAM,GACX,KAAK,aAAa,GACd,KAAK,kBAAgB,KAAK,eAAe,WAAW,GAExD,KAAK,KAAK,YAAY;GACtB,KAAK,IAAM,KAAS,KAAK,kBAOvB,AANA,KAAK,KAAK,YAAY,CAAK,GAC3B,EAAM,gBAAgB,aAAa,GACnC,EAAM,gBAAgB,UAAU,GAChC,EAAM,gBAAgB,MAAM,GAC5B,EAAM,gBAAgB,sBAAsB,GAC5C,EAAM,gBAAgB,YAAY,GAClC,EAAM,MAAM,UAAU;GAaxB,AAXA,KAAK,KAAK,YAAY,KAAK,KAAK,UAC7B,MAAM,KAAK,EACX,QAAQ,MAAM,CAAC,EAAE,WAAW,WAAW,CAAC,EACxC,KAAK,GAAG,EACR,KAAK,GACR,KAAK,KAAK,gBAAgB,MAAM,GAChC,KAAK,KAAK,gBAAgB,sBAAsB,GAChD,KAAK,KAAK,gBAAgB,KAAK,GAE/B,KAAK,YAAY,IACjB,KAAK,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC,GACxC,KAAK,UAAU,MAAM;EArBC;CAsBxB;CAEA,SAAe;EACb,IAAM,IAAW,KAAK,cAChB,IAAiB,KAAK,QAAQ,YAAY,CAAC,KAAK;EAItD,AAHA,KAAK,MAAM,GACX,KAAK,aAAa,GACd,KAAK,kBAAgB,KAAK,eAAe,WAAW,GACxD,KAAK,KAAK,YAAY;EACtB,KAAK,IAAM,KAAS,KAAK,kBAAkB,KAAK,KAAK,YAAY,CAAK;EAOtE,AANA,KAAK,UAAU,EAAa,GAAU,KAAK,WAAW,GACtD,KAAK,gBAAgB,GACrB,KAAK,MAAM,GACX,KAAK,WAAW,GAChB,KAAK,KAAK,EAAM,GAAU,GAAG,KAAK,aAAa,CAAC,GAAG,EAAI,GACnD,KAAgB,KAAK,KAAK,GAC9B,KAAK,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;CACzC;CAEA,kBAAgC;EAC9B,AAAI,KAAK,iBAAiB,WAAW,MACnC,KAAK,mBAAmB,MAAM,KAAK,KAAK,KAAK,QAAQ;CAEzD;CAEA,kBAAgC;EAC9B,IAAM,IAAa,KAAK,QAAQ;EAEhC,IADI,CAAC,KAAc,EAAW,WAAW,KACrC,OAAO,SAAW,KAAa;EACnC,IAAM,IAAQ,OAAO,YACf,IAAiC,CAAC,GAAG,CAAU,EAAE,MACpD,GAAG,MAAM,EAAE,aAAa,EAAE,UAC7B,GACI,IAAsC;EAC1C,KAAK,IAAM,KAAQ,GACjB,IAAI,KAAS,EAAK,YAAY;GAC5B,IAAS;GACT;EACF;EAEF,IAAM,IAAQ,IAAS,EAAO,aAAa;EAC3C,IAAI,MAAU,KAAK,mBAAmB;EAEtC,IADA,KAAK,oBAAoB,GACrB,GAAQ;GACV,IAAI,EAAO,aAAa,WAAW;IACjC,KAAK,QAAQ;IACb;GACF;GACA,KAAK,UAAU,EAAa,EAAa,GAAU,KAAK,WAAW,GAAG,EAAO,QAAQ;EACvF,OACE,KAAK,UAAU,EAAa,GAAU,KAAK,WAAW;EAExD,IAAM,IAA2B,EAAE,YAAY,EAAM;EACrD,KAAK,KAAK,cAAc,CAAM;CAChC;CAEA,QAAsB;EAmBpB,AAlBA,KAAK,KAAK,YAAY,IACtB,KAAK,KAAK,UAAU,IAAI,EAAM,IAAI,GAClC,KAAK,KAAK,UAAU,OAAO,EAAM,UAAU,KAAK,QAAQ,QAAQ,GAChE,KAAK,KAAK,UAAU,OAAO,EAAM,MAAM,KAAK,QAAQ,IAAI,GACxD,KAAK,KAAK,UAAU,OAAO,EAAM,KAAK,KAAK,QAAQ,GAAG,GACtD,KAAK,KAAK,UAAU,OAAO,EAAM,YAAY,KAAK,QAAQ,UAAU,GACpE,KAAK,KAAK,UAAU,OAAO,EAAM,UAAU,KAAK,QAAQ,cAAc,GAGtE,KAAK,KAAK,MAAM,YACd,mCACA,GAAG,KAAK,eAAe,EAAE,GAC3B,GACA,KAAK,KAAK,aAAa,QAAQ,QAAQ,GACvC,KAAK,KAAK,aAAa,wBAAwB,KAAK,QAAQ,mBAAmB,GAC3E,KAAK,QAAQ,OAAK,KAAK,KAAK,aAAa,OAAO,KAAK,GAEzD,KAAK,WAAW,EAAS,OAAO,EAAM,QAAQ,GAC9C,KAAK,QAAQ,EAAS,OAAO,EAAM,OAAO,EAAE,MAAM,eAAe,CAAC;EAElE,IAAM,IAAa,KAAK,iBAAiB,KAAK,GAAO,MAAM,KAAK,YAAY,GAAO,CAAC,CAAC;EAGrF,IAFA,KAAK,aAAa,EAAW,QAG3B,KAAK,QAAQ,YACb,CAAC,KAAK,QAAQ,QACd,KAAK,aAAa,KAClB,CAAC,KAAK,aAAa,GACnB;GAKA,IAAM,IAAU,KAAK,QAAQ,gBACzB,KAAK,aACL,KAAK,IAAI,KAAK,QAAQ,cAAc,CAAC;GACzC,KAAK,aAAa,KAAK,IAAI,GAAS,KAAK,UAAU;GACnD,IAAM,IAAO,EAAW,MAAM,CAAC,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK,WAAW,CAAC,CAAC,GACvE,IAAO,EAAW,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK,WAAW,CAAC,CAAC;GAC/E,KAAK,SAAS;IAAC,GAAG;IAAM,GAAG;IAAY,GAAG;GAAI;EAChD,OAEE,AADA,KAAK,aAAa,GAClB,KAAK,SAAS;EAGhB,KAAK,IAAM,KAAS,KAAK,QAAQ,KAAK,MAAM,YAAY,CAAK;EAa7D,AAZA,KAAK,SAAS,YAAY,KAAK,KAAK,GACpC,KAAK,KAAK,YAAY,KAAK,QAAQ,GAE/B,KAAK,QAAQ,UAAU,KAAK,aAAa,KAAK,QAAQ,gBACxD,KAAK,YAAY,GAGf,KAAK,QAAQ,QAAQ,CAAC,KAAK,aAAa,KAC1C,KAAK,UAAU,GAGjB,KAAK,YAAY,GACjB,KAAK,cAAc;CACrB;CAEA,YAAoB,GAAoB,GAA4B;EAClE,IAAM,IAAQ,EAAS,OAAO,EAAM,OAAO;GACzC,MAAM;GACN,wBAAwB;GACxB,cAAc,GAAG,IAAQ,EAAE,MAAM,KAAK,iBAAiB;GACvD,oBAAoB,OAAO,CAAK;EAClC,CAAC;EAED,OADA,EAAM,YAAY,CAAK,GAChB;CACT;CAEA,WAAmB,GAAoC;EACrD,IAAM,IAAQ,EAAS,UAAU,EAAI;EAIrC,OAHA,EAAM,UAAU,IAAI,EAAM,WAAW,GACrC,EAAM,aAAa,eAAe,MAAM,GACxC,EAAM,aAAa,YAAY,IAAI,GAC5B;CACT;CAEA,cAA4B;EAC1B,IAAM,IAAW,KAAK,QAAQ,WACxB,IAAW,KAAK,QAAQ;EAM9B,AALA,KAAK,YAAY,KAAK,aAAa,GAAU,MAAM,GACnD,KAAK,YAAY,KAAK,aAAa,GAAU,MAAM,GACnD,KAAK,KAAK,YAAY,KAAK,SAAS,GACpC,KAAK,KAAK,YAAY,KAAK,SAAS,GACpC,KAAK,UAAU,iBAAiB,SAAS,KAAK,eAAe,GAC7D,KAAK,UAAU,iBAAiB,SAAS,KAAK,eAAe;CAC/D;CAEA,aAAqB,GAAqC,GAAmC;EAC3F,IAAI;EACJ,IAAI,aAAkB,aACpB,IAAK,EAAO,UAAU,EAAI;OACrB,IAAI,OAAO,KAAW,YAAY,EAAO,KAAK,GAAG;GACtD,IAAM,IAAM,SAAS,cAAc,KAAK;GAExC,AADA,EAAI,YAAY,EAAO,KAAK,GAC5B,IAAM,EAAI,qBAAqC,EAAS,QAAQ;EAClE,OAEE,AADA,IAAK,EAAS,UAAU,IAAI,EAAE,MAAM,SAAS,CAAC,GAC9C,EAAG,YACD,MAAQ,SACJ,mMACA;EAKR,OAHA,EAAG,UAAU,IAAI,EAAM,OAAO,MAAQ,SAAS,EAAM,YAAY,EAAM,SAAS,GAChF,EAAG,aAAa,cAAc,MAAQ,SAAS,mBAAmB,YAAY,GAC1E,EAAG,YAAY,YAAU,EAAG,aAAa,QAAQ,QAAQ,GACtD;CACT;CAEA,YAA0B;EACxB,KAAK,WAAW,EAAS,MAAM,EAAM,MAAM,EAAE,MAAM,UAAU,CAAC;EAC9D,IAAM,IAAY,KAAK,UAAU;EACjC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAW,KAAK;GAClC,IAAM,IAAK,EAAS,MAAM,IAAI,EAAE,MAAM,eAAe,CAAC,GAChD,IAAS,IAAI,KAAK,QAAQ,gBAE1B,IADgB,KAAK,QAAQ,eAE/B,KAAK,QAAQ,aAAc,GAAG,CAAS,IACvC,EAAS,UAAU,GAAG,EAAM,IAAI,GAAG,EAAM,aAAa;IACpD,MAAM;IACN,cAAc,eAAe,IAAI;IACjC,MAAM;GACR,CAAC,GACC,IAAS,OAAO,KAAU,WAAW,KAAK,cAAc,CAAK,IAAI;GAOvE,AAJA,EAAO,UAAU,IAAI,EAAM,GAAG,GAC9B,EAAO,aAAa,qBAAqB,OAAO,CAAM,CAAC,GACvD,EAAO,iBAAiB,eAAe,KAAK,KAAK,CAAM,CAAC,GACxD,EAAG,YAAY,CAAM,GACrB,KAAK,SAAS,YAAY,CAAE;EAC9B;EACA,KAAK,KAAK,YAAY,KAAK,QAAQ;CACrC;CAEA,cAAsB,GAA2B;EAC/C,IAAM,IAAM,SAAS,cAAc,KAAK;EACxC,EAAI,YAAY,EAAK,KAAK;EAC1B,IAAM,IAAK,EAAI;EACf,IAAI,GAAI,OAAO;EACf,IAAM,IAAM,EAAS,UAAU,IAAI,EAAE,MAAM,SAAS,CAAC;EAErD,OADA,EAAI,cAAc,GACX;CACT;CAEA,eAA+B;EAC7B,IAAM,IAAO,KAAK,SAAS,sBAAsB;EACjD,OAAO,KAAK,QAAQ,WAAW,EAAK,SAAS,EAAK;CACpD;CAEA,YAA4B;EAC1B,IAAI,KAAK,QAAQ,eAAe;GAC9B,IAAM,IAAO,KAAK,OAAO,KAAK;GAC9B,IAAI,GAAM;IACR,IAAM,IAAI,EAAK,sBAAsB;IACrC,OAAO,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE;GAC9C;EACF;EACA,IAAM,IAAK,KAAK,aAAa;EAC7B,IAAI,KAAK,QAAQ,YAAY;GAG3B,IAAM,IAAM,KAAK,mBAAmB,CAAE;GACtC,OAAO,KAAK,IAAI,IAAI,IAAK,IAAI,KAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,CAAC;EAC5E;EACA,OAAO,IAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY;CACnD;CAMA,mBAA2B,GAA8B;EACvD,IAAM,KAAO,KAAK,QAAQ,iBAAiB,IAAI,KAAK;EACpD,IAAI,CAAC,GAAK,OAAO;EACjB,IAAM,IAAQ,gCAAgC,KAAK,CAAG;EACtD,IAAI,CAAC,KAAS,EAAM,OAAO,KAAA,GAAW,OAAO;EAC7C,IAAM,IAAQ,WAAW,EAAM,EAAE;EAGjC,OAFI,CAAC,OAAO,SAAS,CAAK,KAAK,IAAQ,IAAU,KACpC,EAAM,MAAM,UACT,MAAO,IAAQ,MAAO,IAAe;CACvD;CAEA,cAA4B;EAC1B,IAAI,KAAK,eAAe,GAAG;EAG3B,IAFW,KAAK,aAAa,GAEzB,KAAK,QAAQ,MAAM;GACrB,KAAK,MAAM,MAAM,YAAY;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;IAC3C,IAAM,IAAQ,KAAK,OAAO;IACrB,MACL,EAAM,MAAM,WAAW,YACvB,EAAM,MAAM,MAAM,KAClB,EAAM,MAAM,OAAO,KACnB,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,UAAU,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,MAAM,KAC7E,EAAM,MAAM,SAAS,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,MAAM,KAC5E,EAAM,MAAM,aAAa,WAAW,KAAK,eAAe,EAAE,KAAK,KAAK,QAAQ,WAC5E,EAAM,MAAM,gBACV,MAAM,KAAK,iBAAiB,KAAK,YAAY,IAAI,SAAS;GAC9D;GAGA,AAFA,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW;GAChB;EACF;EAIA,IAAM,IAAY,KAAK,QAAQ,gBAAgB,OAAO,KAAK,UAAU;EAErE,KAAK,IAAM,KAAS,KAAK,QASvB,AARA,EAAM,MAAM,WAAW,IACvB,EAAM,MAAM,MAAM,IAClB,EAAM,MAAM,OAAO,IACnB,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,UAAU,IACtB,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,aAAa,IACzB,EAAM,MAAM,gBAAgB,IACxB,MAAc,SACZ,KAAK,QAAQ,YACf,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,GAAG,EAAU,QAElC,EAAM,MAAM,SAAS,IACrB,EAAM,MAAM,QAAQ,GAAG,EAAU;EASvC,AAJA,KAAK,YAAY,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,GAAG,EAAK,GACpF,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW,GAChB,KAAK,qBAAqB;CAC5B;CAEA,iBAAiC;EAE/B,OADI,KAAK,QAAQ,wBAAwB,EAAqB,IAAU,IACjE,KAAK,QAAQ;CACtB;CAOA,eAAgC;EAE9B,OADI,KAAK,QAAQ,gBAAsB,KAChC,KAAK,aAAa,KAAK,KAAK,cAAc,KAAK,QAAQ;CAChE;CAEA,cAAsB,GAA4B;EAIhD,IAAI,KAAK,aAAa,KAAK,CAAC,KAAK,QAAQ,YAAY,OAAO;EAC5D,IAAI,KAAK,QAAQ,eAAe;GAC9B,IAAI,IAAS;GACb,KAAK,IAAI,IAAI,GAAG,IAAI,GAAY,KAAK;IACnC,IAAM,IAAI,KAAK,OAAO;IACtB,IAAI,CAAC,GAAG;IACR,IAAM,IAAI,EAAE,sBAAsB;IAClC,KAAU,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE;GACjD;GACA,IAAI,KAAK,QAAQ,YAAY;IAC3B,IAAM,IAAU,KAAK,OAAO;IAC5B,IAAI,GAAS;KACX,IAAM,IAAI,EAAQ,sBAAsB;KACxC,MACG,KAAK,aAAa,KAAK,KAAK,QAAQ,WAAW,EAAE,SAAS,EAAE,UAAU;IAC3E;GACF;GACA,OAAO;EACT;EACA,IAAM,IAAO,KAAK,UAAU,GACxB,IAAS,IAAa;EAC1B,IAAI,KAAK,QAAQ,YACf,MAAW,KAAK,aAAa,IAAI,KAAQ;OACpC,IAAI,CAAC,KAAK,QAAQ,YAAY,CAAC,KAAK,QAAQ,MAAM;GAGvD,IAAM,IAAY,KAAK,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,gBAAgB,CAAI;GAClF,IAAS,KAAK,IAAI,GAAQ,CAAS;EACrC;EACA,OAAO;CACT;CAEA,YAAoB,GAAgB,GAAwB;EAC1D,IAAM,IAAQ,IAAU,KAAK,eAAe,IAAI,GAC1C,IAAO,KAAK,QAAQ,WAAW,MAAM,KACrC,IAAM,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;EAE7D,AADA,KAAK,MAAM,MAAM,aAAa,IAAQ,IAAI,aAAa,EAAM,KAAK,KAAK,QAAQ,YAAY,IAC3F,KAAK,MAAM,MAAM,YAAY,YAAY,EAAK,GAAG,IAAM,EAAO;CAChE;CAEA,OAAa;EACX,KAAK,KAAK,KAAK,eAAe,KAAK,QAAQ,cAAc;CAC3D;CAEA,OAAa;EACX,KAAK,KAAK,KAAK,eAAe,KAAK,QAAQ,cAAc;CAC3D;CAEA,KAAK,GAAe,IAAY,IAAa;EAM3C,IALI,KAAK,aACL,KAAK,eAAe,KAIpB,KAAK,aAAa,CAAC,GAAW;EAOlC,AAAI,KAAK,QAAQ,YAAY,CAAC,KAAK,kBACjC,KAAK,iBAAiB;EAGxB,IAAI,IAAS,GACP,IAAc,KAAK,QAAQ,YAAY,CAAC,KAAK,QAAQ;EAE3D,IAAK,KAAK,QAAQ,UAgBX,AAAI,KAAK,QAAQ,SAGtB,IAAS,EAAI,GAAQ,KAAK,UAAU;OAnBV;GAO1B,IAAM,IAAW,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC;GAKhD,AAJI,IAAS,MACX,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,QAAQ,MAAM,UAAU,OAAO,CAAsB,GACzF,IAAS,IAEP,IAAS,MACX,KAAK,KAAK,QAAQ,EAAE,WAAW,KAAK,QAAQ,MAAM,SAAS,QAAQ,CAAsB,GACzF,IAAS;EAEb;EAOA,IAAM,IAA6B;GACjC,cAFe,KAAK;GAGpB,WAAW,IAAc,EAAI,GAAQ,KAAK,UAAU,IAAI;EAC1D;EAGA,IAFA,KAAK,KAAK,gBAAgB,CAAM,GAE5B,KAAK,QAAQ,MAAM;GAIrB,AADA,KAAK,eAAe,GACpB,KAAK,YAAY;GACjB,IAAM,IAA2B,EAAE,cAAc,KAAK,aAAa;GAGnE,AAFA,KAAK,KAAK,eAAe,CAAK,GAC9B,KAAK,cAAc,GACnB,KAAK,aAAa;GAClB;EACF;EAIA,KAAK,YAAY;EACjB,IAAM,IAAa,IAAS,KAAK;EACjC,KAAK,cAAc;EACnB,IAAM,IAAS,KAAK,cAAc,CAAU;EAY5C,AAXA,KAAK,YAAY,GAAQ,CAAC,CAAS,GAInC,KAAK,qBAAqB,CAAU,GAIpC,KAAK,iBAAiB,CAAU,GAGhC,KAAK,WAAW,IAAc,EAAI,GAAQ,KAAK,UAAU,IAAI,CAAM;EAEnE,IAAI,IAAW,IACT,UAAe;GACnB,IAAI,GAAU;GAOd,IANA,IAAW,IACX,KAAK,YAAY,IAKb,GAAa;IACf,IAAM,IAAU,EAAI,GAAQ,KAAK,UAAU,GACrC,IAAY,MAAY;IAE9B,IADA,KAAK,eAAe,GAChB,GAAW;KACb,IAAM,IAAgB,IAAU,KAAK;KAKrC,AADA,KAAK,oCAAoC,GACzC,KAAK,YAAY,KAAK,cAAc,CAAa,GAAG,EAAK;IAC3D;GACF,OACE,KAAK,eAAe;GAKtB,AAHA,KAAK,cAAc,MACnB,KAAK,WAAW,GAChB,KAAK,aAAa,GAClB,KAAK,WAAW;GAChB,IAAM,IAA2B,EAAE,cAAc,KAAK,aAAa;GAGnE,AAFA,KAAK,KAAK,eAAe,CAAK,GAC9B,KAAK,cAAc,GACnB,KAAK,aAAa;EACpB;EAEA,IAAI,KAAa,KAAK,eAAe,MAAM,GACzC,EAAO;OACF;GACL,IAAM,KAAS,MAAuB;IAKhC,EAAE,WAAW,KAAK,SAClB,EAAE,iBAAiB,gBACvB,KAAK,MAAM,oBAAoB,iBAAiB,CAAK,GACrD,EAAO;GACT;GAEA,AADA,KAAK,MAAM,iBAAiB,iBAAiB,CAAK,GAClD,iBAAiB;IACf,AAAI,KAAK,cACP,KAAK,MAAM,oBAAoB,iBAAiB,CAAK,GACrD,EAAO;GAEX,GAAG,KAAK,eAAe,IAAI,EAAE;EAC/B;CACF;CAEA,OAAa;EACP,KAAK,aAEL,KAAK,aAAa,MACtB,KAAK,QAAQ,WAAW,IACxB,KAAK,iBAAiB,IACtB,KAAK,iBAAiB;CACxB;CAEA,QAAc;EAEZ,AADA,KAAK,iBAAiB,IACtB,AAEE,KAAK,mBADL,aAAa,KAAK,aAAa,GACV;CAEzB;CAEA,mBAAiC;EAC3B,CAAC,KAAK,QAAQ,YAAY,KAAK,mBAC/B,KAAK,iBAAe,aAAa,KAAK,aAAa,GACvD,KAAK,gBAAgB,iBAAiB;GAGpC,AAFI,KAAK,QAAQ,sBAAsB,aAAY,KAAK,KAAK,IACxD,KAAK,KAAK,GACf,KAAK,iBAAiB;EACxB,GAAG,KAAK,QAAQ,aAAa;CAC/B;CAEA,GAAgB,GAAe,GAA0C;EACvE,AAAK,KAAK,UAAU,IAAI,CAAK,KAAG,KAAK,UAAU,IAAI,mBAAO,IAAI,IAAI,CAAC;EACnE,IAAM,IAAM,KAAK,UAAU,IAAI,CAAK;EAEpC,OADA,EAAI,IAAI,CAAoC,SAC/B,EAAI,OAAO,CAAoC;CAC9D;CAEA,IAAI,GAAe,GAA0C;EAC3D,KAAK,UAAU,IAAI,CAAK,GAAG,OAAO,CAAO;CAC3C;CAEA,KAAa,GAAe,GAAuB;EAEjD,AADA,KAAK,UAAU,IAAI,CAAK,GAAG,SAAS,MAAO,EAAG,CAAM,CAAC,GACrD,KAAK,KAAK,cAAc,IAAI,YAAY,aAAa,KAAS;GAAE;GAAQ,SAAS;EAAM,CAAC,CAAC;CAC3F;CAwEA,aAA2B;EAgBzB,AAfA,KAAK,KAAK,iBAAiB,WAAW,KAAK,SAAS,GACpD,KAAK,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GAC9D,KAAK,KAAK,iBAAiB,cAAc,KAAK,gBAAgB,GAC9D,KAAK,KAAK,iBAAiB,WAAW,KAAK,aAAa,GACxD,KAAK,KAAK,iBAAiB,YAAY,KAAK,cAAc,GAC1D,KAAK,KAAK,aAAa,YAAY,GAAG,GAElC,OAAO,iBAAmB,OAC5B,KAAK,iBAAiB,IAAI,qBAAqB,KAAK,aAAa,CAAC,GAClE,KAAK,eAAe,QAAQ,KAAK,IAAI,KAC5B,OAAO,SAAW,OAC3B,OAAO,iBAAiB,UAAU,KAAK,YAAY,GAGjD,KAAK,QAAQ,aAAW,KAAK,kBAAkB,GAC/C,KAAK,QAAQ,iBAAe,KAAK,kBAAkB;CACzD;CAEA,eAA6B;EAU3B,AATA,KAAK,KAAK,oBAAoB,WAAW,KAAK,SAAS,GACvD,KAAK,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GACjE,KAAK,KAAK,oBAAoB,cAAc,KAAK,gBAAgB,GACjE,KAAK,KAAK,oBAAoB,WAAW,KAAK,aAAa,GAC3D,KAAK,KAAK,oBAAoB,YAAY,KAAK,cAAc,GACzD,OAAO,SAAW,OACpB,OAAO,oBAAoB,UAAU,KAAK,YAAY,GACpD,KAAK,aAAW,KAAK,UAAU,oBAAoB,SAAS,KAAK,eAAe,GAChF,KAAK,aAAW,KAAK,UAAU,oBAAoB,SAAS,KAAK,eAAe,GACpF,KAAK,oBAAoB;CAC3B;CAEA,oBAAkC;EAKhC,IAAM,UAA+B,CAAC,KAAK,QAAQ,MAE7C,KAAU,MAAoB;GAElC,IADI,KAAK,aACL,EAAE,WAAW,KAAA,KAAa,EAAE,WAAW,GAAG;GAC9C,IAAM,IAAiB,EAAc,IAAI,KAAK,eAAe,IAAI;GAYjE,AAXA,KAAK,UAAU;IACb,IAAI,EAAE;IACN,QAAQ,EAAE;IACV,QAAQ,EAAE;IACV,WAAW,YAAY,IAAI;IAC3B;IACA,QAAQ;IACR,SAAS;IACT,cAAc,CAAC,KAAK,QAAQ;GAC9B,GACI,EAAc,MAAG,KAAK,MAAM,MAAM,aAAa,KACnD,KAAK,KAAK,UAAU,IAAI,EAAM,QAAQ;EACxC,GAEM,KAAU,MAAoB;GAClC,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,UAAU,KAAK,QAAQ,OAAO,EAAE,WAAW;GAC9E,IAAM,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAK,EAAE,UAAU,KAAK,QAAQ;GACpC,IAAI,CAAC,KAAK,QAAQ,SAAS;IACzB,IAAM,IAAO,KAAK,IAAI,CAAE,GAClB,IAAO,KAAK,IAAI,CAAE;IACxB,IAAI,IAAO,KAAK,IAAO,GAAG;IAG1B,IAFA,KAAK,QAAQ,eAAe,IAAO,GACnC,KAAK,QAAQ,UAAU,IACnB,KAAK,QAAQ,WAAW,KAAK,QAAQ,eAAe,CAAC,KAAK,QAAQ,cAAc;KAElF,AADA,KAAK,QAAQ,SAAS,IACtB,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ;KACzC;IACF;GACF;GACA,IAAI,EAAc,GAAG;IACnB,IAAM,IAAQ,KAAK,QAAQ,WAAW,IAAK,GACrC,IAAM,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,KAAK,GACxD,IAAY,KAAK,QAAQ,iBAAiB,IAAM,GAChD,IAAO,KAAK,QAAQ,WAAW,MAAM,KACrC,IAAe,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;IACtE,KAAK,MAAM,MAAM,YAAY,YAAY,EAAK,GAAG,IAAe,EAAU;GAC5E;GACA,AAAI,OAAQ,EAAmB,kBAAmB,cAAY,EAAE,eAAe;EACjF,GAEM,KAAQ,MAAoB;GAChC,IAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,OAAO,EAAE,WAAW;GACtD,IAAM,IAAY,KAAK,QAAQ,QACzB,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAK,EAAE,UAAU,KAAK,QAAQ,QAC9B,IAAU,YAAY,IAAI,IAAI,KAAK,QAAQ;GAGjD,IAFA,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,GACzC,KAAK,UAAU,MACX,CAAC,GAAW;GAEhB,IAAM,IAAQ,KAAK,QAAQ,WAAW,IAAK,GACrC,IAAW,KAAK,IAAI,CAAK,IAAI,KAAK,IAAI,GAAG,CAAO,GAChD,IAAY,KAAK,QAAQ;GAG/B,AADe,KAAK,IAAI,CAAK,IAAI,KAAa,IAAW,MAExC,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAQ,IAAI,IAAQ,MAE9E,KAAK,KAAK,SAAS,EACjB,WAAW,KAAK,QAAQ,WAAW,SAAS,QAC9C,CAAuB,GACvB,KAAK,KAAK,MAEV,KAAK,KAAK,SAAS,EACjB,WAAW,KAAK,QAAQ,WAAW,OAAO,OAC5C,CAAuB,GACvB,KAAK,KAAK,KAEH,EAAc,KAGvB,KAAK,KAAK,KAAK,cAAc,EAAI;EAErC,GAEM,KAAY,MAAoB;GAChC,CAAC,KAAK,WAAW,KAAK,QAAQ,OAAO,EAAE,cAC3C,KAAK,KAAK,UAAU,OAAO,EAAM,QAAQ,GACzC,KAAK,UAAU,MACX,EAAc,KAAG,KAAK,KAAK,KAAK,cAAc,EAAI;EACxD,GAEM,IAAc,GACd,IAAc,GACd,IAAY,GACZ,IAAgB;EAUtB,AATA,KAAK,kBAAkB;GACrB,MAAM;GACN,MAAM;GACN,IAAI;GACJ,QAAQ;EACV,GACA,KAAK,SAAS,iBAAiB,eAAe,CAAW,GACzD,OAAO,iBAAiB,eAAe,GAAa,EAAE,SAAS,GAAM,CAAC,GACtE,OAAO,iBAAiB,aAAa,CAAS,GAC9C,OAAO,iBAAiB,iBAAiB,CAAa;CACxD;CAEA,sBAAoC;EAClC,IAAM,EAAE,SAAM,SAAM,OAAI,cAAW,KAAK;EACnC,MACL,KAAK,SAAS,oBAAoB,eAAe,CAAI,GACjD,KAAM,OAAO,oBAAoB,eAAe,CAAI,GACpD,KAAI,OAAO,oBAAoB,aAAa,CAAE,GAC9C,KAAQ,OAAO,oBAAoB,iBAAiB,CAAM,GAC9D,KAAK,kBAAkB,CAAC;CAC1B;CAEA,iBAAiC;EAC/B,IAAM,IAAI,KAAK,MAAM,MAAM,WACrB,IAAI,uCAAuC,KAAK,CAAC;EAIvD,OAHI,CAAC,KAAK,CAAC,EAAE,KAAW,KAAK,cAAc,KAAK,iBAAiB,KAAK,YAAY,CAAC,IACzE,WAAW,EAAE,EAEhB,KADK,KAAK,QAAQ,OAAO,CAAC,KAAK,QAAQ,WAAW,IAAI;CAE/D;CAEA,oBAAkC;EAChC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GACrB,KACL,EAAM,iBAAiB,eAAe;IACpC,IAAM,IAAY,IAAI,KAAK;IAC3B,AAAI,KAAa,KAAK,IAAY,KAAK,cAAY,KAAK,KAAK,CAAS;GACxE,CAAC;EACH;CACF;CAEA,iBAAyB,GAA2B;EAClD,OAAO,IAAY,KAAK;CAC1B;CAEA,aAA2B;EACzB,IAAM,IAAa,KAAK,iBAAiB,KAAK,YAAY;EAC1D,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GAC1B,IAAI,CAAC,GAAO;GACZ,IAAM,IAAW,KAAK,qBAAqB,GAAG,CAAU,GAClD,IAAY,MAAM;GAGxB,AAFA,EAAM,UAAU,OAAO,EAAM,aAAa,CAAQ,GAClD,EAAM,UAAU,OAAO,EAAM,cAAc,CAAS,GAC/C,EAAM,UAAU,SAAS,EAAM,WAAW,MAC7C,EAAM,aAAa,eAAe,IAAW,UAAU,MAAM,GAC7D,EAAM,aAAa,YAAY,IAAW,MAAM,IAAI;EAExD;EAGA,KAAK,iBAAiB,CAAU;CAClC;CAEA,sCAAoD;EAIlD,AAHA,KAAK,KAAK,UAAU,IAAI,iBAAiB,GAEzC,KAAU,KAAK,aACX,OAAO,yBAA0B,aACnC,4BAA4B;GAG1B,4BAA4B,KAAK,KAAK,UAAU,OAAO,iBAAiB,CAAC;EAC3E,CAAC,IAED,iBAAiB,KAAK,KAAK,UAAU,OAAO,iBAAiB,GAAG,EAAE;CAEtE;CAEA,iBAAyB,GAA0B;EAC5C,SAAK,QAAQ,YAClB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;GAC3C,IAAM,IAAQ,KAAK,OAAO;GACrB,KACL,EAAM,UAAU,OAAO,EAAM,aAAa,MAAM,CAAU;EAC5D;CACF;CAEA,qBAA6B,GAAyB,GAAoC;EACxF,IAAM,IAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY;EAClD,IAAI,KAAK,QAAQ,YAAY;GAC3B,IAAM,IAAO,KAAK,MAAM,IAAO,CAAC;GAChC,OACE,KAAmB,IAAoB,KACvC,IAAkB,IAAoB,IAAO;EAEjD;EACA,OACE,KAAmB,KAAqB,IAAkB,IAAoB;CAElF;CAEA,eAA6B;EAC3B,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,WAAW;EACxC,IAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,MAAM;GAI9C,AAHA,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,GACnD,KAAK,UAAU,UAAU,OAAO,EAAM,aAAa,GACnD,KAAK,UAAU,gBAAgB,eAAe,GAC9C,KAAK,UAAU,gBAAgB,eAAe;GAC9C;EACF;EACA,IAAM,IAAU,KAAK,gBAAgB,GAC/B,IAAQ,KAAK,gBAAgB,KAAK,aAAa,KAAK,QAAQ;EAWlE,AAVA,KAAK,UAAU,UAAU,OAAO,EAAM,eAAe,CAAO,GAC5D,KAAK,UAAU,UAAU,OAAO,EAAM,eAAe,CAAK,GAC1D,KAAK,UAAU,aAAa,iBAAiB,OAAO,CAAO,CAAC,GAC5D,KAAK,UAAU,aAAa,iBAAiB,OAAO,CAAK,CAAC,GAKtD,KAAK,UAAU,YAAY,aAC7B,KAAM,UAAgC,WAAW,KAC/C,KAAK,UAAU,YAAY,aAC7B,KAAM,UAAgC,WAAW;CACrD;CAEA,YAA4B;EAC1B,IAAI,KAAK,eAAe,GAAG,OAAO;EAClC,IAAM,IAAQ,KAAK,MAChB,KAAK,cAAc,KAAK,QAAQ,WAAW,IAAI,KAAK,QAAQ,eAAe,MAC1E,KAAK,IAAI,GAAG,KAAK,QAAQ,cAAc,CAC3C;EACA,OAAO,KAAK,IAAI,GAAG,CAAK;CAC1B;CAEA,WAAmB,GAA0B;EAC3C,IAAI,CAAC,KAAK,UAAU;EACpB,IAAM,IAAM,KAAa,KAAK,cACxB,IAAU,KAAK,MAAM,IAAM,KAAK,IAAI,GAAG,KAAK,QAAQ,cAAc,CAAC;EAEzE,KADmB,SAAS,iBAAiB,IAAI,EAAM,KACvD,EAAM,SAAS,GAAI,MAAM;GAEvB,AADA,EAAG,UAAU,OAAO,EAAM,WAAW,MAAM,CAAO,GAClD,EAAG,aAAa,iBAAiB,MAAM,IAAU,SAAS,OAAO;EACnE,CAAC;CACH;CAEA,qBAA6B,GAA2B;EACtD,IAAI,CAAC,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,UAAU;EAI3D,IAAM,IAAM,KAAc,KAAK,eAAe,KAAK,iBAAiB,KAAK,YAAY,GAC/E,IAAQ,KAAK,OAAO;EAC1B,IAAI,CAAC,GAAO;EACZ,IAAM,IAAI,EAAM,sBAAsB,EAAE;EACxC,AAAI,IAAI,MAAG,KAAK,SAAS,MAAM,SAAS,GAAG,EAAE;CAC/C;CAEA,gBAA8B;EAC5B,IAAI,CAAC,KAAK,QAAQ,UAAU;EAC5B,IAAI,KAAK,QAAQ,aAAa,eAAe;GAC3C,KAAK,aAAa,KAAK,MAAM;GAC7B;EACF;EACA,IAAM,IAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,GAC5C,IAAe,KAAK,iBAAiB,KAAK,YAAY,GAEtD,IAAQ,IAAe,GACvB,IAAM,IAAe,IAAO,GAC5B,IAAyB,CAAC;EAChC,KAAK,IAAI,IAAI,GAAO,IAAI,GAAK,KAAK;GAIhC,IAAM,IAAM,KAAK,QAAQ,WAAW,EAAI,GAAG,KAAK,OAAO,MAAM,IAAI;GACjE,IAAI,IAAM,KAAK,KAAO,KAAK,OAAO,QAAQ;GAC1C,IAAM,IAAI,KAAK,OAAO;GACtB,AAAI,KAAG,EAAQ,KAAK,CAAC;EACvB;EACA,KAAK,aAAa,CAAO;CAC3B;CAEA,aAAqB,GAA6B;EAChD,KAAK,IAAM,KAAS,GAElB,EADmB,iBAAmC,gBACtD,EAAK,SAAS,MAAQ,KAAK,kBAAkB,CAAG,CAAC;CAErD;CAEA,kBAA0B,GAA6B;EACrD,IAAM,IAAM,EAAI,aAAa,WAAW;EACnC,MACL,EAAI,gBAAgB,WAAW,GAC/B,EAAI,iBACF,cACM,KAAK,KAAK,cAAc;GAAE,OAAO;GAAK;EAAI,CAA0B,GAC1E,EAAE,MAAM,GAAK,CACf,GACA,EAAI,iBACF,eACM,KAAK,KAAK,iBAAiB;GAAE,OAAO;GAAK;EAAI,CAA0B,GAC7E,EAAE,MAAM,GAAK,CACf,GACA,EAAI,MAAM;CACZ;CAEA,eAA6B;EAC3B,IAAM,IAAM,KAAK,QAAQ;EACzB,IAAI,CAAC,GAAK;EACV,IAAM,IAAK,EAAyC,CAAS;EAC7D,IAAI,CAAC,GAAI;EACT,IAAM,IAAY,EAAiD;EACnE,AAAI,MACF,KAAK,YAAY,GACjB,EAAS,GAAsB,gBAAgB,MAAW;GACpD,AAGJ,KAAK,wBAFL,KAAK,qBAAqB,IAC1B,KAAK,KAAK,EAAO,YAAY,GACH;EAC5B,CAAC;CAEL;CAEA,eAA6B;EACtB,KAAK,cACN,AAGJ,KAAK,wBAFL,KAAK,qBAAqB,IAC1B,KAAK,UAAU,KAAK,KAAK,YAAY,GACX;CAC5B;CAEA,kBAA0B;EACxB,OAAO,KAAK;CACd;CAEA,gBAAwB;EACtB,OAAO,KAAK;CACd;CAEA,YAA2B;EACzB,OAAO,KAAK,OAAO,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;CAC7E;CAEA,WAAW,GAAoC,IAAU,IAAY;EAEnE,AADA,KAAK,cAAc;GAAE,GAAG,KAAK;GAAa,GAAG;EAAQ,GACjD,IACF,KAAK,OAAO,IAEZ,KAAK,UAAU,EAAa,KAAK,SAAS,CAAO;CAErD;CAQA,UAAgB;EACV,KAAK,aACT,KAAK,YAAY;CACnB;CAEA,SAAS,GAAsB,GAAsB;EAMnD,AALI,OAAO,KAAU,WACnB,KAAK,iBAAiB,OAAO,GAAO,GAAG,CAAO,IAE9C,KAAK,iBAAiB,KAAK,CAAO,GAEpC,KAAK,OAAO;CACd;CAEA,YAAY,GAAqB;EAC3B,IAAQ,KAAK,KAAS,KAAK,iBAAiB,WAChD,KAAK,iBAAiB,OAAO,GAAO,CAAC,GACrC,KAAK,OAAO;CACd;AACF;;;AC/nCA,SAAgB,EACd,GACA,IAAqC,CAAC,GAC1B;CACZ,OAAO,IAAI,EAAW,GAAM,CAAO;AACrC;AAEA,IAAA,IAAe"}
|
package/dist/slickless.umd.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Slickless={}))})(this,function(e){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var t={arrows:!0,dots:!1,autoplay:!1,autoplaySpeed:3e3,speed:400,cssEase:`cubic-bezier(0.22, 1, 0.36, 1)`,slidesToShow:1,slidesToScroll:1,infinite:!0,fade:!1,vertical:!1,initialSlide:0,variableWidth:!1,centerMode:!1,centerPadding:`50px`,rtl:!1,draggable:!0,swipeThreshold:24,pauseOnHover:!0,pauseOnFocus:!0,accessibility:!0,adaptiveHeight:!1,lazyLoad:!1,respectReducedMotion:!0,prevArrow:null,nextArrow:null,customPaging:null,ariaRoleDescription:`carousel`,responsive:null,asNavFor:null,focusOnSelect:!1,autoplayDirection:`forward`};function n(e,t){return{...e,...t}}function r(e,t,n){return Math.max(t,Math.min(n,e))}function i(e,t){return(e%t+t)%t}function a(){return typeof window>`u`||!window.matchMedia?!1:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function o(e,t,n){let r=document.createElement(e);if(t&&(r.className=t),n)for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function s(e){return e?typeof e==`string`?document.querySelector(e):e:null}var c={root:`slickless`,initialized:`slickless--initialized`,viewport:`slickless__viewport`,track:`slickless__track`,slide:`slickless__slide`,slideActive:`slickless__slide--active`,slideCenter:`slickless__slide--center`,slideCloned:`slickless__slide--cloned`,slideCurrent:`slickless__slide--current`,arrow:`slickless__arrow`,arrowPrev:`slickless__arrow--prev`,arrowNext:`slickless__arrow--next`,arrowDisabled:`slickless__arrow--disabled`,dots:`slickless__dots`,dot:`slickless__dot`,dotBullet:`slickless__dot--bullet`,dotActive:`slickless__dot--active`,vertical:`slickless--vertical`,fade:`slickless--fade`,rtl:`slickless--rtl`,dragging:`slickless--dragging`,centerMode:`slickless--center`,adaptive:`slickless--adaptive-height`},l=class{constructor(e,r={}){this.originalChildren=[],this.slides=[],this.prevArrow=null,this.nextArrow=null,this.dotsList=null,this.cloneCount=0,this.currentIndex=0,this.animatingTo=null,this.slideCount=0,this.animating=!1,this.lastRootWidth=0,this.destroyed=!1,this.currentBreakpoint=null,this.resizeObserver=null,this.autoplayTimer=null,this.autoplayPaused=!1,this.listeners=new Map,this.pointer=null,this.pointerHandlers={},this.linkedNav=null,this.linkedFromExternal=!1,this.handlePrevClick=e=>{e.preventDefault(),this.prev()},this.handleNextClick=e=>{e.preventDefault(),this.next()},this.handleResize=()=>{let e=this.root.getBoundingClientRect().width;e!==this.lastRootWidth&&(this.lastRootWidth=e,this.applyResponsive(),this.applyLayout())},this.handleKey=e=>{this.options.accessibility&&(e.key===`ArrowLeft`?(e.preventDefault(),this.options.rtl?this.next():this.prev()):e.key===`ArrowRight`?(e.preventDefault(),this.options.rtl?this.prev():this.next()):e.key===`Home`?(e.preventDefault(),this.goTo(0)):e.key===`End`&&(e.preventDefault(),this.goTo(this.slideCount-1)))},this.handleMouseEnter=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleMouseLeave=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!1,this.scheduleAutoplay())},this.handleFocusIn=()=>{this.options.pauseOnFocus&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleFocusOut=e=>{if(this.options.pauseOnFocus&&this.options.autoplay){let t=e.relatedTarget;(!t||!this.root.contains(t))&&(this.autoplayPaused=!1,this.scheduleAutoplay())}};let i=typeof e==`string`?document.querySelector(e):e;if(!i)throw Error(`[slickless] Root element not found: ${String(e)}`);this.root=i,this.userOptions=r,this.options=n(t,r),this.init()}init(){this.captureChildren(),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(this.options.initialSlide,!0),this.options.autoplay&&this.play(),this.linkAsNavFor(),this.root.__slickless=this,this.root.classList.add(c.initialized);let e=()=>{this.destroyed||this.emit(`init`,{slickless:this})};typeof queueMicrotask==`function`?queueMicrotask(e):Promise.resolve().then(e)}destroy(){if(!this.destroyed){this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e),e.removeAttribute(`aria-hidden`),e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-roledescription`),e.removeAttribute(`aria-label`),e.style.cssText=``;this.root.className=this.root.className.split(/\s+/).filter(e=>!e.startsWith(`slickless`)).join(` `).trim(),this.root.removeAttribute(`role`),this.root.removeAttribute(`aria-roledescription`),this.root.removeAttribute(`dir`),this.destroyed=!0,this.emit(`destroy`,{slickless:this}),this.listeners.clear()}}reInit(){let e=this.currentIndex,i=this.options.autoplay&&!this.autoplayPaused;this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e);this.options=n(t,this.userOptions),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(r(e,0,this.slideCount-1),!0),i&&this.play(),this.emit(`reInit`,{slickless:this})}captureChildren(){this.originalChildren.length===0&&(this.originalChildren=Array.from(this.root.children))}applyResponsive(){let e=this.options.responsive;if(!e||e.length===0||typeof window>`u`)return;let r=window.innerWidth,i=[...e].sort((e,t)=>e.breakpoint-t.breakpoint),a=null;for(let e of i)if(r<=e.breakpoint){a=e;break}let o=a?a.breakpoint:null;if(o===this.currentBreakpoint)return;if(this.currentBreakpoint=o,a){if(a.settings===`unslick`){this.destroy();return}this.options=n(n(t,this.userOptions),a.settings)}else this.options=n(t,this.userOptions);let s={breakpoint:o};this.emit(`breakpoint`,s)}build(){this.root.innerHTML=``,this.root.classList.add(c.root),this.root.classList.toggle(c.vertical,this.options.vertical),this.root.classList.toggle(c.fade,this.options.fade),this.root.classList.toggle(c.rtl,this.options.rtl),this.root.classList.toggle(c.centerMode,this.options.centerMode),this.root.classList.toggle(c.adaptive,this.options.adaptiveHeight),this.root.style.setProperty(`--slickless-transition-duration`,`${this.effectiveSpeed()}ms`),this.root.setAttribute(`role`,`region`),this.root.setAttribute(`aria-roledescription`,this.options.ariaRoleDescription),this.options.rtl&&this.root.setAttribute(`dir`,`rtl`),this.viewport=o(`div`,c.viewport),this.track=o(`div`,c.track,{role:`presentation`});let e=this.originalChildren.map((e,t)=>this.wrapAsSlide(e,t));if(this.slideCount=e.length,this.options.infinite&&!this.options.fade&&this.slideCount>0){let t=this.options.variableWidth?this.slideCount:Math.max(this.options.slidesToShow,1);this.cloneCount=Math.min(t,this.slideCount);let n=e.slice(-this.cloneCount).map(e=>this.cloneSlide(e)),r=e.slice(0,this.cloneCount).map(e=>this.cloneSlide(e));this.slides=[...n,...e,...r]}else this.cloneCount=0,this.slides=e;for(let e of this.slides)this.track.appendChild(e);this.viewport.appendChild(this.track),this.root.appendChild(this.viewport),this.options.arrows&&this.slideCount>this.options.slidesToShow&&this.buildArrows(),this.options.dots&&this.slideCount>0&&this.buildDots(),this.applyLayout(),this.applyLazyLoad()}wrapAsSlide(e,t){let n=o(`div`,c.slide,{role:`group`,"aria-roledescription":`slide`,"aria-label":`${t+1} of ${this.originalChildren.length}`,"data-slick-index":String(t)});return n.appendChild(e),n}cloneSlide(e){let t=e.cloneNode(!0);return t.classList.add(c.slideCloned),t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`tabindex`,`-1`),t}buildArrows(){let e=this.options.prevArrow,t=this.options.nextArrow;this.prevArrow=this.resolveArrow(e,`prev`),this.nextArrow=this.resolveArrow(t,`next`),this.root.appendChild(this.prevArrow),this.root.appendChild(this.nextArrow),this.prevArrow.addEventListener(`click`,this.handlePrevClick),this.nextArrow.addEventListener(`click`,this.handleNextClick)}resolveArrow(e,t){let n;if(e instanceof HTMLElement)n=e.cloneNode(!0);else if(typeof e==`string`&&e.trim()){let t=document.createElement(`div`);t.innerHTML=e.trim(),n=t.firstElementChild??o(`button`)}else n=o(`button`,``,{type:`button`}),n.innerHTML=t===`prev`?`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 6l-6 6 6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 6l6 6-6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;return n.classList.add(c.arrow,t===`prev`?c.arrowPrev:c.arrowNext),n.setAttribute(`aria-label`,t===`prev`?`Previous slide`:`Next slide`),n.tagName!==`BUTTON`&&n.setAttribute(`role`,`button`),n}buildDots(){this.dotsList=o(`ul`,c.dots,{role:`tablist`});let e=this.pageCount();for(let t=0;t<e;t++){let n=o(`li`,``,{role:`presentation`}),r=t*this.options.slidesToScroll,i=this.options.customPaging?this.options.customPaging(t,e):o(`button`,`${c.dot} ${c.dotBullet}`,{type:`button`,"aria-label":`Go to slide ${t+1}`,role:`tab`}),a=typeof i==`string`?this.htmlToElement(i):i;a.classList.add(c.dot),a.setAttribute(`data-slick-target`,String(r)),a.addEventListener(`click`,()=>this.goTo(r)),n.appendChild(a),this.dotsList.appendChild(n)}this.root.appendChild(this.dotsList)}htmlToElement(e){let t=document.createElement(`div`);t.innerHTML=e.trim();let n=t.firstElementChild;if(n)return n;let r=o(`button`,``,{type:`button`});return r.textContent=e,r}viewportSize(){let e=this.viewport.getBoundingClientRect();return this.options.vertical?e.height:e.width}slideSize(){if(this.options.variableWidth){let e=this.slides[this.cloneCount];if(e){let t=e.getBoundingClientRect();return this.options.vertical?t.height:t.width}}let e=this.viewportSize();if(this.options.centerMode){let t=this.parseCenterPadding(e);return Math.max(1,(e-2*t)/Math.max(1,this.options.slidesToShow))}return e/Math.max(1,this.options.slidesToShow)}parseCenterPadding(e){let t=(this.options.centerPadding??``).trim();if(!t)return 0;let n=/^(-?\d+(?:\.\d+)?)\s*(px|%)?$/.exec(t);if(!n||n[1]===void 0)return 0;let r=parseFloat(n[1]);return!Number.isFinite(r)||r<0?0:(n[2]??`px`)===`%`?r/100*e:r}applyLayout(){if(this.slideCount===0)return;if(this.viewportSize(),this.options.fade){this.track.style.transform=``;for(let e=0;e<this.slides.length;e++){let t=this.slides[e];t&&(t.style.position=`absolute`,t.style.top=`0`,t.style.left=`0`,t.style.width=`100%`,t.style.height=`100%`,t.style.opacity=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.zIndex=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.transition=`opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`,t.style.pointerEvents=e===this.realToTrackIndex(this.currentIndex)?`auto`:`none`)}this.updateAria(),this.updateArrows(),this.updateDots();return}let e=this.options.variableWidth?null:this.slideSize();for(let t of this.slides)t.style.position=``,t.style.top=``,t.style.left=``,t.style.height=``,t.style.opacity=``,t.style.zIndex=``,t.style.transition=``,t.style.pointerEvents=``,e!==null&&(this.options.vertical?(t.style.width=`100%`,t.style.height=`${e}px`):(t.style.height=``,t.style.width=`${e}px`));this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)),!1),this.updateAria(),this.updateArrows(),this.updateDots(),this.updateAdaptiveHeight()}effectiveSpeed(){return this.options.respectReducedMotion&&a()?0:this.options.speed}indexToOffset(e){if(this.options.variableWidth){let t=0;for(let n=0;n<e;n++){let e=this.slides[n];if(!e)continue;let r=e.getBoundingClientRect();t+=this.options.vertical?r.height:r.width}if(this.options.centerMode){let n=this.slides[e];if(n){let e=n.getBoundingClientRect();t-=(this.viewportSize()-(this.options.vertical?e.height:e.width))/2}}return t}let t=this.slideSize(),n=e*t;if(this.options.centerMode)n-=(this.viewportSize()-t)/2;else if(!this.options.infinite&&!this.options.fade){let e=Math.max(0,(this.slideCount-this.options.slidesToShow)*t);n=Math.min(n,e)}return n}translateTo(e,t){let n=t?this.effectiveSpeed():0,r=this.options.vertical?`Y`:`X`,i=this.options.rtl&&!this.options.vertical?1:-1;this.track.style.transition=n>0?`transform ${n}ms ${this.options.cssEase}`:``,this.track.style.transform=`translate${r}(${i*e}px)`}next(){this.goTo(this.currentIndex+this.options.slidesToScroll)}prev(){this.goTo(this.currentIndex-this.options.slidesToScroll)}goTo(e,t=!1){if(this.destroyed||this.slideCount===0||this.animating&&!t)return;let n=e,r=this.options.infinite&&!this.options.fade;if(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.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);for(let t=0;t<this.slides.length;t++){let n=this.slides[t];if(!n)continue;let r=this.isSlideInActiveRange(t,e),i=t===e;n.classList.toggle(c.slideActive,r),n.classList.toggle(c.slideCurrent,i),n.classList.contains(c.slideCloned)||(n.setAttribute(`aria-hidden`,r?`false`:`true`),n.setAttribute(`tabindex`,r?`0`:`-1`))}this.updateCenterMode(e)}suppressSlideTransitionsForOneFrame(){this.root.classList.add(`slickless--snap`),this.root.offsetWidth,typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>{requestAnimationFrame(()=>this.root.classList.remove(`slickless--snap`))}):setTimeout(()=>this.root.classList.remove(`slickless--snap`),16)}updateCenterMode(e){if(this.options.centerMode)for(let t=0;t<this.slides.length;t++){let n=this.slides[t];n&&n.classList.toggle(c.slideCenter,t===e)}}isSlideInActiveRange(e,t){let n=Math.max(1,this.options.slidesToShow);if(this.options.centerMode){let r=Math.floor(n/2);return e>=t-r&&e<t+n-r}return e>=t&&e<t+n}updateArrows(){if(!this.prevArrow||!this.nextArrow)return;if(this.options.infinite||this.options.fade){this.prevArrow.classList.remove(c.arrowDisabled),this.nextArrow.classList.remove(c.arrowDisabled),this.prevArrow.removeAttribute(`aria-disabled`),this.nextArrow.removeAttribute(`aria-disabled`);return}let e=this.currentIndex<=0,t=this.currentIndex>=this.slideCount-this.options.slidesToShow;this.prevArrow.classList.toggle(c.arrowDisabled,e),this.nextArrow.classList.toggle(c.arrowDisabled,t),this.prevArrow.setAttribute(`aria-disabled`,String(e)),this.nextArrow.setAttribute(`aria-disabled`,String(t)),this.prevArrow.tagName===`BUTTON`&&(this.prevArrow.disabled=!1),this.nextArrow.tagName===`BUTTON`&&(this.nextArrow.disabled=!1)}pageCount(){if(this.slideCount===0)return 0;let e=Math.ceil((this.slideCount-(this.options.infinite?0:this.options.slidesToShow-1))/Math.max(1,this.options.slidesToScroll));return Math.max(1,e)}updateDots(e){if(!this.dotsList)return;let t=e??this.currentIndex,n=Math.floor(t/Math.max(1,this.options.slidesToScroll));this.dotsList.querySelectorAll(`.${c.dot}`).forEach((e,t)=>{e.classList.toggle(c.dotActive,t===n),e.setAttribute(`aria-selected`,t===n?`true`:`false`)})}updateAdaptiveHeight(e){if(!this.options.adaptiveHeight||this.options.vertical)return;let t=e??this.animatingTo??this.realToTrackIndex(this.currentIndex),n=this.slides[t];if(!n)return;let r=n.getBoundingClientRect().height;r>0&&(this.viewport.style.height=`${r}px`)}applyLazyLoad(){if(!this.options.lazyLoad)return;if(this.options.lazyLoad===`progressive`){this.loadImagesIn(this.slides);return}let e=Math.max(1,this.options.slidesToShow),t=this.realToTrackIndex(this.currentIndex),n=t-1,r=t+e+1,a=[];for(let e=n;e<r;e++){let t=this.options.infinite?i(e,this.slides.length):e;if(t<0||t>=this.slides.length)continue;let n=this.slides[t];n&&a.push(n)}this.loadImagesIn(a)}loadImagesIn(e){for(let t of e)t.querySelectorAll(`img[data-lazy]`).forEach(e=>this.activateLazyImage(e))}activateLazyImage(e){let t=e.getAttribute(`data-lazy`);t&&(e.removeAttribute(`data-lazy`),e.addEventListener(`load`,()=>this.emit(`lazyLoaded`,{image:e,src:t}),{once:!0}),e.addEventListener(`error`,()=>this.emit(`lazyLoadError`,{image:e,src:t}),{once:!0}),e.src=t)}linkAsNavFor(){let e=this.options.asNavFor;if(!e)return;let t=s(e);if(!t)return;let n=t.__slickless;n&&(this.linkedNav=n,n.on(`afterChange`,e=>{this.linkedFromExternal||=(this.linkedFromExternal=!0,this.goTo(e.currentSlide),!1)}))}notifyLinked(){this.linkedNav&&(this.linkedFromExternal||=(this.linkedFromExternal=!0,this.linkedNav.goTo(this.currentIndex),!1))}getCurrentSlide(){return this.currentIndex}getSlideCount(){return this.slideCount}getSlides(){return this.slides.slice(this.cloneCount,this.cloneCount+this.slideCount)}setOptions(e,t=!0){this.userOptions={...this.userOptions,...e},t?this.reInit():this.options=n(this.options,e)}refresh(){this.destroyed||this.applyLayout()}addSlide(e,t){typeof t==`number`?this.originalChildren.splice(t,0,e):this.originalChildren.push(e),this.reInit()}removeSlide(e){e<0||e>=this.originalChildren.length||(this.originalChildren.splice(e,1),this.reInit())}};function u(e,t={}){return new l(e,t)}var d=l;e.DEFAULTS=t,e.Slickless=l,e.default=d,e.slickless=u});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Slickless={}))})(this,function(e){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var t={arrows:!0,dots:!1,autoplay:!1,autoplaySpeed:3e3,speed:400,cssEase:`cubic-bezier(0.22, 1, 0.36, 1)`,slidesToShow:1,slidesToScroll:1,infinite:!0,fade:!1,vertical:!1,initialSlide:0,variableWidth:!1,centerMode:!1,centerPadding:`50px`,rtl:!1,draggable:!0,swipeThreshold:24,pauseOnHover:!0,pauseOnFocus:!0,accessibility:!0,adaptiveHeight:!1,lazyLoad:!1,respectReducedMotion:!0,prevArrow:null,nextArrow:null,customPaging:null,ariaRoleDescription:`carousel`,responsive:null,asNavFor:null,focusOnSelect:!1,autoplayDirection:`forward`};function n(e,t){return{...e,...t}}function r(e,t,n){return Math.max(t,Math.min(n,e))}function i(e,t){return(e%t+t)%t}function a(){return typeof window>`u`||!window.matchMedia?!1:window.matchMedia(`(prefers-reduced-motion: reduce)`).matches}function o(e,t,n){let r=document.createElement(e);if(t&&(r.className=t),n)for(let[e,t]of Object.entries(n))r.setAttribute(e,t);return r}function s(e){return e?typeof e==`string`?document.querySelector(e):e:null}var c={root:`slickless`,initialized:`slickless--initialized`,viewport:`slickless__viewport`,track:`slickless__track`,slide:`slickless__slide`,slideActive:`slickless__slide--active`,slideCenter:`slickless__slide--center`,slideCloned:`slickless__slide--cloned`,slideCurrent:`slickless__slide--current`,arrow:`slickless__arrow`,arrowPrev:`slickless__arrow--prev`,arrowNext:`slickless__arrow--next`,arrowDisabled:`slickless__arrow--disabled`,dots:`slickless__dots`,dot:`slickless__dot`,dotBullet:`slickless__dot--bullet`,dotActive:`slickless__dot--active`,vertical:`slickless--vertical`,fade:`slickless--fade`,rtl:`slickless--rtl`,dragging:`slickless--dragging`,centerMode:`slickless--center`,adaptive:`slickless--adaptive-height`},l=class{constructor(e,r={}){this.originalChildren=[],this.slides=[],this.prevArrow=null,this.nextArrow=null,this.dotsList=null,this.cloneCount=0,this.currentIndex=0,this.animatingTo=null,this.slideCount=0,this.animating=!1,this.lastRootWidth=0,this.destroyed=!1,this.currentBreakpoint=null,this.resizeObserver=null,this.autoplayTimer=null,this.autoplayPaused=!1,this.listeners=new Map,this.pointer=null,this.pointerHandlers={},this.linkedNav=null,this.linkedFromExternal=!1,this.handlePrevClick=e=>{e.preventDefault(),this.prev()},this.handleNextClick=e=>{e.preventDefault(),this.next()},this.handleResize=()=>{let e=this.root.getBoundingClientRect().width;e!==this.lastRootWidth&&(this.lastRootWidth=e,this.applyResponsive(),this.applyLayout())},this.handleKey=e=>{this.options.accessibility&&(e.key===`ArrowLeft`?(e.preventDefault(),this.options.rtl?this.next():this.prev()):e.key===`ArrowRight`?(e.preventDefault(),this.options.rtl?this.prev():this.next()):e.key===`Home`?(e.preventDefault(),this.goTo(0)):e.key===`End`&&(e.preventDefault(),this.goTo(this.slideCount-1)))},this.handleMouseEnter=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleMouseLeave=()=>{this.options.pauseOnHover&&this.options.autoplay&&(this.autoplayPaused=!1,this.scheduleAutoplay())},this.handleFocusIn=()=>{this.options.pauseOnFocus&&this.options.autoplay&&(this.autoplayPaused=!0,this.autoplayTimer&&clearTimeout(this.autoplayTimer))},this.handleFocusOut=e=>{if(this.options.pauseOnFocus&&this.options.autoplay){let t=e.relatedTarget;(!t||!this.root.contains(t))&&(this.autoplayPaused=!1,this.scheduleAutoplay())}};let i=typeof e==`string`?document.querySelector(e):e;if(!i)throw Error(`[slickless] Root element not found: ${String(e)}`);this.root=i,this.userOptions=r,this.options=n(t,r),this.init()}init(){this.captureChildren(),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(this.options.initialSlide,!0),this.options.autoplay&&this.play(),this.linkAsNavFor(),this.root.__slickless=this,this.root.classList.add(c.initialized);let e=()=>{this.destroyed||this.emit(`init`,{slickless:this})};typeof queueMicrotask==`function`?queueMicrotask(e):Promise.resolve().then(e)}destroy(){if(!this.destroyed){this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e),e.removeAttribute(`aria-hidden`),e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-roledescription`),e.removeAttribute(`aria-label`),e.style.cssText=``;this.root.className=this.root.className.split(/\s+/).filter(e=>!e.startsWith(`slickless`)).join(` `).trim(),this.root.removeAttribute(`role`),this.root.removeAttribute(`aria-roledescription`),this.root.removeAttribute(`dir`),this.destroyed=!0,this.emit(`destroy`,{slickless:this}),this.listeners.clear()}}reInit(){let e=this.currentIndex,i=this.options.autoplay&&!this.autoplayPaused;this.pause(),this.unbindEvents(),this.resizeObserver&&this.resizeObserver.disconnect(),this.root.innerHTML=``;for(let e of this.originalChildren)this.root.appendChild(e);this.options=n(t,this.userOptions),this.applyResponsive(),this.build(),this.bindEvents(),this.goTo(r(e,0,this.slideCount-1),!0),i&&this.play(),this.emit(`reInit`,{slickless:this})}captureChildren(){this.originalChildren.length===0&&(this.originalChildren=Array.from(this.root.children))}applyResponsive(){let e=this.options.responsive;if(!e||e.length===0||typeof window>`u`)return;let r=window.innerWidth,i=[...e].sort((e,t)=>e.breakpoint-t.breakpoint),a=null;for(let e of i)if(r<=e.breakpoint){a=e;break}let o=a?a.breakpoint:null;if(o===this.currentBreakpoint)return;if(this.currentBreakpoint=o,a){if(a.settings===`unslick`){this.destroy();return}this.options=n(n(t,this.userOptions),a.settings)}else this.options=n(t,this.userOptions);let s={breakpoint:o};this.emit(`breakpoint`,s)}build(){this.root.innerHTML=``,this.root.classList.add(c.root),this.root.classList.toggle(c.vertical,this.options.vertical),this.root.classList.toggle(c.fade,this.options.fade),this.root.classList.toggle(c.rtl,this.options.rtl),this.root.classList.toggle(c.centerMode,this.options.centerMode),this.root.classList.toggle(c.adaptive,this.options.adaptiveHeight),this.root.style.setProperty(`--slickless-transition-duration`,`${this.effectiveSpeed()}ms`),this.root.setAttribute(`role`,`region`),this.root.setAttribute(`aria-roledescription`,this.options.ariaRoleDescription),this.options.rtl&&this.root.setAttribute(`dir`,`rtl`),this.viewport=o(`div`,c.viewport),this.track=o(`div`,c.track,{role:`presentation`});let e=this.originalChildren.map((e,t)=>this.wrapAsSlide(e,t));if(this.slideCount=e.length,this.options.infinite&&!this.options.fade&&this.slideCount>0&&!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.setAttribute(`aria-hidden`,`true`),t.setAttribute(`tabindex`,`-1`),t}buildArrows(){let e=this.options.prevArrow,t=this.options.nextArrow;this.prevArrow=this.resolveArrow(e,`prev`),this.nextArrow=this.resolveArrow(t,`next`),this.root.appendChild(this.prevArrow),this.root.appendChild(this.nextArrow),this.prevArrow.addEventListener(`click`,this.handlePrevClick),this.nextArrow.addEventListener(`click`,this.handleNextClick)}resolveArrow(e,t){let n;if(e instanceof HTMLElement)n=e.cloneNode(!0);else if(typeof e==`string`&&e.trim()){let t=document.createElement(`div`);t.innerHTML=e.trim(),n=t.firstElementChild??o(`button`)}else n=o(`button`,``,{type:`button`}),n.innerHTML=t===`prev`?`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 6l-6 6 6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`:`<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 6l6 6-6 6" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`;return n.classList.add(c.arrow,t===`prev`?c.arrowPrev:c.arrowNext),n.setAttribute(`aria-label`,t===`prev`?`Previous slide`:`Next slide`),n.tagName!==`BUTTON`&&n.setAttribute(`role`,`button`),n}buildDots(){this.dotsList=o(`ul`,c.dots,{role:`tablist`});let e=this.pageCount();for(let t=0;t<e;t++){let n=o(`li`,``,{role:`presentation`}),r=t*this.options.slidesToScroll,i=this.options.customPaging?this.options.customPaging(t,e):o(`button`,`${c.dot} ${c.dotBullet}`,{type:`button`,"aria-label":`Go to slide ${t+1}`,role:`tab`}),a=typeof i==`string`?this.htmlToElement(i):i;a.classList.add(c.dot),a.setAttribute(`data-slick-target`,String(r)),a.addEventListener(`click`,()=>this.goTo(r)),n.appendChild(a),this.dotsList.appendChild(n)}this.root.appendChild(this.dotsList)}htmlToElement(e){let t=document.createElement(`div`);t.innerHTML=e.trim();let n=t.firstElementChild;if(n)return n;let r=o(`button`,``,{type:`button`});return r.textContent=e,r}viewportSize(){let e=this.viewport.getBoundingClientRect();return this.options.vertical?e.height:e.width}slideSize(){if(this.options.variableWidth){let e=this.slides[this.cloneCount];if(e){let t=e.getBoundingClientRect();return this.options.vertical?t.height:t.width}}let e=this.viewportSize();if(this.options.centerMode){let t=this.parseCenterPadding(e);return Math.max(1,(e-2*t)/Math.max(1,this.options.slidesToShow))}return e/Math.max(1,this.options.slidesToShow)}parseCenterPadding(e){let t=(this.options.centerPadding??``).trim();if(!t)return 0;let n=/^(-?\d+(?:\.\d+)?)\s*(px|%)?$/.exec(t);if(!n||n[1]===void 0)return 0;let r=parseFloat(n[1]);return!Number.isFinite(r)||r<0?0:(n[2]??`px`)===`%`?r/100*e:r}applyLayout(){if(this.slideCount===0)return;if(this.viewportSize(),this.options.fade){this.track.style.transform=``;for(let e=0;e<this.slides.length;e++){let t=this.slides[e];t&&(t.style.position=`absolute`,t.style.top=`0`,t.style.left=`0`,t.style.width=`100%`,t.style.height=`100%`,t.style.opacity=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.zIndex=e===this.realToTrackIndex(this.currentIndex)?`1`:`0`,t.style.transition=`opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`,t.style.pointerEvents=e===this.realToTrackIndex(this.currentIndex)?`auto`:`none`)}this.updateAria(),this.updateArrows(),this.updateDots();return}let e=this.options.variableWidth?null:this.slideSize();for(let t of this.slides)t.style.position=``,t.style.top=``,t.style.left=``,t.style.height=``,t.style.opacity=``,t.style.zIndex=``,t.style.transition=``,t.style.pointerEvents=``,e!==null&&(this.options.vertical?(t.style.width=`100%`,t.style.height=`${e}px`):(t.style.height=``,t.style.width=`${e}px`));this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)),!1),this.updateAria(),this.updateArrows(),this.updateDots(),this.updateAdaptiveHeight()}effectiveSpeed(){return this.options.respectReducedMotion&&a()?0:this.options.speed}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);for(let t=0;t<this.slides.length;t++){let n=this.slides[t];if(!n)continue;let r=this.isSlideInActiveRange(t,e),i=t===e;n.classList.toggle(c.slideActive,r),n.classList.toggle(c.slideCurrent,i),n.classList.contains(c.slideCloned)||(n.setAttribute(`aria-hidden`,r?`false`:`true`),n.setAttribute(`tabindex`,r?`0`:`-1`))}this.updateCenterMode(e)}suppressSlideTransitionsForOneFrame(){this.root.classList.add(`slickless--snap`),this.root.offsetWidth,typeof requestAnimationFrame==`function`?requestAnimationFrame(()=>{requestAnimationFrame(()=>this.root.classList.remove(`slickless--snap`))}):setTimeout(()=>this.root.classList.remove(`slickless--snap`),16)}updateCenterMode(e){if(this.options.centerMode)for(let t=0;t<this.slides.length;t++){let n=this.slides[t];n&&n.classList.toggle(c.slideCenter,t===e)}}isSlideInActiveRange(e,t){let n=Math.max(1,this.options.slidesToShow);if(this.options.centerMode){let r=Math.floor(n/2);return e>=t-r&&e<t+n-r}return e>=t&&e<t+n}updateArrows(){if(!this.prevArrow||!this.nextArrow)return;if(this.options.infinite||this.options.fade){this.prevArrow.classList.remove(c.arrowDisabled),this.nextArrow.classList.remove(c.arrowDisabled),this.prevArrow.removeAttribute(`aria-disabled`),this.nextArrow.removeAttribute(`aria-disabled`);return}let e=this.currentIndex<=0,t=this.currentIndex>=this.slideCount-this.options.slidesToShow;this.prevArrow.classList.toggle(c.arrowDisabled,e),this.nextArrow.classList.toggle(c.arrowDisabled,t),this.prevArrow.setAttribute(`aria-disabled`,String(e)),this.nextArrow.setAttribute(`aria-disabled`,String(t)),this.prevArrow.tagName===`BUTTON`&&(this.prevArrow.disabled=!1),this.nextArrow.tagName===`BUTTON`&&(this.nextArrow.disabled=!1)}pageCount(){if(this.slideCount===0)return 0;let e=Math.ceil((this.slideCount-(this.options.infinite?0:this.options.slidesToShow-1))/Math.max(1,this.options.slidesToScroll));return Math.max(1,e)}updateDots(e){if(!this.dotsList)return;let t=e??this.currentIndex,n=Math.floor(t/Math.max(1,this.options.slidesToScroll));this.dotsList.querySelectorAll(`.${c.dot}`).forEach((e,t)=>{e.classList.toggle(c.dotActive,t===n),e.setAttribute(`aria-selected`,t===n?`true`:`false`)})}updateAdaptiveHeight(e){if(!this.options.adaptiveHeight||this.options.vertical)return;let t=e??this.animatingTo??this.realToTrackIndex(this.currentIndex),n=this.slides[t];if(!n)return;let r=n.getBoundingClientRect().height;r>0&&(this.viewport.style.height=`${r}px`)}applyLazyLoad(){if(!this.options.lazyLoad)return;if(this.options.lazyLoad===`progressive`){this.loadImagesIn(this.slides);return}let e=Math.max(1,this.options.slidesToShow),t=this.realToTrackIndex(this.currentIndex),n=t-1,r=t+e+1,a=[];for(let e=n;e<r;e++){let t=this.options.infinite?i(e,this.slides.length):e;if(t<0||t>=this.slides.length)continue;let n=this.slides[t];n&&a.push(n)}this.loadImagesIn(a)}loadImagesIn(e){for(let t of e)t.querySelectorAll(`img[data-lazy]`).forEach(e=>this.activateLazyImage(e))}activateLazyImage(e){let t=e.getAttribute(`data-lazy`);t&&(e.removeAttribute(`data-lazy`),e.addEventListener(`load`,()=>this.emit(`lazyLoaded`,{image:e,src:t}),{once:!0}),e.addEventListener(`error`,()=>this.emit(`lazyLoadError`,{image:e,src:t}),{once:!0}),e.src=t)}linkAsNavFor(){let e=this.options.asNavFor;if(!e)return;let t=s(e);if(!t)return;let n=t.__slickless;n&&(this.linkedNav=n,n.on(`afterChange`,e=>{this.linkedFromExternal||=(this.linkedFromExternal=!0,this.goTo(e.currentSlide),!1)}))}notifyLinked(){this.linkedNav&&(this.linkedFromExternal||=(this.linkedFromExternal=!0,this.linkedNav.goTo(this.currentIndex),!1))}getCurrentSlide(){return this.currentIndex}getSlideCount(){return this.slideCount}getSlides(){return this.slides.slice(this.cloneCount,this.cloneCount+this.slideCount)}setOptions(e,t=!0){this.userOptions={...this.userOptions,...e},t?this.reInit():this.options=n(this.options,e)}refresh(){this.destroyed||this.applyLayout()}addSlide(e,t){typeof t==`number`?this.originalChildren.splice(t,0,e):this.originalChildren.push(e),this.reInit()}removeSlide(e){e<0||e>=this.originalChildren.length||(this.originalChildren.splice(e,1),this.reInit())}};function u(e,t={}){return new l(e,t)}var d=l;e.DEFAULTS=t,e.Slickless=l,e.default=d,e.slickless=u});
|
|
2
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 private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (this.options.infinite && !this.options.fade && this.slideCount > 0) {\n // For variableWidth we can't predict how many slides the viewport will\n // hold (each slide has its own intrinsic width), so clone the full set\n // at both ends. For fixed-width layouts, slidesToShow tells us exactly\n // how many neighbours need to be available beyond the current window.\n const desired = this.options.variableWidth\n ? this.slideCount\n : Math.max(this.options.slidesToShow, 1);\n this.cloneCount = Math.min(desired, this.slideCount);\n const head = realSlides.slice(-this.cloneCount).map((s) => this.cloneSlide(s));\n const tail = realSlides.slice(0, this.cloneCount).map((s) => this.cloneSlide(s));\n this.slides = [...head, ...realSlides, ...tail];\n } else {\n this.cloneCount = 0;\n this.slides = realSlides;\n }\n\n for (const slide of this.slides) this.track.appendChild(slide);\n this.viewport.appendChild(this.track);\n this.root.appendChild(this.viewport);\n\n if (this.options.arrows && this.slideCount > this.options.slidesToShow) {\n this.buildArrows();\n }\n if (this.options.dots && this.slideCount > 0) {\n this.buildDots();\n }\n\n this.applyLayout();\n this.applyLazyLoad();\n }\n\n private wrapAsSlide(child: HTMLElement, index: number): HTMLElement {\n const slide = createEl(\"div\", CLASS.slide, {\n role: \"group\",\n \"aria-roledescription\": \"slide\",\n \"aria-label\": `${index + 1} of ${this.originalChildren.length}`,\n \"data-slick-index\": String(index),\n });\n slide.appendChild(child);\n return slide;\n }\n\n private cloneSlide(original: HTMLElement): HTMLElement {\n const clone = original.cloneNode(true) as HTMLElement;\n clone.classList.add(CLASS.slideCloned);\n clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n private indexToOffset(trackIndex: number): number {\n if (this.options.variableWidth) {\n let offset = 0;\n for (let i = 0; i < trackIndex; i++) {\n const s = this.slides[i];\n if (!s) continue;\n const r = s.getBoundingClientRect();\n offset += this.options.vertical ? r.height : r.width;\n }\n if (this.options.centerMode) {\n const focused = this.slides[trackIndex];\n if (focused) {\n const r = focused.getBoundingClientRect();\n offset -=\n (this.viewportSize() - (this.options.vertical ? r.height : r.width)) / 2;\n }\n }\n return offset;\n }\n const size = this.slideSize();\n let offset = trackIndex * size;\n if (this.options.centerMode) {\n offset -= (this.viewportSize() - size) / 2;\n } else if (!this.options.infinite && !this.options.fade) {\n // Don't translate past the end — keeps the last \"window\" of slides flush\n // with the viewport even when `goTo` targets a later index than fits.\n const maxOffset = Math.max(0, (this.slideCount - this.options.slidesToShow) * size);\n offset = Math.min(offset, maxOffset);\n }\n return offset;\n }\n\n private translateTo(offset: number, animate: boolean): void {\n const speed = animate ? this.effectiveSpeed() : 0;\n const axis = this.options.vertical ? \"Y\" : \"X\";\n const dir = this.options.rtl && !this.options.vertical ? 1 : -1;\n this.track.style.transition = speed > 0 ? `transform ${speed}ms ${this.options.cssEase}` : \"\";\n this.track.style.transform = `translate${axis}(${dir * offset}px)`;\n }\n\n next(): void {\n this.goTo(this.currentIndex + this.options.slidesToScroll);\n }\n\n prev(): void {\n this.goTo(this.currentIndex - this.options.slidesToScroll);\n }\n\n goTo(index: number, immediate = false): void {\n if (this.destroyed) return;\n if (this.slideCount === 0) return;\n // Lock out new navigation while a transition is in flight. Rapid clicks\n // beyond the current animation are simply dropped — predictable beats\n // clever here.\n if (this.animating && !immediate) return;\n\n let target = index;\n const wrapEnabled = this.options.infinite && !this.options.fade;\n\n if (!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 this.options.autoplay = true;\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n\n pause(): void {\n this.autoplayPaused = true;\n if (this.autoplayTimer) {\n clearTimeout(this.autoplayTimer);\n this.autoplayTimer = null;\n }\n }\n\n private scheduleAutoplay(): void {\n if (!this.options.autoplay || this.autoplayPaused) return;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n this.autoplayTimer = setTimeout(() => {\n if (this.options.autoplayDirection === \"backward\") this.prev();\n else this.next();\n this.scheduleAutoplay();\n }, this.options.autoplaySpeed);\n }\n\n on<T = unknown>(event: string, handler: (detail: T) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n const set = this.listeners.get(event)!;\n set.add(handler as (detail: unknown) => void);\n return () => set.delete(handler as (detail: unknown) => void);\n }\n\n off(event: string, handler: (detail: unknown) => void): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n private emit(event: string, detail: unknown): void {\n this.listeners.get(event)?.forEach((fn) => fn(detail));\n this.root.dispatchEvent(new CustomEvent(`slickless:${event}`, { detail, bubbles: false }));\n }\n\n private handlePrevClick = (e: Event): void => {\n e.preventDefault();\n this.prev();\n };\n\n private handleNextClick = (e: Event): void => {\n e.preventDefault();\n this.next();\n };\n\n private handleResize = (): void => {\n // Height-only changes (e.g. adaptiveHeight resizing the viewport) shouldn't\n // re-snap the track transform — that interrupts in-flight slide animations.\n const width = this.root.getBoundingClientRect().width;\n if (width === this.lastRootWidth) return;\n this.lastRootWidth = width;\n this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable) this.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 for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slickless.umd.cjs","names":[],"sources":["../src/defaults.ts","../src/utils.ts","../src/slickless.ts","../src/index.ts"],"sourcesContent":["import type { SlicklessOptions } from \"./types\";\n\nexport const DEFAULTS: SlicklessOptions = {\n arrows: true,\n dots: false,\n autoplay: false,\n autoplaySpeed: 3000,\n speed: 400,\n cssEase: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n slidesToShow: 1,\n slidesToScroll: 1,\n infinite: true,\n fade: false,\n vertical: false,\n initialSlide: 0,\n variableWidth: false,\n centerMode: false,\n centerPadding: \"50px\",\n rtl: false,\n draggable: true,\n swipeThreshold: 24,\n pauseOnHover: true,\n pauseOnFocus: true,\n accessibility: true,\n adaptiveHeight: false,\n lazyLoad: false,\n respectReducedMotion: true,\n prevArrow: null,\n nextArrow: null,\n customPaging: null,\n ariaRoleDescription: \"carousel\",\n responsive: null,\n asNavFor: null,\n focusOnSelect: false,\n autoplayDirection: \"forward\",\n};\n\nexport function mergeOptions(\n base: SlicklessOptions,\n override: Partial<SlicklessOptions>,\n): SlicklessOptions {\n return { ...base, ...override };\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function mod(n: number, m: number): number {\n return ((n % m) + m) % m;\n}\n\nexport function prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || !window.matchMedia) return false;\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nexport function createEl<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attrs?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, v);\n }\n return el;\n}\n\nexport function ensureNumber(value: unknown, fallback: number): number {\n const n = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function resolveElement(\n selectorOrElement: string | HTMLElement | null,\n): HTMLElement | null {\n if (!selectorOrElement) return null;\n if (typeof selectorOrElement === \"string\") {\n return document.querySelector<HTMLElement>(selectorOrElement);\n }\n return selectorOrElement;\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => resolve());\n } else {\n setTimeout(() => resolve(), 16);\n }\n });\n}\n","import { DEFAULTS, mergeOptions } from \"./defaults\";\nimport type {\n AfterChangeDetail,\n BeforeChangeDetail,\n BreakpointDetail,\n EdgeDetail,\n LazyLoadDetail,\n ResponsiveBreakpoint,\n SlicklessOptions,\n SwipeDetail,\n} from \"./types\";\nimport { clamp, createEl, mod, prefersReducedMotion, resolveElement } from \"./utils\";\n\ninterface Pointer {\n id: number;\n startX: number;\n startY: number;\n startTime: number;\n startTransform: number;\n active: boolean;\n decided: boolean;\n isHorizontal: boolean;\n}\n\nconst CLASS = {\n root: \"slickless\",\n initialized: \"slickless--initialized\",\n viewport: \"slickless__viewport\",\n track: \"slickless__track\",\n slide: \"slickless__slide\",\n slideActive: \"slickless__slide--active\",\n slideCenter: \"slickless__slide--center\",\n slideCloned: \"slickless__slide--cloned\",\n slideCurrent: \"slickless__slide--current\",\n arrow: \"slickless__arrow\",\n arrowPrev: \"slickless__arrow--prev\",\n arrowNext: \"slickless__arrow--next\",\n arrowDisabled: \"slickless__arrow--disabled\",\n dots: \"slickless__dots\",\n dot: \"slickless__dot\",\n dotBullet: \"slickless__dot--bullet\",\n dotActive: \"slickless__dot--active\",\n vertical: \"slickless--vertical\",\n fade: \"slickless--fade\",\n rtl: \"slickless--rtl\",\n dragging: \"slickless--dragging\",\n centerMode: \"slickless--center\",\n adaptive: \"slickless--adaptive-height\",\n};\n\nexport class Slickless {\n readonly root: HTMLElement;\n private userOptions: Partial<SlicklessOptions>;\n options: SlicklessOptions;\n\n private originalChildren: HTMLElement[] = [];\n private slides: HTMLElement[] = [];\n private track!: HTMLElement;\n private viewport!: HTMLElement;\n private prevArrow: HTMLElement | null = null;\n private nextArrow: HTMLElement | null = null;\n private dotsList: HTMLElement | null = null;\n private cloneCount = 0;\n\n private currentIndex = 0;\n /** Track index we are animating toward. Lets layout reads use the future\n * slide for height-syncing while the transform is still in flight. */\n private animatingTo: number | null = null;\n private slideCount = 0;\n private animating = false;\n /** Last observed root width — used to ignore height-only ResizeObserver\n * fires (e.g. when adaptiveHeight changes the viewport height). */\n private lastRootWidth = 0;\n private destroyed = false;\n private currentBreakpoint: number | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private autoplayTimer: ReturnType<typeof setTimeout> | null = null;\n private autoplayPaused = false;\n private listeners: Map<string, Set<(detail: unknown) => void>> = new Map();\n private pointer: Pointer | null = null;\n private pointerHandlers: {\n down?: (e: Event) => void;\n move?: (e: Event) => void;\n up?: (e: Event) => void;\n cancel?: (e: Event) => void;\n } = {};\n private linkedNav: Slickless | null = null;\n private linkedFromExternal = false;\n\n constructor(root: string | HTMLElement, options: Partial<SlicklessOptions> = {}) {\n const el = typeof root === \"string\" ? document.querySelector<HTMLElement>(root) : root;\n if (!el) throw new Error(`[slickless] Root element not found: ${String(root)}`);\n this.root = el;\n this.userOptions = options;\n this.options = mergeOptions(DEFAULTS, options);\n this.init();\n }\n\n private init(): void {\n this.captureChildren();\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(this.options.initialSlide, true);\n if (this.options.autoplay) this.play();\n this.linkAsNavFor();\n (this.root as HTMLElement & { __slickless?: Slickless }).__slickless = this;\n this.root.classList.add(CLASS.initialized);\n // Defer the init event so callers can subscribe immediately after\n // `new Slickless(...)` returns.\n const emitInit = () => {\n if (!this.destroyed) this.emit(\"init\", { slickless: this });\n };\n if (typeof queueMicrotask === \"function\") queueMicrotask(emitInit);\n else Promise.resolve().then(emitInit);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) {\n this.root.appendChild(child);\n child.removeAttribute(\"aria-hidden\");\n child.removeAttribute(\"tabindex\");\n child.removeAttribute(\"role\");\n child.removeAttribute(\"aria-roledescription\");\n child.removeAttribute(\"aria-label\");\n child.style.cssText = \"\";\n }\n this.root.className = this.root.className\n .split(/\\s+/)\n .filter((c) => !c.startsWith(\"slickless\"))\n .join(\" \")\n .trim();\n this.root.removeAttribute(\"role\");\n this.root.removeAttribute(\"aria-roledescription\");\n this.root.removeAttribute(\"dir\");\n\n this.destroyed = true;\n this.emit(\"destroy\", { slickless: this });\n this.listeners.clear();\n }\n\n reInit(): void {\n const wasIndex = this.currentIndex;\n const wasAutoplaying = this.options.autoplay && !this.autoplayPaused;\n this.pause();\n this.unbindEvents();\n if (this.resizeObserver) this.resizeObserver.disconnect();\n this.root.innerHTML = \"\";\n for (const child of this.originalChildren) this.root.appendChild(child);\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n this.applyResponsive();\n this.build();\n this.bindEvents();\n this.goTo(clamp(wasIndex, 0, this.slideCount - 1), true);\n if (wasAutoplaying) this.play();\n this.emit(\"reInit\", { slickless: this });\n }\n\n private captureChildren(): void {\n if (this.originalChildren.length === 0) {\n this.originalChildren = Array.from(this.root.children) as HTMLElement[];\n }\n }\n\n private applyResponsive(): void {\n const responsive = this.options.responsive;\n if (!responsive || responsive.length === 0) return;\n if (typeof window === \"undefined\") return;\n const width = window.innerWidth;\n const sorted: ResponsiveBreakpoint[] = [...responsive].sort(\n (a, b) => a.breakpoint - b.breakpoint,\n );\n let active: ResponsiveBreakpoint | null = null;\n for (const item of sorted) {\n if (width <= item.breakpoint) {\n active = item;\n break;\n }\n }\n const newBp = active ? active.breakpoint : null;\n if (newBp === this.currentBreakpoint) return;\n this.currentBreakpoint = newBp;\n if (active) {\n if (active.settings === \"unslick\") {\n this.destroy();\n return;\n }\n this.options = mergeOptions(mergeOptions(DEFAULTS, this.userOptions), active.settings);\n } else {\n this.options = mergeOptions(DEFAULTS, this.userOptions);\n }\n const detail: BreakpointDetail = { breakpoint: newBp };\n this.emit(\"breakpoint\", detail);\n }\n\n private build(): void {\n this.root.innerHTML = \"\";\n this.root.classList.add(CLASS.root);\n this.root.classList.toggle(CLASS.vertical, this.options.vertical);\n this.root.classList.toggle(CLASS.fade, this.options.fade);\n this.root.classList.toggle(CLASS.rtl, this.options.rtl);\n this.root.classList.toggle(CLASS.centerMode, this.options.centerMode);\n this.root.classList.toggle(CLASS.adaptive, this.options.adaptiveHeight);\n // Expose the slide transition duration to CSS so optional effects like\n // the center-mode scale can stay in sync with the configured speed.\n this.root.style.setProperty(\n \"--slickless-transition-duration\",\n `${this.effectiveSpeed()}ms`,\n );\n this.root.setAttribute(\"role\", \"region\");\n this.root.setAttribute(\"aria-roledescription\", this.options.ariaRoleDescription);\n if (this.options.rtl) this.root.setAttribute(\"dir\", \"rtl\");\n\n this.viewport = createEl(\"div\", CLASS.viewport);\n this.track = createEl(\"div\", CLASS.track, { role: \"presentation\" });\n\n const realSlides = this.originalChildren.map((child, i) => this.wrapAsSlide(child, i));\n this.slideCount = realSlides.length;\n\n if (\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 clone.setAttribute(\"aria-hidden\", \"true\");\n clone.setAttribute(\"tabindex\", \"-1\");\n return clone;\n }\n\n private buildArrows(): void {\n const prevHtml = this.options.prevArrow;\n const nextHtml = this.options.nextArrow;\n this.prevArrow = this.resolveArrow(prevHtml, \"prev\");\n this.nextArrow = this.resolveArrow(nextHtml, \"next\");\n this.root.appendChild(this.prevArrow);\n this.root.appendChild(this.nextArrow);\n this.prevArrow.addEventListener(\"click\", this.handlePrevClick);\n this.nextArrow.addEventListener(\"click\", this.handleNextClick);\n }\n\n private resolveArrow(custom: string | HTMLElement | null, dir: \"prev\" | \"next\"): HTMLElement {\n let el: HTMLElement;\n if (custom instanceof HTMLElement) {\n el = custom.cloneNode(true) as HTMLElement;\n } else if (typeof custom === \"string\" && custom.trim()) {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = custom.trim();\n el = (tmp.firstElementChild as HTMLElement) ?? createEl(\"button\");\n } else {\n el = createEl(\"button\", \"\", { type: \"button\" });\n el.innerHTML =\n dir === \"prev\"\n ? `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n : `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n }\n el.classList.add(CLASS.arrow, dir === \"prev\" ? CLASS.arrowPrev : CLASS.arrowNext);\n el.setAttribute(\"aria-label\", dir === \"prev\" ? \"Previous slide\" : \"Next slide\");\n if (el.tagName !== \"BUTTON\") el.setAttribute(\"role\", \"button\");\n return el;\n }\n\n private buildDots(): void {\n this.dotsList = createEl(\"ul\", CLASS.dots, { role: \"tablist\" });\n const pageCount = this.pageCount();\n for (let i = 0; i < pageCount; i++) {\n const li = createEl(\"li\", \"\", { role: \"presentation\" });\n const target = i * this.options.slidesToScroll;\n const usingCustom = !!this.options.customPaging;\n const inner = usingCustom\n ? this.options.customPaging!(i, pageCount)\n : createEl(\"button\", `${CLASS.dot} ${CLASS.dotBullet}`, {\n type: \"button\",\n \"aria-label\": `Go to slide ${i + 1}`,\n role: \"tab\",\n });\n const button = typeof inner === \"string\" ? this.htmlToElement(inner) : inner;\n // Always add the base class so updateDots() can find the dot.\n // Only the default bullet variant gets the visual styling class.\n button.classList.add(CLASS.dot);\n button.setAttribute(\"data-slick-target\", String(target));\n button.addEventListener(\"click\", () => this.goTo(target));\n li.appendChild(button);\n this.dotsList.appendChild(li);\n }\n this.root.appendChild(this.dotsList);\n }\n\n private htmlToElement(html: string): HTMLElement {\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = html.trim();\n const el = tmp.firstElementChild as HTMLElement | null;\n if (el) return el;\n const btn = createEl(\"button\", \"\", { type: \"button\" });\n btn.textContent = html;\n return btn;\n }\n\n private viewportSize(): number {\n const rect = this.viewport.getBoundingClientRect();\n return this.options.vertical ? rect.height : rect.width;\n }\n\n private slideSize(): number {\n if (this.options.variableWidth) {\n const real = this.slides[this.cloneCount];\n if (real) {\n const r = real.getBoundingClientRect();\n return this.options.vertical ? r.height : r.width;\n }\n }\n const vp = this.viewportSize();\n if (this.options.centerMode) {\n // centerPadding shrinks the slides so neighbours peek through on both\n // sides. Without subtracting it here the option would have no effect.\n const pad = this.parseCenterPadding(vp);\n return Math.max(1, (vp - 2 * pad) / Math.max(1, this.options.slidesToShow));\n }\n return vp / Math.max(1, this.options.slidesToShow);\n }\n\n /**\n * Resolve `centerPadding` (e.g. \"50px\" or \"10%\") to a pixel value based on\n * the current viewport size. Negative or unparseable values fall back to 0.\n */\n private parseCenterPadding(viewportSize: number): number {\n const raw = (this.options.centerPadding ?? \"\").trim();\n if (!raw) return 0;\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(px|%)?$/.exec(raw);\n if (!match || match[1] === undefined) return 0;\n const value = parseFloat(match[1]);\n if (!Number.isFinite(value) || value < 0) return 0;\n const unit = match[2] ?? \"px\";\n return unit === \"%\" ? (value / 100) * viewportSize : value;\n }\n\n private applyLayout(): void {\n if (this.slideCount === 0) return;\n const vp = this.viewportSize();\n\n if (this.options.fade) {\n this.track.style.transform = \"\";\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.style.position = \"absolute\";\n slide.style.top = \"0\";\n slide.style.left = \"0\";\n slide.style.width = \"100%\";\n slide.style.height = \"100%\";\n slide.style.opacity = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.zIndex = i === this.realToTrackIndex(this.currentIndex) ? \"1\" : \"0\";\n slide.style.transition = `opacity ${this.effectiveSpeed()}ms ${this.options.cssEase}`;\n slide.style.pointerEvents =\n i === this.realToTrackIndex(this.currentIndex) ? \"auto\" : \"none\";\n }\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n return;\n }\n\n // Use the shared slideSize() helper so centerPadding is honoured by both\n // the slide-width writes here and the offset maths in indexToOffset.\n const slideSize = this.options.variableWidth ? null : this.slideSize();\n\n for (const slide of this.slides) {\n slide.style.position = \"\";\n slide.style.top = \"\";\n slide.style.left = \"\";\n slide.style.height = \"\";\n slide.style.opacity = \"\";\n slide.style.zIndex = \"\";\n slide.style.transition = \"\";\n slide.style.pointerEvents = \"\";\n if (slideSize !== null) {\n if (this.options.vertical) {\n slide.style.width = \"100%\";\n slide.style.height = `${slideSize}px`;\n } else {\n slide.style.height = \"\";\n slide.style.width = `${slideSize}px`;\n }\n }\n }\n\n this.translateTo(this.indexToOffset(this.realToTrackIndex(this.currentIndex)), false);\n this.updateAria();\n this.updateArrows();\n this.updateDots();\n this.updateAdaptiveHeight();\n }\n\n private effectiveSpeed(): number {\n if (this.options.respectReducedMotion && prefersReducedMotion()) return 0;\n return this.options.speed;\n }\n\n /**\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 this.applyResponsive();\n this.applyLayout();\n };\n\n private handleKey = (e: KeyboardEvent): void => {\n if (!this.options.accessibility) return;\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n if (this.options.rtl) this.next();\n else this.prev();\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n if (this.options.rtl) this.prev();\n else this.next();\n } else if (e.key === \"Home\") {\n e.preventDefault();\n this.goTo(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n this.goTo(this.slideCount - 1);\n }\n };\n\n private handleMouseEnter = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleMouseLeave = (): void => {\n if (this.options.pauseOnHover && this.options.autoplay) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n };\n\n private handleFocusIn = (): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n this.autoplayPaused = true;\n if (this.autoplayTimer) clearTimeout(this.autoplayTimer);\n }\n };\n\n private handleFocusOut = (e: FocusEvent): void => {\n if (this.options.pauseOnFocus && this.options.autoplay) {\n const next = e.relatedTarget as Node | null;\n if (!next || !this.root.contains(next)) {\n this.autoplayPaused = false;\n this.scheduleAutoplay();\n }\n }\n };\n\n private bindEvents(): void {\n this.root.addEventListener(\"keydown\", this.handleKey);\n this.root.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.root.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.root.addEventListener(\"focusin\", this.handleFocusIn);\n this.root.addEventListener(\"focusout\", this.handleFocusOut);\n this.root.setAttribute(\"tabindex\", \"0\");\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.handleResize());\n this.resizeObserver.observe(this.root);\n } else if (typeof window !== \"undefined\") {\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n if (this.options.draggable) this.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 for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n const isActive = this.isSlideInActiveRange(i, trackIndex);\n const isCurrent = i === trackIndex;\n slide.classList.toggle(CLASS.slideActive, isActive);\n slide.classList.toggle(CLASS.slideCurrent, isCurrent);\n if (!slide.classList.contains(CLASS.slideCloned)) {\n slide.setAttribute(\"aria-hidden\", isActive ? \"false\" : \"true\");\n slide.setAttribute(\"tabindex\", isActive ? \"0\" : \"-1\");\n }\n }\n // Re-sync center class after settle so any state that diverged from the\n // in-flight target (e.g. a snap after an infinite wrap) is corrected.\n this.updateCenterMode(trackIndex);\n }\n\n private suppressSlideTransitionsForOneFrame(): void {\n this.root.classList.add(\"slickless--snap\");\n // Force layout flush so style change is committed before we restore it.\n void this.root.offsetWidth;\n if (typeof requestAnimationFrame === \"function\") {\n requestAnimationFrame(() => {\n // Run another rAF so the class is removed AFTER the snap frame has\n // painted — otherwise the browser may still batch and animate.\n requestAnimationFrame(() => this.root.classList.remove(\"slickless--snap\"));\n });\n } else {\n setTimeout(() => this.root.classList.remove(\"slickless--snap\"), 16);\n }\n }\n\n private updateCenterMode(trackIndex: number): void {\n if (!this.options.centerMode) return;\n for (let i = 0; i < this.slides.length; i++) {\n const slide = this.slides[i];\n if (!slide) continue;\n slide.classList.toggle(CLASS.slideCenter, i === trackIndex);\n }\n }\n\n private isSlideInActiveRange(slideIdxInTrack: number, currentTrackIndex: number): boolean {\n const show = Math.max(1, this.options.slidesToShow);\n if (this.options.centerMode) {\n const half = Math.floor(show / 2);\n return (\n slideIdxInTrack >= currentTrackIndex - half &&\n slideIdxInTrack < currentTrackIndex + show - half\n );\n }\n return (\n slideIdxInTrack >= currentTrackIndex && slideIdxInTrack < currentTrackIndex + show\n );\n }\n\n private updateArrows(): void {\n if (!this.prevArrow || !this.nextArrow) return;\n if (this.options.infinite || this.options.fade) {\n this.prevArrow.classList.remove(CLASS.arrowDisabled);\n this.nextArrow.classList.remove(CLASS.arrowDisabled);\n this.prevArrow.removeAttribute(\"aria-disabled\");\n this.nextArrow.removeAttribute(\"aria-disabled\");\n return;\n }\n const atStart = this.currentIndex <= 0;\n const atEnd = this.currentIndex >= this.slideCount - this.options.slidesToShow;\n this.prevArrow.classList.toggle(CLASS.arrowDisabled, atStart);\n this.nextArrow.classList.toggle(CLASS.arrowDisabled, atEnd);\n this.prevArrow.setAttribute(\"aria-disabled\", String(atStart));\n this.nextArrow.setAttribute(\"aria-disabled\", String(atEnd));\n // Use only aria-disabled + CSS for the visual/semantic disabled state.\n // Setting the native `disabled` attribute would suppress click events,\n // which would also suppress the `edge` event when users click an arrow\n // already at the boundary — different from drag-at-edge behaviour.\n if (this.prevArrow.tagName === \"BUTTON\")\n (this.prevArrow as HTMLButtonElement).disabled = false;\n if (this.nextArrow.tagName === \"BUTTON\")\n (this.nextArrow as HTMLButtonElement).disabled = false;\n }\n\n private pageCount(): number {\n if (this.slideCount === 0) return 0;\n const pages = Math.ceil(\n (this.slideCount - (this.options.infinite ? 0 : this.options.slidesToShow - 1)) /\n Math.max(1, this.options.slidesToScroll),\n );\n return Math.max(1, pages);\n }\n\n private updateDots(realIndex?: number): void {\n if (!this.dotsList) return;\n const idx = realIndex ?? this.currentIndex;\n const pageIdx = Math.floor(idx / Math.max(1, this.options.slidesToScroll));\n const items = this.dotsList.querySelectorAll(`.${CLASS.dot}`);\n items.forEach((el, i) => {\n el.classList.toggle(CLASS.dotActive, i === pageIdx);\n el.setAttribute(\"aria-selected\", i === pageIdx ? \"true\" : \"false\");\n });\n }\n\n private updateAdaptiveHeight(trackIndex?: number): void {\n if (!this.options.adaptiveHeight || this.options.vertical) return;\n // Prefer (in order): explicit trackIndex argument, the in-flight\n // animation target, then the current slide. This stops mid-animation\n // resize observers from snapping the height back to the old slide.\n const idx = trackIndex ?? this.animatingTo ?? this.realToTrackIndex(this.currentIndex);\n const slide = this.slides[idx];\n if (!slide) return;\n const h = slide.getBoundingClientRect().height;\n if (h > 0) this.viewport.style.height = `${h}px`;\n }\n\n private applyLazyLoad(): void {\n if (!this.options.lazyLoad) return;\n if (this.options.lazyLoad === \"progressive\") {\n this.loadImagesIn(this.slides);\n return;\n }\n const show = Math.max(1, this.options.slidesToShow);\n const currentTrack = this.realToTrackIndex(this.currentIndex);\n const buffer = 1;\n const start = currentTrack - buffer;\n const end = currentTrack + show + buffer;\n const targets: HTMLElement[] = [];\n for (let i = start; i < end; i++) {\n // Only wrap into the clone region when the carousel is actually\n // infinite. For finite carousels the buffer should clip at the edges\n // instead of cycling round and pre-loading the opposite end.\n const idx = this.options.infinite ? mod(i, this.slides.length) : i;\n if (idx < 0 || idx >= this.slides.length) continue;\n const s = this.slides[idx];\n if (s) targets.push(s);\n }\n this.loadImagesIn(targets);\n }\n\n private loadImagesIn(slides: HTMLElement[]): void {\n for (const slide of slides) {\n const imgs = slide.querySelectorAll<HTMLImageElement>(\"img[data-lazy]\");\n imgs.forEach((img) => this.activateLazyImage(img));\n }\n }\n\n private activateLazyImage(img: HTMLImageElement): void {\n const src = img.getAttribute(\"data-lazy\");\n if (!src) return;\n img.removeAttribute(\"data-lazy\");\n img.addEventListener(\n \"load\",\n () => this.emit(\"lazyLoaded\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.addEventListener(\n \"error\",\n () => this.emit(\"lazyLoadError\", { image: img, src } satisfies LazyLoadDetail),\n { once: true },\n );\n img.src = src;\n }\n\n private linkAsNavFor(): void {\n const nav = this.options.asNavFor;\n if (!nav) return;\n const el = resolveElement(typeof nav === \"string\" ? nav : nav);\n if (!el) return;\n const instance = (el as HTMLElement & { __slickless?: Slickless }).__slickless;\n if (instance) {\n this.linkedNav = instance;\n instance.on<AfterChangeDetail>(\"afterChange\", (detail) => {\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.goTo(detail.currentSlide);\n this.linkedFromExternal = false;\n });\n }\n }\n\n private notifyLinked(): void {\n if (!this.linkedNav) return;\n if (this.linkedFromExternal) return;\n this.linkedFromExternal = true;\n this.linkedNav.goTo(this.currentIndex);\n this.linkedFromExternal = false;\n }\n\n getCurrentSlide(): number {\n return this.currentIndex;\n }\n\n getSlideCount(): number {\n return this.slideCount;\n }\n\n getSlides(): HTMLElement[] {\n return this.slides.slice(this.cloneCount, this.cloneCount + this.slideCount);\n }\n\n setOptions(options: Partial<SlicklessOptions>, refresh = true): void {\n this.userOptions = { ...this.userOptions, ...options };\n if (refresh) {\n this.reInit();\n } else {\n this.options = mergeOptions(this.options, options);\n }\n }\n\n /**\n * Recompute slide widths and re-position the track using the currently\n * stored options. Cheaper than `reInit` — no DOM teardown, no rebuild — and\n * suitable for live tweaks like dragging a slider that updates layout-only\n * options (e.g. `centerPadding`, `slidesToScroll`, `cssEase`).\n */\n refresh(): void {\n if (this.destroyed) return;\n this.applyLayout();\n }\n\n addSlide(element: HTMLElement, index?: number): void {\n if (typeof index === \"number\") {\n this.originalChildren.splice(index, 0, element);\n } else {\n this.originalChildren.push(element);\n }\n this.reInit();\n }\n\n removeSlide(index: number): void {\n if (index < 0 || index >= this.originalChildren.length) return;\n this.originalChildren.splice(index, 1);\n this.reInit();\n }\n}\n","import \"./styles.css\";\nexport { Slickless } from \"./slickless\";\nexport { DEFAULTS } from \"./defaults\";\nexport type {\n SlicklessOptions,\n ResponsiveBreakpoint,\n SlicklessEvent,\n BeforeChangeDetail,\n AfterChangeDetail,\n SwipeDetail,\n EdgeDetail,\n BreakpointDetail,\n LazyLoadDetail,\n Direction,\n} from \"./types\";\n\nimport { Slickless as _Slickless } from \"./slickless\";\nimport type { SlicklessOptions } from \"./types\";\n\n/** Functional helper — creates a Slickless instance. */\nexport function slickless(\n root: string | HTMLElement,\n options: Partial<SlicklessOptions> = {},\n): _Slickless {\n return new _Slickless(root, options);\n}\n\nexport default _Slickless;\n"],"mappings":"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"}
|