import styled from "styled-components"; import { Theme, Typography } from "../theme"; interface TextProps { color?: keyof Theme["colors"]; bold?: boolean; theme: Theme; } const BaseText = styled.span` ${({ theme }) => theme.font.family ? `font-family: ${theme.font.family};` : ""} color: ${({ color, theme }) => color ? theme.colors[color] : theme.colors.foreground}; font-weight: ${({ bold }) => (bold ? "bold" : "normal")}; font-size: ${({ theme }) => theme.font.baseSize}px; `; const get = (name: keyof Theme["typography"], theme: Theme): Typography => { const typography = theme.typography[name]; return typography; }; const createTypography = (name: keyof Theme["typography"]) => { const Component = styled(BaseText) ` font-size: ${({ theme }) => theme.font.baseSize * (get(name, theme).size || 1)}px; font-weight: ${({ bold, theme }) => typeof bold !== "undefined" ? "bold" : get(name, theme).weight || "normal"}; ${({ theme }) => get(name, theme).upperCase ? "text-transform: uppercase;" : ""} `; return Component; }; const Jumbo = createTypography("Jumbo"); const Title2 = createTypography("Title2"); const Title1 = createTypography("Title1"); const Body1 = createTypography("Body1"); const Overline = createTypography("Overline"); const Caption = createTypography("Caption"); const Link = createTypography("Link"); const types: { [key in keyof Theme["typography"]]: typeof BaseText } = { Jumbo, Title2, Title1, Body1, Overline, Caption, Link, }; export type { TextProps }; export { types, Jumbo, Title2, Title1, Body1, Overline, Caption, Link };