backpack-ui
Version:
Lonely Planet's Components
134 lines (116 loc) • 3.13 kB
JSX
import React from "react";
import PropTypes from "prop-types";
import radium from "radium";
import colors from "../../styles/colors";
import timing from "../../styles/timing";
import mq from "../../styles/mq";
import propTypes from "../../utils/propTypes";
import { Plus } from "../icon";
import createQAHook from "../../utils/createQAHook";
const mediaQuery = `@media (min-width: ${mq.min[768]})`;
const styles = {
container: {
borderBottom: `1px solid ${colors.borderPrimary}`,
},
heading: {
color: colors.textPrimary,
backgroundColor: "transparent",
display: "block",
fontSize: "20px",
fontWeight: 300,
lineHeight: (24 / 20),
paddingBottom: "26px",
paddingLeft: 0,
paddingRight: 0,
paddingTop: "29px",
position: "relative",
textAlign: "left",
transition: `color ${timing.fast} ease-in-out`,
width: "100%",
":hover": { color: colors.linkPrimary },
":active": { color: colors.linkPrimary },
":focus": { color: colors.linkPrimary },
[mediaQuery]: {
fontSize: "28px",
lineHeight: (34 / 28),
paddingBottom: "39px",
paddingTop: "44px",
},
},
icon: {
fontSize: "12px",
float: "right",
marginRight: "8px",
marginTop: "4px",
[mediaQuery]: {
fontSize: "22px",
marginRight: "30px",
marginTop: "10px",
},
},
content: {
overflow: "hidden",
maxHeight: 0,
},
contentPadding: {
paddingBottom: "32px",
[mediaQuery]: {
paddingBottom: "48px",
},
},
};
const AccordionItem = ({ heading, content, id, expanded, onClick, style, qaHook }) => (
<div
className="Accordion-item"
id={id}
style={[styles.container, style]}
>
<button
className="Accordion-itemHeading"
id={`${id}-heading`}
data-testid={qaHook ? createQAHook(heading, "Accordion-itemHeading", "btn") : null}
aria-selected={expanded}
aria-expanded={expanded}
aria-controls={`${id}-content`}
role="tab"
onClick={onClick}
style={styles.heading}
>
{heading}
<div style={[styles.icon, expanded && { transform: "rotate(45deg)" }]}>
<Plus label={expanded ? "Collapse" : "Expand"} />
</div>
</button>
<div
className="Accordion-itemContent"
id={`${id}-content`}
data-testid={qaHook ? createQAHook(id, "Accordion-itemContent", "content") : null}
aria-labelledby={`${id}-heading`}
aria-hidden={!expanded}
role="tabpanel"
style={[styles.content, expanded && {
transition: `max-height ${timing.slow} ease-in-out`,
maxHeight: "500vh",
}]}
>
<div style={styles.contentPadding}>
{content}
</div>
</div>
</div>
);
AccordionItem.propTypes = {
heading: PropTypes.string.isRequired,
content: PropTypes.element.isRequired,
id: PropTypes.string,
onClick: PropTypes.func,
expanded: PropTypes.bool,
style: propTypes.style,
qaHook: PropTypes.bool,
};
AccordionItem.defaultProps = {
id: "accordionItem",
expanded: false,
qaHook: false,
};
export default radium(AccordionItem);