cocoanut 0.2.3

A minimal, declarative macOS GUI framework for Rust
use cocoanut::prelude::*;

component! {
    header,
    View::hstack()
        .child(View::text("Cocoanut UI Showcase").bold().font_size(22.0))
}

fn main() -> cocoanut::Result<()> {
    let count = state(0);
    let count_inc = count.clone();
    let count_dec = count.clone();
    let count_reset = count.clone();
    let display_count = count.clone();

    #[cfg(not(test))]
    display_count.on_change(move |v| {
        cocoanut::state::update_label_by_tag(100, &format!("Count: {}", v));
    });

    app("Cocoanut UI Showcase")
        .size(700.0, 900.0)
        .build()
        .root(
            View::vstack()
                .child(header())
                .child(View::label("Count: 0").font_size(32.0).tag(100))
                .child(
                    View::hstack()
                        .child(View::button("+1").on_click_fn(move || count_inc.increment()))
                        .child(View::button("-1").on_click_fn(move || count_dec.decrement()))
                        .child(View::button("Reset").on_click_fn(move || count_reset.reset())),
                )
                .child(View::spacer())
                .child(View::text("Text Inputs").bold())
                .child(View::text_field("Single-line text field"))
                .child(View::secure_field("Password field"))
                .child(View::text_area("Multi-line text area...").height(60.0))
                .child(View::spacer())
                .child(View::text("Controls").bold())
                .child(
                    View::hstack()
                        .child(View::checkbox("Notifications").on_click_fn(|| println!("checkbox")))
                        .child(View::radio("Option A").on_click_fn(|| println!("radio")))
                        .child(View::toggle("Auto-save").on_click_fn(|| println!("toggle"))),
                )
                .child(
                    View::dropdown(
                        "Theme",
                        vec!["Light".into(), "Dark".into(), "System".into()],
                    )
                    .on_change_fn(|v| println!("Theme: {}", v)),
                )
                .child(View::slider(0.0, 100.0, 50.0).on_change_fn(|v| println!("Slider: {}", v)))
                .child(View::spacer())
                .child(View::text("Extended Controls").bold())
                .child(
                    View::hstack()
                        .child(View::date_picker().on_change_fn(|v| println!("Date: {}", v)))
                        .child(View::color_picker().on_change_fn(|v| println!("Color: {}", v))),
                )
                .child(View::spacer())
                .child(View::text("Data Display").bold())
                .child(
                    View::hstack()
                        .child(View::progress_bar(0.3, 1.0))
                        .child(View::label("30%")),
                )
                .child(
                    View::hstack()
                        .child(View::progress_bar(0.7, 1.0))
                        .child(View::label("70%")),
                )
                .child(View::spacer())
                .child(View::text("Table View").bold())
                .child(
                    View::table_view(
                        vec!["Name", "Type", "Status"],
                        vec![
                            vec!["Button".into(), "Control".into(), "Done".into()],
                            vec!["Slider".into(), "Control".into(), "Done".into()],
                            vec!["WebView".into(), "Container".into(), "New".into()],
                        ],
                    )
                    .height(100.0),
                )
                .child(View::spacer())
                .child(View::text("Appearance").bold())
                .child(
                    View::hstack()
                        .child(
                            View::button("Dark").on_click_fn(|| set_appearance(Appearance::Dark)),
                        )
                        .child(
                            View::button("Light").on_click_fn(|| set_appearance(Appearance::Light)),
                        ),
                ),
        )
        .run()
}