@ribajs/bs5
Version:
Bootstrap 5 module for Riba.js
707 lines • 57.4 kB
JavaScript
import { TemplatesComponent } from "@ribajs/core";
import { EventDispatcher } from "@ribajs/events";
import { hasChildNodesTrim, scrollTo } from "@ribajs/utils/src/dom.js";
import { throttle, debounce } from "@ribajs/utils/src/control";
import { Bs5Service } from "../../services/index.js";
import { Dragscroll, Autoscroll, ScrollEventsService, getScrollPosition, } from "@ribajs/extras";
import templateSlides from "./bs5-slideshow-slides.component.html?raw";
import templateControls from "./bs5-slideshow-controls.component.html?raw";
import templateIndicators from "./bs5-slideshow-indicators.component.html?raw";
import templateImage from "./bs5-slideshow-image.component.html?raw";
const SLIDESHOW_INNER_SELECTOR = ".slideshow-row";
const SLIDES_SELECTOR = `${SLIDESHOW_INNER_SELECTOR} .slide`;
export class Bs5SlideshowComponent extends TemplatesComponent {
resizeObserver;
bs5;
get slideshowInner() {
return this.querySelector(SLIDESHOW_INNER_SELECTOR);
}
get slideElements() {
return this.querySelectorAll(SLIDES_SELECTOR);
}
get controlsElements() {
return this.querySelectorAll(".slideshow-control-prev, .slideshow-control-next");
}
get indicatorsElement() {
return this.querySelector(".slideshow-indicators");
}
static get observedAttributes() {
return [
"items",
"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",
"pause-on-hover",
"sticky",
"indicators",
"indicators-position",
"pause",
"infinite",
];
}
defaultScope = {
slidesToScroll: 1,
controls: true,
controlsPosition: "inside-middle",
pauseOnHover: true,
sticky: false,
indicators: true,
indicatorsPosition: "inside-bottom",
pause: false,
drag: true,
touchScroll: true,
autoplay: false,
autoplayInterval: 0,
autoplayVelocity: 0.8,
controlPrevIconSrc: "",
controlNextIconSrc: "",
indicatorActiveIconSrc: "",
indicatorInactiveIconSrc: "",
angle: "horizontal",
infinite: true,
next: this.next.bind(this),
prev: this.prev.bind(this),
goTo: this.goTo.bind(this),
enableTouchScroll: this.enableTouchScroll.bind(this),
disableTouchScroll: this.disableTouchScroll.bind(this),
items: undefined,
controlsPositionClass: "",
indicatorsPositionClass: "",
intervalCount: 0,
intervalProgress: 0,
nextIndex: -1,
prevIndex: -1,
activeIndex: 0,
};
static tagName = "bs5-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,
},
{
name: "src",
type: "string",
required: false,
},
];
autobind = true;
dragscrollService;
continuousAutoplayService;
scrollEventsService;
templateControls = templateControls;
templateIndicators = templateIndicators;
autoplayIntervalIndex = null;
continuousAutoplayIntervalIndex = null;
resumeTimer = null;
routerEvents = new EventDispatcher("main");
scope = {
...this.defaultScope,
};
constructor() {
super();
this.bs5 = Bs5Service.getSingleton();
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) {
if (index < 0 ||
!this.scope.items?.[index] ||
!this.slideElements[index] ||
!this.slideshowInner) {
this.throw(new Error(`Can't go to slide of index ${index}`));
console.error("items", this.scope.items);
console.error("this.slideElements", this.slideElements);
console.error("this.slideshowInner", this.slideshowInner);
return;
}
this.setSlidePositions();
if (!this.slideElements[index]) {
this.throw(new Error(`Slide element with index "${index}" not found!`));
}
else {
scrollTo(this.slideElements[index], 0, this.slideshowInner, this.scope.angle);
this.setSlideActive(index);
}
}
getNextIndex(centeredIndex) {
let nextIndex = centeredIndex + this.scope.slidesToScroll;
if (nextIndex >= this.slideElements.length) {
if (!this.scope.infinite) {
return this.slideElements.length - 1;
}
nextIndex = nextIndex - this.slideElements.length;
}
return nextIndex;
}
getPrevIndex(centeredIndex) {
let prevIndex = centeredIndex - this.scope.slidesToScroll;
if (prevIndex < 0) {
if (!this.scope.infinite) {
return 0;
}
prevIndex = this.slideElements.length - 1 + (prevIndex + 1);
}
return prevIndex;
}
scrollToNearestSlide() {
this.setSlidePositions();
const nearestIndex = this.getMostCenteredSlideIndex();
return this.goTo(nearestIndex);
}
scrollToNextSlide() {
this.setSlidePositions();
const centeredIndex = this.getMostCenteredSlideIndex();
const nextIndex = this.getNextIndex(centeredIndex);
return this.goTo(nextIndex);
}
scrollToPrevSlide() {
this.setSlidePositions();
const centeredIndex = this.getMostCenteredSlideIndex();
const prevIndex = this.getPrevIndex(centeredIndex);
return this.goTo(prevIndex);
}
initOptions() {
this.setOptions();
}
setOptions() {
if (this.scope.autoplay) {
this.enableAutoplay();
}
else {
this.disableAutoplay();
}
if (this.scope.drag) {
this.enableDesktopDragscroll();
}
else {
this.disableDesktopDragscroll();
}
if (this.scope.touchScroll) {
this.enableTouchScroll();
}
else {
this.disableTouchScroll();
}
this.setControlsOptions();
this.setIndicatorsOptions();
}
setControlsOptions() {
const position = this.scope.controlsPosition?.split("-");
if (this.scope.controls && position.length === 2) {
this.scope.controlsPositionClass = `control-${position[0]} control-${position[1]}`;
}
else {
this.scope.controlsPositionClass = "";
}
}
setIndicatorsOptions() {
const positions = this.scope.indicatorsPosition?.split("-");
if (this.scope.indicators && positions.length === 2) {
this.scope.indicatorsPositionClass = `indicators-${positions[0]} indicators-${positions[1]}`;
}
else {
this.scope.indicatorsPositionClass = "";
}
}
_onViewChanges() {
this.debug("onViewChanges");
if (!this.scope.items?.length || !this.slideElements?.length) {
return;
}
try {
this.setSlidePositions();
const index = this.setCenteredSlideActive();
if (this.scope.sticky) {
this.goTo(index);
}
}
catch (error) {
this.throw(error);
}
}
onViewChanges = debounce(this._onViewChanges.bind(this));
onVisibilityChanged(event) {
if (event.detail.visible) {
this.dragscrollService?.checkDraggable();
this.continuousAutoplayService?.update();
}
}
_onScroll() {
}
onScroll = debounce(this._onScroll.bind(this));
onScrollend() {
if (!this.scope.items?.length) {
return;
}
try {
this.setSlidePositions();
this.setCenteredSlideActive();
if (this.scope.sticky) {
this.scrollToNearestSlide();
}
}
catch (error) {
this.throw(error);
}
}
onMouseIn() {
if (this.scope.pauseOnHover) {
this.scope.pause = true;
}
}
onMouseOut() {
this.resume();
}
_onMouseUp() {
}
onMouseUp = throttle(this._onMouseUp.bind(this));
_resume() {
this.setSlidePositions();
this.scope.pause = false;
}
resume = throttle(this._resume.bind(this), 500);
connectedCallback() {
if (!this.scope.items?.length && this.slideElements) {
this.addItemsByChilds();
}
super.connectedCallback();
this.init(Bs5SlideshowComponent.observedAttributes);
this.addEventListeners();
}
addEventListeners() {
this.routerEvents.on("newPageReady", this.onViewChanges);
if (window.ResizeObserver) {
this.resizeObserver = new window.ResizeObserver(this.onViewChanges);
this.resizeObserver?.observe(this);
}
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("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 });
}
removeEventListeners() {
this.routerEvents.off("newPageReady", this.onViewChanges, this);
window.removeEventListener("resize", this.onViewChanges);
this.resizeObserver?.unobserve(this);
this.bs5.events.off("breakpoint:changed", this.onViewChanges, 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("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);
}
initAll() {
this.initSlideshowInner();
this.initOptions();
this.addEventListeners();
this.onViewChanges();
this.onScrollend();
}
async beforeBind() {
await super.beforeBind();
this.validateItems();
}
async afterBind() {
this.initAll();
await super.afterBind();
}
initSlideshowInner() {
if (!this.slideshowInner) {
this.throw(new Error("Can't init slideshow inner!"));
return;
}
this.scrollEventsService = new ScrollEventsService(this.slideshowInner);
}
enableDesktopDragscroll() {
if (!this.dragscrollService) {
if (!this.slideshowInner) {
return;
}
const dragscrollOptions = { detectGlobalMove: true };
this.dragscrollService = new Dragscroll(this.slideshowInner, dragscrollOptions);
}
}
disableDesktopDragscroll() {
if (this.dragscrollService) {
this.dragscrollService.destroy();
this.dragscrollService = undefined;
}
}
enableTouchScroll() {
this.classList.remove("touchscroll-disabled");
}
disableTouchScroll() {
this.classList.add("touchscroll-disabled");
}
enableContinuousAutoplay() {
if (!this.continuousAutoplayService && this.slideshowInner) {
const autoscrollOptions = {
velocity: this.scope.autoplayVelocity,
angle: this.scope.angle,
pauseOnHover: this.scope.pauseOnHover,
};
this.continuousAutoplayService = new Autoscroll(this.slideshowInner, autoscrollOptions);
}
if (this.continuousAutoplayIntervalIndex === null) {
const intervalsTimeMs = this.scope.autoplayVelocity * 10000;
this.continuousAutoplayIntervalIndex = window.setInterval(this.onScrollend.bind(this), intervalsTimeMs);
}
}
disableContinuousAutoplay() {
if (this.continuousAutoplayService) {
this.continuousAutoplayService.pause();
this.continuousAutoplayService.destroy();
this.continuousAutoplayService = undefined;
}
if (this.continuousAutoplayIntervalIndex !== null) {
window.clearInterval(this.continuousAutoplayIntervalIndex);
this.continuousAutoplayIntervalIndex = null;
}
}
resetIntervalAutoplay() {
this.scope.intervalCount = 0;
this.scope.intervalProgress = 0;
}
enableIntervalAutoplay() {
const steps = 100;
if (this.autoplayIntervalIndex === null) {
this.autoplayIntervalIndex = window.setInterval(() => {
if (!this.scope.pause) {
this.scope.intervalCount += steps;
this.scope.intervalProgress =
(this.scope.intervalCount / this.scope.autoplayInterval) * 100;
if (this.scope.intervalProgress >= 100) {
this.next();
}
}
}, steps);
}
}
disableIntervalAutoplay() {
this.resetIntervalAutoplay();
console.debug("disableIntervalAutoplay", this.autoplayIntervalIndex);
if (this.autoplayIntervalIndex !== null) {
window.clearInterval(this.autoplayIntervalIndex);
this.autoplayIntervalIndex = null;
}
}
disableAutoplay() {
this.disableIntervalAutoplay();
this.disableContinuousAutoplay();
}
enableAutoplay() {
this.disableAutoplay();
if (this.scope.autoplayInterval <= 0) {
this.enableContinuousAutoplay();
}
else {
this.enableIntervalAutoplay();
}
}
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;
}
validateItems() {
if (!this.scope.items) {
this.throw(new Error("No items to validate!"));
return;
}
for (let i = 0; i < this.scope.items.length; i++) {
const item = this.scope.items[i];
item.index = item.index || i;
item.active = item.active || false;
item.title = item.title || "";
item.handle = item.handle || item.index.toString();
item.position =
item.position ||
{
centerX: 0,
centerY: 0,
};
item.class = item.class || "";
item.class += " slide";
item.content = item.content || templateImage;
}
}
addItemByTemplate(tpl, index) {
const attributes = this.getTemplateAttributes(tpl, index);
const content = tpl.innerHTML;
if (attributes.type) {
if (attributes.type === "slide") {
if (!this.scope.items) {
this.scope.items = [];
}
this.scope.items.push({ ...attributes, content });
}
if (attributes.type === "controls") {
this.templateControls = content;
}
if (attributes.type === "indicators") {
this.templateIndicators = content;
}
}
}
addItemsByChilds() {
if (!this.slideElements) {
this.throw(new Error("Can't not add items by child's because no slide child's are found!"));
}
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,
},
};
if (!this.scope.items) {
this.scope.items = [];
}
this.scope.items.push(attributes);
});
}
getScrollPosition() {
if (!this.slideshowInner) {
return null;
}
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) {
this.throw(new Error("No slide items found!"));
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 || !this.scope.items?.length) {
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");
}
}
}
}
setSlideActive(index) {
if (index === -1 || !this.scope.items?.length) {
console.warn(new Error("Most centered slide not found!"));
index = 0;
}
if (!this.scope.items?.[index]) {
index = 0;
}
if (!this.scope.items?.[index]) {
this.throw(new Error("Slide item to set active not found!"));
return 0;
}
this.setAllSlidesInactive(index);
this.scope.items[index].active = true;
this.scope.activeIndex = index;
this.scope.nextIndex = this.getNextIndex(index);
this.scope.prevIndex = this.getPrevIndex(index);
this.resetIntervalAutoplay();
if (this.slideElements && this.slideElements[index].classList) {
this.slideElements[index].classList.add("active");
}
}
setCenteredSlideActive() {
const index = this.getMostCenteredSlideIndex();
this.setSlideActive(index);
return index;
}
isScrollableToIndex(index) {
const scrollPosition = this.getScrollPosition();
if (!this.scope.items?.[index] || !this.slideshowInner || !scrollPosition) {
return false;
}
const maxScrollTo = this.scope.angle === "vertical"
? scrollPosition.maxY
: scrollPosition.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;
}
setSlidePositions() {
if (!this.bound) {
return;
}
if (this.scope.items?.length !== this.slideElements?.length) {
console.warn(new Error(`The slide objects must be the same size as the slide elements! items (${this.scope.items?.length}) !== slideElements (${this.slideElements?.length})`), this.slideElements, this);
return;
}
if (!this.slideshowInner) {
return;
}
const mainBoundingClient = this.slideshowInner.getBoundingClientRect();
for (let i = 0; i < this.scope.items.length; i++) {
const slideElement = this.slideElements[i];
const item = this.scope.items[i];
const rect = slideElement.getBoundingClientRect();
rect.x -= mainBoundingClient.x;
rect.y -= mainBoundingClient.y;
item.position = {
...rect,
centerY: rect.y + rect.height / 2 - mainBoundingClient.height / 2,
centerX: rect.x + rect.width / 2 - mainBoundingClient.width / 2,
};
}
}
requiredAttributes() {
return ["items"];
}
parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) {
super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace);
if (attributeName === "items") {
this.validateItems();
}
if (attributeName === "autoplay") {
if (this.scope.autoplay) {
this.enableAutoplay();
}
else {
this.disableAutoplay();
}
}
if (attributeName === "drag") {
if (this.scope.drag) {
this.enableDesktopDragscroll();
}
else {
this.disableDesktopDragscroll();
}
}
if (attributeName === "touchScroll") {
if (this.scope.touchScroll) {
this.enableTouchScroll();
}
else {
this.disableTouchScroll();
}
}
if (attributeName === "controls" || attributeName === "controlsPosition") {
this.setControlsOptions();
}
if (attributeName === "indicators" ||
attributeName === "indicatorsPosition") {
this.setIndicatorsOptions();
}
}
disconnectedCallback() {
this.removeEventListeners();
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNsaWRlc2hvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczUtc2xpZGVzaG93L2JzNS1zbGlkZXNob3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsVUFBVSxFQUVWLFVBQVUsRUFHVixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxjQUFjLE1BQU0sMkNBQTJDLENBQUM7QUFDdkUsT0FBTyxnQkFBZ0IsTUFBTSw2Q0FBNkMsQ0FBQztBQUMzRSxPQUFPLGtCQUFrQixNQUFNLCtDQUErQyxDQUFDO0FBQy9FLE9BQU8sYUFBYSxNQUFNLDBDQUEwQyxDQUFDO0FBRXJFLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUM7QUFFbEQsTUFBTSxlQUFlLEdBQUcsR0FBRyx3QkFBd0IsU0FBUyxDQUFDO0FBRTdELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxrQkFBa0I7SUFDakQsY0FBYyxDQUFrQjtJQUNoQyxHQUFHLENBQWE7SUFFMUIsSUFBYyxjQUFjO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBYyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQWMsZUFBZSxDQUFDLENB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