···
1
-
(* Complete demonstration of Tailwind OCaml library with HTML generation *)
5
-
let classes_attr tailwind_classes =
6
-
At.class' (Tailwind.to_string tailwind_classes)
8
-
let create_navbar () =
9
-
let nav_classes = Tailwind.tw [
10
-
Tailwind.Color.bg Tailwind.Color.white;
11
-
Tailwind.Effects.shadow_sm;
12
-
Tailwind.Effects.border;
13
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V200 ());
16
-
El.nav ~at:[classes_attr nav_classes] [
17
-
El.div ~at:[classes_attr (Tailwind.tw [
18
-
Tailwind.Css.make "max-w-7xl";
19
-
Tailwind.Css.make "mx-auto";
20
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
22
-
El.div ~at:[classes_attr (Tailwind.tw [
23
-
Tailwind.Display.flex;
24
-
Tailwind.Flexbox.(to_class (justify `Between));
25
-
Tailwind.Flexbox.(to_class (align_items `Center));
26
-
Tailwind.Layout.(to_class (height (Tailwind.Size.rem 4.0)));
29
-
El.div ~at:[classes_attr (Tailwind.tw [
30
-
Tailwind.Typography.(to_class (font_size `Xl));
31
-
Tailwind.Typography.(to_class (font_weight `Bold));
32
-
Tailwind.Color.text (Tailwind.Color.make `Blue ~variant:`V600 ());
33
-
])] [El.txt "Tailwind OCaml"];
35
-
(* Navigation items *)
36
-
El.div ~at:[classes_attr (Tailwind.tw [
37
-
Tailwind.Display.hidden;
38
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Display.flex)));
39
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 2.0)));
43
-
classes_attr (Tailwind.tw [
44
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
45
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
47
-
] [El.txt "Features"];
50
-
classes_attr (Tailwind.tw [
51
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
52
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
57
-
classes_attr (Tailwind.tw [
58
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
59
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
65
-
El.button ~at:[classes_attr (Tailwind.tw [
66
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
67
-
Tailwind.Color.text Tailwind.Color.white;
68
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
69
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.5)));
70
-
Tailwind.Effects.rounded_md;
71
-
Tailwind.Typography.(to_class (font_size `Sm));
72
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
73
-
])] [El.txt "Get Started"];
78
-
let create_hero () =
79
-
El.section ~at:[classes_attr (Tailwind.tw [
80
-
Tailwind.Position.(to_class (position `Relative));
81
-
Tailwind.Display.flex;
82
-
Tailwind.Flexbox.(to_class (align_items `Center));
83
-
Tailwind.Flexbox.(to_class (justify `Center));
84
-
Tailwind.Layout.(to_class (min_height (Tailwind.Size.screen)));
85
-
Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V900 ());
86
-
Tailwind.Color.text Tailwind.Color.white;
88
-
El.div ~at:[classes_attr (Tailwind.tw [
89
-
Tailwind.Css.make "text-center";
90
-
Tailwind.Css.make "max-w-4xl";
91
-
Tailwind.Css.make "mx-auto";
92
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
94
-
El.h1 ~at:[classes_attr (Tailwind.tw [
95
-
Tailwind.Typography.(to_class (font_size `Xl4));
96
-
Tailwind.Typography.(to_class (font_weight `Bold));
97
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.5)));
98
-
])] [El.txt "Type-Safe Tailwind CSS for OCaml"];
100
-
El.p ~at:[classes_attr (Tailwind.tw [
101
-
Tailwind.Typography.(to_class (font_size `Xl));
102
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V300 ());
103
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 2.0)));
104
-
])] [El.txt "Build beautiful, responsive web interfaces with the power of OCaml's type system and Tailwind's utility classes."];
106
-
El.div ~at:[classes_attr (Tailwind.tw [
107
-
Tailwind.Display.flex;
108
-
Tailwind.Flexbox.(to_class (justify `Center));
109
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 1.0)));
111
-
El.button ~at:[classes_attr (Tailwind.tw [
112
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
113
-
Tailwind.Color.text Tailwind.Color.white;
114
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 2.0)));
115
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.75)));
116
-
Tailwind.Effects.rounded_lg;
117
-
Tailwind.Typography.(to_class (font_size `Lg));
118
-
Tailwind.Typography.(to_class (font_weight `Medium));
119
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
120
-
])] [El.txt "Get Started"];
122
-
El.button ~at:[classes_attr (Tailwind.tw [
123
-
Tailwind.Effects.border;
124
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V300 ());
125
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V300 ());
126
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 2.0)));
127
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.75)));
128
-
Tailwind.Effects.rounded_lg;
129
-
Tailwind.Typography.(to_class (font_size `Lg));
130
-
Tailwind.Typography.(to_class (font_weight `Medium));
131
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V800 ()));
132
-
])] [El.txt "View Docs"];
137
-
let create_feature_card ~icon ~title ~description =
138
-
El.div ~at:[classes_attr (Tailwind.tw [
139
-
Tailwind.Effects.rounded_lg;
140
-
Tailwind.Effects.border;
141
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V200 ());
142
-
Tailwind.Color.bg Tailwind.Color.white;
143
-
Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.5)));
144
-
Tailwind.Effects.shadow_sm;
146
-
El.div ~at:[classes_attr (Tailwind.tw [
147
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.0)));
150
-
El.h3 ~at:[classes_attr (Tailwind.tw [
151
-
Tailwind.Typography.(to_class (font_size `Lg));
152
-
Tailwind.Typography.(to_class (font_weight `Semibold));
153
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 0.5)));
154
-
])] [El.txt title];
156
-
El.p ~at:[classes_attr (Tailwind.tw [
157
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
158
-
])] [El.txt description];
161
-
let create_features () =
162
-
El.section ~at:[classes_attr (Tailwind.tw [
163
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 5.0)));
165
-
El.div ~at:[classes_attr (Tailwind.tw [
166
-
Tailwind.Css.make "max-w-7xl";
167
-
Tailwind.Css.make "mx-auto";
168
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
170
-
El.div ~at:[classes_attr (Tailwind.tw [
171
-
Tailwind.Css.make "text-center";
172
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 3.0)));
174
-
El.h2 ~at:[classes_attr (Tailwind.tw [
175
-
Tailwind.Typography.(to_class (font_size `Xl3));
176
-
Tailwind.Typography.(to_class (font_weight `Bold));
177
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.0)));
178
-
])] [El.txt "Why Choose Tailwind OCaml?"];
180
-
El.p ~at:[classes_attr (Tailwind.tw [
181
-
Tailwind.Typography.(to_class (font_size `Lg));
182
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
183
-
])] [El.txt "Everything you need to build modern web applications with OCaml"];
186
-
El.div ~at:[classes_attr (Tailwind.tw [
187
-
Tailwind.Display.grid;
188
-
Tailwind.Grid.(to_class (template_cols (`Cols 1)));
189
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Grid.(to_class (template_cols (`Cols 2))))));
190
-
Tailwind.Responsive.(to_class (at_breakpoint `Lg (Tailwind.Grid.(to_class (template_cols (`Cols 3))))));
191
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 2.0)));
193
-
create_feature_card ~icon:"🔒" ~title:"Type Safety"
194
-
~description:"Catch CSS errors at compile time with OCaml's powerful type system";
195
-
create_feature_card ~icon:"⚡" ~title:"Performance"
196
-
~description:"Zero runtime overhead - all CSS classes are generated at compile time";
197
-
create_feature_card ~icon:"🎨" ~title:"Full Tailwind"
198
-
~description:"Complete coverage of Tailwind CSS v4 including the latest features";
199
-
create_feature_card ~icon:"🔧" ~title:"Composable"
200
-
~description:"Build complex layouts by composing simple, reusable utility functions";
201
-
create_feature_card ~icon:"📱" ~title:"Responsive"
202
-
~description:"First-class support for responsive design and media queries";
203
-
create_feature_card ~icon:"🚀" ~title:"Modern"
204
-
~description:"Support for CSS Grid, Flexbox, and modern web standards";
210
-
Printf.printf "=== Complete Tailwind OCaml Demo ===\n";
212
-
let html_doc = El.html [
214
-
El.meta ~at:[At.charset "utf-8"] ();
215
-
El.meta ~at:[At.name "viewport"; At.content "width=device-width, initial-scale=1"] ();
216
-
El.title [El.txt "Tailwind OCaml - Type-Safe CSS Utilities"];
217
-
El.script ~at:[At.src "https://cdn.tailwindcss.com"] [];
223
-
create_features ();
227
-
let html_string = El.to_string ~doctype:true html_doc in
229
-
Printf.printf "Generated complete website (%d characters)\n" (String.length html_string);
231
-
(* Show a snippet of the generated HTML *)
232
-
let preview_length = 800 in
233
-
let preview = if String.length html_string > preview_length then
234
-
(String.sub html_string 0 preview_length) ^ "..."
235
-
else html_string in
237
-
Printf.printf "\nHTML Preview:\n%s\n" preview;
239
-
(* Demonstrate advanced class combinations *)
240
-
Printf.printf "\n=== Advanced Class Combinations ===\n";
242
-
let responsive_card = Tailwind.tw [
244
-
Tailwind.Effects.rounded_lg;
245
-
Tailwind.Color.bg Tailwind.Color.white;
246
-
Tailwind.Effects.shadow_sm;
248
-
(* Responsive padding *)
249
-
Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.0)));
250
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.5))))));
251
-
Tailwind.Responsive.(to_class (at_breakpoint `Lg (Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 2.0))))));
253
-
(* Hover effects *)
254
-
Tailwind.Effects.transition `All;
255
-
Tailwind.Variants.hover (Tailwind.Effects.shadow_md);
257
-
(* Dark mode support *)
258
-
Tailwind.Responsive.(to_class (media `Dark (Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V800 ()))));
260
-
Printf.printf "Responsive Card: %s\n" (Tailwind.to_string responsive_card);
262
-
let complex_button = Tailwind.tw [
264
-
Tailwind.Display.inline_flex;
265
-
Tailwind.Flexbox.(to_class (align_items `Center));
266
-
Tailwind.Flexbox.(to_class (justify `Center));
267
-
Tailwind.Effects.rounded_md;
270
-
Tailwind.Typography.(to_class (font_size `Sm));
271
-
Tailwind.Typography.(to_class (font_weight `Medium));
273
-
(* Colors with variants *)
274
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
275
-
Tailwind.Color.text Tailwind.Color.white;
276
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
277
-
Tailwind.Variants.focus (Tailwind.Css.make "focus:ring-2");
278
-
Tailwind.Variants.disabled (Tailwind.Effects.(to_class (opacity 50)));
281
-
Tailwind.V4.starting_style (Tailwind.Effects.(to_class (opacity 0)));
283
-
Printf.printf "Complex Button: %s\n" (Tailwind.to_string complex_button);
285
-
Printf.printf "\n✅ Complete demo generated successfully!\n";
286
-
Printf.printf "📄 Ready to serve as a static HTML file\n";
287
-
Printf.printf "🎨 Demonstrates full Tailwind OCaml capabilities\n"