| Crates.io | iconflow |
| lib.rs | iconflow |
| version | 1.0.0 |
| created_at | 2025-12-21 13:38:00.625174+00 |
| updated_at | 2025-12-21 13:38:00.625174+00 |
| description | Unified icon library for Rust GUI apps with 10+ embedded icon packs (Bootstrap, Heroicons, Phosphor, Lucide, Tabler). Type-safe API for egui, iced and more |
| homepage | https://github.com/FerrisMind/iconflow |
| repository | https://github.com/FerrisMind/iconflow |
| max_upload_size | |
| id | 1997975 |
| size | 40,935,100 |
Enable at least one pack feature so the fonts and icon data are included.
[dependencies]
iconflow = { version = "1.0", features = ["all-packs"] }
See docs/quickstart.md for a fast end-to-end setup guide and API overview.
fonts() returns the enabled font assets for registered packs.try_icon(pack, name, style, size) resolves an icon reference or returns IconError.list(pack) returns the icon names for a pack.
Register every FontAsset in egui::FontDefinitions, then render IconRef.codepoint with
FontFamily::Name(icon.family):
use eframe::egui::{self, FontData, FontDefinitions, FontFamily, FontId, RichText};
use iconflow::{fonts, try_icon, Pack, Size, Style};
use std::sync::Arc;
fn install_icon_fonts(ctx: &egui::Context) {
let mut definitions = FontDefinitions::default();
let fallback_fonts: Vec<String> = definitions.font_data.keys().cloned().collect();
for font in fonts() {
definitions.font_data.insert(
font.family.to_string(),
Arc::new(FontData::from_static(font.bytes)),
);
let family = definitions
.families
.entry(FontFamily::Name(font.family.into()))
.or_default();
family.insert(0, font.family.to_string());
for fallback in &fallback_fonts {
if fallback != font.family {
family.push(fallback.clone());
}
}
}
ctx.set_fonts(definitions);
}
fn icon_label(ui: &mut egui::Ui) {
let samples = [
(Pack::Bootstrap, "alarm", Style::Regular, Size::Regular),
(Pack::Bootstrap, "alarm", Style::Filled, Size::Regular),
(Pack::Heroicons, "academic-cap", Style::Filled, Size::Regular),
];
for (pack, name, style, size) in samples {
let icon = try_icon(pack, name, style, size).expect("icon missing");
let glyph = char::from_u32(icon.codepoint).unwrap_or('?');
let font_id = FontId::new(32.0, FontFamily::Name(icon.family.into()));
ui.label(RichText::new(glyph.to_string()).font(font_id));
}
}
Runnable example: cargo run --example egui_demo --features all-packs
In iced 0.14, fonts are loaded asynchronously via Task. Load the bytes from fonts() and
render a glyph with Font::with_name once loading completes.
use iced::{Task, font};
use iced::widget::text;
use iconflow::{fonts, try_icon, Pack, Size, Style};
#[derive(Debug, Clone)]
enum Message {
FontLoaded(Result<(), font::Error>),
}
fn load_all_fonts() -> Task<Message> {
Task::batch(fonts().iter().map(|font| {
font::load(font.bytes).map(Message::FontLoaded)
}))
}
fn icon_text() -> iced::widget::Text<'static> {
let icon = try_icon(Pack::Bootstrap, "alarm", Style::Regular, Size::Regular)
.expect("icon missing");
let glyph = char::from_u32(icon.codepoint).unwrap_or('?');
text(glyph.to_string())
.size(48)
.font(iced::font::Font::with_name(icon.family))
}
Runnable example: cargo run --example iced_demo --features all-packs
Example READMEs: examples/egui_demo/README.md, examples/iced_demo/README.md.
See docs/faq.md.
cargo xtask gen regenerates src/generated/** from assets/maps/*.json.cargo xtask gen --check verifies generated output without writing files.iconflow includes icon fonts from 14 open-source icon packs. All fonts are distributed under permissive licenses (MIT, Apache-2.0, or ISC).
| Icon Pack | License | Source |
|---|---|---|
| Bootstrap Icons | MIT | twbs/icons |
| Carbon Icons | Apache-2.0 | carbon-design-system/carbon-icons |
| Devicon | MIT | devicons/devicon |
| Feather Icons | MIT | feathericons/feather |
| Fluent UI System Icons | MIT | microsoft/fluentui-system-icons |
| Heroicons | MIT | tailwindlabs/heroicons |
| Iconoir | MIT | iconoir-icons/iconoir |
| Ionicons | MIT | ionic-team/ionicons |
| Lobe Icons | MIT | lobehub/lobe-icons |
| Lucide | ISC | lucide-icons/lucide |
| Octicons | MIT | primer/octicons |
| Phosphor Icons | MIT | phosphor-icons/web |
| Remix Icon | Apache-2.0 | Remix-Design/remixicon |
| Tabler Icons | MIT | tabler/tabler-icons |
Total: 34 TTF font files across 14 icon packs.
iconflow is built on top of these excellent open-source icon libraries. We are grateful to all the contributors and maintainers of these projects:
All icon fonts are converted from their original SVG sources and embedded as TTF files in this project. The fonts are included in the crate binary when corresponding feature flags are enabled.
This project is licensed under MIT License.
Third-party dependencies and fonts have their own licenses. See: