michiu_ui 0.0.3

The michiu library handles layout and rendering.
use crate::{
    app::theme::Theme,
    components::{label_style, section_title},
};
pub use michiu_ui::prelude::*;

pub fn container() -> Element {
    v_flex(ts().gap(24.0).p(16.0)).children([
        style_container(),
        weight_container(),
        length_container(),
        align_container(),
        color_container(),
    ])
}

fn section_style() -> ThisStyle {
    ts().grow().gap(14.0)
}

fn wrapper_style() -> ThisStyle {
    ts().w_full().gap(14.0)
}

fn base(change: bool) -> ThisStyle {
    let s = ts()
        .p(12.0)
        .r(4.0)
        .size((170.0, 75.0))
        .justify_center()
        .items_center()
        .p(10.0)
        .r(4.0)
        .hovered(ts().bg_color(dynamic(|t: &Theme| t.background_hover)));

    if change {
        s
    } else {
        s.border_color(dynamic(|t: &Theme| t.border))
    }
}

fn style_container() -> Element {
    let solid = flex(base(false).border_solid(2.0)).label("solid", label_style());
    let dashed = flex(base(false).border_dashed(2.0)).label("dashed", label_style());
    let dotted = flex(base(false).border_dotted(2.0)).label("dotted", label_style());
    let double = flex(base(false).border_double(4.0)).label("double", label_style());

    v_flex(section_style()).children([
        section_title("Border Style"),
        h_flex(wrapper_style()).children([solid, dashed, dotted, double]),
    ])
}

fn weight_container() -> Element {
    let one = flex(base(false).border_solid(1.0)).label("1.0 px", label_style());
    let two = flex(base(false).border_solid(2.0)).label("2.0 px", label_style());
    let four = flex(base(false).border_solid(4.0)).label("4.0 px", label_style());
    let eight = flex(base(false).border_solid(8.0)).label("8.0 px", label_style());

    v_flex(section_style()).children([
        section_title("Border Weight"),
        h_flex(wrapper_style()).children([one, two, four, eight]),
    ])
}

fn length_container() -> Element {
    let top_only = flex(base(false)
        .border_solid(2.0)
        .border_lengths((1.0, 0.0, 0.0, 0.0)))
    .label("top only", label_style());

    let half_all =
        flex(base(false).border_solid(2.0).border_lengths(0.5)).label("all 50%", label_style());

    let vertical_only = flex(base(false).border_solid(2.0).border_lengths((1.0, 0.0)))
        .label("vertical", label_style());

    let horizontal_only = flex(base(false).border_solid(2.0).border_lengths((0.0, 1.0)))
        .label("horizontal", label_style());

    v_flex(section_style()).children([
        section_title("Border Lengths"),
        h_flex(wrapper_style()).children([top_only, half_all, vertical_only, horizontal_only]),
    ])
}

fn align_container() -> Element {
    let start = flex(base(false)
        .border_solid(2.0)
        .border_lengths(0.5)
        .border_align(BorderAlignment::Start))
    .label("Start", label_style());

    let center = flex(base(false)
        .border_solid(2.0)
        .border_lengths(0.5)
        .border_align(BorderAlignment::Center))
    .label("Center", label_style());

    let end = flex(base(false)
        .border_solid(2.0)
        .border_lengths(0.5)
        .border_align(BorderAlignment::End))
    .label("End", label_style());

    v_flex(section_style()).children([
        section_title("Border Alignment (50% Length)"),
        h_flex(wrapper_style()).children([start, center, end]),
    ])
}

fn color_container() -> Element {
    let red =
        flex(base(true).border_solid(2.0).border_color(Color::RED)).label("Red", label_style());
    let yellow = flex(base(true).border_solid(2.0).border_color(Color::YELLOW))
        .label("Yellow", label_style());
    let green =
        flex(base(true).border_solid(2.0).border_color(Color::GREEN)).label("Green", label_style());
    let blue =
        flex(base(true).border_solid(2.0).border_color(Color::BLUE)).label("Blue", label_style());

    v_flex(section_style()).children([
        section_title("Border Color"),
        h_flex(wrapper_style()).children([red, yellow, green, blue]),
    ])
}