react-grid-carousel
Version:
React resposive carousel component w/ grid layout
87 lines (79 loc) • 1.81 kB
JavaScript
import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'
const ButtonWrapper = styled.div`
@media screen and (max-width: ${({ mobileBreakpoint }) =>
mobileBreakpoint}px) {
display: none;
}
`
const Button = styled.span`
position: absolute;
top: calc(50% - 17.5px);
height: 35px;
width: 35px;
background: #fff;
border-radius: 50%;
box-shadow: 0 0 5px 0 #0009;
z-index: 10;
cursor: pointer;
font-size: 10px;
opacity: 0.6;
transition: opacity 0.25s;
left: ${({ type }) => (type === 'prev' ? '5px' : 'initial')};
right: ${({ type }) => (type === 'next' ? '5px' : 'initial')};
&:hover {
opacity: 1;
}
&::before {
content: '';
height: 10px;
width: 10px;
background: transparent;
border-top: 2px solid #000;
border-right: 2px solid #000;
display: inline-block;
position: absolute;
top: 50%;
left: 50%;
transform: ${({ type }) =>
type === 'prev'
? 'translate(-25%, -50%) rotate(-135deg)'
: 'translate(-75%, -50%) rotate(45deg)'};
}
`
const ArrowButton = ({
type,
mobileBreakpoint = 1,
hidden = false,
CustomBtn,
onClick
}) => (
<ButtonWrapper
mobileBreakpoint={mobileBreakpoint}
hidden={hidden}
onClick={onClick}
>
{CustomBtn ? (
typeof CustomBtn === 'function' ? (
<CustomBtn />
) : (
CustomBtn
)
) : (
<Button type={type} />
)}
</ButtonWrapper>
)
ArrowButton.propTypes = {
type: PropTypes.oneOf(['prev', 'next']).isRequired,
mobileBreakpoint: PropTypes.number,
hidden: PropTypes.bool,
CustomBtn: PropTypes.oneOfType([
PropTypes.node,
PropTypes.element,
PropTypes.elementType
]),
onClick: PropTypes.func.isRequired
}
export default ArrowButton