UNPKG

@navinc/base-react-components

Version:
54 lines (49 loc) 1.54 kB
import React, { Children, useState } from 'react' import styled from 'styled-components' import propTypes from 'prop-types' import Text from './text' const TabContainer = styled.div` display: grid; grid-template-columns: 1fr 1fr; background-color: ${({ theme }) => theme.neutral100}; border: 1px solid ${({ theme }) => theme.neutral300}; border-radius: 99px; position: relative; ` const Tab = styled(Text).attrs(() => ({ $bold: true }))` text-align: center; padding: 16px 32px; border-radius: 99px; cursor: pointer; color: ${({ isActive, theme }) => (isActive ? theme.white : theme.neutral400)}; transition: all 0.25s ease-in; position: relative; ` const Glider = styled.div` display: flex; position: absolute; top: 0; bottom: 0; background-color: ${({ theme }) => theme.azure}; width: 50%; border-radius: 99px; transition: 0.25s ease-out; ` Tab.propTypes = { isActive: propTypes.bool, } export default ({ children, filterName, ...props }) => { const [isOn, setIsOn] = useState(true) const handleToggleClick = () => setIsOn((isOn) => !isOn) return ( <TabContainer data-testid="sliding-tabs" {...props} onClick={handleToggleClick}> <Glider data-testid="sliding-tabs-glider" style={{ transform: `${isOn ? 'translateX(0)' : 'translateX(100%)'}` }} /> {Children.toArray(children).map(({ type, key, props }, i) => ( <Tab as={type} key={key} {...props} id={i} data-testid={`sliding-tabs-children-${i}`} /> ))} </TabContainer> ) }