UNPKG

@ribajs/bs5

Version:

Bootstrap 5 module for Riba.js

609 lines 47.7 kB
import { Component } from "@ribajs/core"; import { EventDispatcher } from "@ribajs/events"; import { scrollTo } from "@ribajs/utils/src/dom.js"; import { debounce } from "@ribajs/utils/src/control"; import { Bs5Service } from "../../services/index.js"; import { Dragscroll, ScrollEventsService, getScrollPosition, } from "@ribajs/extras"; const SLIDER_INNER_SELECTOR = ".slider-row"; const SLIDES_SELECTOR = `${SLIDER_INNER_SELECTOR} .slide`; export class Bs5SliderComponent extends Component { resizeObserver; bs5; get sliderInner() { return this.querySelector(SLIDER_INNER_SELECTOR); } get slideElements() { return Array.from(this.querySelectorAll(SLIDES_SELECTOR)); } get controlsElements() { return this.querySelectorAll(".slider-control-prev, .slider-control-next"); } get indicatorsElement() { return this.querySelector(".slider-indicators"); } static EVENTS = { scrolling: "scrolling", scrollended: "scrollended", }; static get observedAttributes() { return [ "items", "slides-to-scroll", "controls", "controls-position", "drag", "sticky", "indicators", "indicators-position", "infinite", "columns", ]; } defaultScope = { slidesToScroll: 1, controls: true, controlsPosition: "inside-middle", sticky: false, indicators: true, indicatorsPosition: "inside-bottom", drag: false, touchScroll: true, angle: "horizontal", infinite: false, columns: 0, items: [], nextIndex: -1, prevIndex: -1, enableNextControl: false, enablePrevControl: false, showControls: false, showIndicators: false, activeSlides: [], isScrolling: false, slideItemStyle: {}, 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), controlsPositionClass: "", indicatorsPositionClass: "", }; static tagName = "bs5-slider"; autobind = true; dragscrollService; continuousAutoplayService; scrollEventsService; 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); } next() { this.scrollToNextSlide(); } prev() { this.scrollToPrevSlide(); } goTo(index, fromRight = false) { if (index === -1 && !this.scope.infinite) { console.warn(`End of slider reached!`); return -1; } if (index !== -1 && fromRight && this.scope.activeSlides.length > 1) { index = index - this.scope.activeSlides.length + 1; if (index < 0) { index = 0; } } const item = this.scope.items[index]; if (!item || !this.sliderInner || !item.el) { console.warn(`Slide element with index "${index}" not found!`); return -1; } scrollTo(item.el, 0, this.sliderInner, this.scope.angle); return index; } getNextIndex(currentActive) { let nextIndex = currentActive + this.scope.slidesToScroll; if (nextIndex > this.scope.items.length - 1) { if (this.scope.infinite) { nextIndex = nextIndex - this.scope.items.length; } else { return -1; } } return nextIndex; } getPrevIndex(currentActive) { let prevIndex = currentActive - this.scope.slidesToScroll; if (prevIndex < 0) { if (this.scope.infinite) { prevIndex = this.scope.items.length - 1 + (prevIndex + 1); } else { return -1; } } return prevIndex; } scrollToNextSlide() { if (this.scope.isScrolling) { this.scope.nextIndex = this.getNextIndex(this.scope.nextIndex); this.updateControls(); } return this.goTo(this.scope.nextIndex, true); } scrollToPrevSlide() { if (this.scope.isScrolling) { this.scope.prevIndex = this.getPrevIndex(this.scope.prevIndex); this.updateControls(); } return this.goTo(this.scope.prevIndex, false); } initOptions() { this.setOptions(); } setOptions() { if (this.scope.drag) { this.enableDesktopDragscroll(); } else { this.disableDesktopDragscroll(); } if (this.scope.touchScroll) { this.enableTouchScroll(); } else { this.disableTouchScroll(); } this.updateColumns(); this.setControlsOptions(); this.setIndicatorsOptions(); } updateColumns() { this.scope.slideItemStyle ||= {}; if (this.scope.columns > 0) { this.scope.slideItemStyle.flex = `0 0 ${100 / this.scope.columns}%`; } else { this.scope.slideItemStyle.flex = ""; } } 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.updateSlides(); } catch (error) { this.throw(error); } } onViewChanges = debounce(this._onViewChanges.bind(this)); onVisibilityChanged(event) { if (event.detail.visible) { this.dragscrollService?.checkDraggable(); this.continuousAutoplayService?.update(); } } onScroll(event) { this.scope.isScrolling = true; this.dispatchEvent(new CustomEvent(event.type, { detail: event.detail })); } onScrollEnd(event) { this.scope.isScrolling = false; if (!this.scope.items?.length) { return; } if (event.detail.direction === "none") { return; } try { this.updateSlides(); } catch (error) { this.throw(error); } this.dispatchEvent(new CustomEvent(event.type, { detail: event.detail })); } connectedCallback() { if (this.scope.items.length || this.scope.slideTemplate) { this.updateItems(); } else { this.initItemsByChildren(); } super.connectedCallback(); this.init(Bs5SliderComponent.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.sliderInner?.addEventListener(Bs5SliderComponent.EVENTS.scrolling, this.onScroll, { passive: true, }); this.sliderInner?.addEventListener(Bs5SliderComponent.EVENTS.scrollended, this.onScrollEnd, { 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.sliderInner?.removeEventListener(Bs5SliderComponent.EVENTS.scrolling, this.onScroll); this.sliderInner?.removeEventListener(Bs5SliderComponent.EVENTS.scrollended, this.onScrollEnd); } initAll() { this.initSlideshowInner(); this.initOptions(); this.addEventListeners(); this.updateSlides(); } async beforeBind() { await super.beforeBind(); this.validateItems(); } async afterBind() { this.initAll(); this.updateItems(); this.classList.add(`${Bs5SliderComponent.tagName}-ready`); await super.afterBind(); } async afterAllBind() { this.updateItems(); await super.afterAllBind(); } initSlideshowInner() { if (!this.sliderInner) { this.throw(new Error("Can't init slider inner!")); return; } this.scrollEventsService = new ScrollEventsService(this.sliderInner); } enableDesktopDragscroll() { if (!this.dragscrollService) { if (!this.sliderInner) { return; } const dragscrollOptions = { detectGlobalMove: true }; this.dragscrollService = new Dragscroll(this.sliderInner, dragscrollOptions); } } disableDesktopDragscroll() { if (this.dragscrollService) { this.dragscrollService.destroy(); this.dragscrollService = undefined; } } enableTouchScroll() { this.classList.remove("touchscroll-disabled"); } disableTouchScroll() { this.classList.add("touchscroll-disabled"); } 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; } } updateItems() { let hasChange = false; const slideEls = this.slideElements; if (!this.scope.slideTemplate) { slideEls.forEach((slideEl, index) => { const exists = this.scope.items.find((item) => item.el === slideEl); if (!exists) { this.addItemByElement(slideEl, index); hasChange = true; } }); } for (const item of this.scope.items) { const exists = slideEls.find((slideEl) => slideEl === item.el); if (!exists) { this.removeItem(item.index, false); hasChange = true; } } if (hasChange) { this.updateItemIndexes(); this.updateSlides(); } return hasChange; } removeItem(index, updateIndex = true) { const item = this.scope.items[index]; if (!item) { return; } item.el?.remove(); this.scope.items.splice(index, 1); if (updateIndex) this.updateItemIndexes(); } updateItemIndexes() { for (let i = 0; i < this.scope.items.length; i++) { const item = this.scope.items[i]; item.index = i; } } addItemByElement(slideElement, index) { slideElement.setAttribute("index", index.toString()); const attributes = { active: false, index, el: slideElement, }; this.scope.items.push(attributes); } initItemsByChildren() { if (!this.slideElements) { this.throw(new Error("Can't not add items by child's because no slide child's are found!")); } this.scope.items = []; this.slideElements.forEach(this.addItemByElement.bind(this)); } getScrollPosition() { if (!this.sliderInner) { return null; } const scrollPosition = getScrollPosition(this.sliderInner); return scrollPosition; } getCurrentClosestNumber(goal, curr, prev) { return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; } setAllSlidesInactive(excludeIndex = -1) { for (const item of this.scope.items) { if (item.index !== excludeIndex) { item.active = false; item.el?.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; } const item = this.scope.items[index]; item.active = true; item.el?.classList.add("active"); } setSlidesActive(slides) { this.setAllSlidesInactive(); for (const slideIndex of slides) { this.setSlideActive(slideIndex); } } isScrollable() { if (!this.sliderInner) { return false; } const hasScrollableContent = this.scope.angle === "horizontal" ? this.sliderInner.scrollWidth > this.sliderInner.clientWidth : this.sliderInner.scrollHeight > this.sliderInner.clientHeight; return hasScrollableContent; } getSlideElementByIndex(index) { if (!this.sliderInner) { return undefined; } const slideEl = this.sliderInner.querySelector(`[index="${index}"]`); return slideEl; } isSlideVisible(item, offset) { if (!this.sliderInner) { return false; } const containerRect = this.sliderInner.getBoundingClientRect(); item.el ||= this.getSlideElementByIndex(item.index); const slideEl = item.el; if (!slideEl) { console.warn("Slide element not found!"); return false; } const slideRect = slideEl.getBoundingClientRect(); const isVisible = this.scope.angle === "horizontal" ? slideRect.left + offset >= containerRect.left && slideRect.right - offset <= containerRect.right : slideRect.top + offset >= containerRect.top && slideRect.bottom - offset <= containerRect.bottom; return isVisible; } getVisibleSlides(offset) { const activeSlides = []; if (!this.scope.items?.length) { return activeSlides; } for (const item of this.scope.items) { if (this.isSlideVisible(item, offset)) { activeSlides.push(item.index); } } return activeSlides.sort((a, b) => a - b); } setVisibleSlidesActive(offset) { this.setAllSlidesInactive(); const activeSlides = this.getVisibleSlides(offset); this.setSlidesActive(activeSlides); return activeSlides; } updateActiveSlides(offset = 8) { const activeSlides = this.setVisibleSlidesActive(offset); const firstIndex = activeSlides[0] || 0; const lastIndex = activeSlides[activeSlides.length - 1] || 0; const prevIndex = this.getPrevIndex(firstIndex); const nextIndex = this.getNextIndex(lastIndex); return { firstIndex, lastIndex, activeSlides, prevIndex, nextIndex, }; } updateSlides(offset = 8, isRetry = false) { if (!this.scope.items.length) { return []; } const { activeSlides, firstIndex, prevIndex, nextIndex } = this.updateActiveSlides(offset); if (!activeSlides.length && !isRetry) { let fallbackOffset = offset * 2; if (this.scope.angle === "horizontal") { const slideWidth = this.scope.items[0]?.el?.clientWidth || 0; if (slideWidth) { fallbackOffset = Math.round(slideWidth / 2 - 0.5); } } else { const slideHeight = this.scope.items[0]?.el?.clientHeight || 0; if (slideHeight) { fallbackOffset = Math.round(slideHeight / 2 - 0.5); } } return this.updateSlides(fallbackOffset, true); } this.scope.activeSlides = activeSlides; this.scope.prevIndex = prevIndex; this.scope.nextIndex = nextIndex; this.updateControls(); this.updateIndicators(); if (this.scope.sticky) { this.goTo(firstIndex); } return activeSlides; } updateControls() { const isScrollable = this.isScrollable(); this.scope.showControls = this.scope.controls && isScrollable && this.scope.items.length > 1; if (this.scope.infinite) { this.scope.enableNextControl = true; this.scope.enablePrevControl = true; return; } this.scope.enableNextControl = isScrollable && this.scope.nextIndex !== -1 && this.scope.nextIndex <= this.scope.items.length - 1; this.scope.enablePrevControl = isScrollable && this.scope.prevIndex !== -1 && this.scope.prevIndex >= 0; } updateIndicators() { const isScrollable = this.isScrollable(); this.scope.showIndicators = this.scope.indicators && isScrollable && this.scope.items.length > 1; } requiredAttributes() { return []; } parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace) { super.parsedAttributeChangedCallback(attributeName, oldValue, newValue, namespace); if (attributeName === "items") { this.validateItems(); } 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(); } if (attributeName === "columns") { this.updateColumns(); } } disconnectedCallback() { this.removeEventListeners(); } async beforeTemplate() { const templates = Array.from(this.querySelectorAll("template")); for (const template of templates) { const type = template.getAttribute("type"); switch (type) { case "slide-item": this.scope.slideTemplate = template.content.children.item(0)?.outerHTML || undefined; this.debug("Slide template found!", this.scope.slideTemplate); break; default: console.warn(`Unknown template type: ${type}`, template); break; } } } template() { return null; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM1LXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczUtc2xpZGVyL2JzNS1zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsVUFBVSxFQUlWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FFbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztBQUU1QyxNQUFNLGVBQWUsR0FBRyxHQUFHLHFCQUFxQixTQUFTLENBQUM7QUFNMUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQVM7SUFDckMsY0FBYyxDQUFrQjtJQUNoQyxHQUFHLENBQWE7SUFFMUIsSUFBYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBYyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFjLGFBQWE7UUFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBYyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFjLGdCQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxJQUFjLGlCQUFpQjtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJ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