use facet::Facet;
use serde::{Deserialize, Serialize};
pub type ActionToken = String;
#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
#[repr(C)]
pub enum InputValue {
Text(String),
Bool(bool),
Int(i64),
}
#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
#[repr(C)]
pub enum Action {
Fired { token: ActionToken },
Input { id: String, value: InputValue },
Restore { data: String },
Start,
}
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum TextStyle { Body, Title, Subtitle, Caption, Emphasis }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum ButtonStyle { Filled, Outlined, Text }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum CardStyle { Elevated, Outlined, Filled }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum Tone { Neutral, Success, Warning, Danger, Info }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum Spacing { Xs, Sm, Md, Lg, Xl }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum Icon { Delete, Add, Edit, Close, Settings, Check, Star }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum ImageShape { Square, Rounded, Circle }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum ImageRatio { Wide, Square, Tall }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum BoxAlign { TopStart, TopEnd, Center, BottomStart, BottomCenter, BottomEnd }
#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
#[repr(C)]
pub enum ProjectColor { Indigo, Teal, Coral, Amber, Lime, Pink }
#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
#[repr(C)]
pub struct Tab {
pub label: String,
pub selected: bool,
pub on_select: ActionToken,
}
#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
#[repr(C)]
pub enum Widget {
Text { content: String, style: TextStyle },
Image { source: String, shape: ImageShape, ratio: ImageRatio },
Badge { label: String, tone: Tone },
ColorDot { color: ProjectColor },
Divider,
Spacer { size: Spacing },
Row { children: Vec<Widget> },
Column { children: Vec<Widget> },
Card { child: Box<Widget>, style: CardStyle, on_press: Option<ActionToken> },
Box { children: Vec<Widget>, align: BoxAlign, scrim: bool },
Grid { children: Vec<Widget> },
Button { label: String, style: ButtonStyle, on_press: ActionToken },
IconButton { icon: Icon, on_press: ActionToken },
Chip { label: String, selected: bool, on_press: ActionToken },
TextField { id: String, placeholder: String, value: String },
Switch { id: String, label: String, value: bool },
Checkbox { id: String, label: String, value: bool },
Slider { id: String, value: i32, max: i32 },
Stepper { value: i32, on_decrement: ActionToken, on_increment: ActionToken },
Scaffold {
title: String,
body: Box<Widget>,
tabs: Vec<Tab>,
back: Option<ActionToken>,
dark_mode: bool,
route: String,
depth: u32,
},
}