use smudge_core::element::{Element, Value};
use smudge_core::geometry::Size;
use smudge_core::semantics::Role;
use smudge_core::theme::{ColorToken, RadiusToken};
use smudge_core::widget::{Panel, panel};
use smudge_text::label;
const PADDING: Size = Size {
width: 12.0,
height: 6.0,
};
const FOCUS_BORDER: f32 = 2.0;
pub fn button(label_text: impl Into<Value<String>>) -> Element<Panel> {
let label_text = label_text.into();
panel()
.padding_xy(PADDING)
.corner_radius(RadiusToken::MEDIUM)
.background(ColorToken::SURFACE)
.hover(|p| p.background(ColorToken::SURFACE_HOVER))
.pressed(|p| p.background(ColorToken::SURFACE_PRESSED))
.border(FOCUS_BORDER)
.focused(|p| p.border_color(ColorToken::FOCUS_RING))
.focusable()
.activate_on_keys()
.role(Role::Button)
.accessible_label(label_text.clone())
.child(label(label_text))
}
pub trait ButtonExt: Sized {
fn primary(self) -> Self;
}
impl ButtonExt for Element<Panel> {
fn primary(self) -> Self {
self.background(ColorToken::ACCENT)
.hover(|p| p.background(ColorToken::ACCENT_HOVER))
.pressed(|p| p.background(ColorToken::ACCENT_PRESSED))
.focused(|p| p.border_color(ColorToken::ACCENT_TEXT))
.style_children(|style| {
style.paint.text_color = Some(ColorToken::ACCENT_TEXT.into());
})
}
}