{"version":3,"file":"createTypography.cjs","sources":["../../../src/themes/createTypography.ts"],"sourcesContent":["// Code based on Material UI\n// The MIT License (MIT)\n// Copyright (c) 2014 Call-Em-All\nimport { z } from 'zod';\n\nimport { ThemeColors } from './createColors';\n\n/** @beta */\nexport interface ThemeTypography extends ThemeTypographyVariantTypes {\n  fontFamily: string;\n  fontFamilyMonospace: string;\n  fontSize: number;\n  fontWeightLight: number;\n  fontWeightRegular: number;\n  fontWeightMedium: number;\n  fontWeightBold: number;\n\n  // The font-size on the html element.\n  htmlFontSize?: number;\n\n  /**\n   * @deprecated\n   * from legacy old theme\n   * */\n  size: {\n    base: string;\n    xs: string;\n    sm: string;\n    md: string;\n    lg: string;\n  };\n\n  pxToRem: (px: number) => string;\n}\n\nexport interface ThemeTypographyVariant {\n  fontSize: string;\n  fontWeight: number;\n  lineHeight: number;\n  fontFamily: string;\n  letterSpacing?: string;\n}\n\nexport const ThemeTypographyInputSchema = z.object({\n  fontFamily: z.string().optional(),\n  fontFamilyMonospace: z.string().optional(),\n  fontSize: z.number().positive().optional(),\n  fontWeightLight: z.number().positive().optional(),\n  fontWeightRegular: z.number().positive().optional(),\n  fontWeightMedium: z.number().positive().optional(),\n  fontWeightBold: z.number().positive().optional(),\n  // what's the font-size on the html element.\n  // 16px is the default font-size used by browsers.\n  htmlFontSize: z.number().positive().optional(),\n});\n\nexport type ThemeTypographyInput = z.infer<typeof ThemeTypographyInputSchema>;\n\nconst defaultFontFamily = \"'Inter', 'Helvetica', 'Arial', sans-serif\";\nconst defaultFontFamilyMonospace = \"'Roboto Mono', monospace\";\n\nexport function createTypography(colors: ThemeColors, typographyInput: ThemeTypographyInput = {}): ThemeTypography {\n  const {\n    fontFamily = defaultFontFamily,\n    fontFamilyMonospace = defaultFontFamilyMonospace,\n    // The default font size of the Material Specification.\n    fontSize = 14, // px\n    fontWeightLight = 300,\n    fontWeightRegular = 400,\n    fontWeightMedium = 500,\n    fontWeightBold = 500,\n    // Tell Grafana-UI what's the font-size on the html element.\n    // 16px is the default font-size used by browsers.\n    htmlFontSize = 14,\n  } = typographyInput;\n\n  if (process.env.NODE_ENV !== 'production') {\n    if (typeof fontSize !== 'number') {\n      console.error('Grafana-UI: `fontSize` is required to be a number.');\n    }\n\n    if (typeof htmlFontSize !== 'number') {\n      console.error('Grafana-UI: `htmlFontSize` is required to be a number.');\n    }\n  }\n\n  const coef = fontSize / 14;\n  const pxToRem = (size: number) => `${(size / htmlFontSize) * coef}rem`;\n  const buildVariant = (\n    fontWeight: number,\n    size: number,\n    lineHeight: number,\n    letterSpacing: number,\n    casing?: object\n  ): ThemeTypographyVariant => {\n    if (lineHeight % 2 !== 0 || size % 2 !== 0) {\n      throw new Error('Font size and line height should be integer multiples of 2 to prevent issues with alignment');\n    }\n\n    return {\n      fontFamily,\n      fontWeight,\n      fontSize: pxToRem(size),\n      lineHeight: lineHeight / size,\n      ...(fontFamily === defaultFontFamily ? { letterSpacing: `${round(letterSpacing / size)}em` } : {}),\n      ...casing,\n    };\n  };\n\n  // All our fonts/line heights should be integer multiples of 2 to prevent issues with alignment\n  const variants = {\n    h1: buildVariant(fontWeightRegular, 28, 32, -0.25),\n    h2: buildVariant(fontWeightRegular, 24, 28, 0),\n    h3: buildVariant(fontWeightRegular, 22, 24, 0),\n    h4: buildVariant(fontWeightRegular, 18, 22, 0.25),\n    h5: buildVariant(fontWeightRegular, 16, 22, 0),\n    h6: buildVariant(fontWeightMedium, 14, 22, 0.15),\n    body: buildVariant(fontWeightRegular, fontSize, 22, 0.15),\n    bodySmall: buildVariant(fontWeightRegular, 12, 18, 0.15),\n    code: { ...buildVariant(fontWeightRegular, 14, 16, 0.15), fontFamily: fontFamilyMonospace },\n  };\n\n  const size = {\n    base: '14px',\n    xs: '10px',\n    sm: '12px',\n    md: '14px',\n    lg: '18px',\n  };\n\n  return {\n    htmlFontSize,\n    pxToRem,\n    fontFamily,\n    fontFamilyMonospace,\n    fontSize,\n    fontWeightLight,\n    fontWeightRegular,\n    fontWeightMedium,\n    fontWeightBold,\n    size,\n    ...variants,\n  };\n}\n\nfunction round(value: number) {\n  return Math.round(value * 1e5) / 1e5;\n}\n\nexport interface ThemeTypographyVariantTypes {\n  h1: ThemeTypographyVariant;\n  h2: ThemeTypographyVariant;\n  h3: ThemeTypographyVariant;\n  h4: ThemeTypographyVariant;\n  h5: ThemeTypographyVariant;\n  h6: ThemeTypographyVariant;\n  body: ThemeTypographyVariant;\n  bodySmall: ThemeTypographyVariant;\n  code: ThemeTypographyVariant;\n}\n"],"names":["z","size"],"mappings":"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"}