import React, { ReactNode, useState } from 'react'; import styled from 'styled-components'; import { color, MarginProps, space, SpaceProps } from 'styled-system'; import { MaterialArrowDropDown } from '@t3n/icons'; import { ThemeProps } from '@t3n/theme'; import Box from '../Box'; import Heading from '../Heading'; import Icon from '../Icon'; export interface AccordionProps extends MarginProps { title: string | JSX.Element; initialOpen?: boolean; children?: ReactNode; } const StyledAccordion = styled.div` border-radius: ${({ theme }: ThemeProps) => theme.border.radii[1]}; border: 1px solid ${({ theme }: ThemeProps) => theme.colors.shades.grey232}; ${({ theme }) => color({ theme, bg: 'shades.white' })}; ${space}; `; const StyledAccordionHeadBox = styled(Box)` display: flex; justify-content: space-between; align-items: center; cursor: pointer; :focus { outline: none; } `; const StyledIconBox = styled(Box)<{ collapsed: boolean }>` border-radius: 50%; height: 2rem; width: 2rem; ${Icon} { transform: ${({ collapsed }) => collapsed ? 'rotate(0deg)' : 'rotate(180deg)'}; transition: transform 0.2s ease-in; } `; const Accordion: React.FC = ({ children, title, initialOpen, ...rest }) => { const [collapsed, setCollapsed] = useState(!initialOpen); return ( setCollapsed(!collapsed)} onKeyDown={() => setCollapsed(!collapsed)} role="button" tabIndex={0} > {typeof title === 'string' ? ( {title} ) : ( title )} {!collapsed && ( {children} )} ); }; export default Accordion;