|
|
|
import React from 'react';
|
|
|
|
import styled from 'styled-components';
|
|
|
|
import LinkIcon from 'components/icons/link.svg';
|
|
|
|
|
|
|
|
const linkify = (Component: React.FunctionComponent<any>) => {
|
|
|
|
return function EnrichedHeading(props: { children: string }): React.ReactNode {
|
|
|
|
const text = props.children;
|
|
|
|
const id = text.toLowerCase && text
|
|
|
|
.toLowerCase()
|
|
|
|
.replace(/[^\x00-\x7F]/g, '')
|
|
|
|
.replace(/\s+/g, '-')
|
|
|
|
.replace(/[?!]/g, '');
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Component id={id}>
|
|
|
|
<HeaderLink href={`#${id}`}>
|
|
|
|
<LinkIcon />
|
|
|
|
</HeaderLink>
|
|
|
|
{props.children}
|
|
|
|
</Component>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const HeaderLink = styled.a`
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
left: -25px;
|
|
|
|
width: 25px;
|
|
|
|
display: none;
|
|
|
|
height: 100%;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: flex-start;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H1 = styled.h1`
|
|
|
|
position: relative;
|
|
|
|
font-size: 32px;
|
|
|
|
line-height: 40px;
|
|
|
|
font-weight: 700;
|
|
|
|
margin: 20px 0 10px !important;
|
|
|
|
|
|
|
|
&:hover ${HeaderLink} {
|
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H2 = styled(H1).attrs({ as: 'h2' })`
|
|
|
|
font-size: 30px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H3 = styled(H1).attrs({ as: 'h3' })`
|
|
|
|
margin: 22px 0 8px;
|
|
|
|
font-size: 28px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H4 = styled(H1).attrs({ as: 'h4' })`
|
|
|
|
margin: 18px 0 8px;
|
|
|
|
font-size: 24px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H5 = styled(H1).attrs({ as: 'h5' })`
|
|
|
|
margin: 14px 0 8px;
|
|
|
|
font-size: 18px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const H6 = styled(H1).attrs({ as: 'h6' })`
|
|
|
|
margin: 12px 0 8px;
|
|
|
|
font-size: 18px;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const Headings = {
|
|
|
|
h1: linkify(H1),
|
|
|
|
h2: linkify(H2),
|
|
|
|
h3: linkify(H3),
|
|
|
|
h4: linkify(H4),
|
|
|
|
h5: linkify(H5),
|
|
|
|
h6: linkify(H6)
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Headings;
|