use bevy::{color::palettes::css::*, prelude::*};
fn main() {
App::new()
.add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
resolution: (800, 600).into(),
title: "Bevy CSS Grid Layout Example".to_string(),
..default()
}),
..default()
}))
.add_systems(Startup, spawn_layout)
.run();
}
fn spawn_layout(mut commands: Commands, asset_server: Res<AssetServer>) {
let font = asset_server.load("fonts/FiraSans-Bold.ttf");
commands.spawn(Camera2d);
commands
.spawn((
Node {
display: Display::Grid,
width: percent(100),
height: percent(100),
grid_template_columns: vec![GridTrack::min_content(), GridTrack::flex(1.0)],
grid_template_rows: vec![
GridTrack::auto(),
GridTrack::flex(1.0),
GridTrack::px(20.),
],
..default()
},
BackgroundColor(Color::WHITE),
))
.with_children(|builder| {
builder
.spawn(
Node {
display: Display::Grid,
grid_column: GridPlacement::span(2),
padding: UiRect::all(px(6)),
..default()
},
)
.with_children(|builder| {
spawn_nested_text_bundle(builder, font.clone(), "Bevy CSS Grid Layout Example");
});
builder
.spawn((
Node {
height: percent(100),
aspect_ratio: Some(1.0),
display: Display::Grid,
padding: UiRect::all(px(24)),
grid_template_columns: RepeatedGridTrack::flex(4, 1.0),
grid_template_rows: RepeatedGridTrack::flex(4, 1.0),
row_gap: px(12),
column_gap: px(12),
..default()
},
BackgroundColor(Color::srgb(0.25, 0.25, 0.25)),
))
.with_children(|builder| {
item_rect(builder, ORANGE);
item_rect(builder, BISQUE);
item_rect(builder, BLUE);
item_rect(builder, CRIMSON);
item_rect(builder, AQUA);
item_rect(builder, ORANGE_RED);
item_rect(builder, DARK_GREEN);
item_rect(builder, FUCHSIA);
item_rect(builder, TEAL);
item_rect(builder, ALICE_BLUE);
item_rect(builder, CRIMSON);
item_rect(builder, ANTIQUE_WHITE);
item_rect(builder, YELLOW);
item_rect(builder, DEEP_PINK);
item_rect(builder, YELLOW_GREEN);
item_rect(builder, SALMON);
});
builder
.spawn((
Node {
display: Display::Grid,
align_items: AlignItems::Start,
justify_items: JustifyItems::Center,
padding: UiRect::all(px(10)),
grid_template_rows: vec![GridTrack::auto(), GridTrack::auto(), GridTrack::fr(1.0)],
row_gap: px(10),
..default()
},
BackgroundColor(BLACK.into()),
))
.with_children(|builder| {
builder.spawn((Text::new("Sidebar"),
TextFont {
font: font.clone(),
..default()
},
));
builder.spawn((Text::new("A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely. A paragraph of text which ought to wrap nicely."),
TextFont {
font: font.clone(),
font_size: 13.0,
..default()
},
));
builder.spawn(Node::default());
});
builder.spawn((
Node {
grid_column: GridPlacement::span(2),
..default()
},
BackgroundColor(WHITE.into()),
));
builder.spawn((
Node {
position_type: PositionType::Absolute,
margin: UiRect {
top: px(100),
bottom: auto(),
left: auto(),
right: auto(),
},
width: percent(60),
height: px(300),
max_width: px(600),
..default()
},
Visibility::Hidden,
BackgroundColor(Color::WHITE.with_alpha(0.8)),
));
});
}
fn item_rect(builder: &mut ChildSpawnerCommands, color: Srgba) {
builder
.spawn((
Node {
display: Display::Grid,
padding: UiRect::all(px(3)),
..default()
},
BackgroundColor(BLACK.into()),
))
.with_children(|builder| {
builder.spawn((Node::default(), BackgroundColor(color.into())));
});
}
fn spawn_nested_text_bundle(builder: &mut ChildSpawnerCommands, font: Handle<Font>, text: &str) {
builder.spawn((
Text::new(text),
TextFont { font, ..default() },
TextColor::BLACK,
));
}