innerSliderUtils.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.checkSpecKeys = exports.checkNavigable = exports.changeSlide = exports.canUseDOM = exports.canGoNext = void 0;
  7. exports.clamp = clamp;
  8. exports.swipeStart = exports.swipeMove = exports.swipeEnd = exports.slidesOnRight = exports.slidesOnLeft = exports.slideHandler = exports.siblingDirection = exports.safePreventDefault = exports.lazyStartIndex = exports.lazySlidesOnRight = exports.lazySlidesOnLeft = exports.lazyEndIndex = exports.keyHandler = exports.initializedState = exports.getWidth = exports.getTrackLeft = exports.getTrackCSS = exports.getTrackAnimateCSS = exports.getTotalSlides = exports.getSwipeDirection = exports.getSlideCount = exports.getRequiredLazySlides = exports.getPreClones = exports.getPostClones = exports.getOnDemandLazySlides = exports.getNavigableIndexes = exports.getHeight = exports.extractObject = void 0;
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. // import supportsPassive from '../../../_util/supportsPassive';
  11. function clamp(number, lowerBound, upperBound) {
  12. return Math.max(lowerBound, Math.min(number, upperBound));
  13. }
  14. var safePreventDefault = function safePreventDefault(event) {
  15. var passiveEvents = ['touchstart', 'touchmove', 'wheel'];
  16. if (!passiveEvents.includes(event.type)) {
  17. event.preventDefault();
  18. }
  19. };
  20. exports.safePreventDefault = safePreventDefault;
  21. var getOnDemandLazySlides = function getOnDemandLazySlides(spec) {
  22. var onDemandSlides = [];
  23. var startIndex = lazyStartIndex(spec);
  24. var endIndex = lazyEndIndex(spec);
  25. for (var slideIndex = startIndex; slideIndex < endIndex; slideIndex++) {
  26. if (spec.lazyLoadedList.indexOf(slideIndex) < 0) {
  27. onDemandSlides.push(slideIndex);
  28. }
  29. }
  30. return onDemandSlides;
  31. };
  32. // return list of slides that need to be present
  33. exports.getOnDemandLazySlides = getOnDemandLazySlides;
  34. var getRequiredLazySlides = function getRequiredLazySlides(spec) {
  35. var requiredSlides = [];
  36. var startIndex = lazyStartIndex(spec);
  37. var endIndex = lazyEndIndex(spec);
  38. for (var slideIndex = startIndex; slideIndex < endIndex; slideIndex++) {
  39. requiredSlides.push(slideIndex);
  40. }
  41. return requiredSlides;
  42. };
  43. // startIndex that needs to be present
  44. exports.getRequiredLazySlides = getRequiredLazySlides;
  45. var lazyStartIndex = function lazyStartIndex(spec) {
  46. return spec.currentSlide - lazySlidesOnLeft(spec);
  47. };
  48. exports.lazyStartIndex = lazyStartIndex;
  49. var lazyEndIndex = function lazyEndIndex(spec) {
  50. return spec.currentSlide + lazySlidesOnRight(spec);
  51. };
  52. exports.lazyEndIndex = lazyEndIndex;
  53. var lazySlidesOnLeft = function lazySlidesOnLeft(spec) {
  54. return spec.centerMode ? Math.floor(spec.slidesToShow / 2) + (parseInt(spec.centerPadding) > 0 ? 1 : 0) : 0;
  55. };
  56. exports.lazySlidesOnLeft = lazySlidesOnLeft;
  57. var lazySlidesOnRight = function lazySlidesOnRight(spec) {
  58. return spec.centerMode ? Math.floor((spec.slidesToShow - 1) / 2) + 1 + (parseInt(spec.centerPadding) > 0 ? 1 : 0) : spec.slidesToShow;
  59. };
  60. // get width of an element
  61. exports.lazySlidesOnRight = lazySlidesOnRight;
  62. var getWidth = function getWidth(elem) {
  63. return elem && elem.offsetWidth || 0;
  64. };
  65. exports.getWidth = getWidth;
  66. var getHeight = function getHeight(elem) {
  67. return elem && elem.offsetHeight || 0;
  68. };
  69. exports.getHeight = getHeight;
  70. var getSwipeDirection = function getSwipeDirection(touchObject) {
  71. var verticalSwiping = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  72. var swipeAngle;
  73. var xDist = touchObject.startX - touchObject.curX;
  74. var yDist = touchObject.startY - touchObject.curY;
  75. var r = Math.atan2(yDist, xDist);
  76. swipeAngle = Math.round(r * 180 / Math.PI);
  77. if (swipeAngle < 0) {
  78. swipeAngle = 360 - Math.abs(swipeAngle);
  79. }
  80. if (swipeAngle <= 45 && swipeAngle >= 0 || swipeAngle <= 360 && swipeAngle >= 315) {
  81. return 'left';
  82. }
  83. if (swipeAngle >= 135 && swipeAngle <= 225) {
  84. return 'right';
  85. }
  86. if (verticalSwiping === true) {
  87. if (swipeAngle >= 35 && swipeAngle <= 135) {
  88. return 'up';
  89. } else {
  90. return 'down';
  91. }
  92. }
  93. return 'vertical';
  94. };
  95. // whether or not we can go next
  96. exports.getSwipeDirection = getSwipeDirection;
  97. var canGoNext = function canGoNext(spec) {
  98. var canGo = true;
  99. if (!spec.infinite) {
  100. if (spec.centerMode && spec.currentSlide >= spec.slideCount - 1) {
  101. canGo = false;
  102. } else if (spec.slideCount <= spec.slidesToShow || spec.currentSlide >= spec.slideCount - spec.slidesToShow) {
  103. canGo = false;
  104. }
  105. }
  106. return canGo;
  107. };
  108. // given an object and a list of keys, return new object with given keys
  109. exports.canGoNext = canGoNext;
  110. var extractObject = function extractObject(spec, keys) {
  111. var newObject = {};
  112. keys.forEach(function (key) {
  113. return newObject[key] = spec[key];
  114. });
  115. return newObject;
  116. };
  117. // get initialized state
  118. exports.extractObject = extractObject;
  119. var initializedState = function initializedState(spec) {
  120. // spec also contains listRef, trackRef
  121. var slideCount = spec.children.length;
  122. var listNode = spec.listRef;
  123. var listWidth = Math.ceil(getWidth(listNode));
  124. var trackNode = spec.trackRef;
  125. var trackWidth = Math.ceil(getWidth(trackNode));
  126. var slideWidth;
  127. if (!spec.vertical) {
  128. var centerPaddingAdj = spec.centerMode && parseInt(spec.centerPadding) * 2;
  129. if (typeof spec.centerPadding === 'string' && spec.centerPadding.slice(-1) === '%') {
  130. centerPaddingAdj *= listWidth / 100;
  131. }
  132. slideWidth = Math.ceil((listWidth - centerPaddingAdj) / spec.slidesToShow);
  133. } else {
  134. slideWidth = listWidth;
  135. }
  136. var slideHeight = listNode && getHeight(listNode.querySelector('[data-index="0"]'));
  137. var listHeight = slideHeight * spec.slidesToShow;
  138. var currentSlide = spec.currentSlide === undefined ? spec.initialSlide : spec.currentSlide;
  139. if (spec.rtl && spec.currentSlide === undefined) {
  140. currentSlide = slideCount - 1 - spec.initialSlide;
  141. }
  142. var lazyLoadedList = spec.lazyLoadedList || [];
  143. var slidesToLoad = getOnDemandLazySlides((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  144. currentSlide: currentSlide,
  145. lazyLoadedList: lazyLoadedList
  146. }), spec);
  147. lazyLoadedList = lazyLoadedList.concat(slidesToLoad);
  148. var state = {
  149. slideCount: slideCount,
  150. slideWidth: slideWidth,
  151. listWidth: listWidth,
  152. trackWidth: trackWidth,
  153. currentSlide: currentSlide,
  154. slideHeight: slideHeight,
  155. listHeight: listHeight,
  156. lazyLoadedList: lazyLoadedList
  157. };
  158. if (spec.autoplaying === null && spec.autoplay) {
  159. state['autoplaying'] = 'playing';
  160. }
  161. return state;
  162. };
  163. exports.initializedState = initializedState;
  164. var slideHandler = function slideHandler(spec) {
  165. var waitForAnimate = spec.waitForAnimate,
  166. animating = spec.animating,
  167. fade = spec.fade,
  168. infinite = spec.infinite,
  169. index = spec.index,
  170. slideCount = spec.slideCount,
  171. lazyLoad = spec.lazyLoad,
  172. currentSlide = spec.currentSlide,
  173. centerMode = spec.centerMode,
  174. slidesToScroll = spec.slidesToScroll,
  175. slidesToShow = spec.slidesToShow,
  176. useCSS = spec.useCSS;
  177. var lazyLoadedList = spec.lazyLoadedList;
  178. if (waitForAnimate && animating) return {};
  179. var animationSlide = index;
  180. var finalSlide;
  181. var animationLeft;
  182. var finalLeft;
  183. var state = {};
  184. var nextState = {};
  185. var targetSlide = infinite ? index : clamp(index, 0, slideCount - 1);
  186. if (fade) {
  187. if (!infinite && (index < 0 || index >= slideCount)) return {};
  188. if (index < 0) {
  189. animationSlide = index + slideCount;
  190. } else if (index >= slideCount) {
  191. animationSlide = index - slideCount;
  192. }
  193. if (lazyLoad && lazyLoadedList.indexOf(animationSlide) < 0) {
  194. lazyLoadedList = lazyLoadedList.concat(animationSlide);
  195. }
  196. state = {
  197. animating: true,
  198. currentSlide: animationSlide,
  199. lazyLoadedList: lazyLoadedList,
  200. targetSlide: animationSlide
  201. };
  202. nextState = {
  203. animating: false,
  204. targetSlide: animationSlide
  205. };
  206. } else {
  207. finalSlide = animationSlide;
  208. if (animationSlide < 0) {
  209. finalSlide = animationSlide + slideCount;
  210. if (!infinite) finalSlide = 0;else if (slideCount % slidesToScroll !== 0) {
  211. finalSlide = slideCount - slideCount % slidesToScroll;
  212. }
  213. } else if (!canGoNext(spec) && animationSlide > currentSlide) {
  214. animationSlide = finalSlide = currentSlide;
  215. } else if (centerMode && animationSlide >= slideCount) {
  216. animationSlide = infinite ? slideCount : slideCount - 1;
  217. finalSlide = infinite ? 0 : slideCount - 1;
  218. } else if (animationSlide >= slideCount) {
  219. finalSlide = animationSlide - slideCount;
  220. if (!infinite) finalSlide = slideCount - slidesToShow;else if (slideCount % slidesToScroll !== 0) finalSlide = 0;
  221. }
  222. if (!infinite && animationSlide + slidesToShow >= slideCount) {
  223. finalSlide = slideCount - slidesToShow;
  224. }
  225. animationLeft = getTrackLeft((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  226. slideIndex: animationSlide
  227. }));
  228. finalLeft = getTrackLeft((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  229. slideIndex: finalSlide
  230. }));
  231. if (!infinite) {
  232. if (animationLeft === finalLeft) animationSlide = finalSlide;
  233. animationLeft = finalLeft;
  234. }
  235. if (lazyLoad) {
  236. lazyLoadedList = lazyLoadedList.concat(getOnDemandLazySlides((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  237. currentSlide: animationSlide
  238. })));
  239. }
  240. if (!useCSS) {
  241. state = {
  242. currentSlide: finalSlide,
  243. trackStyle: getTrackCSS((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  244. left: finalLeft
  245. })),
  246. lazyLoadedList: lazyLoadedList,
  247. targetSlide: targetSlide
  248. };
  249. } else {
  250. state = {
  251. animating: true,
  252. currentSlide: finalSlide,
  253. trackStyle: getTrackAnimateCSS((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  254. left: animationLeft
  255. })),
  256. lazyLoadedList: lazyLoadedList,
  257. targetSlide: targetSlide
  258. };
  259. nextState = {
  260. animating: false,
  261. currentSlide: finalSlide,
  262. trackStyle: getTrackCSS((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  263. left: finalLeft
  264. })),
  265. swipeLeft: null,
  266. targetSlide: targetSlide
  267. };
  268. }
  269. }
  270. return {
  271. state: state,
  272. nextState: nextState
  273. };
  274. };
  275. exports.slideHandler = slideHandler;
  276. var changeSlide = function changeSlide(spec, options) {
  277. var previousInt, slideOffset, targetSlide;
  278. var slidesToScroll = spec.slidesToScroll,
  279. slidesToShow = spec.slidesToShow,
  280. slideCount = spec.slideCount,
  281. currentSlide = spec.currentSlide,
  282. previousTargetSlide = spec.targetSlide,
  283. lazyLoad = spec.lazyLoad,
  284. infinite = spec.infinite;
  285. var unevenOffset = slideCount % slidesToScroll !== 0;
  286. var indexOffset = unevenOffset ? 0 : (slideCount - currentSlide) % slidesToScroll;
  287. if (options.message === 'previous') {
  288. slideOffset = indexOffset === 0 ? slidesToScroll : slidesToShow - indexOffset;
  289. targetSlide = currentSlide - slideOffset;
  290. if (lazyLoad && !infinite) {
  291. previousInt = currentSlide - slideOffset;
  292. targetSlide = previousInt === -1 ? slideCount - 1 : previousInt;
  293. }
  294. if (!infinite) {
  295. targetSlide = previousTargetSlide - slidesToScroll;
  296. }
  297. } else if (options.message === 'next') {
  298. slideOffset = indexOffset === 0 ? slidesToScroll : indexOffset;
  299. targetSlide = currentSlide + slideOffset;
  300. if (lazyLoad && !infinite) {
  301. targetSlide = (currentSlide + slidesToScroll) % slideCount + indexOffset;
  302. }
  303. if (!infinite) {
  304. targetSlide = previousTargetSlide + slidesToScroll;
  305. }
  306. } else if (options.message === 'dots') {
  307. // Click on dots
  308. targetSlide = options.index * options.slidesToScroll;
  309. } else if (options.message === 'children') {
  310. // Click on the slides
  311. targetSlide = options.index;
  312. if (infinite) {
  313. var direction = siblingDirection((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  314. targetSlide: targetSlide
  315. }));
  316. if (targetSlide > options.currentSlide && direction === 'left') {
  317. targetSlide = targetSlide - slideCount;
  318. } else if (targetSlide < options.currentSlide && direction === 'right') {
  319. targetSlide = targetSlide + slideCount;
  320. }
  321. }
  322. } else if (options.message === 'index') {
  323. targetSlide = Number(options.index);
  324. }
  325. return targetSlide;
  326. };
  327. exports.changeSlide = changeSlide;
  328. var keyHandler = function keyHandler(e, accessibility, rtl) {
  329. if (e.target.tagName.match('TEXTAREA|INPUT|SELECT') || !accessibility) {
  330. return '';
  331. }
  332. if (e.keyCode === 37) return rtl ? 'next' : 'previous';
  333. if (e.keyCode === 39) return rtl ? 'previous' : 'next';
  334. return '';
  335. };
  336. exports.keyHandler = keyHandler;
  337. var swipeStart = function swipeStart(e, swipe, draggable) {
  338. e.target.tagName === 'IMG' && safePreventDefault(e);
  339. if (!swipe || !draggable && e.type.indexOf('mouse') !== -1) return '';
  340. return {
  341. dragging: true,
  342. touchObject: {
  343. startX: e.touches ? e.touches[0].pageX : e.clientX,
  344. startY: e.touches ? e.touches[0].pageY : e.clientY,
  345. curX: e.touches ? e.touches[0].pageX : e.clientX,
  346. curY: e.touches ? e.touches[0].pageY : e.clientY
  347. }
  348. };
  349. };
  350. exports.swipeStart = swipeStart;
  351. var swipeMove = function swipeMove(e, spec) {
  352. // spec also contains, trackRef and slideIndex
  353. var scrolling = spec.scrolling,
  354. animating = spec.animating,
  355. vertical = spec.vertical,
  356. swipeToSlide = spec.swipeToSlide,
  357. verticalSwiping = spec.verticalSwiping,
  358. rtl = spec.rtl,
  359. currentSlide = spec.currentSlide,
  360. edgeFriction = spec.edgeFriction,
  361. edgeDragged = spec.edgeDragged,
  362. onEdge = spec.onEdge,
  363. swiped = spec.swiped,
  364. swiping = spec.swiping,
  365. slideCount = spec.slideCount,
  366. slidesToScroll = spec.slidesToScroll,
  367. infinite = spec.infinite,
  368. touchObject = spec.touchObject,
  369. swipeEvent = spec.swipeEvent,
  370. listHeight = spec.listHeight,
  371. listWidth = spec.listWidth;
  372. if (scrolling) return;
  373. if (animating) return safePreventDefault(e);
  374. if (vertical && swipeToSlide && verticalSwiping) safePreventDefault(e);
  375. var swipeLeft;
  376. var state = {};
  377. var curLeft = getTrackLeft(spec);
  378. touchObject.curX = e.touches ? e.touches[0].pageX : e.clientX;
  379. touchObject.curY = e.touches ? e.touches[0].pageY : e.clientY;
  380. touchObject.swipeLength = Math.round(Math.sqrt(Math.pow(touchObject.curX - touchObject.startX, 2)));
  381. var verticalSwipeLength = Math.round(Math.sqrt(Math.pow(touchObject.curY - touchObject.startY, 2)));
  382. if (!verticalSwiping && !swiping && verticalSwipeLength > 10) {
  383. return {
  384. scrolling: true
  385. };
  386. }
  387. if (verticalSwiping) touchObject.swipeLength = verticalSwipeLength;
  388. var positionOffset = (!rtl ? 1 : -1) * (touchObject.curX > touchObject.startX ? 1 : -1);
  389. if (verticalSwiping) {
  390. positionOffset = touchObject.curY > touchObject.startY ? 1 : -1;
  391. }
  392. var dotCount = Math.ceil(slideCount / slidesToScroll);
  393. var swipeDirection = getSwipeDirection(spec.touchObject, verticalSwiping);
  394. var touchSwipeLength = touchObject.swipeLength;
  395. if (!infinite) {
  396. if (currentSlide === 0 && (swipeDirection === 'right' || swipeDirection === 'down') || currentSlide + 1 >= dotCount && (swipeDirection === 'left' || swipeDirection === 'up') || !canGoNext(spec) && (swipeDirection === 'left' || swipeDirection === 'up')) {
  397. touchSwipeLength = touchObject.swipeLength * edgeFriction;
  398. if (edgeDragged === false && onEdge) {
  399. onEdge(swipeDirection);
  400. state['edgeDragged'] = true;
  401. }
  402. }
  403. }
  404. if (!swiped && swipeEvent) {
  405. swipeEvent(swipeDirection);
  406. state['swiped'] = true;
  407. }
  408. if (!vertical) {
  409. if (!rtl) {
  410. swipeLeft = curLeft + touchSwipeLength * positionOffset;
  411. } else {
  412. swipeLeft = curLeft - touchSwipeLength * positionOffset;
  413. }
  414. } else {
  415. swipeLeft = curLeft + touchSwipeLength * (listHeight / listWidth) * positionOffset;
  416. }
  417. if (verticalSwiping) {
  418. swipeLeft = curLeft + touchSwipeLength * positionOffset;
  419. }
  420. state = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, state), {}, {
  421. touchObject: touchObject,
  422. swipeLeft: swipeLeft,
  423. trackStyle: getTrackCSS((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  424. left: swipeLeft
  425. }))
  426. });
  427. if (Math.abs(touchObject.curX - touchObject.startX) < Math.abs(touchObject.curY - touchObject.startY) * 0.8) {
  428. return state;
  429. }
  430. if (touchObject.swipeLength > 10) {
  431. state['swiping'] = true;
  432. safePreventDefault(e);
  433. }
  434. return state;
  435. };
  436. exports.swipeMove = swipeMove;
  437. var swipeEnd = function swipeEnd(e, spec) {
  438. var dragging = spec.dragging,
  439. swipe = spec.swipe,
  440. touchObject = spec.touchObject,
  441. listWidth = spec.listWidth,
  442. touchThreshold = spec.touchThreshold,
  443. verticalSwiping = spec.verticalSwiping,
  444. listHeight = spec.listHeight,
  445. swipeToSlide = spec.swipeToSlide,
  446. scrolling = spec.scrolling,
  447. onSwipe = spec.onSwipe,
  448. targetSlide = spec.targetSlide,
  449. currentSlide = spec.currentSlide,
  450. infinite = spec.infinite;
  451. if (!dragging) {
  452. if (swipe) safePreventDefault(e);
  453. return {};
  454. }
  455. var minSwipe = verticalSwiping ? listHeight / touchThreshold : listWidth / touchThreshold;
  456. var swipeDirection = getSwipeDirection(touchObject, verticalSwiping);
  457. // reset the state of touch related state variables.
  458. var state = {
  459. dragging: false,
  460. edgeDragged: false,
  461. scrolling: false,
  462. swiping: false,
  463. swiped: false,
  464. swipeLeft: null,
  465. touchObject: {}
  466. };
  467. if (scrolling) {
  468. return state;
  469. }
  470. if (!touchObject.swipeLength) {
  471. return state;
  472. }
  473. if (touchObject.swipeLength > minSwipe) {
  474. safePreventDefault(e);
  475. if (onSwipe) {
  476. onSwipe(swipeDirection);
  477. }
  478. var slideCount, newSlide;
  479. var activeSlide = infinite ? currentSlide : targetSlide;
  480. switch (swipeDirection) {
  481. case 'left':
  482. case 'up':
  483. newSlide = activeSlide + getSlideCount(spec);
  484. slideCount = swipeToSlide ? checkNavigable(spec, newSlide) : newSlide;
  485. state['currentDirection'] = 0;
  486. break;
  487. case 'right':
  488. case 'down':
  489. newSlide = activeSlide - getSlideCount(spec);
  490. slideCount = swipeToSlide ? checkNavigable(spec, newSlide) : newSlide;
  491. state['currentDirection'] = 1;
  492. break;
  493. default:
  494. slideCount = activeSlide;
  495. }
  496. state['triggerSlideHandler'] = slideCount;
  497. } else {
  498. // Adjust the track back to it's original position.
  499. var currentLeft = getTrackLeft(spec);
  500. state['trackStyle'] = getTrackAnimateCSS((0, _objectSpread2.default)((0, _objectSpread2.default)({}, spec), {}, {
  501. left: currentLeft
  502. }));
  503. }
  504. return state;
  505. };
  506. exports.swipeEnd = swipeEnd;
  507. var getNavigableIndexes = function getNavigableIndexes(spec) {
  508. var max = spec.infinite ? spec.slideCount * 2 : spec.slideCount;
  509. var breakpoint = spec.infinite ? spec.slidesToShow * -1 : 0;
  510. var counter = spec.infinite ? spec.slidesToShow * -1 : 0;
  511. var indexes = [];
  512. while (breakpoint < max) {
  513. indexes.push(breakpoint);
  514. breakpoint = counter + spec.slidesToScroll;
  515. counter += Math.min(spec.slidesToScroll, spec.slidesToShow);
  516. }
  517. return indexes;
  518. };
  519. exports.getNavigableIndexes = getNavigableIndexes;
  520. var checkNavigable = function checkNavigable(spec, index) {
  521. var navigables = getNavigableIndexes(spec);
  522. var prevNavigable = 0;
  523. if (index > navigables[navigables.length - 1]) {
  524. index = navigables[navigables.length - 1];
  525. } else {
  526. for (var n in navigables) {
  527. if (index < navigables[n]) {
  528. index = prevNavigable;
  529. break;
  530. }
  531. prevNavigable = navigables[n];
  532. }
  533. }
  534. return index;
  535. };
  536. exports.checkNavigable = checkNavigable;
  537. var getSlideCount = function getSlideCount(spec) {
  538. var centerOffset = spec.centerMode ? spec.slideWidth * Math.floor(spec.slidesToShow / 2) : 0;
  539. if (spec.swipeToSlide) {
  540. var swipedSlide;
  541. var slickList = spec.listRef;
  542. var slides = slickList.querySelectorAll && slickList.querySelectorAll('.slick-slide') || [];
  543. Array.from(slides).every(function (slide) {
  544. if (!spec.vertical) {
  545. if (slide.offsetLeft - centerOffset + getWidth(slide) / 2 > spec.swipeLeft * -1) {
  546. swipedSlide = slide;
  547. return false;
  548. }
  549. } else {
  550. if (slide.offsetTop + getHeight(slide) / 2 > spec.swipeLeft * -1) {
  551. swipedSlide = slide;
  552. return false;
  553. }
  554. }
  555. return true;
  556. });
  557. if (!swipedSlide) {
  558. return 0;
  559. }
  560. var currentIndex = spec.rtl === true ? spec.slideCount - spec.currentSlide : spec.currentSlide;
  561. var slidesTraversed = Math.abs(swipedSlide.dataset.index - currentIndex) || 1;
  562. return slidesTraversed;
  563. } else {
  564. return spec.slidesToScroll;
  565. }
  566. };
  567. exports.getSlideCount = getSlideCount;
  568. var checkSpecKeys = function checkSpecKeys(spec, keysArray) {
  569. return keysArray.reduce(function (value, key) {
  570. return value && spec.hasOwnProperty(key);
  571. }, true) ? null : console.error('Keys Missing:', spec);
  572. };
  573. exports.checkSpecKeys = checkSpecKeys;
  574. var getTrackCSS = function getTrackCSS(spec) {
  575. checkSpecKeys(spec, ['left', 'variableWidth', 'slideCount', 'slidesToShow', 'slideWidth']);
  576. var trackWidth, trackHeight;
  577. var trackChildren = spec.slideCount + 2 * spec.slidesToShow;
  578. if (!spec.vertical) {
  579. trackWidth = getTotalSlides(spec) * spec.slideWidth;
  580. } else {
  581. trackHeight = trackChildren * spec.slideHeight;
  582. }
  583. var style = {
  584. opacity: 1,
  585. transition: '',
  586. WebkitTransition: ''
  587. };
  588. if (spec.useTransform) {
  589. var WebkitTransform = !spec.vertical ? 'translate3d(' + spec.left + 'px, 0px, 0px)' : 'translate3d(0px, ' + spec.left + 'px, 0px)';
  590. var transform = !spec.vertical ? 'translate3d(' + spec.left + 'px, 0px, 0px)' : 'translate3d(0px, ' + spec.left + 'px, 0px)';
  591. var msTransform = !spec.vertical ? 'translateX(' + spec.left + 'px)' : 'translateY(' + spec.left + 'px)';
  592. style = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), {}, {
  593. WebkitTransform: WebkitTransform,
  594. transform: transform,
  595. msTransform: msTransform
  596. });
  597. } else {
  598. if (spec.vertical) {
  599. style['top'] = spec.left;
  600. } else {
  601. style['left'] = spec.left;
  602. }
  603. }
  604. if (spec.fade) style = {
  605. opacity: 1
  606. };
  607. if (trackWidth) style.width = trackWidth + 'px';
  608. if (trackHeight) style.height = trackHeight + 'px';
  609. // Fallback for IE8
  610. if (window && !window.addEventListener && window.attachEvent) {
  611. if (!spec.vertical) {
  612. style.marginLeft = spec.left + 'px';
  613. } else {
  614. style.marginTop = spec.left + 'px';
  615. }
  616. }
  617. return style;
  618. };
  619. exports.getTrackCSS = getTrackCSS;
  620. var getTrackAnimateCSS = function getTrackAnimateCSS(spec) {
  621. checkSpecKeys(spec, ['left', 'variableWidth', 'slideCount', 'slidesToShow', 'slideWidth', 'speed', 'cssEase']);
  622. var style = getTrackCSS(spec);
  623. // useCSS is true by default so it can be undefined
  624. if (spec.useTransform) {
  625. style.WebkitTransition = '-webkit-transform ' + spec.speed + 'ms ' + spec.cssEase;
  626. style.transition = 'transform ' + spec.speed + 'ms ' + spec.cssEase;
  627. } else {
  628. if (spec.vertical) {
  629. style.transition = 'top ' + spec.speed + 'ms ' + spec.cssEase;
  630. } else {
  631. style.transition = 'left ' + spec.speed + 'ms ' + spec.cssEase;
  632. }
  633. }
  634. return style;
  635. };
  636. exports.getTrackAnimateCSS = getTrackAnimateCSS;
  637. var getTrackLeft = function getTrackLeft(spec) {
  638. if (spec.unslick) {
  639. return 0;
  640. }
  641. checkSpecKeys(spec, ['slideIndex', 'trackRef', 'infinite', 'centerMode', 'slideCount', 'slidesToShow', 'slidesToScroll', 'slideWidth', 'listWidth', 'variableWidth', 'slideHeight']);
  642. var slideIndex = spec.slideIndex,
  643. trackRef = spec.trackRef,
  644. infinite = spec.infinite,
  645. centerMode = spec.centerMode,
  646. slideCount = spec.slideCount,
  647. slidesToShow = spec.slidesToShow,
  648. slidesToScroll = spec.slidesToScroll,
  649. slideWidth = spec.slideWidth,
  650. listWidth = spec.listWidth,
  651. variableWidth = spec.variableWidth,
  652. slideHeight = spec.slideHeight,
  653. fade = spec.fade,
  654. vertical = spec.vertical;
  655. var slideOffset = 0;
  656. var targetLeft;
  657. var targetSlide;
  658. var verticalOffset = 0;
  659. if (fade || spec.slideCount === 1) {
  660. return 0;
  661. }
  662. var slidesToOffset = 0;
  663. if (infinite) {
  664. slidesToOffset = -getPreClones(spec); // bring active slide to the beginning of visual area
  665. // if next scroll doesn't have enough children, just reach till the end of original slides instead of shifting slidesToScroll children
  666. if (slideCount % slidesToScroll !== 0 && slideIndex + slidesToScroll > slideCount) {
  667. slidesToOffset = -(slideIndex > slideCount ? slidesToShow - (slideIndex - slideCount) : slideCount % slidesToScroll);
  668. }
  669. // shift current slide to center of the frame
  670. if (centerMode) {
  671. slidesToOffset += parseInt(slidesToShow / 2);
  672. }
  673. } else {
  674. if (slideCount % slidesToScroll !== 0 && slideIndex + slidesToScroll > slideCount) {
  675. slidesToOffset = slidesToShow - slideCount % slidesToScroll;
  676. }
  677. if (centerMode) {
  678. slidesToOffset = parseInt(slidesToShow / 2);
  679. }
  680. }
  681. slideOffset = slidesToOffset * slideWidth;
  682. verticalOffset = slidesToOffset * slideHeight;
  683. if (!vertical) {
  684. targetLeft = slideIndex * slideWidth * -1 + slideOffset;
  685. } else {
  686. targetLeft = slideIndex * slideHeight * -1 + verticalOffset;
  687. }
  688. if (variableWidth === true) {
  689. var targetSlideIndex;
  690. var trackElem = trackRef;
  691. targetSlideIndex = slideIndex + getPreClones(spec);
  692. targetSlide = trackElem && trackElem.childNodes[targetSlideIndex];
  693. targetLeft = targetSlide ? targetSlide.offsetLeft * -1 : 0;
  694. if (centerMode === true) {
  695. targetSlideIndex = infinite ? slideIndex + getPreClones(spec) : slideIndex;
  696. targetSlide = trackElem && trackElem.children[targetSlideIndex];
  697. targetLeft = 0;
  698. for (var slide = 0; slide < targetSlideIndex; slide++) {
  699. targetLeft -= trackElem && trackElem.children[slide] && trackElem.children[slide].offsetWidth;
  700. }
  701. targetLeft -= parseInt(spec.centerPadding);
  702. targetLeft += targetSlide && (listWidth - targetSlide.offsetWidth) / 2;
  703. }
  704. }
  705. return targetLeft;
  706. };
  707. exports.getTrackLeft = getTrackLeft;
  708. var getPreClones = function getPreClones(spec) {
  709. if (spec.unslick || !spec.infinite) {
  710. return 0;
  711. }
  712. if (spec.variableWidth) {
  713. return spec.slideCount;
  714. }
  715. return spec.slidesToShow + (spec.centerMode ? 1 : 0);
  716. };
  717. exports.getPreClones = getPreClones;
  718. var getPostClones = function getPostClones(spec) {
  719. if (spec.unslick || !spec.infinite) {
  720. return 0;
  721. }
  722. return spec.slideCount;
  723. };
  724. exports.getPostClones = getPostClones;
  725. var getTotalSlides = function getTotalSlides(spec) {
  726. return spec.slideCount === 1 ? 1 : getPreClones(spec) + spec.slideCount + getPostClones(spec);
  727. };
  728. exports.getTotalSlides = getTotalSlides;
  729. var siblingDirection = function siblingDirection(spec) {
  730. if (spec.targetSlide > spec.currentSlide) {
  731. if (spec.targetSlide > spec.currentSlide + slidesOnRight(spec)) {
  732. return 'left';
  733. }
  734. return 'right';
  735. } else {
  736. if (spec.targetSlide < spec.currentSlide - slidesOnLeft(spec)) {
  737. return 'right';
  738. }
  739. return 'left';
  740. }
  741. };
  742. exports.siblingDirection = siblingDirection;
  743. var slidesOnRight = function slidesOnRight(_ref) {
  744. var slidesToShow = _ref.slidesToShow,
  745. centerMode = _ref.centerMode,
  746. rtl = _ref.rtl,
  747. centerPadding = _ref.centerPadding;
  748. // returns no of slides on the right of active slide
  749. if (centerMode) {
  750. var right = (slidesToShow - 1) / 2 + 1;
  751. if (parseInt(centerPadding) > 0) right += 1;
  752. if (rtl && slidesToShow % 2 === 0) right += 1;
  753. return right;
  754. }
  755. if (rtl) {
  756. return 0;
  757. }
  758. return slidesToShow - 1;
  759. };
  760. exports.slidesOnRight = slidesOnRight;
  761. var slidesOnLeft = function slidesOnLeft(_ref2) {
  762. var slidesToShow = _ref2.slidesToShow,
  763. centerMode = _ref2.centerMode,
  764. rtl = _ref2.rtl,
  765. centerPadding = _ref2.centerPadding;
  766. // returns no of slides on the left of active slide
  767. if (centerMode) {
  768. var left = (slidesToShow - 1) / 2 + 1;
  769. if (parseInt(centerPadding) > 0) left += 1;
  770. if (!rtl && slidesToShow % 2 === 0) left += 1;
  771. return left;
  772. }
  773. if (rtl) {
  774. return slidesToShow - 1;
  775. }
  776. return 0;
  777. };
  778. exports.slidesOnLeft = slidesOnLeft;
  779. var canUseDOM = function canUseDOM() {
  780. return !!(typeof window !== 'undefined' && window.document && window.document.createElement);
  781. };
  782. exports.canUseDOM = canUseDOM;