Flexbox Model
Presentar uses a CSS Flexbox-inspired layout model.
Core Concepts
Main Axis
Direction children are laid out:
- Row: Horizontal (left to right)
- Column: Vertical (top to bottom)
Cross Axis
Perpendicular to main axis.
MainAxisAlignment
Controls spacing along main axis:
use presentar_widgets::row::MainAxisAlignment;
// Start (default)
Row::new().main_axis_alignment(MainAxisAlignment::Start)
// [A][B][C]____________
// Center
Row::new().main_axis_alignment(MainAxisAlignment::Center)
// ____[A][B][C]____
// End
Row::new().main_axis_alignment(MainAxisAlignment::End)
// ____________[A][B][C]
// SpaceBetween
Row::new().main_axis_alignment(MainAxisAlignment::SpaceBetween)
// [A]______[B]______[C]
// SpaceAround
Row::new().main_axis_alignment(MainAxisAlignment::SpaceAround)
// __[A]____[B]____[C]__
// SpaceEvenly
Row::new().main_axis_alignment(MainAxisAlignment::SpaceEvenly)
// ___[A]___[B]___[C]___
CrossAxisAlignment
Controls alignment on cross axis:
use presentar_widgets::row::CrossAxisAlignment;
// Start
Row::new().cross_axis_alignment(CrossAxisAlignment::Start)
// [A]
// [B] <- aligned to top
// Center
Row::new().cross_axis_alignment(CrossAxisAlignment::Center)
// [A]
// [B] <- centered vertically
// End
Row::new().cross_axis_alignment(CrossAxisAlignment::End)
// [A]
// [B] <- aligned to bottom
// Stretch
Row::new().cross_axis_alignment(CrossAxisAlignment::Stretch)
// [A====]
// [B====] <- fills available space
Gap
Space between children:
Row::new().gap(16.0)
// [A]--16px--[B]--16px--[C]
Nesting
Combine Row and Column:
let layout = Column::new()
.gap(16.0)
.child(
Row::new()
.main_axis_alignment(MainAxisAlignment::SpaceBetween)
.child(logo)
.child(nav)
)
.child(content)
.child(footer);
Verified Test
#[test]
fn test_flexbox_alignment() {
use presentar_widgets::Row;
use presentar_widgets::row::{MainAxisAlignment, CrossAxisAlignment};
let row = Row::new()
.main_axis_alignment(MainAxisAlignment::Center)
.cross_axis_alignment(CrossAxisAlignment::Stretch)
.gap(10.0);
assert_eq!(row.children().len(), 0);
}