mogwai

Crates.iomogwai
lib.rsmogwai
version0.7.2
created_at2019-11-18 17:57:25.111978+00
updated_at2025-06-27 02:30:03.356096+00
descriptionThe minimal, obvious, graphical, widget application interface.
homepage
repositoryhttps://github.com/schell/mogwai
max_upload_size
id182254
size103,186
Schell Carl Scivally (schell)

documentation

https://docs.rs/mogwai/

README


mogwai

minimal, obvious, graphical widget application interface

Crates.io

mogwai is a Rust crate for building GUI applications, primarily in the browser, with cross-platform capabilities.

Overview

mogwai simplifies web app development by addressing challenges with web-sys, focusing on:

  • Element creation and styling
  • Event handling
  • Server-side rendering and cross-platform support

It offers a minimalistic and transparent approach, allowing you to structure your app freely.

Key Concepts

  • View Construction: Use the rsx! macro for intuitive view building.
  • Event Handling: Events are futures, not callbacks.
  • Cross-Platform: Traits ensure operations are cross-platform, with room for specialization.
  • Idiomatic Rust: Widgets are Rust types

Example

Here's a button that counts clicks:

use mogwai::web::prelude::*;
use wasm_bindgen::prelude::*;

#[derive(ViewChild)]
pub struct ButtonClick<V: View> {
    #[child]
    wrapper: V::Element,
    on_click: V::EventListener,
    num_clicks: Proxy<u32>,
}

impl<V: View> Default for ButtonClick<V> {
    fn default() -> Self {
        let mut num_clicks = Proxy::<u32>::default();

        rsx! {
            let wrapper = button(
                style:cursor = "pointer",
                on:click = on_click
            ) {
                // When the `num_clicks` proxy is updated it will replace this node.
                {num_clicks(n => match *n {
                    1 => "Click again.".to_string(),
                    n => format!("Clicked {n} times."),
                })}
            }
        }

        Self {
            wrapper,
            on_click,
            num_clicks,
        }
    }
}

impl<V: View> ButtonClick<V> {
    pub async fn step(&mut self) {
        let _ev = self.on_click.next().await;
        self.num_clicks.modify(|n| *n += 1);
    }
}

#[wasm_bindgen(start)]
pub fn main() {
    let mut view = ButtonClick::<Web>::default();
    mogwai::web::body().append_child(&view);
    wasm_bindgen_futures::spawn_local(async move {
        loop {
            view.step().await;
        }
    });
}

Getting Started

  1. Install the Rust toolchain from https://rustup.rs/.
  2. Install trunk.
  3. Use cargo-generate to start a new project:
cargo install cargo-generate
cargo generate --git https://github.com/schell/mogwai-template.git
cd your_project_name
trunk serve --config Trunk.toml

Resources

Community

Join the conversation on Element or via Matrix.

Support

Consider sponsoring on GitHub to support development.

Commit count: 273

cargo fmt