element-call/src/typography/Typography.jsx

218 lines
3.7 KiB
React
Raw Normal View History

2022-01-04 16:00:13 -08:00
import React, { forwardRef } from "react";
import classNames from "classnames";
import { Link as RouterLink } from "react-router-dom";
import styles from "./Typography.module.css";
export const Headline = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "h1",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Title = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "h2",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Subtitle = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "h3",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Body = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Caption = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles.caption,
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Micro = forwardRef(
2022-01-04 17:09:27 -08:00
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref
) => {
2022-01-04 16:00:13 -08:00
return (
<Component
{...rest}
2022-01-04 17:09:27 -08:00
className={classNames(
styles.micro,
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);
export const Link = forwardRef(
(
{
2022-01-06 13:14:15 -08:00
as,
2022-01-04 16:00:13 -08:00
children,
className,
color = "link",
href,
2022-01-06 13:14:15 -08:00
to,
2022-01-04 16:00:13 -08:00
fontWeight,
2022-01-04 17:09:27 -08:00
overflowEllipsis,
2022-01-04 16:00:13 -08:00
...rest
},
ref
) => {
2022-01-06 13:14:15 -08:00
const Component = as || (to ? RouterLink : "a");
2022-01-04 16:00:13 -08:00
let externalLinkProps;
if (href) {
externalLinkProps = {
target: "_blank",
rel: "noreferrer noopener",
};
}
return (
<Component
{...externalLinkProps}
{...rest}
2022-01-06 13:14:15 -08:00
to={to}
2022-01-04 17:09:27 -08:00
className={classNames(
styles[color],
styles[fontWeight],
{ [styles.overflowEllipsis]: overflowEllipsis },
className
)}
2022-01-04 16:00:13 -08:00
ref={ref}
>
{children}
</Component>
);
}
);