Tailwind classes in OCaml
1(* Example 03: Layout and Spacing - Mastering Box Model and Flexbox *) 2 3open Htmlit 4open Tailwind 5 6let classes_attr tailwind_classes = 7 At.class' (Tailwind.to_string tailwind_classes) 8 9let create_layout_demo () = 10 (* Create comprehensive layout demonstration *) 11 let html_doc = El.html [ 12 El.head [ 13 El.meta ~at:[At.charset "utf-8"] (); 14 El.meta ~at:[At.name "viewport"; At.content "width=device-width, initial-scale=1"] (); 15 El.title [El.txt "Layout and Spacing"]; 16 El.link ~at:[At.rel "stylesheet"; At.href "layout_and_spacing_03.css"] (); 17 ]; 18 El.body ~at:[At.class' "min-h-screen bg-gray-50 p-8"] [ 19 El.div ~at:[At.class' "max-w-6xl mx-auto"] [ 20 El.h1 ~at:[classes_attr (Css.tw [ 21 Typography.(to_class (font_size `Xl2)); 22 Typography.(to_class (font_weight `Bold)); 23 Color.text (Color.make `Gray ~variant:`V800 ()); 24 ]); At.class' "mb-8 text-center"] [El.txt "Layout and Spacing Demo"]; 25 26 El.p ~at:[classes_attr (Css.tw [ 27 Typography.(to_class (font_size `Lg)); 28 Color.text (Color.make `Gray ~variant:`V600 ()); 29 ]); At.class' "text-center mb-12"] [ 30 El.txt "Master the box model, flexbox, and CSS grid with type-safe utilities." 31 ]; 32 33 (* Flexbox Examples *) 34 El.section ~at:[At.class' "mb-12"] [ 35 El.h2 ~at:[classes_attr (Css.tw [ 36 Typography.(to_class (font_size `Xl)); 37 Typography.(to_class (font_weight `Semibold)); 38 Color.text (Color.make `Gray ~variant:`V700 ()); 39 ]); At.class' "mb-8"] [El.txt "Flexbox Layouts"]; 40 41 (* Centered content *) 42 El.div ~at:[At.class' "mb-8"] [ 43 El.h3 ~at:[classes_attr (Css.tw [ 44 Typography.(to_class (font_size `Lg)); 45 Typography.(to_class (font_weight `Semibold)); 46 Color.text (Color.make `Gray ~variant:`V700 ()); 47 ]); At.class' "mb-4"] [El.txt "Centered Content"]; 48 49 El.div ~at:[classes_attr (Css.tw [ 50 Display.flex; 51 Flexbox.(to_class (justify `Center)); 52 Flexbox.(to_class (align_items `Center)); 53 Color.bg (Color.make `Blue ~variant:`V100 ()); 54 Layout.(to_class (height (Size.rem 8.0))); 55 Effects.rounded_lg; 56 ])] [ 57 El.div ~at:[classes_attr (Css.tw [ 58 Color.bg Color.white; 59 Spacing.(to_class (p (Size.rem 1.5))); 60 Effects.rounded_md; 61 Effects.shadow_sm; 62 ])] [ 63 El.txt "Perfectly Centered Content" 64 ]; 65 ]; 66 ]; 67 68 (* Space between items *) 69 El.div ~at:[At.class' "mb-8"] [ 70 El.h3 ~at:[classes_attr (Css.tw [ 71 Typography.(to_class (font_size `Lg)); 72 Typography.(to_class (font_weight `Semibold)); 73 Color.text (Color.make `Gray ~variant:`V700 ()); 74 ]); At.class' "mb-4"] [El.txt "Space Between"]; 75 76 El.div ~at:[classes_attr (Css.tw [ 77 Display.flex; 78 Flexbox.(to_class (justify `Between)); 79 Flexbox.(to_class (align_items `Center)); 80 Color.bg (Color.make `Green ~variant:`V100 ()); 81 Spacing.(to_class (p (Size.rem 1.5))); 82 Effects.rounded_lg; 83 ])] [ 84 El.div ~at:[classes_attr (Css.tw [ 85 Color.bg Color.white; 86 Spacing.(to_class (p (Size.rem 1.0))); 87 Effects.rounded_md; 88 ])] [El.txt "Left"]; 89 El.div ~at:[classes_attr (Css.tw [ 90 Color.bg Color.white; 91 Spacing.(to_class (p (Size.rem 1.0))); 92 Effects.rounded_md; 93 ])] [El.txt "Center"]; 94 El.div ~at:[classes_attr (Css.tw [ 95 Color.bg Color.white; 96 Spacing.(to_class (p (Size.rem 1.0))); 97 Effects.rounded_md; 98 ])] [El.txt "Right"]; 99 ]; 100 ]; 101 102 (* Flex direction example *) 103 El.div [ 104 El.h3 ~at:[classes_attr (Css.tw [ 105 Typography.(to_class (font_size `Lg)); 106 Typography.(to_class (font_weight `Semibold)); 107 Color.text (Color.make `Gray ~variant:`V700 ()); 108 ]); At.class' "mb-4"] [El.txt "Flex Direction Column"]; 109 110 El.div ~at:[classes_attr (Css.tw [ 111 Display.flex; 112 Flexbox.(to_class (direction `Col)); 113 Spacing.(to_class (gap `All (Size.rem 1.0))); 114 Color.bg (Color.make `Purple ~variant:`V100 ()); 115 Spacing.(to_class (p (Size.rem 1.5))); 116 Effects.rounded_lg; 117 ])] [ 118 El.div ~at:[classes_attr (Css.tw [ 119 Color.bg Color.white; 120 Spacing.(to_class (p (Size.rem 1.0))); 121 Effects.rounded_md; 122 ]); At.class' "text-center"] [El.txt "Item 1"]; 123 El.div ~at:[classes_attr (Css.tw [ 124 Color.bg Color.white; 125 Spacing.(to_class (p (Size.rem 1.0))); 126 Effects.rounded_md; 127 ]); At.class' "text-center"] [El.txt "Item 2"]; 128 El.div ~at:[classes_attr (Css.tw [ 129 Color.bg Color.white; 130 Spacing.(to_class (p (Size.rem 1.0))); 131 Effects.rounded_md; 132 ]); At.class' "text-center"] [El.txt "Item 3"]; 133 ]; 134 ]; 135 ]; 136 137 (* Grid Examples *) 138 El.section ~at:[At.class' "mb-12"] [ 139 El.h2 ~at:[classes_attr (Css.tw [ 140 Typography.(to_class (font_size `Xl)); 141 Typography.(to_class (font_weight `Semibold)); 142 Color.text (Color.make `Gray ~variant:`V700 ()); 143 ]); At.class' "mb-8"] [El.txt "CSS Grid Layouts"]; 144 145 (* 2-column grid *) 146 El.div ~at:[At.class' "mb-8"] [ 147 El.h3 ~at:[classes_attr (Css.tw [ 148 Typography.(to_class (font_size `Lg)); 149 Typography.(to_class (font_weight `Semibold)); 150 Color.text (Color.make `Gray ~variant:`V700 ()); 151 ]); At.class' "mb-4"] [El.txt "Two Column Grid"]; 152 153 El.div ~at:[classes_attr (Css.tw [ 154 Display.grid; 155 Grid.(to_class (template_cols (`Cols 2))); 156 Spacing.(to_class (gap `All (Size.rem 1.5))); 157 ])] (List.init 4 (fun i -> 158 El.div ~at:[classes_attr (Css.tw [ 159 Color.bg (Color.make `Red ~variant:`V100 ()); 160 Spacing.(to_class (p (Size.rem 1.5))); 161 Effects.rounded_lg; 162 ]); At.class' "text-center"] [ 163 El.txt (Printf.sprintf "Grid Item %d" (i + 1)) 164 ] 165 )); 166 ]; 167 168 (* 3-column grid *) 169 El.div ~at:[At.class' "mb-8"] [ 170 El.h3 ~at:[classes_attr (Css.tw [ 171 Typography.(to_class (font_size `Lg)); 172 Typography.(to_class (font_weight `Semibold)); 173 Color.text (Color.make `Gray ~variant:`V700 ()); 174 ]); At.class' "mb-4"] [El.txt "Three Column Grid"]; 175 176 El.div ~at:[classes_attr (Css.tw [ 177 Display.grid; 178 Grid.(to_class (template_cols (`Cols 3))); 179 Spacing.(to_class (gap `All (Size.rem 1.5))); 180 ])] (List.init 6 (fun i -> 181 El.div ~at:[classes_attr (Css.tw [ 182 Color.bg (Color.make `Yellow ~variant:`V100 ()); 183 Spacing.(to_class (p (Size.rem 1.5))); 184 Effects.rounded_lg; 185 ]); At.class' "text-center"] [ 186 El.txt (Printf.sprintf "Item %d" (i + 1)) 187 ] 188 )); 189 ]; 190 ]; 191 192 (* Spacing Examples *) 193 El.section [ 194 El.h2 ~at:[classes_attr (Css.tw [ 195 Typography.(to_class (font_size `Xl)); 196 Typography.(to_class (font_weight `Semibold)); 197 Color.text (Color.make `Gray ~variant:`V700 ()); 198 ]); At.class' "mb-8"] [El.txt "Spacing System"]; 199 200 El.div ~at:[classes_attr (Css.tw [ 201 Display.grid; 202 Grid.(to_class (template_cols (`Cols 1))); 203 Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 2)))))); 204 Spacing.(to_class (gap `All (Size.rem 2.0))); 205 ])] [ 206 (* Padding example *) 207 El.div ~at:[classes_attr (Css.tw [ 208 Color.bg (Color.make `Indigo ~variant:`V100 ()); 209 Spacing.(to_class (p (Size.rem 1.5))); 210 Effects.rounded_lg; 211 ])] [ 212 El.h4 ~at:[classes_attr (Css.tw [ 213 Typography.(to_class (font_size `Base)); 214 Typography.(to_class (font_weight `Semibold)); 215 Color.text (Color.make `Gray ~variant:`V700 ()); 216 ]); At.class' "mb-3"] [El.txt "Padding Example"]; 217 El.div ~at:[classes_attr (Css.tw [ 218 Color.bg Color.white; 219 Spacing.(to_class (p (Size.rem 2.0))); 220 Effects.rounded_md; 221 Effects.border; 222 Color.border (Color.make `Gray ~variant:`V200 ()); 223 ])] [ 224 El.txt "This content has p-8 (2rem padding)" 225 ]; 226 ]; 227 228 (* Margin example *) 229 El.div ~at:[classes_attr (Css.tw [ 230 Color.bg (Color.make `Cyan ~variant:`V100 ()); 231 Spacing.(to_class (p (Size.rem 1.5))); 232 Effects.rounded_lg; 233 ])] [ 234 El.h4 ~at:[classes_attr (Css.tw [ 235 Typography.(to_class (font_size `Base)); 236 Typography.(to_class (font_weight `Semibold)); 237 Color.text (Color.make `Gray ~variant:`V700 ()); 238 ]); At.class' "mb-3"] [El.txt "Margin Example"]; 239 El.div ~at:[classes_attr (Css.tw [ 240 Color.bg Color.white; 241 Spacing.(to_class (p (Size.rem 1.0))); 242 Spacing.(to_class (m (Size.rem 1.5))); 243 Effects.rounded_md; 244 Effects.border; 245 Color.border (Color.make `Gray ~variant:`V200 ()); 246 ])] [ 247 El.txt "This box has m-6 (1.5rem margin) from its container" 248 ]; 249 ]; 250 ]; 251 ]; 252 ]; 253 ]; 254 ] in 255 html_doc 256 257let () = 258 (* Output HTML to stdout *) 259 let html_doc = create_layout_demo () in 260 print_string (El.to_string ~doctype:true html_doc)