function newBasicSlideDeck({
count = 0,
id,
activate = () => {},
deactivate = () => {},
handleError = console.error,
width = 500,
height = width / 1.6,
delay = 100,
...options
}) {
id = id || newId();
const div = document.createElement("div");
div.innerHTML = `
<!-- Slider main container -->
<div class="swiper" id="${id}">
<!-- Slides are in an additional required wrapper -->
<div class="swiper-wrapper"></div>
<!-- Pagination -->
<div class="swiper-pagination"></div>
<!-- Navigation buttons -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<!-- Scrollbar -->
<div class="swiper-scrollbar"></div>
</div>
<style>
#${id} {
width: ${width}px;
height: ${height}px;
}
</style>
`;
const rootElm = div.querySelector(".swiper");
const wrapperElm = rootElm.querySelector(".swiper-wrapper");
for (let i = 0; i < count; i++) {
const element = document.createElement("div");
element.classList.add("swiper-slide");
wrapperElm.appendChild(element);
}
let info;
let promise = Promise.resolve();
const onUpdate = debounce((swiper) => {
promise = promise.then(async () => {
try {
const element = swiper.slides[swiper.realIndex];
if (info && element === info.element) return;
if (info) {
await deactivate(info);
info = null;
}
if (!element) return;
info = {
element,
slideElement: element,
index: swiper.realIndex,
swiper,
width,
height,
...options
};
await activate(info);
div.dispatchEvent(new CustomEvent("input"));
} catch (error) {
handleError(error);
}
});
}, delay);
const swiper = new Swiper(rootElm, {
// Optional parameters
// direction: "horizontal", // "vertical",
direction: "horizontal",
...options,
keyboard: {
enabled: true,
...options.keyboard
},
// If we need pagination
pagination: {
...options.pagination,
el: rootElm.querySelector(".swiper-pagination"),
// clickable: true,
type: "fraction"
},
// Navigation arrows
navigation: {
...options.navigation,
nextEl: rootElm.querySelector(".swiper-button-next"),
prevEl: rootElm.querySelector(".swiper-button-prev")
},
// And if we need scrollbar
scrollbar: {
draggable: true, // draggable scrollbar
snapOnRelease: true,
...options.scrollbar,
el: div.querySelector(".swiper-scrollbar")
},
on: {
beforeSlideChangeStart: onUpdate,
slideChange: onUpdate
}
});
Object.defineProperty(div, "value", {
get: () => (info ? info.index : -1),
set: (value = 0) => {
!isNaN(value) && swiper.slideTo(value);
}
});
return Object.assign(div, { swiper });
function newId(prefix = "id") {
const ns = newId;
const base = (ns._base = ns._base || Date.now());
const id = (ns._counter = (ns._counter || 0) + 1);
return `${prefix}-${base}-${id}`;
}
function debounce(func, delay) {
let id;
return (...args) => (
clearTimeout(id), (id = setTimeout(() => func(...args), delay))
);
}
}