Tailwind classes in OCaml
1(* Example 01: Hello Tailwind - Your First Tailwind OCaml Program *)
2
3open Htmlit
4open Tailwind_html
5
6let create_page () =
7
8 let html = El.html [
9 El.head [
10 El.meta ~at:[At.charset "utf-8"] ();
11 El.meta ~at:[At.name "viewport"; At.content "width=device-width, initial-scale=1"] ();
12 El.title [txt "Hello Tailwind"];
13 El.link ~at:[At.rel "stylesheet"; At.href "hello_tailwind_01.css"] ();
14 ];
15 El.body ~at:[classes_attr (Tailwind.Css.tw [
16 Tailwind.Layout.(to_class (min_height screen));
17 Tailwind.Color.bg (gray 50);
18 flex;
19 items_center;
20 justify_center;
21 Tailwind.Spacing.(to_class (p (rem 2.0)));
22 ])] [
23 container [
24 h1 ~size:`Xl2 ~weight:`Bold ~color:(blue 600) ~mb:(rem 1.0) [
25 txt "Hello, Tailwind OCaml!"
26 ];
27 p_styled ~color:(gray 600) ~mb:(rem 1.5) [
28 txt "This is your first Tailwind OCaml program. ";
29 txt "The heading above uses type-safe Tailwind classes."
30 ];
31 card [
32 h2 ~size:`Lg ~weight:`Semibold ~color:(gray 800) ~mb:(rem 0.75) [
33 txt "Generated Classes:"
34 ];
35 El.pre ~at:[classes_attr (Tailwind.Css.tw [
36 Tailwind.Color.bg (gray 100);
37 Tailwind.Spacing.(to_class (p (rem 0.75)));
38 Tailwind.Effects.rounded_sm;
39 Tailwind.Typography.(to_class (font_size `Sm));
40 Tailwind.Layout.(to_class (overflow `X `Auto));
41 ])] [
42 El.code ~at:[classes_attr (Tailwind.Css.tw [
43 Tailwind.Color.text (blue 600);
44 ])] [
45 txt "text-blue-600 text-2xl font-bold mb-4"
46 ];
47 ];
48 ];
49 div ~classes:(Tailwind.Css.tw [
50 Tailwind.Spacing.(to_class (mt (rem 2.0)));
51 ]) [
52 h2 ~size:`Lg ~weight:`Semibold ~color:(gray 700) ~mb:(rem 1.5) [
53 txt "What you're learning:"
54 ];
55 ul ~classes:(Tailwind.Css.tw [
56 Tailwind.Typography.(to_class (text_align `Left));
57 Tailwind.Spacing.(to_class (gap `Y (rem 0.5)));
58 Tailwind.Color.text (gray 600);
59 ]) [
60 li ~classes:(Tailwind.Css.tw [flex; Tailwind.Flexbox.(to_class (align_items `Start))]) [
61 span ~classes:(Tailwind.Css.tw [
62 Tailwind.Color.text (green 500);
63 Tailwind.Spacing.(to_class (mr (rem 0.5)));
64 ]) [txt "✓"];
65 txt "Using succinct combinator functions"
66 ];
67 li ~classes:(Tailwind.Css.tw [flex; Tailwind.Flexbox.(to_class (align_items `Start))]) [
68 span ~classes:(Tailwind.Css.tw [
69 Tailwind.Color.text (green 500);
70 Tailwind.Spacing.(to_class (mr (rem 0.5)));
71 ]) [txt "✓"];
72 txt "Type-safe color creation with simple functions"
73 ];
74 li ~classes:(Tailwind.Css.tw [flex; Tailwind.Flexbox.(to_class (align_items `Start))]) [
75 span ~classes:(Tailwind.Css.tw [
76 Tailwind.Color.text (green 500);
77 Tailwind.Spacing.(to_class (mr (rem 0.5)));
78 ]) [txt "✓"];
79 txt "Enhanced element functions with styling parameters"
80 ];
81 li ~classes:(Tailwind.Css.tw [flex; Tailwind.Flexbox.(to_class (align_items `Start))]) [
82 span ~classes:(Tailwind.Css.tw [
83 Tailwind.Color.text (green 500);
84 Tailwind.Spacing.(to_class (mr (rem 0.5)));
85 ]) [txt "✓"];
86 txt "Automatic class-to-attribute conversion"
87 ];
88 ];
89 ];
90 ];
91 ];
92 ] in
93 html
94
95let () =
96 (* Output HTML to stdout *)
97 let html = create_page () in
98 print_string (El.to_string ~doctype:true html)