Home / Class/ CapsizeFontMetricsResolver Class — astro Architecture

CapsizeFontMetricsResolver Class — astro Architecture

Architecture documentation for the CapsizeFontMetricsResolver class in capsize-font-metrics-resolver.ts from the astro codebase.

Entity Profile

Dependency Diagram

graph TD
  830447a8_2868_0945_29b2_fb4acb94f9e8["CapsizeFontMetricsResolver"]
  a11892f3_9dab_e16c_8507_d795d6c082f5["capsize-font-metrics-resolver.ts"]
  830447a8_2868_0945_29b2_fb4acb94f9e8 -->|defined in| a11892f3_9dab_e16c_8507_d795d6c082f5
  bd331974_7a4d_79f8_9680_17587e5fd273["constructor()"]
  830447a8_2868_0945_29b2_fb4acb94f9e8 -->|method| bd331974_7a4d_79f8_9680_17587e5fd273
  d7596678_393c_9c8e_7110_446593c70b65["getMetrics()"]
  830447a8_2868_0945_29b2_fb4acb94f9e8 -->|method| d7596678_393c_9c8e_7110_446593c70b65
  3173d990_3668_518a_8ebe_a502a9890f7d["generateFontFace()"]
  830447a8_2868_0945_29b2_fb4acb94f9e8 -->|method| 3173d990_3668_518a_8ebe_a502a9890f7d

Relationship Graph

Source Code

packages/astro/src/assets/fonts/infra/capsize-font-metrics-resolver.ts lines 34–108

export class CapsizeFontMetricsResolver implements FontMetricsResolver {
	readonly #cache: Record<string, FontFaceMetrics | null> = {};
	readonly #fontFetcher: FontFetcher;
	readonly #cssRenderer: CssRenderer;

	constructor({
		fontFetcher,
		cssRenderer,
	}: {
		fontFetcher: FontFetcher;
		cssRenderer: CssRenderer;
	}) {
		this.#fontFetcher = fontFetcher;
		this.#cssRenderer = cssRenderer;
	}

	async getMetrics(name: string, font: CollectedFontForMetrics): Promise<FontFaceMetrics> {
		return (this.#cache[name] ??= filterRequiredMetrics(
			await fromBuffer(await this.#fontFetcher.fetch(font)),
		));
	}

	// Adapted from Capsize
	// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/createFontStack.ts
	generateFontFace({
		metrics,
		fallbackMetrics,
		name: fallbackName,
		font: fallbackFontName,
		properties,
	}: {
		metrics: FontFaceMetrics;
		fallbackMetrics: FontFaceMetrics;
		name: string;
		font: string;
		properties: CssProperties;
	}): string {
		// Calculate size adjust
		const preferredFontXAvgRatio = metrics.xWidthAvg / metrics.unitsPerEm;
		const fallbackFontXAvgRatio = fallbackMetrics.xWidthAvg / fallbackMetrics.unitsPerEm;

		const sizeAdjust =
			preferredFontXAvgRatio && fallbackFontXAvgRatio
				? preferredFontXAvgRatio / fallbackFontXAvgRatio
				: 1;

		const adjustedEmSquare = metrics.unitsPerEm * sizeAdjust;

		// Calculate metric overrides for preferred font
		const ascentOverride = metrics.ascent / adjustedEmSquare;
		const descentOverride = Math.abs(metrics.descent) / adjustedEmSquare;
		const lineGapOverride = metrics.lineGap / adjustedEmSquare;

		// Calculate metric overrides for fallback font
		const fallbackAscentOverride = fallbackMetrics.ascent / adjustedEmSquare;
		const fallbackDescentOverride = Math.abs(fallbackMetrics.descent) / adjustedEmSquare;
		const fallbackLineGapOverride = fallbackMetrics.lineGap / adjustedEmSquare;

		return this.#cssRenderer.generateFontFace(fallbackName, {
			...properties,
			src: renderFontSrc([{ name: fallbackFontName }]),
			'size-adjust': sizeAdjust && sizeAdjust !== 1 ? toPercentString(sizeAdjust) : undefined,
			'ascent-override':
				ascentOverride && ascentOverride !== fallbackAscentOverride
					? toPercentString(ascentOverride)
					: undefined,
			'descent-override':
				descentOverride && descentOverride !== fallbackDescentOverride
					? toPercentString(descentOverride)
					: undefined,
			'line-gap-override':
				lineGapOverride !== fallbackLineGapOverride ? toPercentString(lineGapOverride) : undefined,
		});
	}
}

Domain

Frequently Asked Questions

What is the CapsizeFontMetricsResolver class?
CapsizeFontMetricsResolver is a class in the astro codebase, defined in packages/astro/src/assets/fonts/infra/capsize-font-metrics-resolver.ts.
Where is CapsizeFontMetricsResolver defined?
CapsizeFontMetricsResolver is defined in packages/astro/src/assets/fonts/infra/capsize-font-metrics-resolver.ts at line 34.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free