UNPKG

react-slick

Version:
159 lines (131 loc) 4.91 kB
'use strict'; exports.__esModule = true; exports.Track = undefined; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _objectAssign = require('object-assign'); var _objectAssign2 = _interopRequireDefault(_objectAssign); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var getSlideClasses = function getSlideClasses(spec) { var slickActive, slickCenter, slickCloned; var centerOffset, index; if (spec.rtl) { index = spec.slideCount - 1 - spec.index; } else { index = spec.index; } slickCloned = index < 0 || index >= spec.slideCount; if (spec.centerMode) { centerOffset = Math.floor(spec.slidesToShow / 2); slickCenter = (index - spec.currentSlide) % spec.slideCount === 0; if (index > spec.currentSlide - centerOffset - 1 && index <= spec.currentSlide + centerOffset) { slickActive = true; } } else { slickActive = spec.currentSlide <= index && index < spec.currentSlide + spec.slidesToShow; } return (0, _classnames2.default)({ 'slick-slide': true, 'slick-active': slickActive, 'slick-center': slickCenter, 'slick-cloned': slickCloned }); }; var getSlideStyle = function getSlideStyle(spec) { var style = {}; if (spec.variableWidth === undefined || spec.variableWidth === false) { style.width = spec.slideWidth; } if (spec.fade) { style.position = 'relative'; style.left = -spec.index * spec.slideWidth; style.opacity = spec.currentSlide === spec.index ? 1 : 0; style.transition = 'opacity ' + spec.speed + 'ms ' + spec.cssEase; style.WebkitTransition = 'opacity ' + spec.speed + 'ms ' + spec.cssEase; } return style; }; var getKey = function getKey(child, fallbackKey) { // key could be a zero return child.key === null || child.key === undefined ? fallbackKey : child.key; }; var renderSlides = function renderSlides(spec) { var _this = this; var key; var slides = []; var preCloneSlides = []; var postCloneSlides = []; var count = _react2.default.Children.count(spec.children); var child; _react2.default.Children.forEach(spec.children, function (elem, index) { var childOnClickOptions = { message: 'children', index: index, slidesToScroll: spec.slidesToScroll, currentSlide: spec.currentSlide }; if (!spec.lazyLoad | (spec.lazyLoad && spec.lazyLoadedList.indexOf(index) >= 0)) { child = elem; } else { child = _react2.default.createElement('div', null); } var childStyle = getSlideStyle((0, _objectAssign2.default)({}, spec, { index: index })); var slickClasses = getSlideClasses((0, _objectAssign2.default)({ index: index }, spec)); var cssClasses; if (child.props.className) { cssClasses = (0, _classnames2.default)(slickClasses, child.props.className); } else { cssClasses = slickClasses; } slides.push(_react2.default.cloneElement(child, { key: 'original' + getKey(child, index), 'data-index': index, className: cssClasses, tabIndex: '-1', style: (0, _objectAssign2.default)({ outline: 'none' }, child.props.style || {}, childStyle), onClick: spec.focusOnSelect.bind(null, childOnClickOptions) })); // variableWidth doesn't wrap properly. if (spec.infinite && spec.fade === false) { var infiniteCount = spec.variableWidth ? spec.slidesToShow + 1 : spec.slidesToShow; if (index >= count - infiniteCount) { key = -(count - index); preCloneSlides.push(_react2.default.cloneElement(child, { key: 'precloned' + getKey(child, key), 'data-index': key, className: cssClasses, style: (0, _objectAssign2.default)({}, child.props.style || {}, childStyle), onClick: _this.props.focusOnSelect.bind(null, childOnClickOptions) })); } if (index < infiniteCount) { key = count + index; postCloneSlides.push(_react2.default.cloneElement(child, { key: 'postcloned' + getKey(child, key), 'data-index': key, className: cssClasses, style: (0, _objectAssign2.default)({}, child.props.style || {}, childStyle), onClick: _this.props.focusOnSelect.bind(null, childOnClickOptions) })); } } }); if (spec.rtl) { return preCloneSlides.concat(slides, postCloneSlides).reverse(); } else { return preCloneSlides.concat(slides, postCloneSlides); } }; var Track = exports.Track = _react2.default.createClass({ displayName: 'Track', render: function render() { var slides = renderSlides.call(this, this.props); return _react2.default.createElement( 'div', { className: 'slick-track', style: this.props.trackStyle }, slides ); } });