@ribajs/bs4
Version:
Bootstrap 4 module for Riba.js
894 lines • 75.3 kB
JavaScript
import { EventDispatcher } from "@ribajs/events";
import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js";
import { clone, camelCase } from "@ribajs/utils/src/type.js";
import { throttle, debounce } from "@ribajs/utils";
import { TemplatesComponent } from "@ribajs/core";
import { Dragscroll, Autoscroll, ScrollEventsService, getScrollPosition, } from "@ribajs/extras";
import templateSlides from "./bs4-slideshow-slides.component.html?raw";
import templateControls from "./bs4-slideshow-controls.component.html?raw";
import templateIndicators from "./bs4-slideshow-indicators.component.html?raw";
const SLIDESHOW_INNER_SELECTOR = ".slideshow-inner";
const SLIDES_SELECTOR = `${SLIDESHOW_INNER_SELECTOR} > .slide`;
export class Bs4SlideshowComponent extends TemplatesComponent {
resizeObserver;
get slideshowInner() {
if (!this._slideshowInner) {
this._slideshowInner = this.querySelector(SLIDESHOW_INNER_SELECTOR);
}
if (!this._slideshowInner) {
throw new Error(`Child element with selector ${SLIDESHOW_INNER_SELECTOR} not found!`);
}
return this._slideshowInner;
}
get slideElements() {
if (!this._slideElements) {
this._slideElements = this.querySelectorAll(SLIDES_SELECTOR);
}
if (!this._slideElements) {
throw new Error(`Child element with selector ${SLIDES_SELECTOR} not found!`);
}
return this._slideElements;
}
get controlsElements() {
if (!this._controlsElements) {
this._controlsElements = this.querySelectorAll(".slideshow-control-prev, .slideshow-control-next");
}
return this._controlsElements;
}
get indicatorsElement() {
if (!this._indicatorsElement) {
this._indicatorsElement = this.querySelector(".slideshow-indicators");
}
return this._indicatorsElement;
}
static get observedAttributes() {
return [
"min-width",
"slides-to-show",
"slides-to-scroll",
"controls",
"controls-position",
"drag",
"autoplay",
"autoplay-interval",
"autoplay-velocity",
"control-prev-icon-src",
"control-next-icon-src",
"indicator-inactive-icon-src",
"indicator-active-icon-src",
"angle",
"set-active-slide",
"pause-on-hover",
"sticky",
"indicators",
"indicators-position",
"pause",
"sm-min-width",
"sm-slides-to-show",
"sm-slides-to-scroll",
"sm-controls",
"sm-controls-position",
"sm-drag",
"sm-autoplay",
"sm-autoplay-interval",
"sm-autoplay-velocity",
"sm-control-prev-icon-src",
"sm-control-next-icon-src",
"sm-indicator-inactive-icon-src",
"sm-indicator-active-icon-src",
"sm-angle",
"sm-set-active-slide",
"sm-pause-on-hover",
"sm-sticky",
"sm-indicators",
"sm-indicators-position",
"sm-pause",
"md-min-width",
"md-slides-to-show",
"md-slides-to-scroll",
"md-controls",
"md-controls-position",
"md-drag",
"md-autoplay",
"md-autoplay-interval",
"md-autoplay-velocity",
"md-control-prev-icon-src",
"md-control-next-icon-src",
"md-indicator-inactive-icon-src",
"md-indicator-active-icon-src",
"md-angle",
"md-set-active-slide",
"md-pause-on-hover",
"md-sticky",
"md-indicators",
"sm-indicators-position",
"md-pause",
"lg-min-width",
"lg-slides-to-show",
"lg-slides-to-scroll",
"lg-controls",
"lg-controls-position",
"lg-drag",
"lg-autoplay",
"lg-autoplay-interval",
"lg-autoplay-velocity",
"lg-control-prev-icon-src",
"lg-control-next-icon-src",
"lg-indicator-inactive-icon-src",
"lg-indicator-active-icon-src",
"lg-angle",
"lg-set-active-slide",
"lg-pause-on-hover",
"lg-sticky",
"lg-indicators",
"lg-indicators-position",
"lg-pause",
"xl-min-width",
"xl-slides-to-show",
"xl-slides-to-scroll",
"xl-controls",
"xl-controls-position",
"xl-drag",
"xl-autoplay",
"xl-autoplay-interval",
"xl-autoplay-velocity",
"xl-control-prev-icon-src",
"xl-control-next-icon-src",
"xl-indicator-inactive-icon-src",
"xl-indicator-active-icon-src",
"xl-angle",
"xl-set-active-slide",
"xl-pause-on-hover",
"xl-sticky",
"xl-indicators",
"xl-indicators-position",
"xl-pause",
];
}
static tagName = "bs4-slideshow";
templateAttributes = [
{
name: "class",
required: false,
},
{
name: "handle",
required: false,
},
{
name: "type",
required: true,
},
{
name: "active",
type: "boolean",
required: false,
},
{
name: "index",
type: "number",
required: false,
},
];
autobind = true;
dragscrollService;
continuousAutoplayService;
scrollEventsService;
_slideshowInner = null;
_slideElements = null;
_controlsElements = null;
_indicatorsElement = null;
templateControls = templateControls;
templateIndicators = templateIndicators;
autoplayIntervalIndex = null;
continuousAutoplayIntervalIndex = null;
resumeTimer = null;
routerEvents = new EventDispatcher("main");
breakpoint = "xs";
scope = {
next: this.next.bind(this),
prev: this.prev.bind(this),
goTo: this.goTo.bind(this),
items: new Array(),
slidesToScroll: 1,
controls: true,
controlsPosition: "inside-middle",
pauseOnHover: true,
sticky: false,
indicators: true,
indicatorsPosition: "inside-bottom",
pause: false,
drag: true,
autoplay: false,
autoplayInterval: 0,
autoplayVelocity: 0.8,
controlPrevIconSrc: "",
controlNextIconSrc: "",
indicatorActiveIconSrc: "",
indicatorInactiveIconSrc: "",
angle: "horizontal",
xs: {
minWidth: 0,
},
sm: {
minWidth: 576,
},
md: {
minWidth: 768,
},
lg: {
minWidth: 992,
},
xl: {
minWidth: 1200,
},
controlsPositionClass: "",
indicatorsPositionClass: "",
};
constructor() {
super();
this.onViewChanges = this.onViewChanges.bind(this);
this.onVisibilityChanged = this.onVisibilityChanged.bind(this);
this.onScroll = this.onScroll.bind(this);
this.onScrollend = this.onScrollend.bind(this);
this.onMouseIn = this.onMouseIn.bind(this);
this.onMouseOut = this.onMouseOut.bind(this);
}
next() {
this.scrollToNextSlide();
}
prev() {
this.scrollToPrevSlide();
}
goTo(index) {
this.setSlidePositions();
let top = 0;
let left = 0;
if (!this.scope.items[index]) {
console.error(`Slide with index "${index}" not found!`, this.scope.items[index]);
return;
}
if (this.scope.angle === "vertical") {
if (this.scope.items[index].position.centerY === 0) {
return;
}
top =
this.slideshowInner.scrollTop +
this.scope.items[index].position.centerY;
}
else {
if (this.scope.items[index].position.centerX === 0) {
return;
}
left =
this.slideshowInner.scrollLeft +
this.scope.items[index].position.centerX;
}
if (this.slideElements[index]) {
if (typeof this.slideshowInner.scroll === "function") {
this.slideshowInner.scroll({
behavior: "smooth",
left,
top,
});
}
else {
if (this.scope.angle === "vertical") {
this.slideshowInner.scrollTop = top;
}
else {
this.slideshowInner.scrollLeft = left;
}
}
}
}
setOptions(dest, source) {
dest.slidesToScroll =
typeof source.slidesToScroll !== "undefined"
? clone(false, source.slidesToScroll)
: dest.slidesToScroll;
dest.controls =
typeof source.controls !== "undefined"
? clone(false, source.controls)
: dest.controls;
dest.controlsPosition =
typeof source.controlsPosition !== "undefined"
? clone(false, source.controlsPosition)
: dest.controlsPosition;
dest.drag =
typeof source.drag !== "undefined"
? clone(false, source.drag)
: dest.drag;
dest.autoplay =
typeof source.autoplay !== "undefined"
? clone(false, source.autoplay)
: dest.autoplay;
dest.autoplayInterval =
typeof source.autoplayInterval !== "undefined"
? clone(false, source.autoplayInterval)
: dest.autoplayInterval;
dest.autoplayVelocity =
typeof source.autoplayVelocity !== "undefined"
? clone(false, source.autoplayVelocity)
: dest.autoplayVelocity;
dest.controlPrevIconSrc =
typeof source.controlPrevIconSrc !== "undefined"
? clone(false, source.controlPrevIconSrc)
: dest.controlPrevIconSrc;
dest.controlNextIconSrc =
typeof source.controlNextIconSrc !== "undefined"
? clone(false, source.controlNextIconSrc)
: dest.controlNextIconSrc;
dest.indicatorActiveIconSrc =
typeof source.indicatorActiveIconSrc !== "undefined"
? clone(false, source.indicatorActiveIconSrc)
: dest.indicatorActiveIconSrc;
dest.indicatorInactiveIconSrc =
typeof source.indicatorInactiveIconSrc !== "undefined"
? clone(false, source.indicatorInactiveIconSrc)
: dest.indicatorInactiveIconSrc;
dest.angle =
typeof source.angle !== "undefined"
? clone(false, source.angle)
: dest.angle;
dest.pauseOnHover =
typeof source.pauseOnHover !== "undefined"
? clone(false, source.pauseOnHover)
: dest.pauseOnHover;
dest.sticky =
typeof source.sticky !== "undefined"
? clone(false, source.sticky)
: dest.sticky;
dest.indicators =
typeof source.indicators !== "undefined"
? clone(false, source.indicators)
: dest.indicators;
dest.indicatorsPosition =
typeof source.indicatorsPosition !== "undefined"
? clone(false, source.indicatorsPosition)
: dest.indicatorsPosition;
dest.pause =
typeof source.pause !== "undefined"
? clone(false, source.pause)
: dest.pause;
}
setOptionsIfUndefined(dest, source) {
dest.slidesToScroll =
typeof dest.slidesToScroll === "undefined"
? source.slidesToScroll
: dest.slidesToScroll;
dest.controls =
typeof dest.controls === "undefined" ? source.controls : dest.controls;
dest.controlsPosition =
typeof dest.controlsPosition === "undefined"
? source.controlsPosition
: dest.controlsPosition;
dest.drag = typeof dest.drag === "undefined" ? source.drag : dest.drag;
dest.autoplay =
typeof dest.autoplay === "undefined" ? source.autoplay : dest.autoplay;
dest.autoplayInterval =
typeof dest.autoplayInterval === "undefined"
? source.autoplayInterval
: dest.autoplayInterval;
dest.autoplayVelocity =
typeof dest.autoplayVelocity === "undefined"
? source.autoplayVelocity
: dest.autoplayVelocity;
dest.controlPrevIconSrc =
typeof dest.controlPrevIconSrc === "undefined"
? source.controlPrevIconSrc
: dest.controlPrevIconSrc;
dest.controlNextIconSrc =
typeof dest.controlNextIconSrc === "undefined"
? source.controlNextIconSrc
: dest.controlNextIconSrc;
dest.indicatorActiveIconSrc =
typeof dest.indicatorActiveIconSrc === "undefined"
? source.indicatorActiveIconSrc
: dest.indicatorActiveIconSrc;
dest.indicatorInactiveIconSrc =
typeof dest.indicatorInactiveIconSrc === "undefined"
? source.indicatorInactiveIconSrc
: dest.indicatorInactiveIconSrc;
dest.angle = typeof dest.angle === "undefined" ? source.angle : dest.angle;
dest.pauseOnHover =
typeof dest.pauseOnHover === "undefined"
? source.pauseOnHover
: dest.pauseOnHover;
dest.sticky =
typeof dest.sticky === "undefined" ? source.sticky : dest.sticky;
dest.indicators =
typeof dest.indicators === "undefined"
? source.indicators
: dest.indicators;
dest.indicatorsPosition =
typeof dest.indicatorsPosition === "undefined"
? source.indicatorsPosition
: dest.indicatorsPosition;
dest.pause = typeof dest.pause === "undefined" ? source.pause : dest.pause;
}
initResponsiveOptions() {
this.setOptions(this.scope.xs, this.scope);
this.setOptionsIfUndefined(this.scope.sm, this.scope.xs);
this.setOptionsIfUndefined(this.scope.md, this.scope.sm);
this.setOptionsIfUndefined(this.scope.lg, this.scope.md);
this.setOptionsIfUndefined(this.scope.xl, this.scope.lg);
this.breakpoint = this.getBreakpoint();
this.setOptionsByBreakpoint(this.breakpoint);
}
setControlsOptions() {
const xsControlsPosition = this.scope.xs.controlsPosition?.split("-");
const smControlsPosition = this.scope.sm.controlsPosition?.split("-");
const mdControlsPosition = this.scope.md.controlsPosition?.split("-");
const lgControlsPosition = this.scope.lg.controlsPosition?.split("-");
const xlControlsPosition = this.scope.xl.controlsPosition?.split("-");
this.scope.controlsPositionClass = `control-${xsControlsPosition[0]} control-${xsControlsPosition[1]} control-sm-${smControlsPosition[0]} control-sm-${smControlsPosition[1]} control-md-${mdControlsPosition[0]} control-md-${mdControlsPosition[1]} control-lg-${lgControlsPosition[0]} control-lg-${lgControlsPosition[1]} control-xl-${xlControlsPosition[0]} control-xl-${xlControlsPosition[1]}`;
}
setIndicatorsOptions() {
const xsIndicatorsPosition = this.scope.xs.indicatorsPosition?.split("-");
const smIndicatorsPosition = this.scope.sm.indicatorsPosition?.split("-");
const mdIndicatorsPosition = this.scope.md.indicatorsPosition?.split("-");
const lgIndicatorsPosition = this.scope.lg.indicatorsPosition?.split("-");
const xlIndicatorsPosition = this.scope.xl.indicatorsPosition?.split("-");
this.scope.indicatorsPositionClass = `indicators-${xsIndicatorsPosition[0]} indicators-${xsIndicatorsPosition[1]} indicators-sm-${smIndicatorsPosition[0]} indicators-sm-${smIndicatorsPosition[1]} indicators-md-${mdIndicatorsPosition[0]} indicators-md-${mdIndicatorsPosition[1]} indicators-lg-${lgIndicatorsPosition[0]} indicators-lg-${lgIndicatorsPosition[1]} indicators-xl-${xlIndicatorsPosition[0]} indicators-xl-${xlIndicatorsPosition[1]}`;
}
getBreakpoint() {
const size = window.innerWidth;
if (size >= this.scope.xs.minWidth && size < this.scope.sm.minWidth) {
return "xs";
}
if (size >= this.scope.sm.minWidth && size < this.scope.md.minWidth) {
return "sm";
}
if (size >= this.scope.md.minWidth && size < this.scope.lg.minWidth) {
return "md";
}
if (size >= this.scope.lg.minWidth && size < this.scope.xl.minWidth) {
return "lg";
}
return "xl";
}
setOptionsByBreakpoint(breakpoint) {
this.setOptions(this.scope, this.scope[breakpoint]);
if (this.scope.autoplay) {
this.enableAutoplay();
}
else {
this.disableAutoplay();
}
if (this.scope.drag) {
this.enableDesktopDragscroll();
}
else {
this.disableDesktopDragscroll();
}
this.setControlsOptions();
this.setIndicatorsOptions();
}
onBreakpointChanges() {
this.setOptionsByBreakpoint(this.breakpoint);
}
_onViewChanges() {
this.debug("onViewChanges");
const newBreakpoint = this.getBreakpoint();
if (newBreakpoint !== this.breakpoint) {
this.breakpoint = newBreakpoint;
this.onBreakpointChanges();
}
this.setSlidePositions();
const index = this.setCenteredSlideActive();
if (this.scope.sticky) {
this.goTo(index);
}
}
onViewChanges = debounce(this._onViewChanges.bind(this));
onVisibilityChanged(event) {
if (event.detail.visible) {
this.dragscrollService?.checkDraggable();
this.continuousAutoplayService?.update();
}
}
_onScroll() {
this.resume(1000);
}
onScroll = debounce(this._onScroll.bind(this));
onScrollend() {
this.setSlidePositions();
this.setCenteredSlideActive();
if (this.scope.sticky) {
this.scrollToNearestSlide();
}
this.resume(1000);
}
onMouseIn() {
if (this.scope.pauseOnHover) {
this.scope.pause = true;
}
}
onMouseOut() {
this.resume(200);
}
_onMouseUp() {
this.resume(1000);
}
onMouseUp = throttle(this._onMouseUp.bind(this));
resume(delay = 1000) {
if (!this.scope.pause) {
return;
}
if (this.resumeTimer !== null) {
clearTimeout(this.resumeTimer);
this.resumeTimer = null;
}
this.resumeTimer = window.setTimeout(() => {
this.setSlidePositions();
this.scope.pause = false;
}, delay);
}
connectedCallback() {
super.connectedCallback();
return this.init(Bs4SlideshowComponent.observedAttributes);
}
addEventListeners() {
this.routerEvents.on("newPageReady", this.onBreakpointChanges, this);
if (window.ResizeObserver) {
this.resizeObserver = new window.ResizeObserver(this.onViewChanges);
this.resizeObserver?.observe(this);
}
else {
window.addEventListener("resize", this.onViewChanges, { passive: true });
}
this.addEventListener("visibility-changed", this.onVisibilityChanged);
this.slideshowInner.addEventListener("scroll", this.onScroll, {
passive: true,
});
this.slideshowInner.addEventListener("scrollended", this.onScrollend, {
passive: true,
});
this.addEventListener("mouseenter", this.onMouseIn, { passive: true });
this.addEventListener("mouseover", this.onMouseIn, { passive: true });
this.addEventListener("focusin", this.onMouseIn, { passive: true });
this.addEventListener("touchstart", this.onMouseIn, { passive: true });
this.addEventListener("mouseout", this.onMouseOut, { passive: true });
this.addEventListener("mouseleave", this.onMouseOut, { passive: true });
this.addEventListener("focusout", this.onMouseOut, { passive: true });
this.addEventListener("mouseup", this.onMouseUp, { passive: true });
this.addEventListener("touchend", this.onMouseUp, { passive: true });
this.addEventListener("scroll", this.onMouseUp, { passive: true });
this.addEventListener("scrollend", this.onMouseUp, { passive: true });
this.addEventListener("scrollended", this.onMouseUp, { passive: true });
this.onViewChanges();
this.onScrollend();
}
removeEventListeners() {
this.routerEvents.off("newPageReady", this.onBreakpointChanges, this);
window.removeEventListener("resize", this.onViewChanges);
this.resizeObserver?.unobserve(this);
this.removeEventListener("visibility-changed", this.onVisibilityChanged);
this.slideshowInner.removeEventListener("scroll", this.onScroll);
this.slideshowInner.removeEventListener("scrollended", this.onScrollend);
this.removeEventListener("mouseenter", this.onMouseIn);
this.removeEventListener("mouseover", this.onMouseIn);
this.removeEventListener("focusin", this.onMouseIn);
this.removeEventListener("touchstart", this.onMouseIn);
this.removeEventListener("mouseout", this.onMouseOut);
this.removeEventListener("mouseleave", this.onMouseOut);
this.removeEventListener("focusout", this.onMouseOut);
this.removeEventListener("mouseup", this.onMouseUp);
this.removeEventListener("touchend", this.onMouseUp);
this.removeEventListener("scroll", this.onMouseUp);
this.removeEventListener("scrollend", this.onMouseUp);
this.removeEventListener("scrollended", this.onMouseUp);
}
async beforeBind() {
return await super.beforeBind();
}
async afterBind() {
this.initSlideshowInner();
this.initResponsiveOptions();
this.addEventListeners();
await super.afterBind();
}
initSlideshowInner() {
this.initSlideshowInnerSlides();
this.scrollEventsService = new ScrollEventsService(this.slideshowInner);
}
enableDesktopDragscroll() {
if (!this.dragscrollService) {
const dragscrollOptions = { detectGlobalMove: true };
this.dragscrollService = new Dragscroll(this.slideshowInner, dragscrollOptions);
}
}
disableDesktopDragscroll() {
if (this.dragscrollService) {
this.dragscrollService.destroy();
this.dragscrollService = undefined;
}
}
enableContinuousAutoplay() {
if (!this.continuousAutoplayService) {
const autoscrollOptions = {
velocity: this.scope.autoplayVelocity,
angle: this.scope.angle,
pauseOnHover: this.scope.pauseOnHover,
};
this.continuousAutoplayService = new Autoscroll(this.slideshowInner, autoscrollOptions);
}
if (!this.continuousAutoplayIntervalIndex) {
const intervalsTimeMs = this.scope.autoplayVelocity * 10000;
this.continuousAutoplayIntervalIndex = window.setInterval(this.onScrollend.bind(this), intervalsTimeMs);
}
}
disableContinuousAutoplay() {
if (this.continuousAutoplayService) {
this.continuousAutoplayService.destroy();
this.continuousAutoplayService = undefined;
}
if (this.continuousAutoplayIntervalIndex) {
window.clearInterval(this.continuousAutoplayIntervalIndex);
this.continuousAutoplayIntervalIndex = null;
}
}
enableIntervalAutoplay() {
if (this.autoplayIntervalIndex === null) {
this.autoplayIntervalIndex = window.setInterval(() => {
if (!this.scope.pause) {
this.next();
}
}, this.scope.autoplayInterval);
}
}
disableIntervalAutoplay() {
if (this.autoplayIntervalIndex) {
window.clearInterval(this.autoplayIntervalIndex);
this.autoplayIntervalIndex = null;
}
}
disableAutoplay() {
this.disableIntervalAutoplay();
this.disableContinuousAutoplay();
}
enableAutoplay() {
if (this.scope.autoplayInterval <= 0) {
this.enableContinuousAutoplay();
}
else {
this.enableIntervalAutoplay();
}
}
initSlideshowInnerSlides() {
if (!this.slideElements) {
throw new Error("No slides found!");
}
if (this.scope.items.length === 0) {
this.addItemsByChilds();
}
}
transformTemplateAttributes(attributes, index) {
attributes = super.transformTemplateAttributes(attributes, index);
attributes.handle = attributes.handle || index.toString();
attributes.index = index;
attributes.class = attributes.class || "";
attributes.class += " slide";
return attributes;
}
addItemByTemplate(tpl, index) {
const attributes = this.getTemplateAttributes(tpl, index);
const content = tpl.innerHTML;
if (attributes.type) {
if (attributes.type === "slide") {
this.scope.items.push({ ...attributes, content });
}
if (attributes.type === "controls") {
this.templateControls = content;
}
if (attributes.type === "indicators") {
this.templateIndicators = content;
}
}
}
addItemsByChilds() {
if (!this.slideElements) {
return;
}
this.slideElements.forEach((slideElement, index) => {
const handle = slideElement.getAttribute("handle") ||
slideElement.getAttribute("id") ||
index.toString();
slideElement.setAttribute("index", index.toString());
const attributes = {
handle,
active: false,
content: slideElement.innerHTML,
index,
position: {
...slideElement.getBoundingClientRect(),
centerY: 0,
centerX: 0,
},
};
this.scope.items.push(attributes);
});
}
getScrollPosition() {
const scrollPosition = getScrollPosition(this.slideshowInner);
return scrollPosition;
}
getCurrentClosestNumber(goal, curr, prev) {
return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev;
}
getMostCenteredSlideIndex() {
if (this.scope.items.length <= 0) {
return -1;
}
let nearZero = Math.abs(this.scope.angle === "vertical"
? this.scope.items[0].position.centerY
: this.scope.items[0].position.centerX);
let minIndex = 0;
for (let i = 1; i < this.scope.items.length; i++) {
const position = Math.abs(this.scope.angle === "vertical"
? this.scope.items[i].position.centerY
: this.scope.items[i].position.centerX);
nearZero = this.getCurrentClosestNumber(0, position, nearZero);
if (nearZero === position) {
minIndex = i;
}
}
return minIndex;
}
setAllSlidesInactive(excludeIndex = -1) {
if (!this.slideElements) {
return;
}
for (let index = 0; index < this.scope.items.length; index++) {
if (index !== excludeIndex) {
if (this.scope.items[index]) {
this.scope.items[index].active = false;
}
if (this.slideElements[index] && this.slideElements[index].classList) {
this.slideElements[index].classList.remove("active");
}
}
}
}
setCenteredSlideActive() {
const index = this.getMostCenteredSlideIndex();
this.setAllSlidesInactive(index);
if (!this.scope.items[index]) {
return -1;
}
this.scope.items[index].active = true;
if (this.slideElements && this.slideElements[index].classList) {
this.slideElements[index].classList.add("active");
}
return index;
}
isScrollableToIndex(index) {
if (!this.scope.items[index]) {
return false;
}
const maxScrollTo = this.scope.angle === "vertical"
? this.getScrollPosition().maxY
: this.getScrollPosition().maxX;
const scrollTo = this.scope.angle === "vertical"
? this.slideshowInner.scrollTop +
this.scope.items[index].position.centerY
: this.slideshowInner.scrollLeft +
this.scope.items[index].position.centerX;
return scrollTo <= maxScrollTo && scrollTo >= 0;
}
scrollToNextSlide() {
this.setSlidePositions();
const currentIndex = this.getMostCenteredSlideIndex();
let nextIndex = currentIndex + this.scope.slidesToScroll;
if (nextIndex >= this.slideElements.length) {
nextIndex = nextIndex - this.slideElements.length;
}
return this.goTo(nextIndex);
}
scrollToPrevSlide() {
this.setSlidePositions();
const currentIndex = this.getMostCenteredSlideIndex();
let prevIndex = currentIndex - this.scope.slidesToScroll;
if (prevIndex < 0) {
prevIndex = this.slideElements.length - 1 + (prevIndex + 1);
}
return this.goTo(prevIndex);
}
scrollToNearestSlide() {
this.setSlidePositions();
const nearestIndex = this.getMostCenteredSlideIndex();
return this.goTo(nearestIndex);
}
setSlidePositions() {
if (this.scope.items.length !== this.slideElements?.length) {
console.warn(`The slide objects must be the same size as the slide elements! ${this.scope.items.length} !== ${this.slideElements?.length}`);
return;
}
const mainBoundingClient = this.slideshowInner.getBoundingClientRect();
for (let i = 0; i < this.scope.items.length; i++) {
const slideElement = this.slideElements[i];
const slideObject = this.scope.items[i];
const rect = slideElement.getBoundingClientRect();
rect.x -= mainBoundingClient.x;
rect.y -= mainBoundingClient.y;
slideObject.position = {
x: rect.x,
y: rect.y,
width: rect.width,
height: rect.height,
bottom: rect.bottom,
left: rect.left,
right: rect.right,
top: rect.top,
toJSON: rect.toJSON,
centerY: rect.y + rect.height / 2 - mainBoundingClient.height / 2,
centerX: rect.x + rect.width / 2 - mainBoundingClient.width / 2,
};
}
}
requiredAttributes() {
return [];
}
async attributeChangedCallback(attributeName, oldValue, newValue, namespace) {
let optionForSize = "xs";
let responsiveScope = this.scope;
if (this.observedAttributesToCheck &&
this.observedAttributesToCheck[attributeName]) {
this.observedAttributesToCheck[attributeName].initialized = true;
}
newValue = this.parseAttribute(newValue);
if (attributeName.startsWith("sm-")) {
optionForSize = "sm";
responsiveScope = this.scope.sm;
attributeName = attributeName.slice(3);
}
else if (attributeName.startsWith("md-")) {
optionForSize = "md";
responsiveScope = this.scope.md;
attributeName = attributeName.slice(3);
}
else if (attributeName.startsWith("lg-")) {
optionForSize = "lg";
responsiveScope = this.scope.lg;
attributeName = attributeName.slice(3);
}
else if (attributeName.startsWith("xl-")) {
optionForSize = "xl";
responsiveScope = this.scope.xl;
attributeName = attributeName.slice(3);
}
const parsedAttributeName = camelCase(attributeName);
if (responsiveScope && responsiveScope[parsedAttributeName]) {
oldValue = responsiveScope[parsedAttributeName];
}
responsiveScope[parsedAttributeName] = newValue;
this.parsedAttributeChangedCallback(optionForSize + parsedAttributeName, oldValue, newValue, namespace);
this.bindIfReady();
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) {
return super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace);
}
disconnectedCallback() {
this.removeEventListeners();
this.scrollEventsService?.destroy();
this.disableAutoplay();
this.disableDesktopDragscroll();
return super.disconnectedCallback();
}
template() {
if (!hasChildNodesTrim(this) || this.hasOnlyTemplateChilds()) {
return templateSlides + this.templateControls + this.templateIndicators;
}
else {
if (this.controlsElements.length <= 0) {
this.innerHTML += this.templateControls;
}
if (!this.indicatorsElement) {
this.innerHTML += this.templateIndicators;
}
return null;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LXNsaWRlc2hvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczQtc2xpZGVzaG93L2JzNC1zbGlkZXNob3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBb0Isa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFcEUsT0FBTyxFQUNMLFVBQVUsRUFFVixVQUFVLEVBR1YsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sY0FBYyxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sZ0JBQWdCLE1BQU0sNkNBQTZDLENBQUM7QUFFM0UsT0FBTyxrQkFBa0IsTUFBTSwrQ0FBK0MsQ0FBQztBQUUvRSxNQUFNLHdCQUF3QixHQUFHLGtCQUFrQixDQUFDO0FBRXBELE1BQU0sZUFBZSxHQUFHLEdBQUcsd0JBQXdCLFdBQVcsQ0FBQztBQStGL0QsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGtCQUFrQjtJQUNqRCxjQUFjLENBQU87SUFFL0IsSUFBYyxjQUFjO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJ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