Install
openclaw skills install @monikazapisek/glyph-fidelityUse when checking that letterform-level detail survives a transform — all-caps tracking by a continuous formula, ligature collisions under negative tracking, and inline acronyms needing their own subrange treatment to keep paragraph color even.
openclaw skills install @monikazapisek/glyph-fidelityProtect letterform structure from the failure modes a naive tracking/case transform introduces — under- or over-tracked all-caps text, ligatures that collapse into illegible blobs under negative tracking, inline acronyms that break the paragraph's even visual "color" (texture) — and from glyphs that silently come from another font.
text-transform: uppercase, Figma textCase: "UPPER"), to compute the correct tracking rather than a guessed round number.text-typesetting Step 2 (Branch A/B) decides whether tracking is positive or negative. This skill holds the all-caps formula that Branch A uses and covers the structural side-effects (ligatures, acronym color) that Step 2 doesn't address.font-size (px).This skill is an audit, not an interview. Work in this order: read what the file or the input already says, report, then ask.
Questions this skill may need:
For any text-run transformed to uppercase, tracking (TS) is a function of font-size (FS, in px), not a fixed band:
TS = max(3%, min(12%, 160 / FS))
Reference values: 10px → +12%, 14px → +11.4%, 16px → +10%, 20px → +8%, 32px → +5%, 40px → +4%, 54px and above → +3%. The 12% cap keeps very small text from spreading apart. The 3% floor is there because all-caps text never goes to zero or negative tracking; large display headings (FS > 32px) land between +3% and +5% on their own.
This is the same formula text-typesetting Step 2 Branch A uses. There is one source for all-caps tracking, so both skills return the same number for the same size. The font-weight modifier (text-typesetting Step 2c) is applied to the result afterwards. In Figma, write it as letterSpacing = { unit: "PERCENT", value: TS }.
If Small Caps styling is required, never simulate it by shrinking the base font (fontSize × 0.8) and capitalizing — this produces thin, spindly letterforms with the wrong stroke weight relative to true small caps, which are drawn by the type designer at the correct weight. Check for and use the native OpenType feature instead:
font-variant-caps: small-caps; (or all-small-caps if lowercase-context is needed too).textNode.textCase = "SMALL_CAPS".Negative tracking (TS < -2%, per text-typesetting Step 2 Branch B at large sizes) pulls letters closer together. Built-in ligatures (fi, fl, ffi, ffl) are pre-drawn as fused glyphs — at sufficiently negative tracking, the already-fused shape can start visually colliding with its neighbors, reading as a blob rather than two/three distinct letters.
-2% on a text containing ligature-prone pairs.text-typesetting was asked to do).
font-variant-ligatures: no-common-ligatures; on the affected range.LIGA OpenType feature. textNode.getRangeOpenTypeFeatures(start, end) reads its state, but the Plugin API has no setter for OpenType features. Report the affected range and ask the user to switch ligatures off for it in the Type settings panel (Details tab). Don't report the fix as applied.A run of 3+ consecutive capital letters (HTML, ZUS, USA) inside otherwise sentence-case prose reads visually heavier and denser than the surrounding lowercase text — it creates a dark "spot" that breaks the paragraph's even visual texture (what Bringhurst calls color).
+5% on that subrange only.1px relative to the surrounding body text (a small optical correction — full-size acronyms read as shouting relative to the lowercase around them).When a font has no glyph for a character, software either shows an empty box ("tofu") or silently takes the character from a fallback font. In an interface the second case is the common one and the harder to spot: a few letters in a word come from a different typeface, slightly off in weight, width or height.
ą ć ę ł ń ó ś ź ż and their capitals), typographic quotes („ ” “), dashes (– —), ×, currency signs — set in a font that may not cover them. Check every language the interface ships in, not only the one in the mockup.textNode.hasMissingFont tells you that the whole font is unavailable to the document — report that first, since nothing else about the node can be trusted until it's resolved. A single glyph taken from a fallback font can't be read from the Plugin API: check a screenshot of the node for letters that differ from their neighbours, and say that the check was visual.font-size shown — the same value text-typesetting Branch A gives for that size.-2%; fix disables ligatures on the affected range only, doesn't further reduce tracking. In Figma it is reported as a step for the user, not applied by script.+5% tracking and -1px size, not left at body-text default.hasMissingFont reported; glyph fallback checked visually and labelled as such.liga (standard ligatures), smcp/c2sc (small caps).TextNode.textCase, TextNode.setRangeLetterSpacing, TextNode.setRangeFontSize, TextNode.getRangeOpenTypeFeatures (read-only).text-typesetting (base tracking direction/size — this skill refines edge cases on top of it), microtypography (character-level text rules independent of a design tool).