backpack-ui
Version:
Lonely Planet's Components
192 lines (178 loc) • 4.13 kB
JSX
import React, { Component } from "react";
import PropTypes from "prop-types";
import radium, { Style } from "radium";
import Slider from "react-slick";
import colors from "../../styles/colors";
import mq from "../../styles/mq";
import zIndex from "../../styles/zIndex";
import { rgb } from "../../utils/color";
export const rules = {
".slick-dots": {
marginRight: "auto",
marginLeft: "auto",
height: "34px",
position: "absolute",
textAlign: "center",
right: 0,
left: 0,
bottom: "32px",
},
".slick-dots li": {
width: "12px",
},
".slick-dots li:first-of-type": {
marginLeft: 0,
},
".slick-track": {
position: "relative",
},
".slick-slide": {
zIndex: zIndex.default,
position: "relative !important",
width: "100%",
},
".slick-slide.slick-active": {
zIndex: zIndex.middle,
position: "relative !important",
},
".slick-slide img": {
maxWidth: "100px",
},
".slick-dots button:before": {
opacity: 1,
fontSize: "10px",
color: `rgba(${rgb(colors.bgPrimary)}, 0.37)`,
},
".slick-dots .slick-active button:before": {
opacity: 1,
color: `rgba(${rgb(colors.bgPrimary)}, 1)`,
},
".slick-prev": {
left: "52px",
zIndex: zIndex.middle + 1,
},
".slick-next": {
right: "52px",
zIndex: zIndex.middle + 1,
},
".slick-arrow:before": {
content: "",
display: "none",
},
".slick-slider": { display: "none" },
".slick-slider.slick-initialized,.slick-slide:first-child": { display: "block" },
".slick-cloned:first-of-type": {
display: "none !important",
},
};
const styles = {
slideContainer: {
overflowY: "hidden",
minHeight: "370px",
[`@media (min-width: ${mq.min[720]})`]: {
minHeight: "650px",
},
},
slide: {
width: "100%",
position: "absolute",
minHeight: "370px",
[`@media (min-width: ${mq.min[720]})`]: {
minHeight: "650px",
},
},
// REM units being used to match what is currently in rizz-next
isUnderGlobalHeader: {
marginTop: "-5rem",
[`@media (min-width: ${mq.min[720]})`]: {
marginTop: "-13rem",
},
},
};
class MastheadSlider extends Component {
constructor(props) {
super(props);
this.renderSlide = this.renderSlide.bind(this);
}
renderSlide(slide, index) {
return (
<div key={index} style={[styles.slide, { height: this.props.height }]}>{slide}</div>
);
}
render() {
const { slides, settings, customSettings, isUnderGlobalHeader } = this.props;
return (
<div
className="MastheadSlider"
style={[
styles.slideContainer,
isUnderGlobalHeader && styles.isUnderGlobalHeader,
{
height: this.props.height,
},
]}
>
<Style
scopeSelector=".MastheadSlider"
rules={
rules
}
/>
<Slider
{...settings}
{...customSettings}
>
{slides.map(this.renderSlide)}
</Slider>
</div>
);
}
}
MastheadSlider.propTypes = {
isUnderGlobalHeader: PropTypes.bool,
height: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
]),
slides: PropTypes.arrayOf(PropTypes.node),
settings: PropTypes.objectOf(PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.bool,
PropTypes.object,
PropTypes.array,
])),
customSettings: PropTypes.objectOf(PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.bool,
PropTypes.object,
])),
};
MastheadSlider.defaultProps = {
// React Slick settings
height: "100vh",
settings: {
dots: true,
dotsClass: "slick-dots container",
touchThreshold: 10,
pauseOnHover: false,
autoplaySpeed: 7000,
infinite: true,
speed: 250,
slidesToShow: 1,
slidesToScroll: 1,
fade: false,
cssEase: "linear",
arrows: true,
swipe: true,
responsive: [{
breakpoint: 720,
settings: {
arrows: false,
centerMode: false,
},
}],
},
};
export default radium(MastheadSlider);