UI: draw the ▸ menu-path separator instead of a missing-glyph box

Inter and egui's built-in fallbacks have no glyph for ▸ (U+25B8), so the
command palette's "EffectCraft ▸ Settings... ▸ Appearance..." and every
"File ▸ Import" hint drew a box. JetBrains Mono, already bundled, has it:
register it as a symbol fallback for the non-monospace families.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
pravdomilandClaude Opus 5.5 committed 2026-10-11 17:37:57 +02:00
1 parent 9a7d3e7699
commit 01400f0a89
1 file changed
+20
+20
View File
@@ -340,6 +340,13 @@ pub fn install(ctx: &egui::Context, t: &Tokens, language: &str) {
fonts.families.entry(FontFamily::Monospace).or_default().insert(0, "jbmono".into());
fonts.families.insert(FontFamily::Name("semibold".into()), vec!["inter-semibold".into(), "inter".into()]);
fonts.families.insert(FontFamily::Name("medium".into()), vec!["inter-medium".into(), "inter".into()]);
// Inter and egui's own fallbacks have no small triangles (the `▸` of "File ▸ Import"), which
// would draw as missing-glyph boxes: JetBrains Mono fills in the symbols the others lack.
for (family, stack) in &mut fonts.families {
if *family != FontFamily::Monospace {
stack.push("jbmono".into());
}
}
install_script_fallbacks(&mut fonts, language);
ctx.set_fonts(fonts);
apply_visuals(ctx, t);
@@ -649,6 +656,19 @@ mod tests {
install_script_fallbacks(&mut english, "en");
}
#[test]
fn interface_symbols_have_a_glyph_in_every_family() {
let ctx = egui::Context::default();
install(&ctx, &Tokens::for_kind(Default::default()), "en");
ctx.run_ui(Default::default(), |_| {}).textures_delta.clear();
for family in [FontFamily::Proportional, FontFamily::Monospace, FontFamily::Name("medium".into()), FontFamily::Name("semibold".into())] {
let id = FontId::new(12.0, family);
for c in "▸•›·▶◀●○⚠…×".chars() {
assert!(ctx.fonts_mut(|f| f.has_glyph(&id, c)), "{c} has no glyph in {id:?}");
}
}
}
#[test]
fn hangul_gets_a_face_when_one_is_installed() {
use effectcraft_text::fonts;