Website | Documentation | Discord | Main branch Docs
Freya is a cross-platform and non-web GUI library for Rust powered by π¨ Skia.
- Introduction
- Development Setup
- Documentation
- Differences with Dioxus
- Contributing
- Support Development
fn app() -> Element {
let mut count = use_signal(|| 0);
rsx!(
rect {
height: "50%",
width: "100%",
main_align: "center",
cross_align: "center",
background: "rgb(0, 119, 182)",
color: "white",
shadow: "0 4 20 5 rgb(0, 0, 0, 80)",
label {
font_size: "75",
font_weight: "bold",
"{count}"
}
}
rect {
height: "50%",
width: "100%",
main_align: "center",
cross_align: "center",
direction: "horizontal",
Button {
onclick: move |_| count += 1,
label { "Increase" }
}
Button {
onclick: move |_| count -= 1,
label { "Decrease" }
}
}
)
} |
This is Freya's website landing page made with Freya itself:
An animated drag and drop.
Animated transition between router pages.
More Examples
Valin βοΈ is a Work-In-Progress cross-platform code editor, made with Freya π¦ and Rust, by me.
Make sure to have Development Setup ready.
β οΈ If you happen to be on Windows usingwindows-gnu
and get compile errors, maybe go check this issue.
Clone this repo and run:
cargo run --example counter
You can also try freya-template
Add Freya and Dioxus as dependencies:
freya = "0.3"
dioxus = { version = "0.6", features = ["macro", "hooks"], default-features = false }
If you are interested in contributing please make sure to have read the Contributing guide first!
- βοΈ Built-in components (button, scroll views, switch and more)
- π Built-in hooks (animations, text editing and more)
- π Built-in developer tools (tree inspection, fps overlay)
- π§° Built-in headless runner to test UI
- π¨ Theming support
- π©οΈ Cross-platform (Windows, Linux, MacOS)
- πΌοΈ SKSL Shaders support
- π Multi-line text editing
- π¦Ύ Accessibility support
- π§© Compatible with dioxus-sdk and other Dioxus renderer-agnostic libraries
- Performant and low memory usage
- Good developer experience
- Cross-platform support
- Decent Accessibility support
- Useful testing APIs
- Useful and extensible built-in components and hooks
Freya uses some of the core crates from Dioxus. This means that you will effectively be creating Dioxus components using RSX and hooks.
However, thanks to Dioxus being a renderer-agnostic library, you and your app will NOT be using Webviews, JavaScript, HTML, CSS, or any other abstraction that ends up using one of those or other web technologies.
Freya does everything on its own when it comes to:
- Elements
- Styling
- Layout
- Events
- Rendering
- Testing
- Built-in components and hooks
- Editing
- Animating
...and more. Dioxus is only used for managing app components (hooks, lifecycle, state, RSX), while everything else is managed by Freya.
Freya is not meant to be a drop-in alternative to Dioxus renderers but a GUI library on its own.
Below is a comparison of the main differences between Freya and the official Dioxus renderers for Desktop (WebView and Blitz):
Category | Freya | Dioxus Renderers |
---|---|---|
Elements, attributes, and events | Custom | HTML |
Layout | Custom (Torin ) |
CSS or Taffy |
Styling | Custom | CSS |
Renderer | Skia | WebView or WGPU |
Components library | Custom (freya-components ) |
None, but can use HTML elements and CSS libraries |
Devtools | Custom (freya-devtools ) |
Provided in WebView |
Headless testing runner | Custom (freya-testing ) |
None, but tools like Playwright and similar are available |
If you are interested in supporting the development of this project feel free to donate to my Github Sponsor page.
Thanks to my sponsors for supporting this project! π
- Jonathan Kelley and Evan Almloff for making Dioxus and all their help, specially when I was still creating Freya.
- Armin for making rust-skia and all his help and making the favor of hosting prebuilt binaries of skia for the combo of features use by Freya.
- geom3trik for helping me figure out how to add incremental rendering.
- Tropical for this contributions to improving accessibility and rendering.
- Aiving for having made heavy contributions to rust-skia for better SVG support, and helped optimizing images rendering in Freya.
- RobertasJ for having added nested parenthesis to the
calc()
function and also pushed for improvements in the animation APIs. - And to the rest of contributors and anybody who gave me any kind of feedback!