Tailwind classes in OCaml
1(* Button Demo - Showcasing new button combinators *)
2
3open Htmlit
4open Tailwind_html
5
6let create_button_demo () =
7 let html = El.html [
8 El.head [
9 El.meta ~at:[At.charset "utf-8"] ();
10 El.meta ~at:[At.name "viewport"; At.content "width=device-width, initial-scale=1"] ();
11 El.title [txt "Button Demo"];
12 El.link ~at:[At.rel "stylesheet"; At.href "button_demo.css"] ();
13 ];
14 El.body ~at:[classes_attr (Tailwind.Css.tw [
15 Tailwind.Layout.(to_class (min_height screen));
16 Tailwind.Color.bg (gray 50);
17 Tailwind.Spacing.(to_class (p (rem 2.0)));
18 ])] [
19 container [
20 h1 ~size:`Xl3 ~weight:`Bold ~color:(gray 800) ~align:`Center ~mb:(rem 2.0) [
21 txt "Button Combinator Demo"
22 ];
23
24 p_styled ~size:`Lg ~color:(gray 600) ~align:`Center ~mb:(rem 3.0) [
25 txt "Showcasing succinct button creation with the new Tailwind_html API"
26 ];
27
28 (* Button examples section *)
29 div ~classes:(Tailwind.Css.tw [
30 Tailwind.Spacing.(to_class (gap `All (rem 2.0)));
31 flex;
32 Tailwind.Flexbox.(to_class (direction `Col));
33 ]) [
34 (* Primary buttons *)
35 card [
36 h2 ~size:`Xl ~weight:`Semibold ~color:(gray 700) ~mb:(rem 1.5) [
37 txt "Primary Buttons"
38 ];
39 div ~classes:(Tailwind.Css.tw [
40 flex;
41 Tailwind.Flexbox.(to_class (wrap `Wrap));
42 Tailwind.Spacing.(to_class (gap `All (rem 1.0)));
43 ]) [
44 btn_primary ~size:`Sm [txt "Small Primary"];
45 btn_primary [txt "Default Primary"];
46 btn_primary ~size:`Lg [txt "Large Primary"];
47 btn_primary ~disabled:true [txt "Disabled Primary"];
48 ];
49 ];
50
51 (* Secondary buttons *)
52 card [
53 h2 ~size:`Xl ~weight:`Semibold ~color:(gray 700) ~mb:(rem 1.5) [
54 txt "Secondary Buttons"
55 ];
56 div ~classes:(Tailwind.Css.tw [
57 flex;
58 Tailwind.Flexbox.(to_class (wrap `Wrap));
59 Tailwind.Spacing.(to_class (gap `All (rem 1.0)));
60 ]) [
61 btn_secondary ~size:`Sm [txt "Small Secondary"];
62 btn_secondary [txt "Default Secondary"];
63 btn_secondary ~size:`Lg [txt "Large Secondary"];
64 btn_secondary ~disabled:true [txt "Disabled Secondary"];
65 ];
66 ];
67
68 (* Comparison section *)
69 card [
70 h2 ~size:`Xl ~weight:`Semibold ~color:(gray 700) ~mb:(rem 1.5) [
71 txt "Before vs After"
72 ];
73 div ~classes:(Tailwind.Css.tw [
74 Tailwind.Display.grid;
75 Tailwind.Grid.(to_class (template_cols (`Cols 1)));
76 Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Grid.(to_class (template_cols (`Cols 2))))));
77 Tailwind.Spacing.(to_class (gap `All (rem 2.0)));
78 ]) [
79 div [
80 h2 ~size:`Lg ~weight:`Medium ~color:(red 600) ~mb:(rem 1.0) [
81 txt "❌ Old Verbose Way"
82 ];
83 El.pre ~at:[classes_attr (Tailwind.Css.tw [
84 Tailwind.Color.bg (gray 100);
85 Tailwind.Spacing.(to_class (p (rem 1.0)));
86 Tailwind.Effects.rounded_md;
87 Tailwind.Typography.(to_class (font_size `Sm));
88 Tailwind.Layout.(to_class (overflow `X `Auto));
89 ])] [
90 El.code [txt {|let btn_classes = Css.tw [
91 Color.bg (Color.make `Blue ~variant:`V600 ());
92 Color.text Color.white;
93 Spacing.(to_class (px (Size.rem 1.0)));
94 Spacing.(to_class (py (Size.rem 0.5)));
95 Effects.rounded_md;
96 Typography.(to_class (font_weight `Medium));
97] in
98El.button ~at:[classes_attr btn_classes] [
99 El.txt "Click me!"
100]|}];
101 ];
102 ];
103 div [
104 h2 ~size:`Lg ~weight:`Medium ~color:(green 600) ~mb:(rem 1.0) [
105 txt "✅ New Succinct Way"
106 ];
107 El.pre ~at:[classes_attr (Tailwind.Css.tw [
108 Tailwind.Color.bg (gray 100);
109 Tailwind.Spacing.(to_class (p (rem 1.0)));
110 Tailwind.Effects.rounded_md;
111 Tailwind.Typography.(to_class (font_size `Sm));
112 Tailwind.Layout.(to_class (overflow `X `Auto));
113 ])] [
114 El.code [txt {|btn_primary [txt "Click me!"]|}];
115 ];
116 ];
117 ];
118 ];
119 ];
120 ];
121 ];
122 ] in
123 html
124
125let () =
126 let html = create_button_demo () in
127 print_string (El.to_string ~doctype:true html)