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