Home / File/ capsize-font-metrics-resolver.ts — astro Source File

capsize-font-metrics-resolver.ts — astro Source File

Architecture documentation for capsize-font-metrics-resolver.ts, a typescript file in the astro codebase. 5 imports, 0 dependents.

File typescript CoreAstro RenderingEngine 5 imports 3 functions 1 classes

Entity Profile

Dependency Diagram

graph LR
  a11892f3_9dab_e16c_8507_d795d6c082f5["capsize-font-metrics-resolver.ts"]
  2f3de45d_9993_acba_acd0_40014d5fbc2e["./core/optimize-fallbacks.js"]
  a11892f3_9dab_e16c_8507_d795d6c082f5 --> 2f3de45d_9993_acba_acd0_40014d5fbc2e
  e92fda44_4a5d_b83b_1a45_958cdae6c91b["./definitions.js"]
  a11892f3_9dab_e16c_8507_d795d6c082f5 --> e92fda44_4a5d_b83b_1a45_958cdae6c91b
  ea387312_d0a2_bb52_dafc_3872f7307f95["../../src/assets/fonts/types.js"]
  a11892f3_9dab_e16c_8507_d795d6c082f5 --> ea387312_d0a2_bb52_dafc_3872f7307f95
  aca757ac_dcac_a793_a9c5_394cd0d7d313["../utils.js"]
  a11892f3_9dab_e16c_8507_d795d6c082f5 --> aca757ac_dcac_a793_a9c5_394cd0d7d313
  ef055097_16b3_7136_fbaf_9392f06fd4dc["unpack"]
  a11892f3_9dab_e16c_8507_d795d6c082f5 --> ef055097_16b3_7136_fbaf_9392f06fd4dc
  style a11892f3_9dab_e16c_8507_d795d6c082f5 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { type Font, fromBuffer } from '@capsizecss/unpack';
import type { CollectedFontForMetrics } from '../core/optimize-fallbacks.js';
import type { CssRenderer, FontFetcher, FontMetricsResolver } from '../definitions.js';
import type { CssProperties, FontFaceMetrics } from '../types.js';
import { renderFontSrc } from '../utils.js';

// Source: https://github.com/unjs/fontaine/blob/main/src/metrics.ts
function filterRequiredMetrics({
	ascent,
	descent,
	lineGap,
	unitsPerEm,
	xWidthAvg,
}: Pick<Font, 'ascent' | 'descent' | 'lineGap' | 'unitsPerEm' | 'xWidthAvg'>) {
	return {
		ascent,
		descent,
		lineGap,
		unitsPerEm,
		xWidthAvg,
	};
}

// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/round.ts
function round(value: number) {
	return parseFloat(value.toFixed(4));
}

// Source: https://github.com/seek-oss/capsize/blob/b752693428b45994442433f7e3476ca4e3e3c507/packages/core/src/createFontStack.ts#L5
function toPercentString(value: number) {
	return `${round(value * 100)}%`;
}

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

Subdomains

Dependencies

  • ../../src/assets/fonts/types.js
  • ../utils.js
  • ./core/optimize-fallbacks.js
  • ./definitions.js
  • unpack

Frequently Asked Questions

What does capsize-font-metrics-resolver.ts do?
capsize-font-metrics-resolver.ts is a source file in the astro codebase, written in typescript. It belongs to the CoreAstro domain, RenderingEngine subdomain.
What functions are defined in capsize-font-metrics-resolver.ts?
capsize-font-metrics-resolver.ts defines 3 function(s): filterRequiredMetrics, round, toPercentString.
What does capsize-font-metrics-resolver.ts depend on?
capsize-font-metrics-resolver.ts imports 5 module(s): ../../src/assets/fonts/types.js, ../utils.js, ./core/optimize-fallbacks.js, ./definitions.js, unpack.
Where is capsize-font-metrics-resolver.ts in the architecture?
capsize-font-metrics-resolver.ts is located at packages/astro/src/assets/fonts/infra/capsize-font-metrics-resolver.ts (domain: CoreAstro, subdomain: RenderingEngine, directory: packages/astro/src/assets/fonts/infra).

Analyze Your Own Codebase

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

Try Supermodel Free