dioxus-iconify 0.3.0

CLI tool for vendoring [Iconify](https://icon-sets.iconify.design/) icons (material, lucid, heroicons,....) in Dioxus projects
Documentation

dioxus-iconify

CLI tool for vendoring Iconify icons (material, lucid, heroicons,....) in Dioxus projects

Crates.io License GitHub Downloads (all assets, all releases)

Use any of the 275,000+ icons from Iconify in your Dioxus applications with a simple CLI tool. Icons are generated at build time as Rust source code, eliminating runtime dependencies.

✨ Features

  • 🎨 275k+ Icons: Access icons from Material Design, Heroicons, FontAwesome, Lucide, and 200+ other icon sets
  • πŸ¦€ Type-Safe: Generated as Rust const values, checked at compile time
  • πŸ“¦ Zero Runtime Dependencies: No need to depend on this crate at compile time and runtime - only Dioxus
  • πŸ—‚οΈ Well Organized: Icons grouped by collection in separate files
  • 🎯 Fully Customizable: Override any SVG attribute (size, color, stroke, etc.)
  • πŸ’Ύ Git-Friendly: Generated code is committed to your repository
  • ⚑ CLI-Based: Simple add command inspired by shadcn-ui and dioxus components

πŸš€ Quick Start

Installation

cargo install dioxus-iconify

# via cargo-binstall
cargo binstall dioxus-iconify

# brew (mac & linux)
brew install davidB/tap/dioxus-iconify

# via mise (cli or configuration file)
mise install "ubi:davidB/dioxus-iconify"

# curl + bash script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/davidB/dioxus-iconify/releases/download/latest/dioxus-iconify-installer.sh | sh

Usage

  1. Choose your icons on Iconify - home of open source icons

  2. Add icons to your project:

# Add single icon
dioxus-iconify add mdi:home

# Add multiple icons
dioxus-iconify add mdi:home mdi:account heroicons:arrow-left

# Specify custom output directory
dioxus-iconify --output src/components/icons add lucide:settings
  1. Use in your Dioxus components:
mod icons;
use crate::icons::{Icon, mdi};

use dioxus::prelude::*;

fn App() -> Element {
    rsx! {
        div {
            // Basic usage
            Icon { data: mdi::Home }

            // Custom size
            Icon {
                data: mdi::Home,
                size: "1.2em", // for same width & height
            }

            Icon {
                data: mdi::Home,
                width: 42,
                height: "24",
            }

            // Custom color and style
            Icon {
                data: mdi::Home,
                fill: "blue",
                class: "icon-class",
            }
        }
    }
}

Create a module to alias other icons/app.rs

// My application iconset
// - aliasing icon from other iconset to not expose other iconset outside
pub use super::heroicons::ArrowLeft;
pub use super::mdi::Home as MyHome;

Only pub this module in icons/mod.rs (to redo after each dioxus-iconify update)

// ...
pub mod app;
mod heroicons;
mod mdi;

Use icons data from icons::app::*;

mod icons;
use crate::icons::{Icon, app};

use dioxus::prelude::*;

fn App() -> Element {
    rsx! {
        div {
            Icon { data: app::MyHome }
            Icon { data: app::ArrowLeft }
        }
    }
}

πŸ“š How It Works

The Problem

Existing Dioxus icon libraries typically bundle all icons in the crate, leading to:

  • Large dependency sizes
  • Slower compile times
  • Including icons you don't use

The Solution

dioxus-iconify takes inspiration from shadcn-ui: instead of shipping icons as a dependency, it generates the icon code directly in your project.

What Gets Generated

When you run dioxus-iconify add mdi:home heroicons:arrow-left, it creates:

src/icons/
β”œβ”€β”€ mod.rs         # Icon component + IconData struct + module declarations
β”œβ”€β”€ mdi.rs         # Material Design Icons: Home, ...
└── heroicons.rs   # Heroicons: ArrowLeft, ...

src/icons/mod.rs:

// Auto-generated by dioxus-iconify - DO NOT EDIT
use dioxus::prelude::*;

#[derive(Clone, Copy, PartialEq)]
pub struct IconData {
    pub name: &'static str,
    pub body: &'static str,
    pub view_box: &'static str,
    pub width: &'static str,
    pub height: &'static str,
}

#[component]
pub fn Icon(
    data: IconData,
    /// Optional size to set both width and height
    #[props(default, into)]
    size: String,
    /// Additional attributes to extend the svg element
    #[props(extends = GlobalAttributes)]
    attributes: Vec<Attribute>,
) -> Element {
    let (width, height) = if size.is_empty() {
        (data.width, data.height)
    } else {
        (size.as_str(), size.as_str())
    };

    rsx! {
        svg {
            view_box: "{data.view_box}",
            width: "{width}",
            height: "{height}",
            dangerous_inner_html: "{data.body}",
            ..attributes,
        }
    }
}

pub mod heroicons;
pub mod mdi;

src/icons/mdi.rs:

// Auto-generated by dioxus-iconify - DO NOT EDIT
// Collection: mdi

use super::IconData;

pub const Home: IconData = IconData {
    name: "mdi:home",
    body: r#"<path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>"#,
    view_box: "0 0 24 24",
    width: "24",
    height: "24",
};

🎨 Icon Customization

The Icon component uses Dioxus 0.7's extends = GlobalAttributes pattern, allowing you to override any SVG attribute:

Icon {
    data: mdi::Home,
    // Size
    width: "48",
    height: "48",

    // Color
    fill: "currentColor",
    stroke: "#000000",
    stroke_width: "2",

    // CSS
    class: "my-icon hover:text-blue-500",
    style: "margin: 1rem;",

    // Accessibility
    aria_label: "Home icon",
    role: "img",

    // Any other SVG attribute...
}

πŸ” Finding Icons

Browse available icons at:

Icon names follow the format collection:icon-name:

  • mdi:home - Material Design Icons
  • heroicons:arrow-left - Heroicons
  • lucide:settings - Lucide
  • fa:github - Font Awesome
  • simple-icons:rust - Simple Icons

πŸ“– CLI Commands

add

Add icons to your project:

dioxus-iconify add <icon>...

# Examples
dioxus-iconify add mdi:home
dioxus-iconify add mdi:home mdi:account heroicons:arrow-left
dioxus-iconify --output src/components/icons add lucide:settings

init

Initialize the icons directory (creates mod.rs):

dioxus-iconify init

Coming Soon

  • remove - Remove icons from your project
  • list - List all generated icons
  • update - Re-fetch and update all icons

πŸ†š Comparison with Other Solutions

Feature dioxus-iconify Embedded Libraries SVG Files
Icon Count 275,000+ Limited Manual
Uptodate Icons βœ… Depends Manual
Dependency Size 0 (CLI only) Large 0
Type Safety Mixed βœ… ❌
Customization Full Limited Full
Fixes/workaround Full Take time Full
Offline Support βœ… (committed) βœ… βœ…
Updates CLI command Crate update Manual

Some Embedded libraries of icons for dioxus: dioxus-free-icons, dioxus-material-icons, dioxus-heroicons, ...

Search Results for 'dioxus icons' - crates.io: Rust Package Registry

πŸ’‘ Tips

  1. Commit generated code: The src/icons/ directory should be committed to version control
  2. Customize the Icon component: It's generated in your project, so modify it if needed
  3. Use with Tailwind: Icon colors work with Tailwind's text-* classes via currentColor
  4. Organization: Icons are automatically grouped by collection in separate files

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

πŸ™ Acknowledgments

  • Dioxus - The amazing Rust UI framework
  • Iconify - For providing the amazing icon API and collections

For inspiration

  • shadcn-ui - For inspiration on the CLI-based generation approach
  • Dioxus Components - Like shadcn but for dioxus
  • iconmate - For similar ideas in the TypeScript ecosystem

πŸ“š Resources