
in bengali, haalka means "light" (e.g. not heavy) and can also be used to mean "easy"
haalka is an ergonomic reactive Bevy UI library powered by the incredible FRP signals of futures-signals and the convenient async ECS of bevy-async-ecs with API ported from web UI libraries MoonZoon and Dominator.
While haalka is primarily targeted at UI and provides high level UI abstractions as such, its core abstraction can be used to manage signals-powered reactivity for any entity, not just bevy_ui nodes.
examples
use bevy::prelude::*;
use haalka::prelude::*;
fn main() {
App::new()
.add_plugins((DefaultPlugins, HaalkaPlugin))
.add_systems(Startup, (ui_root, camera))
.run();
}
#[derive(Component)]
struct Counter(Mutable<i32>);
fn ui_root(world: &mut World) {
let counter = Mutable::new(0);
El::<NodeBundle>::new()
.height(Val::Percent(100.))
.width(Val::Percent(100.))
.align_content(Align::center())
.child(
Row::<NodeBundle>::new()
.with_style(|mut style| style.column_gap = Val::Px(15.0))
.item(counter_button(counter.clone(), "-", -1))
.item(El::<TextBundle>::new().text_signal(counter.signal().map(text)))
.item(counter_button(counter.clone(), "+", 1))
.update_raw_el(move |raw_el| raw_el.insert(Counter(counter))),
)
.spawn(world);
}
fn counter_button(counter: Mutable<i32>, label: &str, step: i32) -> impl Element {
let hovered = Mutable::new(false);
El::<NodeBundle>::new()
.width(Val::Px(45.0))
.align_content(Align::center())
.background_color_signal(
hovered
.signal()
.map_bool(|| Color::hsl(300., 0.75, 0.85), || Color::hsl(300., 0.75, 0.75))
.map(BackgroundColor),
)
.hovered_sync(hovered)
.on_click(move || *counter.lock_mut() += step)
.child(El::<TextBundle>::new().text(text(label)))
}
fn text(text: impl ToString) -> Text {
Text::from_section(
text.to_string(),
TextStyle {
font_size: 30.0,
..default()
},
)
}
fn camera(mut commands: Commands) {
commands.spawn(Camera2dBundle::default());
}
cargo run --example counter cargo run --example button cargo run --example align cargo run --example scroll cargo run --example scroll_grid cargo run --example snake cargo run --example ecs_ui_sync cargo run --example key_values_sorted
cargo run --example challenge01 cargo run --example challenge02 cargo run --example challenge03 cargo run --example challenge04 cargo run --example challenge05
One can also run the example with just (cargo install just), e.g. just example snake -r.
Bevy compatibility
license
All code in this repository is dual-licensed under either:
at your option.
Assets used in examples may be licensed under different terms, see the examples README.
your contributions
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.