bevy_ui_bits 0.14.0

A tiny and opinionated collection of UI components for Bevy
Documentation
use bevy::{color::palettes, input::keyboard::KeyboardInput, prelude::*};
use bevy_ui_bits::*;

const JUMPS_TEXT_ID: usize = 1;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "HUD Example".to_string(),
                ..default()
            }),
            ..default()
        }))
        .add_systems(Startup, (spawn_camera, spawn_hud).chain())
        .add_systems(Update, handle_input)
        .run();
}

fn spawn_camera(mut commands: Commands) {
    commands.spawn(Camera2d::default());
}

fn spawn_hud(mut commands: Commands) {
    let font = &Handle::default();

    let root = Root::new()
        .padding(UiRect::all(Val::Px(20.0)))
        .justify_between();

    let top = Container::width(Val::Percent(100.0))
        .row()
        .justify_between();
    let bottom = Container::new();

    let level = EmbossedText::medium("Level 1", font).color(palettes::css::GOLDENROD.into());
    let jumps = DynamicTextBuilder::medium("Jumps: ", font)
        .initial_dynamic_text("0")
        .id(JUMPS_TEXT_ID);
    let instructions = SimpleText::small("Press [SPACE] to jump", font);

    commands.spawn((
        root,
        children![
            (top, children![level, jumps.build()]),
            (bottom, children![instructions])
        ],
    ));
}

fn handle_input(
    mut writer: TextUiWriter,
    mut keyboard_input_events: EventReader<KeyboardInput>,
    mut texts: Query<(Entity, &DynamicTextData)>,
) {
    for event in keyboard_input_events.read() {
        if event.state.is_pressed() {
            match event.key_code {
                KeyCode::Space => {
                    for (entity, data) in texts.iter_mut() {
                        if matches!(data.id, JUMPS_TEXT_ID) {
                            if let Some(mut text) = writer.get_text(entity, 1) {
                                *text =
                                    format!("{}", text.as_str().parse::<usize>().unwrap_or(0) + 1);
                            }
                        }
                    }
                }
                _ => break,
            }
        }
    }
}