| 1 |
<?xml version="1.0"?> |
| 2 |
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd"> |
| 3 |
|
| 4 |
Alloy fontconfig |
| 5 |
================ |
| 6 |
Optimized for reading. Every app that asks fontconfig for a generic |
| 7 |
family (monospace, sans-serif, serif) gets Alloy's readability picks. |
| 8 |
|
| 9 |
- monospace -> Quasi Mono (the house face: Atkinson Hyperlegible Mono |
| 10 |
plus the marks and cell furniture we draw) |
| 11 |
- sans-serif -> Quasi Body (its sans half, same superfamily, same axis) |
| 12 |
- serif -> Liberation Serif, the one serif the image installs |
| 13 |
|
| 14 |
Every family named below is installed in the image. Names that were not |
| 15 |
were deleted 2026-08-16: a preference list is read as a depth of fallback, |
| 16 |
and a name fontconfig silently skips is a claim the file cannot back. |
| 17 |
|
| 18 |
Departure Mono is *not* here — it is the Alloy brand mark, invoked |
| 19 |
by name where wanted (marquee UI, headers), never as a generic family. |
| 20 |
|
| 21 |
Source of truth: docs/STACK.md ("Fonts" section) and docs/TOKENS.md. |
| 22 |
|
| 23 |
<fontconfig> |
| 24 |
|
| 25 |
|
| 26 |
The house face, cut by `quasi-type` from Atkinson Hyperlegible Mono |
| 27 |
with the house glyph set drawn into it: box drawing, block elements, |
| 28 |
the four arrows and the seven marks Alloy's own surfaces emit. There |
| 29 |
is no Term/Mono family split any more, because there is no Private |
| 30 |
Use Area to constrain — the glyphs the Nerd Font patch was carrying |
| 31 |
are drawn into this face at its own weight and its own advance. |
| 32 |
|
| 33 |
One entry, and that is the whole chain. If it ever failed to install, |
| 34 |
monospace would not resolve to a second Alloy pick: it would drop |
| 35 |
straight into Fedora's generic rules (45-latin.conf, 60-latin.conf) |
| 36 |
and land on whatever those order first. |
| 37 |
|
| 38 |
The face is variable, `wght` 200-800, and its own default instance is |
| 39 |
ExtraLight — a cut keeps its base's default. fontconfig enumerates a |
| 40 |
variable font's named instances, so an unweighted query resolves to |
| 41 |
Regular and nothing here has to say so; a consumer that loads the file |
| 42 |
directly does have to name a weight. The build asserts the resolved |
| 43 |
weight for exactly this reason. |
| 44 |
<alias> |
| 45 |
<family>monospace</family> |
| 46 |
<prefer> |
| 47 |
<family>Quasi Mono</family> |
| 48 |
</prefer> |
| 49 |
</alias> |
| 50 |
|
| 51 |
|
| 52 |
The same superfamily as the mono, on the same axis, by the same |
| 53 |
designers, and carrying the same drawn marks. It replaced upstream |
| 54 |
Atkinson Hyperlegible, which the image used to install directly and |
| 55 |
which is now the base this is cut from. |
| 56 |
|
| 57 |
Cantarell is here because the image installs it, not as a design |
| 58 |
pick. Inter used to sit between them and is gone: it is not in the |
| 59 |
image either, so its only effect was to repoint the whole UI font |
| 60 |
for anyone who installed Inter for some unrelated app. Preferring |
| 61 |
Inter is still a supported swap, and it is an edit to this file |
| 62 |
(docs/STACK.md, "Sans"), not a side effect of having it on disk. |
| 63 |
<alias> |
| 64 |
<family>sans-serif</family> |
| 65 |
<prefer> |
| 66 |
<family>Quasi Body</family> |
| 67 |
<family>Cantarell</family> |
| 68 |
</prefer> |
| 69 |
</alias> |
| 70 |
|
| 71 |
|
| 72 |
Alloy has no serif thesis and reads nothing long in one. This names |
| 73 |
the serif the image already carries so the alias resolves somewhere |
| 74 |
known, which is a statement of fact rather than a design pick. The |
| 75 |
three Source Serif and DejaVu spellings that used to lead this list |
| 76 |
were not installed, so the file prescribed four families under a |
| 77 |
comment that said it declined to prescribe. |
| 78 |
<alias> |
| 79 |
<family>serif</family> |
| 80 |
<prefer> |
| 81 |
<family>Liberation Serif</family> |
| 82 |
</prefer> |
| 83 |
</alias> |
| 84 |
|
| 85 |
|
| 86 |
Emoji: deliberately none. |
| 87 |
|
| 88 |
This aliased `emoji` to Noto Color Emoji, which the image has never |
| 89 |
installed, so the alias resolved to whatever fontconfig picked next |
| 90 |
(Alloy's own sans, in practice) and every emoji rendered as a |
| 91 |
missing glyph anyway. An alias naming a font that is not shipped |
| 92 |
reads as an oversight; the absence is the decision, so it is written |
| 93 |
as one here rather than left as a broken preference. |
| 94 |
|
| 95 |
Alloy ships no emoji font and does not use emoji in its own copy |
| 96 |
(docs/STACK.md, and the brand rules). Emoji in a web page or a |
| 97 |
third-party notification will show as missing glyphs. Anyone who |
| 98 |
wants them installs an emoji font; nothing here has to change for |
| 99 |
that to work, because fontconfig will pick it up on its own. |
| 100 |
|
| 101 |
|
| 102 |
|
| 103 |
Rendering defaults — screen-readable, no antialiasing tricks |
| 104 |
that fight the fonts' own hinting. |
| 105 |
|
| 106 |
<match target="font"> |
| 107 |
<edit name="antialias" mode="assign"><bool>true</bool></edit> |
| 108 |
<edit name="hinting" mode="assign"><bool>true</bool></edit> |
| 109 |
<edit name="hintstyle" mode="assign"><const>hintslight</const></edit> |
| 110 |
<edit name="rgba" mode="assign"><const>rgb</const></edit> |
| 111 |
<edit name="lcdfilter" mode="assign"><const>lcddefault</const></edit> |
| 112 |
<edit name="autohint" mode="assign"><bool>false</bool></edit> |
| 113 |
</match> |
| 114 |
|
| 115 |
</fontconfig> |
| 116 |
|