aboutsummaryrefslogtreecommitdiff
path: root/js/src/carousel.js
diff options
context:
space:
mode:
authorPatrick H. Lauke <[email protected]>2021-05-04 12:46:06 +0100
committerGitHub <[email protected]>2021-05-04 12:46:06 +0100
commit8865a8ab1c7157ab81bf49afa62b75f36daee46d (patch)
tree97ef78f2ea8e07aab50014176d061fe3c1d49134 /js/src/carousel.js
parent018ee6a3b50b958ddb49657086cd9168abf5a485 (diff)
parent7ea6578773cb1b7f5cfb8fb41321b3fa10349daf (diff)
downloadbootstrap-jo-docs-thanks-page.tar.xz
bootstrap-jo-docs-thanks-page.zip
Merge branch 'main' into jo-docs-thanks-pagejo-docs-thanks-page
Diffstat (limited to 'js/src/carousel.js')
-rw-r--r--js/src/carousel.js171
1 files changed, 81 insertions, 90 deletions
diff --git a/js/src/carousel.js b/js/src/carousel.js
index d8ad3a135..ebb0b7b20 100644
--- a/js/src/carousel.js
+++ b/js/src/carousel.js
@@ -1,17 +1,16 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v5.0.0-alpha3): carousel.js
+ * Bootstrap (v5.0.0-beta3): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
import {
- getjQuery,
- onDOMContentLoaded,
- TRANSITION_END,
+ defineJQueryPlugin,
emulateTransitionEnd,
getElementFromSelector,
getTransitionDurationFromElement,
+ isRTL,
isVisible,
reflow,
triggerTransitionEnd,
@@ -57,8 +56,8 @@ const DefaultType = {
touch: 'boolean'
}
-const DIRECTION_NEXT = 'next'
-const DIRECTION_PREV = 'prev'
+const ORDER_NEXT = 'next'
+const ORDER_PREV = 'prev'
const DIRECTION_LEFT = 'left'
const DIRECTION_RIGHT = 'right'
@@ -91,13 +90,12 @@ const SELECTOR_ITEM = '.carousel-item'
const SELECTOR_ITEM_IMG = '.carousel-item img'
const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'
const SELECTOR_INDICATORS = '.carousel-indicators'
+const SELECTOR_INDICATOR = '[data-bs-target]'
const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'
const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'
-const PointerType = {
- TOUCH: 'touch',
- PEN: 'pen'
-}
+const POINTER_TYPE_TOUCH = 'touch'
+const POINTER_TYPE_PEN = 'pen'
/**
* ------------------------------------------------------------------------
@@ -139,7 +137,7 @@ class Carousel extends BaseComponent {
next() {
if (!this._isSliding) {
- this._slide(DIRECTION_NEXT)
+ this._slide(ORDER_NEXT)
}
}
@@ -153,7 +151,7 @@ class Carousel extends BaseComponent {
prev() {
if (!this._isSliding) {
- this._slide(DIRECTION_PREV)
+ this._slide(ORDER_PREV)
}
}
@@ -210,17 +208,14 @@ class Carousel extends BaseComponent {
return
}
- const direction = index > activeIndex ?
- DIRECTION_NEXT :
- DIRECTION_PREV
+ const order = index > activeIndex ?
+ ORDER_NEXT :
+ ORDER_PREV
- this._slide(direction, this._items[index])
+ this._slide(order, this._items[index])
}
dispose() {
- super.dispose()
- EventHandler.off(this._element, EVENT_KEY)
-
this._items = null
this._config = null
this._interval = null
@@ -228,6 +223,8 @@ class Carousel extends BaseComponent {
this._isSliding = null
this._activeElement = null
this._indicatorsElement = null
+
+ super.dispose()
}
// Private
@@ -252,15 +249,11 @@ class Carousel extends BaseComponent {
this.touchDeltaX = 0
- // swipe left
- if (direction > 0) {
- this.prev()
+ if (!direction) {
+ return
}
- // swipe right
- if (direction < 0) {
- this.next()
- }
+ this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT)
}
_addEventListeners() {
@@ -280,7 +273,7 @@ class Carousel extends BaseComponent {
_addTouchEventListeners() {
const start = event => {
- if (this._pointerEvent && PointerType[event.pointerType.toUpperCase()]) {
+ if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
this.touchStartX = event.clientX
} else if (!this._pointerEvent) {
this.touchStartX = event.touches[0].clientX
@@ -289,15 +282,13 @@ class Carousel extends BaseComponent {
const move = event => {
// ensure swiping with one touch and not pinching
- if (event.touches && event.touches.length > 1) {
- this.touchDeltaX = 0
- } else {
- this.touchDeltaX = event.touches[0].clientX - this.touchStartX
- }
+ this.touchDeltaX = event.touches && event.touches.length > 1 ?
+ 0 :
+ event.touches[0].clientX - this.touchStartX
}
const end = event => {
- if (this._pointerEvent && PointerType[event.pointerType.toUpperCase()]) {
+ if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
this.touchDeltaX = event.clientX - this.touchStartX
}
@@ -341,16 +332,12 @@ class Carousel extends BaseComponent {
return
}
- switch (event.key) {
- case ARROW_LEFT_KEY:
- event.preventDefault()
- this.prev()
- break
- case ARROW_RIGHT_KEY:
- event.preventDefault()
- this.next()
- break
- default:
+ if (event.key === ARROW_LEFT_KEY) {
+ event.preventDefault()
+ this._slide(DIRECTION_RIGHT)
+ } else if (event.key === ARROW_RIGHT_KEY) {
+ event.preventDefault()
+ this._slide(DIRECTION_LEFT)
}
}
@@ -362,19 +349,18 @@ class Carousel extends BaseComponent {
return this._items.indexOf(element)
}
- _getItemByDirection(direction, activeElement) {
- const isNextDirection = direction === DIRECTION_NEXT
- const isPrevDirection = direction === DIRECTION_PREV
+ _getItemByOrder(order, activeElement) {
+ const isNext = order === ORDER_NEXT
+ const isPrev = order === ORDER_PREV
const activeIndex = this._getItemIndex(activeElement)
const lastItemIndex = this._items.length - 1
- const isGoingToWrap = (isPrevDirection && activeIndex === 0) ||
- (isNextDirection && activeIndex === lastItemIndex)
+ const isGoingToWrap = (isPrev && activeIndex === 0) || (isNext && activeIndex === lastItemIndex)
if (isGoingToWrap && !this._config.wrap) {
return activeElement
}
- const delta = direction === DIRECTION_PREV ? -1 : 1
+ const delta = isPrev ? -1 : 1
const itemIndex = (activeIndex + delta) % this._items.length
return itemIndex === -1 ?
@@ -396,18 +382,19 @@ class Carousel extends BaseComponent {
_setActiveIndicatorElement(element) {
if (this._indicatorsElement) {
- const indicators = SelectorEngine.find(SELECTOR_ACTIVE, this._indicatorsElement)
+ const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)
- for (let i = 0; i < indicators.length; i++) {
- indicators[i].classList.remove(CLASS_NAME_ACTIVE)
- }
+ activeIndicator.classList.remove(CLASS_NAME_ACTIVE)
+ activeIndicator.removeAttribute('aria-current')
- const nextIndicator = this._indicatorsElement.children[
- this._getItemIndex(element)
- ]
+ const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement)
- if (nextIndicator) {
- nextIndicator.classList.add(CLASS_NAME_ACTIVE)
+ for (let i = 0; i < indicators.length; i++) {
+ if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {
+ indicators[i].classList.add(CLASS_NAME_ACTIVE)
+ indicators[i].setAttribute('aria-current', 'true')
+ break
+ }
}
}
}
@@ -429,27 +416,19 @@ class Carousel extends BaseComponent {
}
}
- _slide(direction, element) {
+ _slide(directionOrOrder, element) {
+ const order = this._directionToOrder(directionOrOrder)
const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)
const activeElementIndex = this._getItemIndex(activeElement)
- const nextElement = element || (activeElement && this._getItemByDirection(direction, activeElement))
+ const nextElement = element || this._getItemByOrder(order, activeElement)
const nextElementIndex = this._getItemIndex(nextElement)
const isCycling = Boolean(this._interval)
- let directionalClassName
- let orderClassName
- let eventDirectionName
-
- if (direction === DIRECTION_NEXT) {
- directionalClassName = CLASS_NAME_START
- orderClassName = CLASS_NAME_NEXT
- eventDirectionName = DIRECTION_LEFT
- } else {
- directionalClassName = CLASS_NAME_END
- orderClassName = CLASS_NAME_PREV
- eventDirectionName = DIRECTION_RIGHT
- }
+ const isNext = order === ORDER_NEXT
+ const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END
+ const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV
+ const eventDirectionName = this._orderToDirection(order)
if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
this._isSliding = false
@@ -485,7 +464,7 @@ class Carousel extends BaseComponent {
const transitionDuration = getTransitionDurationFromElement(activeElement)
- EventHandler.one(activeElement, TRANSITION_END, () => {
+ EventHandler.one(activeElement, 'transitionend', () => {
nextElement.classList.remove(directionalClassName, orderClassName)
nextElement.classList.add(CLASS_NAME_ACTIVE)
@@ -522,10 +501,34 @@ class Carousel extends BaseComponent {
}
}
+ _directionToOrder(direction) {
+ if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
+ return direction
+ }
+
+ if (isRTL()) {
+ return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT
+ }
+
+ return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV
+ }
+
+ _orderToDirection(order) {
+ if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
+ return order
+ }
+
+ if (isRTL()) {
+ return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT
+ }
+
+ return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT
+ }
+
// Static
static carouselInterface(element, config) {
- let data = Data.getData(element, DATA_KEY)
+ let data = Data.get(element, DATA_KEY)
let _config = {
...Default,
...Manipulator.getDataAttributes(element)
@@ -584,7 +587,7 @@ class Carousel extends BaseComponent {
Carousel.carouselInterface(target, config)
if (slideIndex) {
- Data.getData(target, DATA_KEY).to(slideIndex)
+ Data.get(target, DATA_KEY).to(slideIndex)
}
event.preventDefault()
@@ -603,7 +606,7 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)
for (let i = 0, len = carousels.length; i < len; i++) {
- Carousel.carouselInterface(carousels[i], Data.getData(carousels[i], DATA_KEY))
+ Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY))
}
})
@@ -614,18 +617,6 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
* add .Carousel to jQuery only if jQuery is present
*/
-onDOMContentLoaded(() => {
- const $ = getjQuery()
- /* istanbul ignore if */
- if ($) {
- const JQUERY_NO_CONFLICT = $.fn[NAME]
- $.fn[NAME] = Carousel.jQueryInterface
- $.fn[NAME].Constructor = Carousel
- $.fn[NAME].noConflict = () => {
- $.fn[NAME] = JQUERY_NO_CONFLICT
- return Carousel.jQueryInterface
- }
- }
-})
+defineJQueryPlugin(NAME, Carousel)
export default Carousel