* fix(producer): a misspelled font-family resolves to the family the document declares
"Saira ExtraCondensed" in CSS next to an @import of family=Saira+Extra+Condensed
was unresolved (Google Fonts answers the typo with HTTP 400), so fail-closed
compiles threw FontFetchError. Once every existing path fails, a family whose
spelling (case, spaces, -, _, +) uniquely matches a family the document declares
in a Google Fonts @import/<link> URL or its own @font-face resolves to it. Faces
are emitted under the authored name, so every authored usage matches them. Zero
or ambiguous matches keep today's behavior.
FontFetchError gains a structured unresolvedFamilies list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(cli): font localization failures name the unresolved font families
The failure line keeps its prefix and appends the sanitized names from
FontFetchError.unresolvedFamilies, e.g.
font localization failed (FontFetchError): unresolved font families: "Foo Bar"
The error message, URLs and HTML are still never printed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(producer): keep conditional font declarations out of alias fallback
* refactor(producer): bound declared font collection complexity
* test(producer): model multi-family Google font responses
* test(producer): preserve optional font policy through alias fallback
---------
Co-authored-by: terence.cho_tai2 <terence.cho_tai2@heygen.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>