Lepticons
August 11, 2026 ยท View on GitHub
Icon toolkit for Leptos, powered by Lucide icons. 1,700 icons, an embeddable picker, and animations -- shipped as <Icon glyph=LucideGlyph::Search />.
Live demo & icon browser at lepticons.9bits.cc
<DrawIcon /> -- stroke draw-in, no runtime, no JSON payload
Why lepticons?
- Category features, not per-icon features. 42 category flags cover ~1,700 icons. Pick
arrows + navigation + textand the rest is dead code -- nocargo buildtime blowup from thousands of feature gates. - Always-fresh Lucide. Weekly automated PR pulls the upstream
lucidesubmodule and regenerates the icon data. No stale forks. - More than icons. Drop-in
<IconPickerPopover>for users who need to pick icons at runtime, plus stroke draw-in / spin / pulse animations. - Type-safe enum, no string lookups.
LucideGlyph::Heartis a&'static strunder the hood; misspelling fails at compile time. - Framework-agnostic data layer. Use
lepticons-datastandalone if you only need search + metadata without a Leptos rendering layer.
Crates
| Crate | Description |
|---|---|
lepticons | Leptos Icon and CustomIcon components; re-exports the lepticons-data surface (crates.io, docs.rs) |
lepticons-data | Framework-agnostic data layer -- LucideGlyph enum, search, categories, 42 category features (crates.io, docs.rs) |
lepticons-picker | Embeddable icon picker -- search, grid, category filter, popover (crates.io, docs.rs) |
lepticons-animate | Icon animations -- stroke draw-in, spin, pulse, bounce, ping (crates.io, docs.rs) |
demo | Demo app deployed to lepticons.9bits.cc |
codegen | Code generator that reads Lucide SVGs and produces lepticons-data/src/lucide_icon_data.rs |
Most users only need lepticons; it re-exports everything from lepticons-data. Depend on lepticons-data directly only if you want the icon enum + search without a Leptos rendering layer.
Quick start
cargo add lepticons
use lepticons::{Icon, LucideGlyph};
// Render an icon
view! { <Icon glyph=LucideGlyph::Search /> }
// With props
view! { <Icon glyph=LucideGlyph::Heart class="text-red-500" size="32" /> }
Trim binary size with category features
The default feature set bundles all 42 categories. Opt out and pick only what you use:
[dependencies]
lepticons = { version = "0.13", default-features = false, features = [
"arrows",
"navigation",
"text",
] }
See lepticons/Cargo.toml for the full category list.
Pick icons at runtime
use lepticons::LucideGlyph;
use lepticons_picker::IconPickerPopover;
use leptos::prelude::*;
let (icon, set_icon) = signal(None::<LucideGlyph>);
view! {
<IconPickerPopover
selected=icon
on_select=Callback::new(move |g| set_icon.set(Some(g)))
>
<button>"Choose icon"</button>
</IconPickerPopover>
}
See each crate's README and docs.rs/lepticons for the full API.
Building
# Library
cargo clippy -p lepticons --all-targets -- -D warnings && cargo test -p lepticons
# Demo (requires wasm32-unknown-unknown target)
cd demo && trunk serve
# Code generator (regenerates lepticons-data/src/lucide_icon_data.rs)
cd codegen && cargo run --bin lepticons-codegen
Lucide submodule
git clone --recurse-submodules https://github.com/eugener/lepticons.git
# or after clone:
git submodule update --init
License
MIT -- see LICENSE.
Bundled Lucide icon assets are MIT-licensed by the Lucide / Feather authors. See NOTICE for attribution.