track.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  10. var _propsUtil = require("../_util/props-util");
  11. var _innerSliderUtils = require("./utils/innerSliderUtils");
  12. var _vnode = require("../_util/vnode");
  13. // given specifications/props for a slide, fetch all the classes that need to be applied to the slide
  14. const getSlideClasses = spec => {
  15. let slickActive, slickCenter;
  16. let centerOffset, index;
  17. if (spec.rtl) {
  18. index = spec.slideCount - 1 - spec.index;
  19. } else {
  20. index = spec.index;
  21. }
  22. const slickCloned = index < 0 || index >= spec.slideCount;
  23. if (spec.centerMode) {
  24. centerOffset = Math.floor(spec.slidesToShow / 2);
  25. slickCenter = (index - spec.currentSlide) % spec.slideCount === 0;
  26. if (index > spec.currentSlide - centerOffset - 1 && index <= spec.currentSlide + centerOffset) {
  27. slickActive = true;
  28. }
  29. } else {
  30. slickActive = spec.currentSlide <= index && index < spec.currentSlide + spec.slidesToShow;
  31. }
  32. let focusedSlide;
  33. if (spec.targetSlide < 0) {
  34. focusedSlide = spec.targetSlide + spec.slideCount;
  35. } else if (spec.targetSlide >= spec.slideCount) {
  36. focusedSlide = spec.targetSlide - spec.slideCount;
  37. } else {
  38. focusedSlide = spec.targetSlide;
  39. }
  40. const slickCurrent = index === focusedSlide;
  41. return {
  42. 'slick-slide': true,
  43. 'slick-active': slickActive,
  44. 'slick-center': slickCenter,
  45. 'slick-cloned': slickCloned,
  46. 'slick-current': slickCurrent // dubious in case of RTL
  47. };
  48. };
  49. const getSlideStyle = function (spec) {
  50. const style = {};
  51. if (spec.variableWidth === undefined || spec.variableWidth === false) {
  52. style.width = spec.slideWidth + (typeof spec.slideWidth === 'number' ? 'px' : '');
  53. }
  54. if (spec.fade) {
  55. style.position = 'relative';
  56. if (spec.vertical) {
  57. style.top = -spec.index * parseInt(spec.slideHeight) + 'px';
  58. } else {
  59. style.left = -spec.index * parseInt(spec.slideWidth) + 'px';
  60. }
  61. style.opacity = spec.currentSlide === spec.index ? 1 : 0;
  62. if (spec.useCSS) {
  63. style.transition = 'opacity ' + spec.speed + 'ms ' + spec.cssEase + ', ' + 'visibility ' + spec.speed + 'ms ' + spec.cssEase;
  64. }
  65. }
  66. return style;
  67. };
  68. const getKey = (child, fallbackKey) => child.key + '-' + fallbackKey;
  69. const renderSlides = function (spec, children) {
  70. let key;
  71. const slides = [];
  72. const preCloneSlides = [];
  73. const postCloneSlides = [];
  74. const childrenCount = children.length;
  75. const startIndex = (0, _innerSliderUtils.lazyStartIndex)(spec);
  76. const endIndex = (0, _innerSliderUtils.lazyEndIndex)(spec);
  77. children.forEach((elem, index) => {
  78. let child;
  79. const childOnClickOptions = {
  80. message: 'children',
  81. index,
  82. slidesToScroll: spec.slidesToScroll,
  83. currentSlide: spec.currentSlide
  84. };
  85. // in case of lazyLoad, whether or not we want to fetch the slide
  86. if (!spec.lazyLoad || spec.lazyLoad && spec.lazyLoadedList.indexOf(index) >= 0) {
  87. child = elem;
  88. } else {
  89. child = (0, _vue.createVNode)('div');
  90. }
  91. const childStyle = getSlideStyle((0, _extends2.default)((0, _extends2.default)({}, spec), {
  92. index
  93. }));
  94. const slideClass = child.props.class || '';
  95. let slideClasses = getSlideClasses((0, _extends2.default)((0, _extends2.default)({}, spec), {
  96. index
  97. }));
  98. // push a cloned element of the desired slide
  99. slides.push((0, _vnode.deepCloneElement)(child, {
  100. key: 'original' + getKey(child, index),
  101. tabindex: '-1',
  102. 'data-index': index,
  103. 'aria-hidden': !slideClasses['slick-active'],
  104. class: (0, _classNames.default)(slideClasses, slideClass),
  105. style: (0, _extends2.default)((0, _extends2.default)({
  106. outline: 'none'
  107. }, child.props.style || {}), childStyle),
  108. onClick: () => {
  109. // child.props && child.props.onClick && child.props.onClick(e)
  110. if (spec.focusOnSelect) {
  111. spec.focusOnSelect(childOnClickOptions);
  112. }
  113. }
  114. }));
  115. // if slide needs to be precloned or postcloned
  116. if (spec.infinite && spec.fade === false) {
  117. const preCloneNo = childrenCount - index;
  118. if (preCloneNo <= (0, _innerSliderUtils.getPreClones)(spec) && childrenCount !== spec.slidesToShow) {
  119. key = -preCloneNo;
  120. if (key >= startIndex) {
  121. child = elem;
  122. }
  123. slideClasses = getSlideClasses((0, _extends2.default)((0, _extends2.default)({}, spec), {
  124. index: key
  125. }));
  126. preCloneSlides.push((0, _vnode.deepCloneElement)(child, {
  127. key: 'precloned' + getKey(child, key),
  128. class: (0, _classNames.default)(slideClasses, slideClass),
  129. tabindex: '-1',
  130. 'data-index': key,
  131. 'aria-hidden': !slideClasses['slick-active'],
  132. style: (0, _extends2.default)((0, _extends2.default)({}, child.props.style || {}), childStyle),
  133. onClick: () => {
  134. // child.props && child.props.onClick && child.props.onClick(e)
  135. if (spec.focusOnSelect) {
  136. spec.focusOnSelect(childOnClickOptions);
  137. }
  138. }
  139. }));
  140. }
  141. if (childrenCount !== spec.slidesToShow) {
  142. key = childrenCount + index;
  143. if (key < endIndex) {
  144. child = elem;
  145. }
  146. slideClasses = getSlideClasses((0, _extends2.default)((0, _extends2.default)({}, spec), {
  147. index: key
  148. }));
  149. postCloneSlides.push((0, _vnode.deepCloneElement)(child, {
  150. key: 'postcloned' + getKey(child, key),
  151. tabindex: '-1',
  152. 'data-index': key,
  153. 'aria-hidden': !slideClasses['slick-active'],
  154. class: (0, _classNames.default)(slideClasses, slideClass),
  155. style: (0, _extends2.default)((0, _extends2.default)({}, child.props.style || {}), childStyle),
  156. onClick: () => {
  157. // child.props && child.props.onClick && child.props.onClick(e)
  158. if (spec.focusOnSelect) {
  159. spec.focusOnSelect(childOnClickOptions);
  160. }
  161. }
  162. }));
  163. }
  164. }
  165. });
  166. if (spec.rtl) {
  167. return preCloneSlides.concat(slides, postCloneSlides).reverse();
  168. } else {
  169. return preCloneSlides.concat(slides, postCloneSlides);
  170. }
  171. };
  172. const Track = (_, _ref) => {
  173. let {
  174. attrs,
  175. slots
  176. } = _ref;
  177. const slides = renderSlides(attrs, (0, _propsUtil.flattenChildren)(slots === null || slots === void 0 ? void 0 : slots.default()));
  178. // const slides = renderSlides(attrs, slots?.default);
  179. const {
  180. onMouseenter,
  181. onMouseover,
  182. onMouseleave
  183. } = attrs;
  184. const mouseEvents = {
  185. onMouseenter,
  186. onMouseover,
  187. onMouseleave
  188. };
  189. const trackProps = (0, _extends2.default)({
  190. class: 'slick-track',
  191. style: attrs.trackStyle
  192. }, mouseEvents);
  193. return (0, _vue.createVNode)("div", trackProps, [slides]);
  194. };
  195. Track.inheritAttrs = false;
  196. var _default = exports.default = Track;