innerSliderUtils.js 28 KB

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