dwui 0.7.4

UI Component library built on the DWIND style crate!
Documentation
use crate::theme::prelude::*;
use dominator::{events, html, Dom};
use dwind::prelude::*;
use futures_signals::signal::SignalExt;
use futures_signals_component_macro::component;

#[derive(Copy, Clone, Eq, PartialEq)]
pub enum ButtonType {
    Flat,
    Border,
}

#[component(render_fn = button)]
struct Button {
    #[signal]
    #[default(None)]
    content: Option<Dom>,
    #[default(Box::new(| _: events::Click | {}))]
    on_click: dyn Fn(events::Click) -> () + 'static,
    #[signal]
    #[default(false)]
    disabled: bool,
    #[signal]
    #[default(ButtonType::Flat)]
    button_type: ButtonType,
}

pub fn button(props: ButtonProps) -> Dom {
    let ButtonProps {
        content,
        on_click,
        disabled,
        button_type,
        apply,
    } = props;

    let button_type = button_type.broadcast();

    html!("button", {
        .dwclass!("is(.light *):dwui-text-on-primary-900 dwui-text-on-primary-50 hover:brightness-90")
        .dwclass_signal!("linear-gradient-90 dwui-gradient-from-primary-800 dwui-gradient-to-primary-900", button_type.signal().map(|v| v == ButtonType::Flat))
        .dwclass_signal!("is(.light *):dwui-gradient-from-primary-400 is(.light *):dwui-gradient-to-primary-500", button_type.signal().map(|v| v == ButtonType::Flat))
        .dwclass_signal!("dwui-border-primary-700 hover:dwui-border-primary-800 border bg-unset", button_type.signal().map(|v| v == ButtonType::Border))
        .dwclass_signal!("is(.light *):dwui-border-primary-200 is(.light *):hover:dwui-border-primary-300 border bg-unset", button_type.signal().map(|v| v == ButtonType::Border))
        .dwclass!("disabled:dwui-text-on-primary-500 disabled:hover:dwui-border-primary-800")
        .dwclass!("is(.light *):disabled:dwui-text-on-primary-600 is(.light *):disabled:hover:dwui-border-primary-200")
        .dwclass!("w-full h-10 font-bold p-1 cursor-pointer rounded-full pointer-events-auto")
        .apply_if(apply.is_some(), move |b| {
            b.apply(apply.unwrap())
        })
        .attr_signal("disabled", disabled.map(|v| if v { Some("disabled") } else { None }))
        .child_signal(content)
        .event(move |e: events::Click| {
            (on_click)(e);
        })
    })
}