import { css, SerializedStyles } from '@emotion/react'; import { theme, typography, spacing, borderRadius } from '@expo/styleguide'; import React from 'react'; import { LinkBase, LinkProps } from './Link'; import { TextComponentProps, TextElement } from './types'; import { durations } from '~/ui/foundations/durations'; export { LinkBase } from './Link'; export { AnchorContext } from './withAnchor'; export function createTextComponent(Element: TextElement, textStyle?: SerializedStyles) { function TextComponent(props: TextComponentProps) { const { testID, tag, weight: textWeight, theme: textTheme, ...rest } = props; const TextElementTag = tag ?? Element; return ( ); } TextComponent.displayName = `Text(${Element})`; return TextComponent; } const baseTextStyle = css({ ...typography.body.paragraph, color: theme.text.default, }); const link = css({ textDecoration: 'none', cursor: 'pointer', // transform prevents a 1px shift on hover on Safari transform: 'translate3d(0,0,0)', ':hover': { transition: durations.hover, opacity: 0.8, }, }); const listStyle = css({ marginLeft: '1.5rem', }); export const H1 = createTextComponent(TextElement.H1, css(typography.headers.default.h1)); export const H2 = createTextComponent(TextElement.H2, css(typography.headers.default.h2)); export const H3 = createTextComponent(TextElement.H4, css(typography.headers.default.h3)); export const H4 = createTextComponent(TextElement.H4, css(typography.headers.default.h4)); export const H5 = createTextComponent(TextElement.H5, css(typography.headers.default.h5)); export const H6 = createTextComponent(TextElement.H6, css(typography.headers.default.h6)); export const P = createTextComponent(TextElement.P, css(typography.body.paragraph)); export const CODE = createTextComponent(TextElement.CODE, css(typography.utility.inlineCode)); export const LI = createTextComponent(TextElement.LI, css(typography.body.li)); export const LABEL = createTextComponent(TextElement.SPAN, css(typography.body.label)); export const HEADLINE = createTextComponent(TextElement.P, css(typography.body.headline)); export const FOOTNOTE = createTextComponent(TextElement.P, css(typography.body.footnote)); export const CALLOUT = createTextComponent(TextElement.P, css(typography.body.callout)); export const BOLD = createTextComponent(TextElement.SPAN, css(typography.utility.weight.semiBold)); export const DEMI = createTextComponent(TextElement.SPAN, css(typography.utility.weight.medium)); export const UL = createTextComponent(TextElement.UL, css([typography.body.ul, listStyle])); export const OL = createTextComponent(TextElement.OL, css([typography.body.ol, listStyle])); export const PRE = createTextComponent(TextElement.PRE, css(typography.utility.pre)); export const kbdStyle = css({ fontFamily: typography.fontFaces.medium, color: theme.text.secondary, padding: `0 ${spacing[1]}px`, boxShadow: `0 0.1rem 0 1px ${theme.border.default}`, borderRadius: borderRadius.small, position: 'relative', display: 'inline-flex', margin: 0, minWidth: 22, justifyContent: 'center', top: -1, }); const isExternalLink = (href?: string) => href?.includes('://'); export const KBD = createTextComponent(TextElement.KBD, css([typography.utility.pre, kbdStyle])); export const A = (props: LinkProps & { isStyled?: boolean }) => { const { isStyled, ...rest } = props; return ( ); }; A.displayName = 'Text(a)';