1use facet::Facet;
18use serde::{Deserialize, Serialize};
19
20pub type ActionToken = String;
22
23#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
25#[repr(C)]
26pub enum InputValue {
27 Text(String),
28 Bool(bool),
29 Int(i64),
30}
31
32#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
34#[repr(C)]
35pub enum Action {
36 Fired { token: ActionToken },
38 Input { id: String, value: InputValue },
40 Restore { data: String },
42}
43
44#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
47#[repr(C)]
48pub enum TextStyle { Body, Title, Subtitle, Caption, Emphasis }
49
50#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
51#[repr(C)]
52pub enum ButtonStyle { Filled, Outlined, Text }
53
54#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
55#[repr(C)]
56pub enum CardStyle { Elevated, Outlined, Filled }
57
58#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
60#[repr(C)]
61pub enum Tone { Neutral, Success, Warning, Danger, Info }
62
63#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
64#[repr(C)]
65pub enum Spacing { Xs, Sm, Md, Lg, Xl }
66
67#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
69#[repr(C)]
70pub enum Icon { Delete, Add, Edit, Close, Settings, Check, Star }
71
72#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
73#[repr(C)]
74pub enum ImageShape { Square, Rounded, Circle }
75
76#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
77#[repr(C)]
78pub enum ImageRatio { Wide, Square, Tall }
79
80#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
81#[repr(C)]
82pub enum BoxAlign { TopStart, TopEnd, Center, BottomStart, BottomCenter, BottomEnd }
83
84#[derive(Facet, Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq)]
87#[repr(C)]
88pub enum ProjectColor { Indigo, Teal, Coral, Amber, Lime, Pink }
89
90#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
93#[repr(C)]
94pub struct Tab {
95 pub label: String,
96 pub selected: bool,
97 pub on_select: ActionToken,
98}
99
100#[derive(Facet, Serialize, Deserialize, Clone, Debug)]
104#[repr(C)]
105pub enum Widget {
106 Text { content: String, style: TextStyle },
108 Image { source: String, shape: ImageShape, ratio: ImageRatio },
109 Badge { label: String, tone: Tone },
110 ColorDot { color: ProjectColor },
112 Divider,
113 Spacer { size: Spacing },
114 Row { children: Vec<Widget> },
116 Column { children: Vec<Widget> },
117 Card { child: Box<Widget>, style: CardStyle, on_press: Option<ActionToken> },
119 Box { children: Vec<Widget>, align: BoxAlign, scrim: bool },
123 Grid { children: Vec<Widget> },
125 Button { label: String, style: ButtonStyle, on_press: ActionToken },
127 IconButton { icon: Icon, on_press: ActionToken },
128 Chip { label: String, selected: bool, on_press: ActionToken },
129 TextField { id: String, placeholder: String, value: String },
130 Switch { id: String, label: String, value: bool },
131 Checkbox { id: String, label: String, value: bool },
132 Slider { id: String, value: i32, max: i32 },
134 Stepper { value: i32, on_decrement: ActionToken, on_increment: ActionToken },
136 Scaffold {
140 title: String,
141 body: Box<Widget>,
142 tabs: Vec<Tab>,
143 back: Option<ActionToken>,
144 dark_mode: bool,
145 },
146}