Files
solvecraft/docs/fonts.md

2.4 KiB

Interface fonts

SolidCraft bundles IBM Plex Sans as its default interface font on desktop and web. The unmodified variable font provides regular (400), medium (500), semibold (600) and bold (700) faces. Titles and selected labels use semibold; compass letters and the primary OK action use bold. Selection fields and status messages use medium. Numeric fields and sketch dimensions use IBM Plex Mono Regular.

Both fonts are licensed under the SIL Open Font License 1.1. Their licence texts are in assets/fonts/ibm-plex-sans/OFL.txt and assets/fonts/ibm-plex-mono/OFL.txt; provenance is recorded in ATTRIBUTION.md.

The ui_font preference puts the chosen font first in every sans family, including the three weighted families. A chosen static font retains its own weight; SolidCraft does not simulate bold by drawing text twice. Clearing the preference restores Plex. Monospace fields keep Plex Mono.

Egui's symbol and emoji fallbacks remain available. Desktop also appends the available Japanese/Chinese, Hangul and Thai system fonts to every family, ordered for the selected language. The web app installs Plex at startup and adds its bundled Japanese font asynchronously when needed, preserving the interface faces and any font preference.

Type scale and metrics

Text sizes come from theme::Tokens, with identical values in the light and dark palettes in assets/styles/ui/palettes.rs. The compact scale runs from font_badge (9.5 pt) through font_heading (14 pt). Special roles preserve the existing designs: font_triad (8), font_compass (13.5), font_subtitle (15), font_intro (16), font_article_heading (17), font_title (22), and font_display (26). Scaled labels derive from these tokens. Weight helpers in fonts.rs choose the family independently of size.

Dense forms also use tokens for control height/radius, label width, row gap, header/footer/card dimensions, icons, text insets, checkbox and action heights, and section letter spacing. Existing space_* tokens supply shared padding. The font_literals_tests source guard scans production Rust, including the viewport icon sources, and rejects numeric font sizes, private font families outside fonts.rs, and direct dense-form spacing literals. Its small per-file allowance table documents graphic spinner diameters; it permits no text sizes. Run it with cargo test -p solidcraft-ui-egui --lib font_literals_tests.