UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

894 lines 75.3 kB
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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