Tailwind classes in OCaml
1(* Example 06: Patterns and Components - Reusable Layout Patterns *) 2 3open Htmlit 4open Tailwind 5 6let classes_attr tailwind_classes = 7 At.class' (Tailwind.to_string tailwind_classes) 8 9let create_patterns_demo () = 10 (* Create comprehensive patterns 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 "Patterns and Components"]; 16 El.link ~at:[At.rel "stylesheet"; At.href "patterns_and_components_06.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 (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 "Patterns and Components Demo"]; 25 26 (* Container Pattern *) 27 El.section ~at:[At.class' "mb-12"] [ 28 El.h2 ~at:[classes_attr (tw [ 29 Typography.(to_class (font_size `Xl)); 30 Typography.(to_class (font_weight `Semibold)); 31 Color.text (Color.make `Gray ~variant:`V700 ()); 32 ]); At.class' "mb-6"] [El.txt "Container Pattern"]; 33 34 El.div ~at:[classes_attr (tw [Patterns.container ()]); At.class' "bg-white rounded-lg shadow-sm p-6"] [ 35 El.p ~at:[classes_attr (tw [ 36 Color.text (Color.make `Gray ~variant:`V600 ()); 37 ])] [El.txt "This content is inside a container pattern that centers content and provides responsive padding."]; 38 ]; 39 ]; 40 41 (* Card Pattern *) 42 El.section ~at:[At.class' "mb-12"] [ 43 El.h2 ~at:[classes_attr (tw [ 44 Typography.(to_class (font_size `Xl)); 45 Typography.(to_class (font_weight `Semibold)); 46 Color.text (Color.make `Gray ~variant:`V700 ()); 47 ]); At.class' "mb-6"] [El.txt "Card Pattern"]; 48 49 El.div ~at:[At.class' "grid grid-cols-1 md:grid-cols-3 gap-6"] [ 50 El.div ~at:[classes_attr (tw [Patterns.card]); At.class' "p-6"] [ 51 El.h3 ~at:[classes_attr (tw [ 52 Typography.(to_class (font_size `Lg)); 53 Typography.(to_class (font_weight `Semibold)); 54 Color.text (Color.make `Gray ~variant:`V800 ()); 55 ]); At.class' "mb-2"] [El.txt "Card One"]; 56 El.p ~at:[classes_attr (tw [ 57 Color.text (Color.make `Gray ~variant:`V600 ()); 58 ])] [El.txt "This is a card using the built-in card pattern."]; 59 ]; 60 61 El.div ~at:[classes_attr (tw [Patterns.card]); At.class' "p-6"] [ 62 El.h3 ~at:[classes_attr (tw [ 63 Typography.(to_class (font_size `Lg)); 64 Typography.(to_class (font_weight `Semibold)); 65 Color.text (Color.make `Gray ~variant:`V800 ()); 66 ]); At.class' "mb-2"] [El.txt "Card Two"]; 67 El.p ~at:[classes_attr (tw [ 68 Color.text (Color.make `Gray ~variant:`V600 ()); 69 ])] [El.txt "Another card with the same styling pattern applied."]; 70 ]; 71 72 El.div ~at:[classes_attr (tw [Patterns.card]); At.class' "p-6"] [ 73 El.h3 ~at:[classes_attr (tw [ 74 Typography.(to_class (font_size `Lg)); 75 Typography.(to_class (font_weight `Semibold)); 76 Color.text (Color.make `Gray ~variant:`V800 ()); 77 ]); At.class' "mb-2"] [El.txt "Card Three"]; 78 El.p ~at:[classes_attr (tw [ 79 Color.text (Color.make `Gray ~variant:`V600 ()); 80 ])] [El.txt "A third card demonstrating consistent styling."]; 81 ]; 82 ]; 83 ]; 84 85 (* Flex Center Pattern *) 86 El.section ~at:[At.class' "mb-12"] [ 87 El.h2 ~at:[classes_attr (tw [ 88 Typography.(to_class (font_size `Xl)); 89 Typography.(to_class (font_weight `Semibold)); 90 Color.text (Color.make `Gray ~variant:`V700 ()); 91 ]); At.class' "mb-6"] [El.txt "Flex Center Pattern"]; 92 93 El.div ~at:[classes_attr (tw [Patterns.flex_center]); At.class' "bg-blue-50 rounded-lg h-32"] [ 94 El.p ~at:[classes_attr (tw [ 95 Color.text (Color.make `Blue ~variant:`V600 ()); 96 Typography.(to_class (font_weight `Medium)); 97 ])] [El.txt "This content is perfectly centered using flex_center pattern"]; 98 ]; 99 ]; 100 101 (* Stack Pattern *) 102 El.section ~at:[At.class' "mb-12"] [ 103 El.h2 ~at:[classes_attr (tw [ 104 Typography.(to_class (font_size `Xl)); 105 Typography.(to_class (font_weight `Semibold)); 106 Color.text (Color.make `Gray ~variant:`V700 ()); 107 ]); At.class' "mb-6"] [El.txt "Stack Pattern"]; 108 109 El.div ~at:[classes_attr (tw [Patterns.stack ~gap:(Size.rem 1.0) ()]); At.class' "bg-white rounded-lg shadow-sm p-6"] [ 110 El.div ~at:[classes_attr (tw [ 111 Color.bg (Color.make `Green ~variant:`V50 ()); 112 Spacing.(to_class (p (Size.rem 1.0))); 113 Effects.rounded_md; 114 ])] [El.txt "Stack Item 1"]; 115 116 El.div ~at:[classes_attr (tw [ 117 Color.bg (Color.make `Blue ~variant:`V50 ()); 118 Spacing.(to_class (p (Size.rem 1.0))); 119 Effects.rounded_md; 120 ])] [El.txt "Stack Item 2"]; 121 122 El.div ~at:[classes_attr (tw [ 123 Color.bg (Color.make `Purple ~variant:`V50 ()); 124 Spacing.(to_class (p (Size.rem 1.0))); 125 Effects.rounded_md; 126 ])] [El.txt "Stack Item 3"]; 127 ]; 128 ]; 129 130 (* Inline Stack Pattern *) 131 El.section [ 132 El.h2 ~at:[classes_attr (tw [ 133 Typography.(to_class (font_size `Xl)); 134 Typography.(to_class (font_weight `Semibold)); 135 Color.text (Color.make `Gray ~variant:`V700 ()); 136 ]); At.class' "mb-6"] [El.txt "Inline Stack Pattern"]; 137 138 El.div ~at:[classes_attr (tw [Patterns.inline_stack ~gap:(Size.rem 1.0) ()]); At.class' "bg-white rounded-lg shadow-sm p-6"] [ 139 El.span ~at:[classes_attr (tw [ 140 Color.bg (Color.make `Red ~variant:`V50 ()); 141 Color.text (Color.make `Red ~variant:`V600 ()); 142 Spacing.(to_class (px (Size.rem 0.75))); 143 Spacing.(to_class (py (Size.rem 0.5))); 144 Effects.rounded_full; 145 Typography.(to_class (font_size `Sm)); 146 ])] [El.txt "Tag 1"]; 147 148 El.span ~at:[classes_attr (tw [ 149 Color.bg (Color.make `Yellow ~variant:`V50 ()); 150 Color.text (Color.make `Yellow ~variant:`V600 ()); 151 Spacing.(to_class (px (Size.rem 0.75))); 152 Spacing.(to_class (py (Size.rem 0.5))); 153 Effects.rounded_full; 154 Typography.(to_class (font_size `Sm)); 155 ])] [El.txt "Tag 2"]; 156 157 El.span ~at:[classes_attr (tw [ 158 Color.bg (Color.make `Indigo ~variant:`V50 ()); 159 Color.text (Color.make `Indigo ~variant:`V600 ()); 160 Spacing.(to_class (px (Size.rem 0.75))); 161 Spacing.(to_class (py (Size.rem 0.5))); 162 Effects.rounded_full; 163 Typography.(to_class (font_size `Sm)); 164 ])] [El.txt "Tag 3"]; 165 ]; 166 ]; 167 ]; 168 ]; 169 ] in 170 html_doc 171 172let () = 173 (* Output HTML to stdout *) 174 let html_doc = create_patterns_demo () in 175 let html_string = El.to_string ~doctype:true html_doc in 176 print_string html_string