···
(* Main module for Tailwind HTML library *)
3
-
(* Re-export all submodules *)
4
-
module Component = Component
5
-
module Button = Button
8
-
module Layout = Layout
(* Common utility for converting Tailwind classes to HTML class attribute *)
let classes_attr tailwind_classes =
Htmlit.At.class' (Tailwind.to_string tailwind_classes)
···
let img ?classes ?attributes ~src ~alt () =
let attrs = match attributes with Some a -> a | None -> [] in
el "img" ?classes ~attributes:(("src", src) :: ("alt", alt) :: attrs) []
48
-
let h1 ?classes ?attributes children = el "h1" ?classes ?attributes children
49
-
let h2 ?classes ?attributes children = el "h2" ?classes ?attributes children
50
-
let h3 ?classes ?attributes children = el "h3" ?classes ?attributes children
51
-
let h4 ?classes ?attributes children = el "h4" ?classes ?attributes children
52
-
let h5 ?classes ?attributes children = el "h5" ?classes ?attributes children
53
-
let h6 ?classes ?attributes children = el "h6" ?classes ?attributes children
let ul ?classes ?attributes children = el "ul" ?classes ?attributes children
let ol ?classes ?attributes children = el "ol" ?classes ?attributes children
let li ?classes ?attributes children = el "li" ?classes ?attributes children
44
+
(* Utility functions for colors and sizes *)
45
+
let blue variant = Tailwind.Color.make `Blue ~variant:(match variant with
46
+
| 50 -> `V50 | 100 -> `V100 | 200 -> `V200 | 300 -> `V300 | 400 -> `V400
47
+
| 500 -> `V500 | 600 -> `V600 | 700 -> `V700 | 800 -> `V800 | 900 -> `V900
50
+
let gray variant = Tailwind.Color.make `Gray ~variant:(match variant with
51
+
| 50 -> `V50 | 100 -> `V100 | 200 -> `V200 | 300 -> `V300 | 400 -> `V400
52
+
| 500 -> `V500 | 600 -> `V600 | 700 -> `V700 | 800 -> `V800 | 900 -> `V900
55
+
let red variant = Tailwind.Color.make `Red ~variant:(match variant with
56
+
| 50 -> `V50 | 100 -> `V100 | 200 -> `V200 | 300 -> `V300 | 400 -> `V400
57
+
| 500 -> `V500 | 600 -> `V600 | 700 -> `V700 | 800 -> `V800 | 900 -> `V900
60
+
let green variant = Tailwind.Color.make `Green ~variant:(match variant with
61
+
| 50 -> `V50 | 100 -> `V100 | 200 -> `V200 | 300 -> `V300 | 400 -> `V400
62
+
| 500 -> `V500 | 600 -> `V600 | 700 -> `V700 | 800 -> `V800 | 900 -> `V900
65
+
let rem f = Tailwind.Size.rem f
66
+
let px = Tailwind.Size.px
67
+
let zero = Tailwind.Size.zero
68
+
let auto = Tailwind.Size.auto
69
+
let full = Tailwind.Size.full
70
+
let screen = Tailwind.Size.screen
71
+
let txt s = Htmlit.El.txt s
73
+
(* Common utility classes *)
74
+
let flex = Tailwind.Display.flex
75
+
let flex_col = Tailwind.Flexbox.(to_class (direction `Col))
76
+
let items_center = Tailwind.Flexbox.(to_class (align_items `Center))
77
+
let justify_center = Tailwind.Flexbox.(to_class (justify `Center))
78
+
let justify_between = Tailwind.Flexbox.(to_class (justify `Between))
79
+
let font_bold = Tailwind.Typography.(to_class (font_weight `Bold))
80
+
let font_semibold = Tailwind.Typography.(to_class (font_weight `Semibold))
81
+
let text_center = Tailwind.Typography.(to_class (text_align `Center))
82
+
let w_full = Tailwind.Layout.w_full
83
+
let h_full = Tailwind.Layout.h_full
84
+
let rounded_lg = Tailwind.Effects.rounded_lg
85
+
let rounded_md = Tailwind.Effects.rounded_md
86
+
let shadow_md = Tailwind.Effects.shadow_md
87
+
let shadow_lg = Tailwind.Effects.shadow_lg
89
+
(* Enhanced element functions with styling parameters *)
90
+
let h1 ?size ?weight ?color ?align ?mb ?classes children =
91
+
let base_styles = [Tailwind.Typography.(to_class (font_size `Xl2)); font_bold] in
92
+
let size_styles = match size with
93
+
| Some `Xl -> [Tailwind.Typography.(to_class (font_size `Xl))]
94
+
| Some `Xl2 -> [Tailwind.Typography.(to_class (font_size `Xl2))]
95
+
| Some `Xl3 -> [Tailwind.Typography.(to_class (font_size `Xl3))]
96
+
| Some `Xl4 -> [Tailwind.Typography.(to_class (font_size `Xl4))]
99
+
let weight_styles = match weight with
100
+
| Some `Bold -> [font_bold]
101
+
| Some `Semibold -> [font_semibold]
102
+
| Some `Medium -> [Tailwind.Typography.(to_class (font_weight `Medium))]
105
+
let color_styles = match color with Some c -> [Tailwind.Color.text c] | None -> [] in
106
+
let align_styles = match align with
107
+
| Some `Center -> [text_center]
108
+
| Some `Left -> [Tailwind.Typography.(to_class (text_align `Left))]
109
+
| Some `Right -> [Tailwind.Typography.(to_class (text_align `Right))]
112
+
let spacing_styles = match mb with Some s -> [Tailwind.Spacing.(to_class (mb s))] | None -> [] in
113
+
let final_classes = Tailwind.Css.tw (base_styles @ size_styles @ weight_styles @ color_styles @ align_styles @ spacing_styles @
114
+
(match classes with Some c -> [c] | None -> [])) in
115
+
Htmlit.El.h1 ~at:[classes_attr final_classes] children
117
+
let h2 ?size ?weight ?color ?align ?mb ?classes children =
118
+
let base_styles = [Tailwind.Typography.(to_class (font_size `Xl)); font_semibold] in
119
+
let size_styles = match size with
120
+
| Some `Lg -> [Tailwind.Typography.(to_class (font_size `Lg))]
121
+
| Some `Xl -> [Tailwind.Typography.(to_class (font_size `Xl))]
122
+
| Some `Xl2 -> [Tailwind.Typography.(to_class (font_size `Xl2))]
125
+
let weight_styles = match weight with
126
+
| Some `Bold -> [font_bold]
127
+
| Some `Semibold -> [font_semibold]
128
+
| Some `Medium -> [Tailwind.Typography.(to_class (font_weight `Medium))]
131
+
let color_styles = match color with Some c -> [Tailwind.Color.text c] | None -> [] in
132
+
let align_styles = match align with
133
+
| Some `Center -> [text_center]
134
+
| Some `Left -> [Tailwind.Typography.(to_class (text_align `Left))]
135
+
| Some `Right -> [Tailwind.Typography.(to_class (text_align `Right))]
138
+
let spacing_styles = match mb with Some s -> [Tailwind.Spacing.(to_class (mb s))] | None -> [] in
139
+
let final_classes = Tailwind.Css.tw (base_styles @ size_styles @ weight_styles @ color_styles @ align_styles @ spacing_styles @
140
+
(match classes with Some c -> [c] | None -> [])) in
141
+
Htmlit.El.h2 ~at:[classes_attr final_classes] children
143
+
let p_styled ?size ?color ?align ?mb ?classes children =
144
+
let base_styles = [Tailwind.Typography.(to_class (font_size `Base))] in
145
+
let size_styles = match size with
146
+
| Some `Sm -> [Tailwind.Typography.(to_class (font_size `Sm))]
147
+
| Some `Base -> [Tailwind.Typography.(to_class (font_size `Base))]
148
+
| Some `Lg -> [Tailwind.Typography.(to_class (font_size `Lg))]
151
+
let color_styles = match color with Some c -> [Tailwind.Color.text c] | None -> [] in
152
+
let align_styles = match align with
153
+
| Some `Center -> [text_center]
154
+
| Some `Left -> [Tailwind.Typography.(to_class (text_align `Left))]
155
+
| Some `Right -> [Tailwind.Typography.(to_class (text_align `Right))]
158
+
let spacing_styles = match mb with Some s -> [Tailwind.Spacing.(to_class (mb s))] | None -> [] in
159
+
let final_classes = Tailwind.Css.tw (base_styles @ size_styles @ color_styles @ align_styles @ spacing_styles @
160
+
(match classes with Some c -> [c] | None -> [])) in
161
+
Htmlit.El.p ~at:[classes_attr final_classes] children
163
+
(* Simple component functions *)
164
+
let container children =
165
+
let container_classes = Tailwind.Css.tw [Tailwind.Patterns.container ()] in
166
+
div ~classes:container_classes children
168
+
let flex_center children =
169
+
let flex_classes = Tailwind.Css.tw [flex; items_center; justify_center] in
170
+
div ~classes:flex_classes children
172
+
let card ?elevated ?padding children =
173
+
let base_classes = [Tailwind.Color.bg Tailwind.Color.white; rounded_lg] in
174
+
let shadow_classes = if elevated = Some true then [shadow_lg] else [Tailwind.Effects.shadow_sm] in
175
+
let padding_classes = if padding <> Some false then [Tailwind.Spacing.(to_class (p (rem 1.5)))] else [] in
176
+
let card_classes = Tailwind.Css.tw (base_classes @ shadow_classes @ padding_classes) in
177
+
div ~classes:card_classes children
179
+
let btn_primary ?size ?disabled children =
180
+
let base_classes = [
181
+
flex; items_center; justify_center; rounded_md;
182
+
Tailwind.Typography.(to_class (font_size `Sm));
183
+
Tailwind.Typography.(to_class (font_weight `Medium));
184
+
Tailwind.Color.bg (blue 600);
185
+
Tailwind.Color.text Tailwind.Color.white;
186
+
Tailwind.Variants.hover (Tailwind.Color.bg (blue 700));
187
+
Tailwind.Effects.transition `Colors;
189
+
let size_classes = match size with
190
+
| Some `Sm -> [Tailwind.Spacing.(to_class (px (rem 0.75))); Tailwind.Spacing.(to_class (py (rem 0.375)))]
191
+
| Some `Lg -> [Tailwind.Spacing.(to_class (px (rem 2.0))); Tailwind.Spacing.(to_class (py (rem 0.75)))]
192
+
| _ -> [Tailwind.Spacing.(to_class (px (rem 1.0))); Tailwind.Spacing.(to_class (py (rem 0.5)))]
194
+
let disabled_classes = if disabled = Some true then [
195
+
Tailwind.Css.make "disabled:opacity-50";
196
+
Tailwind.Css.make "disabled:cursor-not-allowed"
198
+
let btn_classes = Tailwind.Css.tw (base_classes @ size_classes @ disabled_classes) in
199
+
let attrs = [classes_attr btn_classes] @ (if disabled = Some true then [Htmlit.At.disabled] else []) in
200
+
Htmlit.El.button ~at:attrs children
202
+
let btn_secondary ?size ?disabled children =
203
+
let base_classes = [
204
+
flex; items_center; justify_center; rounded_md;
205
+
Tailwind.Typography.(to_class (font_size `Sm));
206
+
Tailwind.Typography.(to_class (font_weight `Medium));
207
+
Tailwind.Color.bg (gray 200);
208
+
Tailwind.Color.text (gray 900);
209
+
Tailwind.Variants.hover (Tailwind.Color.bg (gray 300));
210
+
Tailwind.Effects.transition `Colors;
212
+
let size_classes = match size with
213
+
| Some `Sm -> [Tailwind.Spacing.(to_class (px (rem 0.75))); Tailwind.Spacing.(to_class (py (rem 0.375)))]
214
+
| Some `Lg -> [Tailwind.Spacing.(to_class (px (rem 2.0))); Tailwind.Spacing.(to_class (py (rem 0.75)))]
215
+
| _ -> [Tailwind.Spacing.(to_class (px (rem 1.0))); Tailwind.Spacing.(to_class (py (rem 0.5)))]
217
+
let disabled_classes = if disabled = Some true then [
218
+
Tailwind.Css.make "disabled:opacity-50";
219
+
Tailwind.Css.make "disabled:cursor-not-allowed"
221
+
let btn_classes = Tailwind.Css.tw (base_classes @ size_classes @ disabled_classes) in
222
+
let attrs = [classes_attr btn_classes] @ (if disabled = Some true then [Htmlit.At.disabled] else []) in
223
+
Htmlit.El.button ~at:attrs children
(* Text element with built-in typography utilities *)
let text ?size ?weight ?color ?align ?classes text_content =