michiu_ui 0.0.3

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

pub fn container() -> Element {
    v_flex(ts().gap(28.0).p(16.0)).children([section_inherit(), section_self(), section_within()])
}

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

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

fn item(label: &'static str, style: ThisStyle) -> Element {
    flex(style
        .p(12.0)
        .r(4.0)
        .justify_center()
        .items_center()
        .border_solid(1.0)
        .border_color(dynamic(|t: &Theme| t.border))
        .hovered(ts().bg_color(dynamic(|t: &Theme| t.background_hover))))
    .label(label, label_style())
}

fn section_inherit() -> Element {
    let item_1 = item("Focus 3", ts().focusable_inherit_keyboard());
    let item_2 = item("Focus 4", ts().focusable_inherit_keyboard());
    let item_3 = item("Focus 5", ts().focusable_inherit_keyboard());
    let item_4 = item("Focus 6", ts().focusable_inherit_keyboard());

    let wrapper = h_flex(wrapper_style()).children([item_1, item_2, item_3, item_4]);

    let parent_focused = section_style().focused(
        ts().outline_solid(1.0)
            .outline_offset(2.0)
            .outline_color(dynamic(|t: &Theme| t.text)),
    );

    v_flex(parent_focused).children([section_title("Keyboard & Inherit"), wrapper])
}

fn section_self() -> Element {
    let item_1 = item(
        "Focus 7",
        ts().focusable_self_keyboard().focused(
            ts().outline_dashed(2.0)
                .outline_offset(2.0)
                .outline_color(dynamic(|t: &Theme| t.primary)),
        ),
    );
    let item_2 = item(
        "Focus 8",
        ts().focusable_self_keyboard()
            .focused(ts().bg_color(dynamic(|t: &Theme| t.border_hover))),
    );
    let item_3 = item(
        "Focus 9",
        ts().focusable_self_keyboard()
            .trans_transform(Duration::from_millis(300), AnimationCurve::EaseInOutQuad)
            .focused(ts().transform_scale(1.1, 1.1)),
    );
    let item_4 = item(
        "Focus 10",
        ts().focusable_self_keyboard().focused(
            ts().box_shadow(
                shadow()
                    .blur(8.0)
                    .offset(0.0)
                    .spread(1.0)
                    .color(Color::BLACK),
            ),
        ),
    );

    let wrapper = h_flex(wrapper_style()).children([item_1, item_2, item_3, item_4]);

    v_flex(section_style()).children([section_title("Keyboard & SelfStyle"), wrapper])
}

fn section_within() -> Element {
    let item_1 = item(
        "Focus 12",
        ts().focusable_self_keyboard().focused(
            ts().outline_dashed(2.0)
                .outline_offset(2.0)
                .outline_color(dynamic(|t: &Theme| t.primary)),
        ),
    );

    let item_2 = item("Focus 12", ts().focusable_inherit_keyboard());

    let wrapper = h_flex(
        ts().w_full()
            .gap(16.0)
            .p(6.0)
            .border_solid(1.0)
            .border_color(dynamic(|t: &Theme| t.border))
            .focused(ts().bg_color(dynamic(|t: &Theme| t.primary)))
            .focused_within(
                ts().outline_solid(1.0)
                    .outline_offset(2.0)
                    .outline_color(dynamic(|t: &Theme| t.text)),
            ),
    )
    .children([item_1, item_2]);

    v_flex(section_style()).children([section_title("Keyboard & Focus Within"), wrapper])
}