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()
}