@ribajs/bs4
Version:
Bootstrap 4 module for Riba.js
446 lines • 36.5 kB
JavaScript
import { TRANSITION_END } from "../constants/index.js";
import { typeCheckConfig, makeArray, reflow, getTransitionDurationFromElement, emulateTransitionEnd, isVisible, triggerTransitionEnd, } from "../helper/utils.js";
import { on, one, off, trigger } from "../helper/dom/event-handler.js";
import { findOne, find } from "../helper/dom/selector-engine.js";
const NAME = "carousel";
const DATA_KEY = "bs.carousel";
const EVENT_KEY = `.${DATA_KEY}`;
const DATA_API_KEY = ".data-api";
const ARROW_LEFT_KEYCODE = 37;
const ARROW_RIGHT_KEYCODE = 39;
const TOUCHEVENT_COMPAT_WAIT = 500;
const SWIPE_THRESHOLD = 40;
const Default = {
interval: 5000,
keyboard: true,
slide: false,
pause: "hover",
wrap: true,
touch: true,
};
const DefaultType = {
interval: "(number|boolean)",
keyboard: "boolean",
slide: "(boolean|string)",
pause: "(string|boolean)",
wrap: "boolean",
touch: "boolean",
};
const Direction = {
NEXT: "next",
PREV: "prev",
LEFT: "left",
RIGHT: "right",
};
const Event = {
SLIDE: `slide${EVENT_KEY}`,
SLID: `slid${EVENT_KEY}`,
KEYDOWN: `keydown${EVENT_KEY}`,
MOUSEENTER: `mouseenter${EVENT_KEY}`,
MOUSELEAVE: `mouseleave${EVENT_KEY}`,
TOUCHSTART: `touchstart${EVENT_KEY}`,
TOUCHMOVE: `touchmove${EVENT_KEY}`,
TOUCHEND: `touchend${EVENT_KEY}`,
POINTERDOWN: `pointerdown${EVENT_KEY}`,
POINTERUP: `pointerup${EVENT_KEY}`,
DRAG_START: `dragstart${EVENT_KEY}`,
LOAD_DATA_API: `load${EVENT_KEY}${DATA_API_KEY}`,
CLICK_DATA_API: `click${EVENT_KEY}${DATA_API_KEY}`,
};
const ClassName = {
CAROUSEL: "carousel",
ACTIVE: "active",
SLIDE: "slide",
RIGHT: "carousel-item-right",
LEFT: "carousel-item-left",
NEXT: "carousel-item-next",
PREV: "carousel-item-prev",
ITEM: "carousel-item",
POINTER_EVENT: "pointer-event",
};
const Selector = {
ACTIVE: ".active",
ACTIVE_ITEM: ".active.carousel-item",
ITEM: ".carousel-item",
ITEM_IMG: ".carousel-item img",
NEXT_PREV: ".carousel-item-next, .carousel-item-prev",
INDICATORS: ".carousel-indicators",
};
const PointerType = {
TOUCH: "touch",
PEN: "pen",
};
class CarouselService {
items = null;
interval = null;
activeElement = null;
isPaused = false;
isSliding = false;
config;
element;
indicatorsElement;
touchSupported;
pointerEvent;
touchTimeout = null;
touchStartX = 0;
touchDeltaX = 0;
constructor(element, config) {
this.config = this.getConfig(config);
this.element = element;
this.indicatorsElement =
findOne(Selector.INDICATORS, this.element) || null;
this.touchSupported =
"ontouchstart" in document.documentElement ||
navigator.maxTouchPoints > 0;
this.pointerEvent = !!(window.PointerEvent || window.MSPointerEvent);
this.addEventListeners();
}
static get Default() {
return Default;
}
next() {
if (!this.isSliding) {
this.slide(Direction.NEXT);
}
}
nextWhenVisible() {
if (!document.hidden && isVisible(this.element)) {
this.next();
}
}
prev() {
if (!this.isSliding) {
this.slide(Direction.PREV);
}
}
pause(event) {
if (!event) {
this.isPaused = true;
}
if (findOne(Selector.NEXT_PREV, this.element)) {
triggerTransitionEnd(this.element);
this.cycle(true);
}
clearInterval(this.interval || undefined);
this.interval = null;
}
cycle(event) {
if (!event) {
this.isPaused = false;
}
if (this.interval) {
clearInterval(this.interval);
this.interval = null;
}
if (this.config && this.config.interval && !this.isPaused) {
this.interval = window.setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this.config.interval);
}
}
to(index) {
if (this.items === null) {
throw new Error("No items found!");
}
this.activeElement =
findOne(Selector.ACTIVE_ITEM, this.element) || null;
if (this.activeElement === null) {
throw new Error("Active element not found!");
}
const activeIndex = this.getItemIndex(this.activeElement);
if (index > this.items.length - 1 || index < 0) {
return;
}
if (this.isSliding) {
one(this.element, Event.SLID, () => this.to(index));
return;
}
if (activeIndex === index) {
this.pause();
this.cycle();
return;
}
const direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
this.slide(direction, this.items[index]);
}
dispose() {
this.removeEventListeners();
clearTimeout(this.touchTimeout || undefined);
clearInterval(this.interval || undefined);
}
getConfig(config) {
config = {
...Default,
...config,
};
typeCheckConfig(NAME, config, DefaultType);
return config;
}
handleSwipe() {
const absDeltax = Math.abs(this.touchDeltaX);
if (absDeltax <= SWIPE_THRESHOLD) {
return;
}
const direction = absDeltax / this.touchDeltaX;
this.touchDeltaX = 0;
if (direction > 0) {
this.prev();
}
if (direction < 0) {
this.next();
}
}
addEventListeners() {
this.keydown = this.keydown.bind(this);
this.pause = this.pause.bind(this);
this.cycle = this.cycle.bind(this);
if (this.config.keyboard) {
on(this.element, Event.KEYDOWN, this.keydown);
}
if (this.config.pause === "hover") {
on(this.element, Event.MOUSEENTER, this.pause);
on(this.element, Event.MOUSELEAVE, this.cycle);
}
if (this.config.touch && this.touchSupported) {
this.addTouchEventListeners();
}
}
addTouchEventListeners() {
this.onTouchStart = this.onTouchStart.bind(this);
this.onTouchMove = this.onTouchMove.bind(this);
this.onTouchEnd = this.onTouchEnd.bind(this);
makeArray(find(Selector.ITEM_IMG, this.element)).forEach((itemImg) => {
on(itemImg, Event.DRAG_START, this.preventDrag);
});
if (this.pointerEvent) {
on(this.element, Event.POINTERDOWN, this.onTouchStart);
on(this.element, Event.POINTERUP, this.onTouchEnd);
this.element.classList.add(ClassName.POINTER_EVENT);
}
else {
on(this.element, Event.TOUCHSTART, this.onTouchStart);
on(this.element, Event.TOUCHMOVE, this.onTouchMove);
on(this.element, Event.TOUCHEND, this.onTouchEnd);
}
}
removeEventListeners() {
if (this.config.keyboard) {
off(this.element, Event.KEYDOWN, this.keydown);
}
if (this.config.pause === "hover") {
off(this.element, Event.MOUSEENTER, this.pause);
off(this.element, Event.MOUSELEAVE, this.cycle);
}
this.removeTouchEventListeners();
}
removeTouchEventListeners() {
makeArray(find(Selector.ITEM_IMG, this.element)).forEach((itemImg) => {
off(itemImg, Event.DRAG_START, this.preventDrag);
});
if (this.pointerEvent) {
off(this.element, Event.POINTERDOWN, this.onTouchStart);
off(this.element, Event.POINTERUP, this.onTouchEnd);
this.element.classList.add(ClassName.POINTER_EVENT);
}
else {
off(this.element, Event.TOUCHSTART, this.onTouchStart);
off(this.element, Event.TOUCHMOVE, this.onTouchMove);
off(this.element, Event.TOUCHEND, this.onTouchEnd);
}
}
onTouchStart(e) {
const event = e;
if (this.pointerEvent &&
PointerType[event.pointerType.toUpperCase()]) {
this.touchStartX = event.clientX;
}
else if (!this.pointerEvent) {
this.touchStartX = event.touches[0].clientX;
}
}
onTouchMove(e) {
const event = e;
if (event.touches && event.touches.length > 1) {
this.touchDeltaX = 0;
}
else {
this.touchDeltaX = event.touches[0].clientX - this.touchStartX;
}
}
onTouchEnd(e) {
const event = e;
if (this.pointerEvent &&
PointerType[event.pointerType.toUpperCase()]) {
this.touchDeltaX = event.clientX - this.touchStartX;
}
this.handleSwipe();
if (this.config.pause === "hover") {
this.pause();
if (this.touchTimeout) {
clearTimeout(this.touchTimeout);
}
this.touchTimeout = Number(setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + (this.config.interval || 0)));
}
}
preventDrag(event) {
event.preventDefault();
}
keydown(e) {
const event = e;
if (event.target?.tagName &&
/input|textarea/i.test(event.target.tagName)) {
return;
}
switch (event.which) {
case ARROW_LEFT_KEYCODE:
event.preventDefault();
this.prev();
break;
case ARROW_RIGHT_KEYCODE:
event.preventDefault();
this.next();
break;
default:
}
}
getItemIndex(element) {
if (!element) {
return -1;
}
this.items =
element && element.parentNode
? makeArray(find(Selector.ITEM, element.parentNode))
: [];
return this.items.indexOf(element);
}
getItemByDirection(direction, activeElement) {
if (this.items === null) {
throw new Error("No items found!");
}
const isNextDirection = direction === Direction.NEXT;
const isPrevDirection = direction === Direction.PREV;
const activeIndex = this.getItemIndex(activeElement);
const lastItemIndex = this.items.length - 1;
const isGoingToWrap = (isPrevDirection && activeIndex === 0) ||
(isNextDirection && activeIndex === lastItemIndex);
if (isGoingToWrap && !this.config.wrap) {
return activeElement;
}
const delta = direction === Direction.PREV ? -1 : 1;
const itemIndex = (activeIndex + delta) % this.items.length;
return itemIndex === -1
? this.items[this.items.length - 1]
: this.items[itemIndex];
}
triggerSlideEvent(relatedTarget, eventDirectionName) {
const targetIndex = this.getItemIndex(relatedTarget);
const fromIndex = this.getItemIndex(findOne(Selector.ACTIVE_ITEM, this.element) || null);
return trigger(this.element, Event.SLIDE, {
relatedTarget,
direction: eventDirectionName,
from: fromIndex,
to: targetIndex,
});
}
setActiveIndicatorElement(element) {
if (this.indicatorsElement) {
const indicators = find(Selector.ACTIVE, this.indicatorsElement);
for (let i = 0; i < indicators.length; i++) {
indicators[i].classList.remove(ClassName.ACTIVE);
}
const nextIndicator = this.indicatorsElement.children[this.getItemIndex(element)];
if (nextIndicator) {
nextIndicator.classList.add(ClassName.ACTIVE);
}
}
}
slide(direction, element) {
const activeElement = findOne(Selector.ACTIVE_ITEM, this.element);
const activeElementIndex = this.getItemIndex(activeElement);
const nextElement = element ||
(activeElement && this.getItemByDirection(direction, activeElement));
if (!nextElement) {
throw new Error("Next element not found!");
}
const nextElementIndex = this.getItemIndex(nextElement);
const isCycling = Boolean(this.interval);
let directionalClassName;
let orderClassName;
let eventDirectionName;
if (direction === Direction.NEXT) {
directionalClassName = ClassName.LEFT;
orderClassName = ClassName.NEXT;
eventDirectionName = Direction.LEFT;
}
else {
directionalClassName = ClassName.RIGHT;
orderClassName = ClassName.PREV;
eventDirectionName = Direction.RIGHT;
}
if (nextElement && nextElement.classList.contains(ClassName.ACTIVE)) {
this.isSliding = false;
return;
}
const slideEvent = this.triggerSlideEvent(nextElement, eventDirectionName);
if (slideEvent.defaultPrevented) {
return;
}
if (!activeElement || !nextElement) {
return;
}
this.isSliding = true;
if (isCycling) {
this.pause();
}
this.setActiveIndicatorElement(nextElement);
if (this.element.classList.contains(ClassName.SLIDE)) {
nextElement.classList.add(orderClassName);
reflow(nextElement);
activeElement.classList.add(directionalClassName);
nextElement.classList.add(directionalClassName);
const nextElementInterval = parseInt(nextElement.getAttribute("data-interval") || "0", 10);
if (nextElementInterval) {
this.config.defaultInterval =
this.config.defaultInterval || this.config.interval;
this.config.interval = nextElementInterval;
}
else {
this.config.interval =
this.config.defaultInterval || this.config.interval;
}
const transitionDuration = getTransitionDurationFromElement(activeElement);
one(activeElement, TRANSITION_END, () => {
nextElement.classList.remove(directionalClassName);
nextElement.classList.remove(orderClassName);
nextElement.classList.add(ClassName.ACTIVE);
activeElement.classList.remove(ClassName.ACTIVE);
activeElement.classList.remove(orderClassName);
activeElement.classList.remove(directionalClassName);
this.isSliding = false;
setTimeout(() => {
trigger(this.element, Event.SLID, {
relatedTarget: nextElement,
direction: eventDirectionName,
from: activeElementIndex,
to: nextElementIndex,
});
}, 0);
});
emulateTransitionEnd(activeElement, transitionDuration);
}
else {
activeElement.classList.remove(ClassName.ACTIVE);
nextElement.classList.add(ClassName.ACTIVE);
this.isSliding = false;
trigger(this.element, Event.SLID, {
relatedTarget: nextElement,
direction: eventDirectionName,
from: activeElementIndex,
to: nextElementIndex,
});
}
if (isCycling) {
this.cycle();
}
}
}
export default CarouselService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYXJvdXNlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVN2RCxPQUFPLEVBQ0wsZUFBZSxFQUNmLFNBQVMsRUFDVCxNQUFNLEVBQ04sZ0NBQWdDLEVBQ2hDLG9CQUFvQixFQUNwQixTQUFTLEVBQ1Qsb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFRakUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQ3hCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2pDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUNqQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFFM0IsTUFBTSxPQUFPLEdBQW1CO0lBQzlCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsS0FBSztJQUNaLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRztJQUNsQixRQUFRLEVBQUUsa0JBQWtCO0lBQzVCLFFBQVEsRUFBRSxTQUFTO0lBQ25C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