Tailwind classes in OCaml
1(* Main module for Tailwind HTML library *)
2
3(* Re-export all submodules *)
4module Component = Component
5module Button = Button
6module Card = Card
7module Form = Form
8module Layout = Layout
9module Cli = Cli
10
11(* Common utility for converting Tailwind classes to HTML class attribute *)
12let classes_attr tailwind_classes =
13 Htmlit.At.class' (Tailwind.to_string tailwind_classes)
14
15(* Apply Tailwind classes to an existing HTML element by wrapping it *)
16let with_classes classes element =
17 let open Htmlit in
18 El.span ~at:[classes_attr classes] [element]
19
20(* Conditionally apply Tailwind classes *)
21let with_classes_if condition classes element =
22 if condition then with_classes classes element else element
23
24(* Create an element with Tailwind classes and optional attributes *)
25let el tag ?classes ?attributes children =
26 let open Htmlit in
27 let base_attrs = match classes with
28 | Some c -> [classes_attr c]
29 | None -> []
30 in
31 let custom_attrs = match attributes with
32 | Some attrs -> List.map (fun (k, v) -> At.v k v) attrs
33 | None -> []
34 in
35 let all_attrs = base_attrs @ custom_attrs in
36 El.v tag ~at:all_attrs children
37
38(* Common HTML elements with Tailwind class support *)
39let div ?classes ?attributes children = el "div" ?classes ?attributes children
40let span ?classes ?attributes children = el "span" ?classes ?attributes children
41let p ?classes ?attributes children = el "p" ?classes ?attributes children
42let a ?classes ?attributes ~href children =
43 let attrs = match attributes with Some a -> a | None -> [] in
44 el "a" ?classes ~attributes:(("href", href) :: attrs) children
45let img ?classes ?attributes ~src ~alt () =
46 let attrs = match attributes with Some a -> a | None -> [] in
47 el "img" ?classes ~attributes:(("src", src) :: ("alt", alt) :: attrs) []
48let h1 ?classes ?attributes children = el "h1" ?classes ?attributes children
49let h2 ?classes ?attributes children = el "h2" ?classes ?attributes children
50let h3 ?classes ?attributes children = el "h3" ?classes ?attributes children
51let h4 ?classes ?attributes children = el "h4" ?classes ?attributes children
52let h5 ?classes ?attributes children = el "h5" ?classes ?attributes children
53let h6 ?classes ?attributes children = el "h6" ?classes ?attributes children
54let ul ?classes ?attributes children = el "ul" ?classes ?attributes children
55let ol ?classes ?attributes children = el "ol" ?classes ?attributes children
56let li ?classes ?attributes children = el "li" ?classes ?attributes children
57
58(* Text element with built-in typography utilities *)
59let text ?size ?weight ?color ?align ?classes text_content =
60 let base_styles = [] in
61 let size_styles = match size with Some s -> [Tailwind.Typography.(to_class (font_size s))] | None -> [] in
62 let weight_styles = match weight with Some w -> [Tailwind.Typography.(to_class (font_weight w))] | None -> [] in
63 let color_styles = match color with Some c -> [Tailwind.Color.text c] | None -> [] in
64 let align_styles = match align with Some a -> [Tailwind.Typography.(to_class (text_align a))] | None -> [] in
65 let text_classes = Tailwind.tw (base_styles @ size_styles @ weight_styles @ color_styles @ align_styles) in
66 let final_classes = match classes with
67 | Some c -> Tailwind.tw [text_classes; c]
68 | None -> text_classes
69 in
70 span ~classes:final_classes [Htmlit.El.txt text_content]