1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
4pub enum UtilityFontFamilyRole {
5 Sans,
6 Serif,
7 Mono,
8}
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
11pub enum UtilityFontStyle {
12 Normal,
13 Italic,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
17pub enum UtilityTextTransform {
18 None,
19 Uppercase,
20 Lowercase,
21 Capitalize,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
25pub enum UtilityVal {
26 Auto,
27 Px(f32),
28 Percent(f32),
29 Vw(f32),
30 Vh(f32),
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
34pub enum UtilityFlexDirection {
35 Row,
36 Column,
37 RowReverse,
38 ColumnReverse,
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
42pub enum UtilityJustifyContent {
43 FlexStart,
44 FlexEnd,
45 Center,
46 SpaceBetween,
47 SpaceAround,
48 SpaceEvenly,
49}
50
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
52pub enum UtilityAlignItems {
53 FlexStart,
54 FlexEnd,
55 Center,
56 Baseline,
57 Stretch,
58}
59
60#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
61pub enum UtilityAlignContent {
62 FlexStart,
63 FlexEnd,
64 Center,
65 Stretch,
66 SpaceBetween,
67 SpaceAround,
68 SpaceEvenly,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
72pub enum UtilityAlignSelf {
73 Auto,
74 FlexStart,
75 FlexEnd,
76 Center,
77 Baseline,
78 Stretch,
79}
80
81#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
82pub enum UtilityFlexWrap {
83 NoWrap,
84 Wrap,
85 WrapReverse,
86}
87
88#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
89pub enum UtilityOverflowAxis {
90 Visible,
91 Clip,
92 Hidden,
93 Scroll,
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
97pub enum UtilityDisplay {
98 Flex,
99 Grid,
100 None,
101 Block,
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
105pub enum UtilityPositionType {
106 Relative,
107 Absolute,
108}
109
110#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
111pub enum UtilityStateVariant {
112 Hover,
113 Active,
114 Focus,
115 Disabled,
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
119pub enum UtilityTransitionProperty {
120 All,
121 Colors,
122}
123
124#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
125pub enum UtilityTransitionTiming {
126 Linear,
127 EaseIn,
128 EaseOut,
129 EaseInOut,
130}
131
132#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
133pub struct UtilityRect {
134 pub left: Option<UtilityVal>,
135 pub right: Option<UtilityVal>,
136 pub top: Option<UtilityVal>,
137 pub bottom: Option<UtilityVal>,
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
141pub struct UtilityVisualStylePatch {
142 pub background_color: Option<String>,
143 pub text_color: Option<String>,
144 pub border_color: Option<String>,
145 pub outline_width: Option<UtilityVal>,
146 pub outline_color: Option<String>,
147 pub opacity: Option<f32>,
148 pub transition_property: Option<UtilityTransitionProperty>,
149 pub transition_duration_ms: Option<f32>,
150 pub transition_timing: Option<UtilityTransitionTiming>,
151}
152
153#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
154pub struct UtilityStylePatch {
155 pub width: Option<UtilityVal>,
156 pub height: Option<UtilityVal>,
157 pub min_width: Option<UtilityVal>,
158 pub min_height: Option<UtilityVal>,
159 pub max_width: Option<UtilityVal>,
160 pub max_height: Option<UtilityVal>,
161 pub flex_direction: Option<UtilityFlexDirection>,
162 pub justify_content: Option<UtilityJustifyContent>,
163 pub align_items: Option<UtilityAlignItems>,
164 pub align_content: Option<UtilityAlignContent>,
165 pub align_self: Option<UtilityAlignSelf>,
166 pub flex_wrap: Option<UtilityFlexWrap>,
167 pub flex_grow: Option<f32>,
168 pub flex_shrink: Option<f32>,
169 pub flex_basis: Option<UtilityVal>,
170 pub row_gap: Option<UtilityVal>,
171 pub column_gap: Option<UtilityVal>,
172 pub padding: Option<UtilityRect>,
173 pub margin: Option<UtilityRect>,
174 pub border: Option<UtilityRect>,
175 pub border_radius: Option<UtilityVal>,
176 pub overflow_x: Option<UtilityOverflowAxis>,
177 pub overflow_y: Option<UtilityOverflowAxis>,
178 pub display: Option<UtilityDisplay>,
179 pub position_type: Option<UtilityPositionType>,
180 pub left: Option<UtilityVal>,
181 pub right: Option<UtilityVal>,
182 pub top: Option<UtilityVal>,
183 pub bottom: Option<UtilityVal>,
184 pub font_family_role: Option<UtilityFontFamilyRole>,
185 pub font_size: Option<f32>,
186 pub font_weight: Option<u16>,
187 pub font_style: Option<UtilityFontStyle>,
188 pub line_height: Option<f32>,
189 pub letter_spacing_em: Option<f32>,
190 pub text_transform: Option<UtilityTextTransform>,
191 pub visual: UtilityVisualStylePatch,
192 pub hover: UtilityVisualStylePatch,
193 pub active: UtilityVisualStylePatch,
194 pub focus: UtilityVisualStylePatch,
195 pub disabled: UtilityVisualStylePatch,
196}
197
198#[derive(Debug, Clone, PartialEq, Eq)]
199pub struct ParseUtilityError {
200 pub token: String,
201 pub reason: String,
202}
203
204impl ParseUtilityError {
205 pub(crate) fn new(token: &str, reason: impl Into<String>) -> Self {
206 Self {
207 token: token.to_string(),
208 reason: reason.into(),
209 }
210 }
211}