native-theme-iced
iced toolkit connector for native-theme.
Maps native_theme::ResolvedThemeVariant data to
iced's theming system, producing a fully configured iced::Theme with correct
colors for all built-in widget styles via iced's Catalog system.
Usage
Add both crates to your Cargo.toml:
[]
= "0.5.3"
= "0.5.3"
Then create an iced theme from any native-theme preset:
use ThemeSpec;
use to_theme;
// Load a preset and resolve it
let nt = preset.unwrap;
let resolved = nt.into_variant.unwrap.into_resolved.unwrap;
let theme = to_theme;
// Use `theme` as your iced application theme
Or read the OS theme at runtime:
use SystemTheme;
use to_theme;
let system = from_system.unwrap;
let theme = to_theme;
Widget Metrics
The crate exposes helper functions for widget sizing that iced applies per-widget rather than through the Catalog:
button_padding(resolved)-- horizontal and vertical paddinginput_padding(resolved)-- text input paddingborder_radius(resolved)-- standard corner radiusborder_radius_lg(resolved)-- large corner radius (e.g., dialogs)scrollbar_width(resolved)-- scrollbar track widthfont_family(resolved)-- primary UI font family namefont_size(resolved)-- primary UI font size in logical pixelsfont_weight(resolved)-- primary UI font weight (CSS 100-900)mono_font_family(resolved)-- monospace font family namemono_font_size(resolved)-- monospace font size in pixelsmono_font_weight(resolved)-- monospace font weight (CSS 100-900)line_height_multiplier(resolved)-- line height multiplier (e.g. 1.4)to_iced_weight(css_weight)-- converts CSS weight to icedWeightenum
All helpers take a &ResolvedThemeVariant reference (except to_iced_weight
which takes a u16).
Modules
| Module | Purpose |
|---|---|
palette |
Maps native-theme colors to iced's 6-field Palette |
extended |
Overrides iced's Extended palette for secondary and background.weak |
icons |
Icon role mapping, SVG widget helpers, and animated icon playback |
Custom Icons
For app-specific icons defined via native-theme-build, the connector provides:
custom_icon_to_image_handle(provider, icon_set)-- load a custom icon as an iced image handlecustom_icon_to_svg_handle(provider, icon_set, color)-- load as an SVG handle (passNonefor uncolored)
These work with any type implementing IconProvider.
Animated Icons
The connector provides helpers for displaying animated icons from
loading_indicator():
animated_frames_to_svg_handles()-- convertsAnimatedIcon::Framesto aVec<svg::Handle>for frame-based playbackspin_rotation_radians()-- computes the current rotation angle forAnimatedIcon::Transformplayback
use ;
use ;
if let Some = loading_indicator
Cache the AnimatedSvgHandles from animated_frames_to_svg_handles() -- do not
call it on every frame tick. Use Rotation::Floating (not Rotation::Solid)
for spin animations to avoid layout jitter during rotation.
Example
Run the showcase widget gallery to explore all 16 presets interactively:
Linux

macOS

Windows

The showcase displays all iced widgets (buttons, inputs, sliders, checkboxes, togglers, etc.) themed with native-theme presets, with live theme switching and a color map inspector.
License
Licensed under either of
at your option.