codekingpro/portable-devtools
115k
1/*!2 * Bootstrap carousel.js v4.6.2 (https://getbootstrap.com/)3 * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)4 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)5 */6(function (global, factory) {7 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :8 typeof define === 'function' && define.amd ? define(['jquery', './util'], factory) :9 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Carousel = factory(global.jQuery, global.Util));10})(this, (function ($, Util) { 'use strict';11 12 function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }13 14 var $__default = /*#__PURE__*/_interopDefaultLegacy($);15 var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);16 17 function _defineProperties(target, props) {18 for (var i = 0; i < props.length; i++) {19 var descriptor = props[i];20 descriptor.enumerable = descriptor.enumerable || false;21 descriptor.configurable = true;22 if ("value" in descriptor) descriptor.writable = true;23 Object.defineProperty(target, descriptor.key, descriptor);24 }25 }26 27 function _createClass(Constructor, protoProps, staticProps) {28 if (protoProps) _defineProperties(Constructor.prototype, protoProps);29 if (staticProps) _defineProperties(Constructor, staticProps);30 Object.defineProperty(Constructor, "prototype", {31 writable: false32 });33 return Constructor;34 }35 36 function _extends() {37 _extends = Object.assign ? Object.assign.bind() : function (target) {38 for (var i = 1; i < arguments.length; i++) {39 var source = arguments[i];40 41 for (var key in source) {42 if (Object.prototype.hasOwnProperty.call(source, key)) {43 target[key] = source[key];44 }45 }46 }47 48 return target;49 };50 return _extends.apply(this, arguments);51 }52 53 /**54 * Constants55 */56 57 var NAME = 'carousel';58 var VERSION = '4.6.2';59 var DATA_KEY = 'bs.carousel';60 var EVENT_KEY = "." + DATA_KEY;61 var DATA_API_KEY = '.data-api';62 var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME];63 var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key64 65 var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key66 67 var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch68 69 var SWIPE_THRESHOLD = 40;70 var CLASS_NAME_CAROUSEL = 'carousel';71 var CLASS_NAME_ACTIVE = 'active';72 var CLASS_NAME_SLIDE = 'slide';73 var CLASS_NAME_RIGHT = 'carousel-item-right';74 var CLASS_NAME_LEFT = 'carousel-item-left';75 var CLASS_NAME_NEXT = 'carousel-item-next';76 var CLASS_NAME_PREV = 'carousel-item-prev';77 var CLASS_NAME_POINTER_EVENT = 'pointer-event';78 var DIRECTION_NEXT = 'next';79 var DIRECTION_PREV = 'prev';80 var DIRECTION_LEFT = 'left';81 var DIRECTION_RIGHT = 'right';82 var EVENT_SLIDE = "slide" + EVENT_KEY;83 var EVENT_SLID = "slid" + EVENT_KEY;84 var EVENT_KEYDOWN = "keydown" + EVENT_KEY;85 var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY;86 var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY;87 var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY;88 var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY;89 var EVENT_TOUCHEND = "touchend" + EVENT_KEY;90 var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY;91 var EVENT_POINTERUP = "pointerup" + EVENT_KEY;92 var EVENT_DRAG_START = "dragstart" + EVENT_KEY;93 var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;94 var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;95 var SELECTOR_ACTIVE = '.active';96 var SELECTOR_ACTIVE_ITEM = '.active.carousel-item';97 var SELECTOR_ITEM = '.carousel-item';98 var SELECTOR_ITEM_IMG = '.carousel-item img';99 var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';100 var SELECTOR_INDICATORS = '.carousel-indicators';101 var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]';102 var SELECTOR_DATA_RIDE = '[data-ride="carousel"]';103 var Default = {104 interval: 5000,105 keyboard: true,106 slide: false,107 pause: 'hover',108 wrap: true,109 touch: true110 };111 var DefaultType = {112 interval: '(number|boolean)',113 keyboard: 'boolean',114 slide: '(boolean|string)',115 pause: '(string|boolean)',116 wrap: 'boolean',117 touch: 'boolean'118 };119 var PointerType = {120 TOUCH: 'touch',121 PEN: 'pen'122 };123 /**124 * Class definition125 */126 127 var Carousel = /*#__PURE__*/function () {128 function Carousel(element, config) {129 this._items = null;130 this._interval = null;131 this._activeElement = null;132 this._isPaused = false;133 this._isSliding = false;134 this.touchTimeout = null;135 this.touchStartX = 0;136 this.touchDeltaX = 0;137 this._config = this._getConfig(config);138 this._element = element;139 this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS);140 this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;141 this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);142 143 this._addEventListeners();144 } // Getters145 146 147 var _proto = Carousel.prototype;148 149 // Public150 _proto.next = function next() {151 if (!this._isSliding) {152 this._slide(DIRECTION_NEXT);153 }154 };155 156 _proto.nextWhenVisible = function nextWhenVisible() {157 var $element = $__default["default"](this._element); // Don't call next when the page isn't visible158 // or the carousel or its parent isn't visible159 160 if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') {161 this.next();162 }163 };164 165 _proto.prev = function prev() {166 if (!this._isSliding) {167 this._slide(DIRECTION_PREV);168 }169 };170 171 _proto.pause = function pause(event) {172 if (!event) {173 this._isPaused = true;174 }175 176 if (this._element.querySelector(SELECTOR_NEXT_PREV)) {177 Util__default["default"].triggerTransitionEnd(this._element);178 this.cycle(true);179 }180 181 clearInterval(this._interval);182 this._interval = null;183 };184 185 _proto.cycle = function cycle(event) {186 if (!event) {187 this._isPaused = false;188 }189 190 if (this._interval) {191 clearInterval(this._interval);192 this._interval = null;193 }194 195 if (this._config.interval && !this._isPaused) {196 this._updateInterval();197 198 this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);199 }200 };201 202 _proto.to = function to(index) {203 var _this = this;204 205 this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);206 207 var activeIndex = this._getItemIndex(this._activeElement);208 209 if (index > this._items.length - 1 || index < 0) {210 return;211 }212 213 if (this._isSliding) {214 $__default["default"](this._element).one(EVENT_SLID, function () {215 return _this.to(index);216 });217 return;218 }219 220 if (activeIndex === index) {221 this.pause();222 this.cycle();223 return;224 }225 226 var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV;227 228 this._slide(direction, this._items[index]);229 };230 231 _proto.dispose = function dispose() {232 $__default["default"](this._element).off(EVENT_KEY);233 $__default["default"].removeData(this._element, DATA_KEY);234 this._items = null;235 this._config = null;236 this._element = null;237 this._interval = null;238 this._isPaused = null;239 this._isSliding = null;240 this._activeElement = null;241 this._indicatorsElement = null;242 } // Private243 ;244 245 _proto._getConfig = function _getConfig(config) {246 config = _extends({}, Default, config);247 Util__default["default"].typeCheckConfig(NAME, config, DefaultType);248 return config;249 };250 251 _proto._handleSwipe = function _handleSwipe() {252 var absDeltax = Math.abs(this.touchDeltaX);253 254 if (absDeltax <= SWIPE_THRESHOLD) {255 return;256 }257 258 var direction = absDeltax / this.touchDeltaX;259 this.touchDeltaX = 0; // swipe left260 261 if (direction > 0) {262 this.prev();263 } // swipe right264 265 266 if (direction < 0) {267 this.next();268 }269 };270 271 _proto._addEventListeners = function _addEventListeners() {272 var _this2 = this;273 274 if (this._config.keyboard) {275 $__default["default"](this._element).on(EVENT_KEYDOWN, function (event) {276 return _this2._keydown(event);277 });278 }279 280 if (this._config.pause === 'hover') {281 $__default["default"](this._element).on(EVENT_MOUSEENTER, function (event) {282 return _this2.pause(event);283 }).on(EVENT_MOUSELEAVE, function (event) {284 return _this2.cycle(event);285 });286 }287 288 if (this._config.touch) {289 this._addTouchEventListeners();290 }291 };292 293 _proto._addTouchEventListeners = function _addTouchEventListeners() {294 var _this3 = this;295 296 if (!this._touchSupported) {297 return;298 }299 300 var start = function start(event) {301 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {302 _this3.touchStartX = event.originalEvent.clientX;303 } else if (!_this3._pointerEvent) {304 _this3.touchStartX = event.originalEvent.touches[0].clientX;305 }306 };307 308 var move = function move(event) {309 // ensure swiping with one touch and not pinching310 _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX;311 };312 313 var end = function end(event) {314 if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {315 _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;316 }317 318 _this3._handleSwipe();319 320 if (_this3._config.pause === 'hover') {321 // If it's a touch-enabled device, mouseenter/leave are fired as322 // part of the mouse compatibility events on first tap - the carousel323 // would stop cycling until user tapped out of it;324 // here, we listen for touchend, explicitly pause the carousel325 // (as if it's the second time we tap on it, mouseenter compat event326 // is NOT fired) and after a timeout (to allow for mouse compatibility327 // events to fire) we explicitly restart cycling328 _this3.pause();329 330 if (_this3.touchTimeout) {331 clearTimeout(_this3.touchTimeout);332 }333 334 _this3.touchTimeout = setTimeout(function (event) {335 return _this3.cycle(event);336 }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);337 }338 };339 340 $__default["default"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) {341 return e.preventDefault();342 });343 344 if (this._pointerEvent) {345 $__default["default"](this._element).on(EVENT_POINTERDOWN, function (event) {346 return start(event);347 });348 $__default["default"](this._element).on(EVENT_POINTERUP, function (event) {349 return end(event);350 });351 352 this._element.classList.add(CLASS_NAME_POINTER_EVENT);353 } else {354 $__default["default"](this._element).on(EVENT_TOUCHSTART, function (event) {355 return start(event);356 });357 $__default["default"](this._element).on(EVENT_TOUCHMOVE, function (event) {358 return move(event);359 });360 $__default["default"](this._element).on(EVENT_TOUCHEND, function (event) {361 return end(event);362 });363 }364 };365 366 _proto._keydown = function _keydown(event) {367 if (/input|textarea/i.test(event.target.tagName)) {368 return;369 }370 371 switch (event.which) {372 case ARROW_LEFT_KEYCODE:373 event.preventDefault();374 this.prev();375 break;376 377 case ARROW_RIGHT_KEYCODE:378 event.preventDefault();379 this.next();380 break;381 }382 };383 384 _proto._getItemIndex = function _getItemIndex(element) {385 this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : [];386 return this._items.indexOf(element);387 };388 389 _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {390 var isNextDirection = direction === DIRECTION_NEXT;391 var isPrevDirection = direction === DIRECTION_PREV;392 393 var activeIndex = this._getItemIndex(activeElement);394 395 var lastItemIndex = this._items.length - 1;396 var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;397 398 if (isGoingToWrap && !this._config.wrap) {399 return activeElement;400 }401 402 var delta = direction === DIRECTION_PREV ? -1 : 1;403 var itemIndex = (activeIndex + delta) % this._items.length;404 return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];405 };406 407 _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {408 var targetIndex = this._getItemIndex(relatedTarget);409 410 var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM));411 412 var slideEvent = $__default["default"].Event(EVENT_SLIDE, {413 relatedTarget: relatedTarget,414 direction: eventDirectionName,415 from: fromIndex,416 to: targetIndex417 });418 $__default["default"](this._element).trigger(slideEvent);419 return slideEvent;420 };421 422 _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {423 if (this._indicatorsElement) {424 var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE));425 $__default["default"](indicators).removeClass(CLASS_NAME_ACTIVE);426 427 var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];428 429 if (nextIndicator) {430 $__default["default"](nextIndicator).addClass(CLASS_NAME_ACTIVE);431 }432 }433 };434 435 _proto._updateInterval = function _updateInterval() {436 var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM);437 438 if (!element) {439 return;440 }441 442 var elementInterval = parseInt(element.getAttribute('data-interval'), 10);443 444 if (elementInterval) {445 this._config.defaultInterval = this._config.defaultInterval || this._config.interval;446 this._config.interval = elementInterval;447 } else {448 this._config.interval = this._config.defaultInterval || this._config.interval;449 }450 };451 452 _proto._slide = function _slide(direction, element) {453 var _this4 = this;454 455 var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM);456 457 var activeElementIndex = this._getItemIndex(activeElement);458 459 var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);460 461 var nextElementIndex = this._getItemIndex(nextElement);462 463 var isCycling = Boolean(this._interval);464 var directionalClassName;465 var orderClassName;466 var eventDirectionName;467 468 if (direction === DIRECTION_NEXT) {469 directionalClassName = CLASS_NAME_LEFT;470 orderClassName = CLASS_NAME_NEXT;471 eventDirectionName = DIRECTION_LEFT;472 } else {473 directionalClassName = CLASS_NAME_RIGHT;474 orderClassName = CLASS_NAME_PREV;475 eventDirectionName = DIRECTION_RIGHT;476 }477 478 if (nextElement && $__default["default"](nextElement).hasClass(CLASS_NAME_ACTIVE)) {479 this._isSliding = false;480 return;481 }482 483 var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);484 485 if (slideEvent.isDefaultPrevented()) {486 return;487 }488 489 if (!activeElement || !nextElement) {490 // Some weirdness is happening, so we bail491 return;492 }493 494 this._isSliding = true;495 496 if (isCycling) {497 this.pause();498 }499 500 this._setActiveIndicatorElement(nextElement);501 502 this._activeElement = nextElement;503 var slidEvent = $__default["default"].Event(EVENT_SLID, {504 relatedTarget: nextElement,505 direction: eventDirectionName,506 from: activeElementIndex,507 to: nextElementIndex508 });509 510 if ($__default["default"](this._element).hasClass(CLASS_NAME_SLIDE)) {511 $__default["default"](nextElement).addClass(orderClassName);512 Util__default["default"].reflow(nextElement);513 $__default["default"](activeElement).addClass(directionalClassName);514 $__default["default"](nextElement).addClass(directionalClassName);515 var transitionDuration = Util__default["default"].getTransitionDurationFromElement(activeElement);516 $__default["default"](activeElement).one(Util__default["default"].TRANSITION_END, function () {517 $__default["default"](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE);518 $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE + " " + orderClassName + " " + directionalClassName);519 _this4._isSliding = false;520 setTimeout(function () {521 return $__default["default"](_this4._element).trigger(slidEvent);522 }, 0);523 }).emulateTransitionEnd(transitionDuration);524 } else {525 $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE);526 $__default["default"](nextElement).addClass(CLASS_NAME_ACTIVE);527 this._isSliding = false;528 $__default["default"](this._element).trigger(slidEvent);529 }530 531 if (isCycling) {532 this.cycle();533 }534 } // Static535 ;536 537 Carousel._jQueryInterface = function _jQueryInterface(config) {538 return this.each(function () {539 var data = $__default["default"](this).data(DATA_KEY);540 541 var _config = _extends({}, Default, $__default["default"](this).data());542 543 if (typeof config === 'object') {544 _config = _extends({}, _config, config);545 }546 547 var action = typeof config === 'string' ? config : _config.slide;548 549 if (!data) {550 data = new Carousel(this, _config);551 $__default["default"](this).data(DATA_KEY, data);552 }553 554 if (typeof config === 'number') {555 data.to(config);556 } else if (typeof action === 'string') {557 if (typeof data[action] === 'undefined') {558 throw new TypeError("No method named \"" + action + "\"");559 }560 561 data[action]();562 } else if (_config.interval && _config.ride) {563 data.pause();564 data.cycle();565 }566 });567 };568 569 Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {570 var selector = Util__default["default"].getSelectorFromElement(this);571 572 if (!selector) {573 return;574 }575 576 var target = $__default["default"](selector)[0];577 578 if (!target || !$__default["default"](target).hasClass(CLASS_NAME_CAROUSEL)) {579 return;580 }581 582 var config = _extends({}, $__default["default"](target).data(), $__default["default"](this).data());583 584 var slideIndex = this.getAttribute('data-slide-to');585 586 if (slideIndex) {587 config.interval = false;588 }589 590 Carousel._jQueryInterface.call($__default["default"](target), config);591 592 if (slideIndex) {593 $__default["default"](target).data(DATA_KEY).to(slideIndex);594 }595 596 event.preventDefault();597 };598 599 _createClass(Carousel, null, [{600 key: "VERSION",601 get: function get() {602 return VERSION;603 }604 }, {605 key: "Default",606 get: function get() {607 return Default;608 }609 }]);610 611 return Carousel;612 }();613 /**614 * Data API implementation615 */616 617 618 $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler);619 $__default["default"](window).on(EVENT_LOAD_DATA_API, function () {620 var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE));621 622 for (var i = 0, len = carousels.length; i < len; i++) {623 var $carousel = $__default["default"](carousels[i]);624 625 Carousel._jQueryInterface.call($carousel, $carousel.data());626 }627 });628 /**629 * jQuery630 */631 632 $__default["default"].fn[NAME] = Carousel._jQueryInterface;633 $__default["default"].fn[NAME].Constructor = Carousel;634 635 $__default["default"].fn[NAME].noConflict = function () {636 $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;637 return Carousel._jQueryInterface;638 };639 640 return Carousel;641 642}));643//# sourceMappingURL=carousel.js.map644 