UNPKG

@ribajs/bs5

Version:

Bootstrap 5 module for Riba.js

707 lines 57.4 kB
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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