onecart-ui
Version:
Cross-platform React and React Native component library with white-label support
184 lines (177 loc) • 7.61 kB
text/typescript
// This file maps the generated tokens to a structured format for Typography component
import * as tokens from "./tokens";
import { normalizeFontWeight } from "./utils/fontUtils";
import { pxToNumber } from "./utils/utils";
export const typographyTokens = {
// Display variants
display2xl: {
fontFamily: tokens.DISPLAY_2XL_FONT_FAMILY,
fontSize: pxToNumber(tokens.DISPLAY_2XL_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.DISPLAY_2XL_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_6XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.DISPLAY_2XL_LETTER_SPACING,
textDecoration: tokens.DISPLAY_2XL_TEXT_DECORATION,
textCase: tokens.DISPLAY_2XL_TEXT_CASE,
},
displayXl: {
fontFamily: tokens.DISPLAY_XL_FONT_FAMILY,
fontSize: pxToNumber(tokens.DISPLAY_XL_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.DISPLAY_XL_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_5XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.DISPLAY_XL_LETTER_SPACING,
textDecoration: tokens.DISPLAY_XL_TEXT_DECORATION,
textCase: tokens.DISPLAY_XL_TEXT_CASE,
},
// Heading variants
headingXl: {
fontFamily: tokens.HEADING_XL_FONT_FAMILY,
fontSize: pxToNumber(tokens.HEADING_XL_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.HEADING_XL_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_4XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.HEADING_XL_LETTER_SPACING,
textDecoration: tokens.HEADING_XL_TEXT_DECORATION,
textCase: tokens.HEADING_XL_TEXT_CASE,
},
headingLg: {
fontFamily: tokens.HEADING_LG_FONT_FAMILY,
fontSize: pxToNumber(tokens.HEADING_LG_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.HEADING_LG_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_3XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.HEADING_LG_LETTER_SPACING,
textDecoration: tokens.HEADING_LG_TEXT_DECORATION,
textCase: tokens.HEADING_LG_TEXT_CASE,
},
headingMd: {
fontFamily: tokens.HEADING_MD_FONT_FAMILY,
fontSize: pxToNumber(tokens.HEADING_MD_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.HEADING_MD_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_2XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.HEADING_MD_LETTER_SPACING,
textDecoration: tokens.HEADING_MD_TEXT_DECORATION,
textCase: tokens.HEADING_MD_TEXT_CASE,
},
headingSm: {
fontFamily: tokens.HEADING_SM_FONT_FAMILY,
fontSize: pxToNumber(tokens.HEADING_SM_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.HEADING_SM_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_XL),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.HEADING_SM_LETTER_SPACING,
textDecoration: tokens.HEADING_SM_TEXT_DECORATION,
textCase: tokens.HEADING_SM_TEXT_CASE,
},
headingXs: {
fontFamily: tokens.HEADING_XS_FONT_FAMILY,
fontSize: pxToNumber(tokens.HEADING_XS_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.HEADING_XS_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.LINE_HEIGHT_LG),
color: tokens.TEXT_HEADER,
letterSpacing: tokens.HEADING_XS_LETTER_SPACING,
textDecoration: tokens.HEADING_XS_TEXT_DECORATION,
textCase: tokens.HEADING_XS_TEXT_CASE,
},
// Body text variants
bodyXl: {
fontFamily: tokens.BODY_XL_FONT_FAMILY,
fontSize: pxToNumber(tokens.BODY_XL_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.BODY_XL_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.BODY_XL_LINE_HEIGHT),
color: tokens.TEXT_BODY,
letterSpacing: tokens.BODY_XL_LETTER_SPACING,
textDecoration: tokens.BODY_XL_TEXT_DECORATION,
textCase: tokens.BODY_XL_TEXT_CASE,
paragraphIndent: tokens.BODY_XL_PARAGRAPH_INDENT,
},
bodyLg: {
fontFamily: tokens.BODY_LG_FONT_FAMILY,
fontSize: pxToNumber(tokens.BODY_LG_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.BODY_LG_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.BODY_LG_LINE_HEIGHT),
color: tokens.TEXT_BODY,
letterSpacing: tokens.BODY_LG_LETTER_SPACING,
textDecoration: tokens.BODY_LG_TEXT_DECORATION,
textCase: tokens.BODY_LG_TEXT_CASE,
paragraphIndent: tokens.BODY_LG_PARAGRAPH_INDENT,
},
bodyMd: {
fontFamily: tokens.BODY_MD_FONT_FAMILY,
fontSize: pxToNumber(tokens.BODY_MD_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.BODY_MD_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.BODY_MD_LINE_HEIGHT),
color: tokens.TEXT_BODY,
letterSpacing: tokens.BODY_MD_LETTER_SPACING,
textDecoration: tokens.BODY_MD_TEXT_DECORATION,
textCase: tokens.BODY_MD_TEXT_CASE,
paragraphIndent: tokens.BODY_MD_PARAGRAPH_INDENT,
},
bodySm: {
fontFamily: tokens.BODY_SM_FONT_FAMILY,
fontSize: pxToNumber(tokens.BODY_SM_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.BODY_SM_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.BODY_SM_LINE_HEIGHT),
color: tokens.TEXT_BODY,
letterSpacing: tokens.BODY_SM_LETTER_SPACING,
textDecoration: tokens.BODY_SM_TEXT_DECORATION,
textCase: tokens.BODY_SM_TEXT_CASE,
paragraphIndent: tokens.BODY_SM_PARAGRAPH_INDENT,
},
bodyXs: {
// Map to utility-caption which is our smallest text style in Figma tokens
fontFamily: tokens.UTILITY_CAPTION_FONT_FAMILY,
fontSize: pxToNumber(tokens.UTILITY_CAPTION_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.UTILITY_CAPTION_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.UTILITY_CAPTION_LINE_HEIGHT),
color: tokens.TEXT_BODY,
letterSpacing: tokens.UTILITY_CAPTION_LETTER_SPACING,
textDecoration: tokens.UTILITY_CAPTION_TEXT_DECORATION,
textCase: tokens.UTILITY_CAPTION_TEXT_CASE,
paragraphIndent: tokens.UTILITY_CAPTION_PARAGRAPH_INDENT,
},
// Label variants - map to Utility tokens from Figma
labelLg: {
// Maps to utility-button
fontFamily: tokens.UTILITY_BUTTON_FONT_FAMILY,
fontSize: pxToNumber(tokens.UTILITY_BUTTON_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.UTILITY_BUTTON_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.UTILITY_BUTTON_LINE_HEIGHT),
color: tokens.TEXT_TERTIARY,
letterSpacing: tokens.UTILITY_BUTTON_LETTER_SPACING,
textDecoration: tokens.UTILITY_BUTTON_TEXT_DECORATION,
textCase: tokens.UTILITY_BUTTON_TEXT_CASE,
},
labelMd: {
// Maps to utility-link
fontFamily: tokens.UTILITY_LINK_FONT_FAMILY,
fontSize: pxToNumber(tokens.UTILITY_LINK_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.UTILITY_LINK_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.UTILITY_LINK_LINE_HEIGHT),
color: tokens.TEXT_TERTIARY,
letterSpacing: tokens.UTILITY_LINK_LETTER_SPACING,
textDecoration: tokens.TEXT_DECORATION_NONE, // Override the default underline from utility-link
textCase: tokens.UTILITY_LINK_TEXT_CASE,
},
labelSm: {
// Maps to utility-caption
fontFamily: tokens.UTILITY_CAPTION_FONT_FAMILY,
fontSize: pxToNumber(tokens.UTILITY_CAPTION_FONT_SIZE),
fontWeight: normalizeFontWeight(tokens.UTILITY_CAPTION_FONT_WEIGHT),
lineHeight: pxToNumber(tokens.UTILITY_CAPTION_LINE_HEIGHT),
color: tokens.TEXT_TERTIARY,
letterSpacing: tokens.UTILITY_CAPTION_LETTER_SPACING,
textDecoration: tokens.UTILITY_CAPTION_TEXT_DECORATION,
textCase: tokens.UTILITY_CAPTION_TEXT_CASE,
},
// Weights mapping for custom weight overrides
weights: {
normal: "400", // Regular weight
medium: normalizeFontWeight(tokens.MEDIUM),
semibold: normalizeFontWeight(tokens.SEMI_BOLD),
bold: "700", // Bold weight (not directly defined in tokens)
},
};
export default typographyTokens;