import type { FontWeight, UnifiedFont, } from '../../model'; /** Valid font weight values (100-900 in increments of 100) */ const SIZES = [100, 200, 300, 400, 500, 600, 700, 800, 900]; /** * Gets the URL for a font file at a specific weight * * Constructs the appropriate URL for loading a font file based on * the font object and requested weight. Handles variable fonts and * provides fallbacks for static fonts. * * @param font - Unified font object containing style URLs * @param weight - Font weight (100-900) * @returns URL string for the font file, or undefined if not found * @throws Error if weight is not a valid value (100-900) * * @example * ```ts * const url = getFontUrl(roboto, 700); // Returns URL for Roboto Bold * * // Variable fonts: backend maps weight to VF URL * const vfUrl = getFontUrl(inter, 450); // Returns variable font URL * * // Fallback for missing weights * const fallback = getFontUrl(font, 900); // Falls back to regular/400 if 900 missing * ``` */ export function getFontUrl(font: UnifiedFont, weight: number): string | undefined { if (!SIZES.includes(weight)) { throw new Error(`Invalid weight: ${weight}`); } const weightKey = weight.toString() as FontWeight; // Try exact match (backend maps weight to VF URL for variable fonts) if (font.styles.variants?.[weightKey]) { return font.styles.variants[weightKey]; } // Fallbacks for static fonts when exact weight is missing return font.styles.regular || font.styles.variants?.['400'] || font.styles.variants?.['regular']; }