diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/fonts/FontMetadata.ts | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/fonts/FontMetadata.ts')
| -rw-r--r-- | packages/excalidraw/fonts/FontMetadata.ts | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/packages/excalidraw/fonts/FontMetadata.ts b/packages/excalidraw/fonts/FontMetadata.ts new file mode 100644 index 0000000..e93380e --- /dev/null +++ b/packages/excalidraw/fonts/FontMetadata.ts @@ -0,0 +1,150 @@ +import type { JSX } from "react"; +import { + FreedrawIcon, + FontFamilyNormalIcon, + FontFamilyHeadingIcon, + FontFamilyCodeIcon, +} from "../components/icons"; +import { FONT_FAMILY, FONT_FAMILY_FALLBACKS } from "../constants"; + +/** + * Encapsulates font metrics with additional font metadata. + * */ +export interface FontMetadata { + /** for head & hhea metrics read the woff2 with https://fontdrop.info/ */ + metrics: { + /** head.unitsPerEm metric */ + unitsPerEm: 1000 | 1024 | 2048; + /** hhea.ascender metric */ + ascender: number; + /** hhea.descender metric */ + descender: number; + /** harcoded unitless line-height, https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971 */ + lineHeight: number; + }; + /** element to be displayed as an icon */ + icon?: JSX.Element; + /** flag to indicate a deprecated font */ + deprecated?: true; + /** flag to indicate a server-side only font */ + serverSide?: true; + /** flag to indiccate a local-only font */ + local?: true; + /** flag to indicate a fallback font */ + fallback?: true; +} + +export const FONT_METADATA: Record<number, FontMetadata> = { + [FONT_FAMILY.Excalifont]: { + metrics: { + unitsPerEm: 1000, + ascender: 886, + descender: -374, + lineHeight: 1.25, + }, + icon: FreedrawIcon, + }, + [FONT_FAMILY.Nunito]: { + metrics: { + unitsPerEm: 1000, + ascender: 1011, + descender: -353, + lineHeight: 1.35, + }, + icon: FontFamilyNormalIcon, + }, + [FONT_FAMILY["Lilita One"]]: { + metrics: { + unitsPerEm: 1000, + ascender: 923, + descender: -220, + lineHeight: 1.15, + }, + icon: FontFamilyHeadingIcon, + }, + [FONT_FAMILY["Comic Shanns"]]: { + metrics: { + unitsPerEm: 1000, + ascender: 750, + descender: -250, + lineHeight: 1.25, + }, + icon: FontFamilyCodeIcon, + }, + [FONT_FAMILY.Virgil]: { + metrics: { + unitsPerEm: 1000, + ascender: 886, + descender: -374, + lineHeight: 1.25, + }, + icon: FreedrawIcon, + deprecated: true, + }, + [FONT_FAMILY.Helvetica]: { + metrics: { + unitsPerEm: 2048, + ascender: 1577, + descender: -471, + lineHeight: 1.15, + }, + icon: FontFamilyNormalIcon, + deprecated: true, + local: true, + }, + [FONT_FAMILY.Cascadia]: { + metrics: { + unitsPerEm: 2048, + ascender: 1900, + descender: -480, + lineHeight: 1.2, + }, + icon: FontFamilyCodeIcon, + deprecated: true, + }, + [FONT_FAMILY["Liberation Sans"]]: { + metrics: { + unitsPerEm: 2048, + ascender: 1854, + descender: -434, + lineHeight: 1.15, + }, + serverSide: true, + }, + [FONT_FAMILY_FALLBACKS.Xiaolai]: { + metrics: { + unitsPerEm: 1000, + ascender: 880, + descender: -144, + lineHeight: 1.15, + }, + fallback: true, + }, + [FONT_FAMILY_FALLBACKS["Segoe UI Emoji"]]: { + metrics: { + // reusing Excalifont metrics + unitsPerEm: 1000, + ascender: 886, + descender: -374, + lineHeight: 1.25, + }, + local: true, + fallback: true, + }, +}; + +/** Unicode ranges defined by google fonts */ +export const GOOGLE_FONTS_RANGES = { + LATIN: + "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD", + LATIN_EXT: + "U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF", + CYRILIC_EXT: + "U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F", + CYRILIC: "U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116", + VIETNAMESE: + "U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB", +}; + +/** local protocol to skip the local font from registering or inlining */ +export const LOCAL_FONT_PROTOCOL = "local:"; |
