1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//! mirui — a `no_std`, ECS-driven UI framework for embedded, desktop,
//! and (planned) WebAssembly. Renders with 24.8 fixed-point subpixel
//! precision on a software rasterizer designed for MCUs without an FPU;
//! optionally runs on top of SDL2 (CPU or hardware-accelerated) on
//! desktop.
//!
//! # Quick Start
//!
//! ```toml
//! [dependencies]
//! mirui = { version = "0.24", features = ["sdl"] }
//! ```
//!
//! The snippet below builds against mirui's default features and is
//! verified by `cargo test --doc`. Swap `FramebufSurface` for
//! `mirui::surface::sdl::SdlSurface::new("hello", 480, 320)` (with the
//! `sdl` feature) to run on a desktop window instead of into a
//! user-supplied flush callback.
//!
//! ```no_run
//! use mirui::prelude::*;
//! use mirui::surface::framebuf::FramebufSurface;
//! use mirui::draw::texture::ColorFormat;
//! use mirui::types::Rect;
//!
//! let backend = FramebufSurface::with_format(
//! 480, 320, ColorFormat::RGBA8888,
//! |_bytes: &[u8], _area: &Rect| { /* push to your display */ },
//! );
//! let mut app = App::new(backend);
//! app.with_default_widgets().with_default_systems();
//!
//! let root = WidgetBuilder::new(&mut app.world)
//! .bg_color(ColorToken::Surface)
//! .id();
//!
//! ui! {
//! :(
//! parent: root
//! world: &mut app.world
//! :)
//!
//! header (
//! bg_color: ColorToken::Primary,
//! text_color: ColorToken::OnPrimary,
//! text: "Hello mirui!",
//! border_radius: 8
//! ) {}
//! };
//!
//! app.set_root(root);
//! app.run();
//! ```
//!
//! # Other targets
//!
//! mirui also runs bare-metal on RISC-V and ARM Cortex-M MCUs through
//! [`surface::framebuf::FramebufSurface`], and a Cargo workspace
//! template builds the same UI code on both desktop and embedded
//! targets unchanged. The full walkthrough — including ESP32-C3
//! wiring, the workspace layout, and a recipe for adding new target
//! crates — lives in [`docs/quickstart.md`][quickstart].
//!
//! [quickstart]: https://github.com/W-Mai/mirui/blob/main/docs/quickstart.md
//!
//! # Module map
//!
//! - [`app`]: the [`App`][app::App] entry point and [`Plugin`][plugin::Plugin] trait.
//! - [`ecs`]: World, Entity, Component, Resource, Query, System, SystemScheduler.
//! - [`widget`]: widget tree primitives (Style, ComputedRect, View, Theme, Dirty).
//! - [`components`]: built-in widgets — buttons, sliders, lazy lists, effects.
//! - [`draw`]: software rasterizer, paths, textures, draw commands.
//! - [`surface`]: backend trait + bundled SDL2 / framebuffer / SDL_GPU implementations.
//! - [`event`]: input dispatch, gestures, hit-testing, focus.
//! - [`anim`]: easing, springs, motion components.
//! - [`layout`]: flexbox + absolute positioning + dimension types.
//! - [`plugins`]: bundled `App` plugins (clock, perf, FPS, input feedback).
extern crate alloc;
// Lets `trace_span!` / `trace_fn` expand to `mirui::perf::enter(...)`
// uniformly — the crate has to be able to refer to itself by name
// for the absolute path to resolve in our own modules.
extern crate self as mirui;
pub use ;
/// `use mirui::prelude::*;` brings in the types and macros that nearly
/// every application file needs: `App`, the layout module, `Color` /
/// `Dimension` / `Fixed`, `Entity` / `World`, the widget builder, theme
/// tokens, and the `ui!` macro. Surface backends, individual widget
/// kinds, and plugins stay on their canonical paths so the prelude
/// doesn't pin a platform choice.