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.
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
Classes
Dependencies
- ../../src/assets/fonts/types.js
- ../utils.js
- ./core/optimize-fallbacks.js
- ./definitions.js
- unpack
Source
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