# Valerie [![CI](https://github.com/emmanuelantony2000/valerie/workflows/CI/badge.svg)]( https://github.com/emmanuelantony2000/valerie/actions) [![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)]() [![Cargo](https://img.shields.io/crates/v/valerie.svg)]( https://crates.io/crates/valerie) [![Documentation](https://docs.rs/valerie/badge.svg)]( https://docs.rs/valerie) [![Discord](https://img.shields.io/discord/731850006713204777)](https://discord.gg/xx2sArF) Rust front-end framework for building web apps. *Valerie is still in a very early phase. A lot of features are not available at the moment. A lot of work is left and you are welcome to try it out.* - No Virtual DOM. - UI can be made in a simple manner, by following an MVVM architecture rather an MVC architecture. - Use state variables to update the UI where required. - Written without any unsafe code. ## Architecture - Every UI element has to implement the `Component` trait. - A page is a function which returns a `Node`. - Two type of State variables - `StateAtomic` for types implementing `Copy`. - `StateMutex` for types implementing `Clone`. ## Setting up - Run `cargo new --lib some_name` - Add `valerie` to the dependencies - Create a `static` directory and create an `index.html` inside it ```html Title ``` - Also in the `Cargo.toml` enable lto. ```toml [profile.release] lto = true opt-level = 3 ``` - Compile it using [`wasm-pack`](https://github.com/rustwasm/wasm-pack) by running `wasm-pack build --target web --out-name wasm --out-dir ./static` - Use some server, like [`miniserve`](https://github.com/svenstaro/miniserve), to host the `./static` folder and try it out. Take a look at `wasm-pack` [docs](https://rustwasm.github.io/docs/wasm-pack/) for more options. ## Examples ### Hello world ```rust use valerie::prelude::components::*; use valerie::prelude::*; fn ui() -> Node { h1!("Hello World").into() } #[valerie(start)] pub fn run() { App::render_single(ui()); } ``` ### Add and Subtract one using a Button ```rust use valerie::prelude::components::*; use valerie::prelude::*; fn ui() -> Node { let value = StateAtomic::new(0isize); div!( h1!("Value ", value.clone()), button!("Add 1") .on_event("click", value.clone(), move |x, _| { *x += 1; }), button!("Subtract 1") .on_event("click", value.clone(), move |x, _| { *x -= 1; }) ) .into() } #[valerie(start)] pub fn run() { App::render_single(ui()); } ``` ### Time Counter ```rust use valerie::prelude::components::*; use valerie::prelude::*; use wasm_timer::Delay; fn ui() -> web_sys::Node { let timer = StateAtomic::new(0); execute(time(1, timer.clone())); p!("Seconds passed: ", timer).into() } async fn time(n: u64, mut timer: StateAtomic) { while Delay::new(core::time::Duration::from_secs(n)) .await .is_ok() { timer += 1; } } #[valerie(start)] pub fn run() { App::render_single(ui()); } ``` There are more examples in the examples directory. ## Missing features - Library support for CSS. - Using States for CSS. - Routing and multi-page support. - Global Variables for Multiple Pages. ## Issues and Contributing Pick out some issues and start contributing. Our contribution guidelines are available [here](https://github.com/emmanuelantony2000/valerie/blob/master/.github/CONTRIBUTING.md).