use std::rc::Rc;
use serde::{Deserialize, Serialize};
use teksilo_canvas::{EdgeInsets, Size};
use crate::build_context::BuildContext;
use crate::signal::Signal;
use crate::styles::recipe::{BorderRecipe, FillRecipe, PerStateRecipe, ShadowRecipe, ShapeRecipe};
use crate::widget_id::WidgetId;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Serialize, Deserialize)]
pub enum ButtonVariant {
Filled,
Tinted,
Outlined,
#[default]
Plain,
Ghost,
Link,
Destructive,
}
#[derive(Clone, Debug)]
pub struct ButtonStyleConfig {
pub label: WidgetId,
pub is_pressed: Signal<bool>,
pub is_hovered: Signal<bool>,
pub is_focused: Signal<bool>,
pub is_disabled: Signal<bool>,
pub variant: ButtonVariant,
}
pub trait ButtonStyle: 'static {
fn make_body(&self, cfg: &ButtonStyleConfig, ctx: &mut BuildContext) -> WidgetId;
fn label_text_role(&self, _variant: ButtonVariant) -> Option<teksilo_tokens::TextRole> {
None
}
}
pub type SharedButtonStyle = Rc<dyn ButtonStyle>;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ButtonRecipe {
pub shape: ShapeRecipe,
pub fill: PerStateRecipe<FillRecipe>,
pub border: PerStateRecipe<BorderRecipe>,
pub shadow: PerStateRecipe<Option<ShadowRecipe>>,
pub padding: EdgeInsets,
pub min_size: Size,
}