1 |
- {"version":3,"file":"carousel.cjs","sources":["../../src/strings/carouselString.ts","../../src/strings/carouselComponent.ts","../../src/components/carousel.ts"],"sourcesContent":["/** @type {string} */\nconst carouselString = \"carousel\";\nexport default carouselString;\n","/** @type {string} */\nconst carouselComponent = \"Carousel\";\nexport default carouselComponent;\n","/* Native JavaScript for Bootstrap 5 | Carousel\n----------------------------------------------- */\nimport {\n addClass,\n closest,\n createCustomEvent,\n dispatchEvent,\n DragEvent,\n dragstartEvent,\n emulateTransitionEnd,\n getAttribute,\n getDocument,\n getElementsByClassName,\n getElementTransitionDuration,\n getInstance,\n hasClass,\n isElementInScrollRange,\n isRTL,\n keyArrowLeft,\n keyArrowRight,\n keydownEvent,\n matches,\n mouseclickEvent,\n mouseenterEvent,\n mouseleaveEvent,\n ObjectAssign,\n passiveHandler,\n pointerdownEvent,\n PointerEvent,\n pointermoveEvent,\n pointerupEvent,\n querySelector,\n querySelectorAll,\n reflow,\n removeClass,\n Timer,\n TouchEvent,\n touchstartEvent,\n} from \"@thednp/shorty\";\n\nimport { addListener, removeListener } from \"@thednp/event-listener\";\n\nimport activeClass from \"~/strings/activeClass\";\nimport dataBsTarget from \"~/strings/dataBsTarget\";\nimport carouselString from \"~/strings/carouselString\";\nimport carouselComponent from \"~/strings/carouselComponent\";\nimport getTargetElement from \"~/util/getTargetElement\";\nimport isDisabled from \"~/util/isDisabled\";\nimport BaseComponent from \"./base-component\";\nimport type { CarouselEvent, CarouselOptions } from \"~/interface/carousel\";\n\ntype CarouselEventProperties = {\n relatedTarget: EventTarget & HTMLElement;\n from: number;\n to: number;\n direction: \"left\" | \"right\";\n};\n\n// CAROUSEL PRIVATE GC\n// ===================\nconst carouselSelector = `[data-bs-ride=\"${carouselString}\"]`;\nconst carouselItem = `${carouselString}-item`;\nconst dataBsSlideTo = \"data-bs-slide-to\";\nconst dataBsSlide = \"data-bs-slide\";\nconst pausedClass = \"paused\";\n\nconst carouselDefaults: CarouselOptions = {\n pause: \"hover\",\n keyboard: false,\n touch: true,\n interval: 5000,\n};\n\n/**\n * Static method which returns an existing `Carousel` instance associated\n * to a target `Element`.\n */\nconst getCarouselInstance = (element: Element) =>\n getInstance<Carousel>(element, carouselComponent);\n\n/**\n * A `Carousel` initialization callback.\n */\nconst carouselInitCallback = (element: Element) => new Carousel(element);\n\nlet startX = 0;\nlet currentX = 0;\nlet endX = 0;\n\n// CAROUSEL CUSTOM EVENTS\n// ======================\nconst carouselSlideEvent = createCustomEvent<\n CarouselEventProperties,\n CarouselEvent\n>(`slide.bs.${carouselString}`);\nconst carouselSlidEvent = createCustomEvent<\n CarouselEventProperties,\n CarouselEvent\n>(`slid.bs.${carouselString}`);\n\n// CAROUSEL EVENT HANDLERS\n// =======================\n/**\n * The `transitionend` event listener of the `Carousel`.\n *\n * @param self the `Carousel` instance\n */\nconst carouselTransitionEndHandler = (self: Carousel) => {\n const { index, direction, element, slides, options } = self;\n\n // istanbul ignore else @preserve\n if (self.isAnimating) {\n const activeItem = getActiveIndex(self);\n const orientation = direction === \"left\" ? \"next\" : \"prev\";\n const directionClass = direction === \"left\" ? \"start\" : \"end\";\n\n addClass(slides[index], activeClass);\n removeClass(slides[index], `${carouselItem}-${orientation}`);\n removeClass(slides[index], `${carouselItem}-${directionClass}`);\n\n removeClass(slides[activeItem], activeClass);\n removeClass(slides[activeItem], `${carouselItem}-${directionClass}`);\n\n dispatchEvent(element, carouselSlidEvent);\n Timer.clear(element, dataBsSlide);\n\n // must check if a previous instance is disposed\n if (\n self.cycle && !getDocument(element).hidden && options.interval &&\n !self.isPaused\n ) {\n self.cycle();\n }\n }\n};\n\n/**\n * Handles the `mouseenter` events when *options.pause*\n * is set to `hover`.\n */\nfunction carouselPauseHandler(this: HTMLElement) {\n const self = getCarouselInstance(this);\n // istanbul ignore else @preserve\n if (self && !self.isPaused && !Timer.get(this, pausedClass)) {\n addClass(this, pausedClass);\n }\n}\n\n/**\n * Handles the `mouseleave` events when *options.pause*\n * is set to `hover`.\n */\nfunction carouselResumeHandler(this: HTMLElement) {\n const self = getCarouselInstance(this);\n // istanbul ignore else @preserve\n if (self && self.isPaused && !Timer.get(this, pausedClass)) {\n self.cycle();\n }\n}\n\n/**\n * Handles the `click` event for the `Carousel` indicators.\n *\n * @param e the `Event` object\n */\nfunction carouselIndicatorHandler(this: HTMLElement, e: MouseEvent) {\n e.preventDefault();\n const element = closest(this, carouselSelector) || getTargetElement(this);\n const self = element && getCarouselInstance(element);\n\n // istanbul ignore if @preserve\n if (isDisabled(this)) return;\n // istanbul ignore if @preserve\n if (!self || self.isAnimating) return;\n\n const newIndex = +(\n getAttribute(this, dataBsSlideTo) ||\n // istanbul ignore next @preserve\n 0\n );\n\n // istanbul ignore else @preserve\n if (\n this &&\n !hasClass(this, activeClass) && // event target is not active\n !Number.isNaN(newIndex)\n ) {\n // AND has the specific attribute\n self.to(newIndex); // do the slide\n }\n}\n\n/**\n * Handles the `click` event for the `Carousel` arrows.\n *\n * @param e the `Event` object\n */\nfunction carouselControlsHandler(this: HTMLElement, e: MouseEvent) {\n e.preventDefault();\n const element = closest(this, carouselSelector) || getTargetElement(this);\n const self = element && getCarouselInstance(element);\n\n // istanbul ignore if @preserve\n if (isDisabled(this)) return;\n // istanbul ignore if @preserve\n if (!self || self.isAnimating) return;\n\n const orientation = getAttribute(this, dataBsSlide);\n\n // istanbul ignore else @preserve\n if (orientation === \"next\") {\n self.next();\n } else if (orientation === \"prev\") {\n self.prev();\n }\n}\n\n/**\n * Handles the keyboard `keydown` event for the visible `Carousel` elements.\n *\n * @param e the `Event` object\n */\nconst carouselKeyHandler = (\n { code, target }: KeyboardEvent & { target: Node },\n) => {\n const doc = getDocument(target);\n const [element] = [...querySelectorAll<HTMLElement>(carouselSelector, doc)]\n .filter((x) => isElementInScrollRange(x));\n const self = getCarouselInstance(element);\n\n // istanbul ignore next @preserve\n if (\n !self || self.isAnimating || /textarea|input|select/i.test(target.nodeName)\n ) return;\n\n const RTL = isRTL(element);\n const arrowKeyNext = !RTL ? keyArrowRight : keyArrowLeft;\n const arrowKeyPrev = !RTL ? keyArrowLeft : keyArrowRight;\n\n // istanbul ignore else @preserve\n if (code === arrowKeyPrev) self.prev();\n else if (code === arrowKeyNext) self.next();\n};\n\n// CAROUSEL TOUCH HANDLERS\n// =======================\n/**\n * Prevents the `touchstart` and `dragstart` events for the `Carousel` element.\n *\n * @param e the `Event` object\n */\nfunction carouselDragHandler<T extends HTMLElement>(\n this: T,\n e: Event & (DragEvent<T> | TouchEvent<T>),\n) {\n const { target } = e;\n const self = getCarouselInstance(this);\n\n // istanbul ignore next @preserve\n if (\n self &&\n self.isTouch &&\n ((self.indicator && !self.indicator.contains(target)) ||\n !self.controls.includes(target))\n ) {\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n }\n}\n\n// CAROUSEL POINTER HANDLERS\n// =========================\n/**\n * Handles the `pointerdown` event for the `Carousel` element.\n *\n * @param e the `Event` object\n */\nfunction carouselPointerDownHandler(\n this: HTMLElement,\n e: PointerEvent<HTMLElement>,\n) {\n const { target } = e;\n const self = getCarouselInstance(this);\n\n // istanbul ignore else @preserve\n if (!self || self.isAnimating || self.isTouch) return;\n\n // filter pointer event on controls & indicators\n const { controls, indicators } = self;\n // istanbul ignore else @preserve\n if (\n ![...controls, ...indicators].every((el) =>\n el === target || el.contains(target)\n )\n ) {\n startX = e.pageX;\n\n // istanbul ignore else @preserve\n if (this.contains(target)) {\n self.isTouch = true;\n toggleCarouselTouchHandlers(self, true);\n }\n }\n}\n\n/**\n * Handles the `pointermove` event for the `Carousel` element.\n *\n * @param e\n */\nconst carouselPointerMoveHandler = (e: PointerEvent<HTMLElement>) => {\n currentX = e.pageX;\n};\n\n/**\n * Handles the `pointerup` event for the `Carousel` element.\n *\n * @param e\n */\nconst carouselPointerUpHandler = (e: PointerEvent<HTMLElement>) => {\n const { target } = e;\n const doc = getDocument(target);\n const self = [...querySelectorAll(carouselSelector, doc)]\n .map((c) => getCarouselInstance(c) as Carousel)\n .find((i) => i.isTouch) as Carousel;\n\n // istanbul ignore if @preserve\n if (!self) return;\n\n const { element, index } = self;\n const RTL = isRTL(element);\n endX = e.pageX;\n\n self.isTouch = false;\n toggleCarouselTouchHandlers(self);\n\n if (\n !doc.getSelection()?.toString().length &&\n element.contains(target) &&\n Math.abs(startX - endX) > 120\n ) {\n // determine next index to slide to\n // istanbul ignore else @preserve\n if (currentX < startX) {\n self.to(index + (RTL ? -1 : 1));\n } else if (currentX > startX) {\n self.to(index + (RTL ? 1 : -1));\n }\n }\n\n // reset pointer position\n startX = 0;\n currentX = 0;\n endX = 0;\n};\n\n// CAROUSEL PRIVATE METHODS\n// ========================\n/**\n * Sets active indicator for the `Carousel` instance.\n *\n * @param self the `Carousel` instance\n * @param index the index of the new active indicator\n */\nconst activateCarouselIndicator = (self: Carousel, index: number) => {\n const { indicators } = self;\n [...indicators].forEach((x) => removeClass(x, activeClass));\n\n // istanbul ignore else @preserve\n if (self.indicators[index]) addClass(indicators[index], activeClass);\n};\n\n/**\n * Toggles the pointer event listeners for a given `Carousel` instance.\n *\n * @param self the `Carousel` instance\n * @param add when `TRUE` event listeners are added\n */\nconst toggleCarouselTouchHandlers = (self: Carousel, add?: boolean) => {\n const { element } = self;\n const action = add ? addListener : removeListener;\n action(\n getDocument(element),\n pointermoveEvent,\n carouselPointerMoveHandler,\n passiveHandler,\n );\n action(\n getDocument(element),\n pointerupEvent,\n carouselPointerUpHandler,\n passiveHandler,\n );\n};\n\n/**\n * Returns the index of the current active item.\n *\n * @param self the `Carousel` instance\n * @returns the query result\n */\nconst getActiveIndex = (self: Carousel) => {\n const { slides, element } = self;\n const activeItem = querySelector<HTMLElement>(\n `.${carouselItem}.${activeClass}`,\n element,\n );\n return activeItem ? [...slides].indexOf(activeItem) : -1;\n};\n\n// CAROUSEL DEFINITION\n// ===================\n/** Creates a new `Carousel` instance. */\nexport default class Carousel extends BaseComponent {\n static selector = carouselSelector;\n static init = carouselInitCallback;\n static getInstance = getCarouselInstance;\n declare element: HTMLElement;\n declare options: CarouselOptions;\n declare direction: \"right\" | \"left\";\n declare index: number;\n declare isTouch: boolean;\n declare slides: HTMLCollectionOf<HTMLElement>;\n declare controls: HTMLElement[];\n declare indicator: HTMLElement | null;\n declare indicators: HTMLElement[];\n\n /**\n * @param target mostly a `.carousel` element\n * @param config instance options\n */\n constructor(target: Element | string, config?: Partial<CarouselOptions>) {\n super(target, config);\n\n // initialization element\n const { element } = this;\n\n // additional properties\n this.direction = isRTL(element) ? \"right\" : \"left\";\n this.isTouch = false;\n\n // carousel elements\n // a LIVE collection is prefferable\n this.slides = getElementsByClassName(carouselItem, element);\n const { slides } = this;\n\n // invalidate when not enough items\n // no need to go further\n if (slides.length < 2) return;\n\n const activeIndex = getActiveIndex(this);\n // recover item from disposed instance\n const transitionItem = [...slides].find((s) =>\n matches(s, `.${carouselItem}-next`)\n );\n this.index = activeIndex;\n\n // external controls must be within same document context\n const doc = getDocument(element);\n\n this.controls = [\n ...querySelectorAll<HTMLElement>(`[${dataBsSlide}]`, element),\n ...querySelectorAll<HTMLElement>(\n `[${dataBsSlide}][${dataBsTarget}=\"#${element.id}\"]`,\n doc,\n ),\n ].filter((c, i, ar) => i === ar.indexOf(c));\n\n this.indicator = querySelector<HTMLElement>(\n `.${carouselString}-indicators`,\n element,\n );\n\n // a LIVE collection is preffered\n this.indicators = [\n ...(this.indicator\n ? querySelectorAll<HTMLElement>(`[${dataBsSlideTo}]`, this.indicator)\n /* istanbul ignore next @preserve */ : []),\n ...querySelectorAll<HTMLElement>(\n `[${dataBsSlideTo}][${dataBsTarget}=\"#${element.id}\"]`,\n doc,\n ),\n ].filter((c, i, ar) => i === ar.indexOf(c));\n\n // set JavaScript and DATA API options\n const { options } = this;\n\n // don't use TRUE as interval, it's actually 0, use the default 5000ms better\n this.options.interval = options.interval === true\n ? carouselDefaults.interval\n : options.interval;\n\n // set first slide active if none\n // istanbul ignore next @preserve - impossible to test\n if (transitionItem) {\n this.index = [...slides].indexOf(transitionItem);\n } else if (activeIndex < 0) {\n this.index = 0;\n addClass(slides[0], activeClass);\n if (this.indicators.length) activateCarouselIndicator(this, 0);\n }\n\n // istanbul ignore else @preserve\n if (this.indicators.length) activateCarouselIndicator(this, this.index);\n\n // attach event handlers\n this._toggleEventListeners(true);\n\n // start to cycle if interval is set\n if (options.interval) this.cycle();\n }\n\n /**\n * Returns component name string.\n */\n get name() {\n return carouselComponent;\n }\n /**\n * Returns component default options.\n */\n get defaults() {\n return carouselDefaults;\n }\n\n /**\n * Check if instance is paused.\n */\n get isPaused() {\n return hasClass(this.element, pausedClass);\n }\n\n /**\n * Check if instance is animating.\n */\n get isAnimating() {\n return querySelector(\n `.${carouselItem}-next,.${carouselItem}-prev`,\n this.element,\n ) !== null;\n }\n\n // CAROUSEL PUBLIC METHODS\n // =======================\n /** Slide automatically through items. */\n cycle() {\n const { element, options, isPaused, index } = this;\n\n Timer.clear(element, carouselString);\n if (isPaused) {\n Timer.clear(element, pausedClass);\n removeClass(element, pausedClass);\n }\n\n Timer.set(\n element,\n () => {\n // it's very important to check self.element\n // where instance might have been disposed\n // istanbul ignore else @preserve\n if (\n this.element && !this.isPaused && !this.isTouch &&\n isElementInScrollRange(element)\n ) {\n this.to(index + 1);\n }\n },\n options.interval as number,\n carouselString,\n );\n }\n\n /** Pause the automatic cycle. */\n pause() {\n const { element, options } = this;\n // istanbul ignore else @preserve\n if (this.isPaused || !options.interval) return;\n\n addClass(element, pausedClass);\n Timer.set(\n element,\n () => {\n /* ESLint is now happy */\n },\n 1,\n pausedClass,\n );\n }\n\n /** Slide to the next item. */\n next() {\n // istanbul ignore else @preserve\n if (!this.isAnimating) {\n this.to(this.index + 1);\n }\n }\n\n /** Slide to the previous item. */\n prev() {\n // istanbul ignore else @preserve\n if (!this.isAnimating) {\n this.to(this.index - 1);\n }\n }\n\n /**\n * Jump to the item with the `idx` index.\n *\n * @param idx the index of the item to jump to\n */\n to(idx: number) {\n const { element, slides, options } = this;\n const activeItem = getActiveIndex(this);\n const RTL = isRTL(element);\n let next = idx;\n\n // when controled via methods, make sure to check again\n // first return if we're on the same item #227\n // `to()` must be SPAM protected by Timer\n if (\n this.isAnimating || activeItem === next ||\n Timer.get(element, dataBsSlide)\n ) return;\n\n // determine transition direction\n // istanbul ignore else @preserve\n if (\n activeItem < next || (activeItem === 0 && next === slides.length - 1)\n ) {\n this.direction = RTL ? \"right\" : \"left\"; // next\n } else if (\n activeItem > next || (activeItem === slides.length - 1 && next === 0)\n ) {\n this.direction = RTL ? \"left\" : \"right\"; // prev\n }\n const { direction } = this;\n\n // find the right next index\n if (next < 0) {\n next = slides.length - 1;\n } else if (next >= slides.length) {\n next = 0;\n }\n\n // orientation, class name, eventProperties\n const orientation = direction === \"left\" ? \"next\" : \"prev\";\n const directionClass = direction === \"left\" ? \"start\" : \"end\";\n\n const eventProperties = {\n relatedTarget: slides[next],\n from: activeItem,\n to: next,\n direction,\n };\n\n // update event properties\n ObjectAssign(carouselSlideEvent, eventProperties);\n ObjectAssign(carouselSlidEvent, eventProperties);\n\n // discontinue when prevented\n dispatchEvent(element, carouselSlideEvent);\n if (carouselSlideEvent.defaultPrevented) return;\n\n // update index\n this.index = next;\n activateCarouselIndicator(this, next);\n\n if (\n getElementTransitionDuration(slides[next]) &&\n hasClass(element, \"slide\")\n ) {\n Timer.set(\n element,\n () => {\n addClass(slides[next], `${carouselItem}-${orientation}`);\n reflow(slides[next]);\n addClass(slides[next], `${carouselItem}-${directionClass}`);\n addClass(slides[activeItem], `${carouselItem}-${directionClass}`);\n\n // the instance might get diposed mid-animation\n emulateTransitionEnd(\n slides[next],\n () =>\n this.slides && this.slides.length &&\n carouselTransitionEndHandler(this),\n );\n },\n 0,\n dataBsSlide,\n );\n } else {\n addClass(slides[next], activeClass);\n removeClass(slides[activeItem], activeClass);\n\n Timer.set(\n element,\n () => {\n Timer.clear(element, dataBsSlide);\n // check for element, might have been disposed\n // istanbul ignore else @preserve\n if (element && options.interval && !this.isPaused) {\n this.cycle();\n }\n\n dispatchEvent(element, carouselSlidEvent);\n },\n 0,\n dataBsSlide,\n );\n }\n }\n\n /**\n * Toggles all event listeners for the `Carousel` instance.\n *\n * @param add when `TRUE` event listeners are added\n */\n _toggleEventListeners = (add?: boolean) => {\n const { element, options, slides, controls, indicators } = this;\n const { touch, pause, interval, keyboard } = options;\n const action = add ? addListener : removeListener;\n\n if (pause && interval) {\n action(element, mouseenterEvent, carouselPauseHandler);\n action(element, mouseleaveEvent, carouselResumeHandler);\n }\n\n if (touch && slides.length > 2) {\n action(\n element,\n pointerdownEvent,\n carouselPointerDownHandler,\n passiveHandler,\n );\n action(element, touchstartEvent, carouselDragHandler, { passive: false });\n action(element, dragstartEvent, carouselDragHandler, { passive: false });\n }\n\n // istanbul ignore else @preserve\n if (controls.length) {\n controls.forEach((arrow) => {\n action(arrow, mouseclickEvent, carouselControlsHandler);\n });\n }\n\n // istanbul ignore else @preserve\n if (indicators.length) {\n indicators.forEach((indicator) => {\n action(indicator, mouseclickEvent, carouselIndicatorHandler);\n });\n }\n\n if (keyboard) {\n action(getDocument(element), keydownEvent, carouselKeyHandler);\n }\n };\n\n /** Remove `Carousel` component from target. */\n dispose() {\n const { isAnimating } = this;\n\n const clone = {\n ...this,\n isAnimating,\n };\n this._toggleEventListeners();\n super.dispose();\n\n // istanbul ignore next @preserve - impossible to test in playwright\n if (clone.isAnimating) {\n emulateTransitionEnd(clone.slides[clone.index], () => {\n carouselTransitionEndHandler(clone);\n });\n }\n }\n}\n"],"names":["carouselString","carouselComponent","carouselSelector","carouselItem","dataBsSlideTo","dataBsSlide","pausedClass","carouselDefaults","getCarouselInstance","element","getInstance","carouselInitCallback","Carousel","startX","currentX","endX","carouselSlideEvent","createCustomEvent","carouselSlidEvent","carouselTransitionEndHandler","self","index","direction","slides","options","activeItem","getActiveIndex","orientation","directionClass","addClass","activeClass","removeClass","dispatchEvent","Timer","getDocument","carouselPauseHandler","carouselResumeHandler","carouselIndicatorHandler","e","closest","getTargetElement","isDisabled","newIndex","getAttribute","hasClass","carouselControlsHandler","carouselKeyHandler","code","target","doc","querySelectorAll","x","isElementInScrollRange","RTL","isRTL","arrowKeyNext","keyArrowLeft","keyArrowRight","arrowKeyPrev","carouselDragHandler","carouselPointerDownHandler","controls","indicators","el","toggleCarouselTouchHandlers","carouselPointerMoveHandler","carouselPointerUpHandler","c","i","activateCarouselIndicator","add","action","addListener","removeListener","pointermoveEvent","passiveHandler","pointerupEvent","querySelector","BaseComponent","config","getElementsByClassName","activeIndex","transitionItem","s","matches","dataBsTarget","ar","isPaused","idx","next","eventProperties","ObjectAssign","getElementTransitionDuration","reflow","emulateTransitionEnd","touch","pause","interval","keyboard","mouseenterEvent","mouseleaveEvent","pointerdownEvent","touchstartEvent","dragstartEvent","arrow","mouseclickEvent","indicator","keydownEvent","isAnimating","clone"],"mappings":"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"}
|