mottes-floem-components 0.1.0

Some styled components for floem.
Documentation
use std::fs;

use floem::{
    peniko::Color,
    prelude::{RwSignal, SignalGet},
    unit::Pct,
    views::{button, container, h_stack, label, text_input, toggle_button, v_stack, Decorators},
    IntoView,
};
use mottes_floem_components::{
    classes::{
        construct_theme, BadgeFive, BadgeFour, BadgeOne, BadgeThree, BadgeTwo, Button, Label,
        RadioButton, TextInput, ToggleButton,
    },
    theme::Theme,
    views::{
        accordion_item, avatar, labeled_checkbox, labeled_radio_button, progress_bar, separator,
        slider,
    },
};

fn view(theme: Theme<'static>) -> impl IntoView {
    let text = RwSignal::new(String::new());
    let checked = RwSignal::new(false);
    let slider_pct = RwSignal::new(Pct::from(50.0));
    let active_id = RwSignal::new(1);

    container(h_stack((
        v_stack((
            button("Button").class(Button),
            label(|| "Label").class(Label),
            text_input(text).placeholder("Text input").class(TextInput),
            toggle_button(|| true).class(ToggleButton),
            avatar(
                || {
                    fs::read("examples/silly_robot_avatar.png")
                        .expect("failed to read avatar picture")
                },
                50,
                theme,
            ),
        ))
        .style(|s| s.padding(10).gap(10).width(150)),
        separator(theme),
        v_stack((
            labeled_checkbox(checked, || "Checkbox", theme)
                .style(|s| s.align_self(Some(floem::taffy::AlignItems::Start))),
            labeled_radio_button(checked.get(), checked, || "Radio button", theme)
                .class(RadioButton),
            label(|| "Badge 1").class(BadgeOne),
            label(|| "Badge 2").class(BadgeTwo),
            label(|| "Badge 3").class(BadgeThree),
            label(|| "Badge 4").class(BadgeFour),
            label(|| "Badge 5").class(BadgeFive),
        ))
        .style(|s| s.padding(10).gap(10).width(150)),
        separator(theme),
        v_stack((
            slider(slider_pct, theme),
            progress_bar(slider_pct, theme),
            accordion_item(
                label(|| "I'm some text").class(Label),
                || "Accordion item 0",
                0,
                active_id,
                theme,
            ),
            accordion_item(
                label(|| "I'm some more text").class(Label),
                || "Accordion item 1",
                1,
                active_id,
                theme,
            ),
            accordion_item(
                label(|| "Fuck facists, btw").class(Label),
                || "Accordion item 2",
                2,
                active_id,
                theme,
            ),
        ))
        .style(|s| s.padding(10).gap(10).width(150)),
    )))
    .style(move |_| {
        construct_theme(theme)
            .height_full()
            .width_full()
            .justify_center()
            .items_center()
            .background(Color::parse(theme.base00).unwrap())
    })
}

fn split_view() -> impl IntoView {
    h_stack((view(Theme::dark()), view(Theme::light()))).style(|s| s.height_full().width_full())
}

fn main() {
    floem::launch(split_view);
}