feat: add automated font installation system with fontconfig management

- Install fonts from Google Fonts via TOML config
- Generate fontconfig XML with optimized rendering settings
- Auto-run on config changes via chezmoi hook
- Support GitHub-sourced fonts (Iosevka) alongside Google Fonts
This commit is contained in:
2025-12-28 15:20:04 -06:00
parent ffcb41380c
commit 62c575aa92
4 changed files with 1038 additions and 0 deletions
+237
View File
@@ -0,0 +1,237 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<!--
Fontconfig Configuration
Managed by Chezmoi - edit fonts.toml for font selection
Optimized for:
- LCD displays (1080p)
- Both light and dark modes
- General readability and crisp text
-->
<fontconfig>
<!-- ============================================================
Global Rendering Settings
============================================================ -->
<!-- Enable antialiasing for smooth edges -->
<match target="font">
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
</match>
<!-- Enable hinting for sharper text -->
<match target="font">
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
</match>
<!--
Hintstyle: slight
- Best balance between shape preservation and sharpness
- Works well for both light and dark modes
- Recommended for modern LCDs
-->
<match target="font">
<edit name="hintstyle" mode="assign">
<const>hintslight</const>
</edit>
</match>
<!--
Subpixel rendering: RGB
- Standard for most LCD monitors (horizontal RGB stripe)
- Effectively triples horizontal resolution
-->
<match target="font">
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
</match>
<!--
LCD filter: default
- Reduces color fringing from subpixel rendering
- Good balance for most displays
-->
<match target="font">
<edit name="lcdfilter" mode="assign">
<const>lcddefault</const>
</edit>
</match>
<!-- Disable autohinting (use font's built-in hints) -->
<match target="font">
<edit name="autohint" mode="assign">
<bool>false</bool>
</edit>
</match>
<!-- Disable embedded bitmap fonts (use vector glyphs) -->
<match target="font">
<edit name="embeddedbitmap" mode="assign">
<bool>false</bool>
</edit>
</match>
<!-- Re-enable embedded bitmaps for emoji fonts -->
<match target="font">
<test name="family" qual="any">
<string>Noto Color Emoji</string>
</test>
<edit name="embeddedbitmap" mode="assign">
<bool>true</bool>
</edit>
</match>
<!-- ============================================================
Default Font Aliases
============================================================ -->
<!-- Sans-serif: Inter with Noto Sans fallback -->
<alias>
<family>sans-serif</family>
<prefer>
<family>Inter</family>
<family>Noto Sans</family>
<family>DejaVu Sans</family>
</prefer>
</alias>
<alias>
<family>system-ui</family>
<prefer>
<family>Inter</family>
<family>Noto Sans</family>
</prefer>
</alias>
<!-- Serif: Source Serif 4 with Noto Serif fallback -->
<alias>
<family>serif</family>
<prefer>
<family>Source Serif 4</family>
<family>Noto Serif</family>
<family>DejaVu Serif</family>
</prefer>
</alias>
<!-- Monospace: Iosevka with JetBrains Mono fallback -->
<alias>
<family>monospace</family>
<prefer>
<family>Iosevka</family>
<family>JetBrains Mono</family>
<family>DejaVu Sans Mono</family>
</prefer>
</alias>
<alias>
<family>ui-monospace</family>
<prefer>
<family>Iosevka</family>
<family>JetBrains Mono</family>
</prefer>
</alias>
<!-- Common font substitutions -->
<alias>
<family>Arial</family>
<prefer>
<family>Inter</family>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Helvetica</family>
<prefer>
<family>Inter</family>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Times New Roman</family>
<prefer>
<family>Source Serif 4</family>
<family>Noto Serif</family>
</prefer>
</alias>
<alias>
<family>Times</family>
<prefer>
<family>Source Serif 4</family>
<family>Noto Serif</family>
</prefer>
</alias>
<alias>
<family>Courier New</family>
<prefer>
<family>Iosevka</family>
<family>JetBrains Mono</family>
</prefer>
</alias>
<alias>
<family>Courier</family>
<prefer>
<family>Iosevka</family>
<family>JetBrains Mono</family>
</prefer>
</alias>
<!-- Emoji support -->
<alias>
<family>emoji</family>
<prefer>
<family>Noto Color Emoji</family>
</prefer>
</alias>
<!-- ============================================================
Font-Specific Tweaks
============================================================ -->
<!--
Iosevka: Use medium hinting for better terminal rendering
Iosevka is quite thin, so medium hinting helps legibility
-->
<match target="font">
<test name="family" qual="any">
<string>Iosevka</string>
</test>
<edit name="hintstyle" mode="assign">
<const>hintmedium</const>
</edit>
</match>
<!-- Same for Iosevka variants -->
<match target="font">
<test name="family" qual="any" compare="contains">
<string>Iosevka</string>
</test>
<edit name="hintstyle" mode="assign">
<const>hintmedium</const>
</edit>
</match>
<!--
Inter: Slight hinting works great for this font
Already using global defaults, but explicit for clarity
-->
<match target="font">
<test name="family" qual="any">
<string>Inter</string>
</test>
<edit name="hintstyle" mode="assign">
<const>hintslight</const>
</edit>
</match>
</fontconfig>
+31
View File
@@ -0,0 +1,31 @@
# Font Configuration for Chezmoi
# This file defines which fonts to install and configure.
# Fonts are sourced from Google Fonts automatically.
#
# To add a font: Just type its name - fuzzy matching will help if you misspell.
# To swap fonts: Change the primary, run `chezmoi apply`, done!
#
# Run `install-fonts.ts` manually to see available fonts or troubleshoot.
[ui]
# Sans-serif fonts for user interface elements
primary = "Inter"
fallback = "Noto Sans"
[serif]
# Serif fonts for documents and reading
primary = "Source Serif 4"
fallback = "Noto Serif"
[mono]
# Monospace fonts for code and terminals
primary = "Iosevka"
fallback = "JetBrains Mono"
[emoji]
# Emoji font for unicode emoji support
primary = "Noto Color Emoji"
# Optional: Uncomment to install accessibility-focused fonts
# [accessibility]
# primary = "Atkinson Hyperlegible"