Tailwind classes in OCaml
1type breakpoint = [ `Sm | `Md | `Lg | `Xl | `Xl2 ]
2type container_size = [ `Xs | `Sm | `Md | `Lg | `Xl | `Xl2 | `Xl3 | `Xl4 | `Xl5 | `Xl6 | `Xl7 ]
3type media_feature = [ `Dark | `Light | `Motion_safe | `Motion_reduce | `Contrast_more | `Contrast_less | `Portrait | `Landscape | `Print | `Screen ]
4
5type t = [
6 | `At_breakpoint of breakpoint * Css.t
7 | `Max_breakpoint of breakpoint * Css.t
8 | `At_container of container_size * Css.t
9 | `Media of media_feature * Css.t
10 | `Container of [`Normal | `Size | `Inline_size] option
11]
12
13let to_class = function
14 | `At_breakpoint (`Sm, classes) -> Css.make ("sm:" ^ Css.to_string classes)
15 | `At_breakpoint (`Md, classes) -> Css.make ("md:" ^ Css.to_string classes)
16 | `At_breakpoint (`Lg, classes) -> Css.make ("lg:" ^ Css.to_string classes)
17 | `At_breakpoint (`Xl, classes) -> Css.make ("xl:" ^ Css.to_string classes)
18 | `At_breakpoint (`Xl2, classes) -> Css.make ("2xl:" ^ Css.to_string classes)
19 | `Max_breakpoint (`Sm, classes) -> Css.make ("max-sm:" ^ Css.to_string classes)
20 | `Max_breakpoint (`Md, classes) -> Css.make ("max-md:" ^ Css.to_string classes)
21 | `Max_breakpoint (`Lg, classes) -> Css.make ("max-lg:" ^ Css.to_string classes)
22 | `Max_breakpoint (`Xl, classes) -> Css.make ("max-xl:" ^ Css.to_string classes)
23 | `Max_breakpoint (`Xl2, classes) -> Css.make ("max-2xl:" ^ Css.to_string classes)
24 | `Media (`Dark, classes) -> Css.make ("dark:" ^ Css.to_string classes)
25 | `Media (`Light, classes) -> Css.make ("light:" ^ Css.to_string classes)
26 | `Media (`Motion_safe, classes) -> Css.make ("motion-safe:" ^ Css.to_string classes)
27 | `Media (`Motion_reduce, classes) -> Css.make ("motion-reduce:" ^ Css.to_string classes)
28 | `Media (`Contrast_more, classes) -> Css.make ("contrast-more:" ^ Css.to_string classes)
29 | `Media (`Contrast_less, classes) -> Css.make ("contrast-less:" ^ Css.to_string classes)
30 | `Media (`Portrait, classes) -> Css.make ("portrait:" ^ Css.to_string classes)
31 | `Media (`Landscape, classes) -> Css.make ("landscape:" ^ Css.to_string classes)
32 | `Media (`Print, classes) -> Css.make ("print:" ^ Css.to_string classes)
33 | `Media (`Screen, classes) -> Css.make ("screen:" ^ Css.to_string classes)
34 | `Container None -> Css.make "container"
35 | `Container (Some `Normal) -> Css.make "container"
36 | `Container (Some `Size) -> Css.make "@container"
37 | `Container (Some `Inline_size) -> Css.make "@container/inline-size"
38 | `At_container (size, classes) ->
39 let size_str = match size with
40 | `Xs -> "@xs"
41 | `Sm -> "@sm"
42 | `Md -> "@md"
43 | `Lg -> "@lg"
44 | `Xl -> "@xl"
45 | `Xl2 -> "@2xl"
46 | `Xl3 -> "@3xl"
47 | `Xl4 -> "@4xl"
48 | `Xl5 -> "@5xl"
49 | `Xl6 -> "@6xl"
50 | `Xl7 -> "@7xl"
51 in
52 Css.make (size_str ^ ":" ^ Css.to_string classes)
53
54let at_breakpoint bp classes = `At_breakpoint (bp, classes)
55let max_breakpoint bp classes = `Max_breakpoint (bp, classes)
56let at_container size classes = `At_container (size, classes)
57let media feature classes = `Media (feature, classes)
58let container container_type = `Container container_type
59
60let apply responsive_t classes =
61 Css.combine (to_class responsive_t) classes