-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathindex.tsx
76 lines (65 loc) · 2.24 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import React, { useState } from 'react';
import Collapse from 'react-css-collapse';
import { ClassNames } from '@emotion/core';
import uniqid from 'uniqid';
import { H2, H3 } from '../../components';
import styled from '../../';
const expandIcon = require('./expand.svg');
const collapseIcon = require('./collapse.svg');
const Container = styled.div({
padding: '16px 0',
maxWidth: 900,
});
const Header = styled.div({
display: 'flex',
alignItems: 'center',
cursor: 'pointer',
'> h2, > h3': {
margin: 0,
},
});
const ToggleButton = styled.button<{ expanded: boolean; iconSize: Size }>(({ expanded, iconSize }) => ({
fontFamily: 'inherit',
cursor: 'pointer',
backgroundColor: 'transparent',
border: 0,
marginRight: 12,
backgroundRepeat: 'no-repeat',
backgroundImage: expanded ? `url(${collapseIcon})` : `url(${expandIcon})`,
width: iconSize === 'medium' ? 24 : 21,
height: iconSize === 'medium' ? 24 : 21,
backgroundSize: iconSize === 'medium' ? undefined : 18,
}));
type Size = 'small' | 'medium';
export interface TogglableProps {
title: string;
defaultExpanded?: boolean;
size?: Size;
onClick?: (isExpanded: boolean) => void;
}
export const Togglable: React.FC<TogglableProps> = ({ defaultExpanded, size, title, children, onClick }) => {
const [isExpanded, setIsExpanded] = useState(!!defaultExpanded);
const id = uniqid();
const toggleSize: Size = size ? size : 'medium';
const toggle = () => {
setIsExpanded(prevExpanded => !prevExpanded);
if (onClick) {
onClick(isExpanded);
}
};
return (
<ClassNames>
{({ css }) => (
<Container>
<Header onClick={toggle} aria-expanded={isExpanded} aria-controls={id}>
<ToggleButton expanded={isExpanded} iconSize={toggleSize} />
{toggleSize === 'medium' ? <H2>{title}</H2> : <H3>{title}</H3>}
</Header>
<Collapse isOpen={isExpanded} className={css({ transition: 'height 150ms' })}>
<div id={id}>{children}</div>
</Collapse>
</Container>
)}
</ClassNames>
);
};