Tailwind classes in OCaml
1type pseudo = [ `Hover | `Focus | `Focus_within | `Focus_visible | `Active | `Visited | `Target
2 | `Disabled | `Enabled | `Checked | `Indeterminate | `Default | `Required | `Valid | `Invalid
3 | `In_range | `Out_of_range | `Placeholder_shown | `Autofill | `Read_only ]
4
5type pseudo_element = [ `Before | `After | `First_line | `First_letter | `Marker | `Selection | `File | `Backdrop | `Placeholder ]
6
7type structural = [ `First | `Last | `Only | `Odd | `Even | `First_of_type | `Last_of_type | `Only_of_type | `Empty | `Root | `Nth of int | `Nth_last of int ]
8
9type group = [ `Group of pseudo | `Peer of pseudo ]
10
11type special = [ `Not of pseudo | `Has of string | `Where of string | `Is of string | `Starting_style | `Inert | `Open | `In of string ]
12
13type t = [
14 | `Pseudo of pseudo * Css.t
15 | `Pseudo_element of pseudo_element * Css.t
16 | `Structural of structural * Css.t
17 | `Group of group * Css.t
18 | `Special of special * Css.t
19]
20
21let pseudo_to_string = function
22 | `Hover -> "hover"
23 | `Focus -> "focus"
24 | `Focus_within -> "focus-within"
25 | `Focus_visible -> "focus-visible"
26 | `Active -> "active"
27 | `Visited -> "visited"
28 | `Target -> "target"
29 | `Disabled -> "disabled"
30 | `Enabled -> "enabled"
31 | `Checked -> "checked"
32 | `Indeterminate -> "indeterminate"
33 | `Default -> "default"
34 | `Required -> "required"
35 | `Valid -> "valid"
36 | `Invalid -> "invalid"
37 | `In_range -> "in-range"
38 | `Out_of_range -> "out-of-range"
39 | `Placeholder_shown -> "placeholder-shown"
40 | `Autofill -> "autofill"
41 | `Read_only -> "read-only"
42
43let to_class = function
44 | `Pseudo (pseudo, classes) ->
45 let prefix = pseudo_to_string pseudo in
46 Css.make (prefix ^ ":" ^ Css.to_string classes)
47 | `Pseudo_element (`Before, classes) -> Css.make ("before:" ^ Css.to_string classes)
48 | `Pseudo_element (`After, classes) -> Css.make ("after:" ^ Css.to_string classes)
49 | `Pseudo_element (`First_line, classes) -> Css.make ("first-line:" ^ Css.to_string classes)
50 | `Pseudo_element (`First_letter, classes) -> Css.make ("first-letter:" ^ Css.to_string classes)
51 | `Pseudo_element (`Marker, classes) -> Css.make ("marker:" ^ Css.to_string classes)
52 | `Pseudo_element (`Selection, classes) -> Css.make ("selection:" ^ Css.to_string classes)
53 | `Pseudo_element (`File, classes) -> Css.make ("file:" ^ Css.to_string classes)
54 | `Pseudo_element (`Backdrop, classes) -> Css.make ("backdrop:" ^ Css.to_string classes)
55 | `Pseudo_element (`Placeholder, classes) -> Css.make ("placeholder:" ^ Css.to_string classes)
56 | `Structural (`First, classes) -> Css.make ("first:" ^ Css.to_string classes)
57 | `Structural (`Last, classes) -> Css.make ("last:" ^ Css.to_string classes)
58 | `Structural (`Only, classes) -> Css.make ("only:" ^ Css.to_string classes)
59 | `Structural (`Odd, classes) -> Css.make ("odd:" ^ Css.to_string classes)
60 | `Structural (`Even, classes) -> Css.make ("even:" ^ Css.to_string classes)
61 | `Structural (`First_of_type, classes) -> Css.make ("first-of-type:" ^ Css.to_string classes)
62 | `Structural (`Last_of_type, classes) -> Css.make ("last-of-type:" ^ Css.to_string classes)
63 | `Structural (`Only_of_type, classes) -> Css.make ("only-of-type:" ^ Css.to_string classes)
64 | `Structural (`Empty, classes) -> Css.make ("empty:" ^ Css.to_string classes)
65 | `Structural (`Root, classes) -> Css.make ("root:" ^ Css.to_string classes)
66 | `Structural (`Nth n, classes) -> Css.make (Printf.sprintf "nth-child(%d):" n ^ Css.to_string classes)
67 | `Structural (`Nth_last n, classes) -> Css.make (Printf.sprintf "nth-last-child(%d):" n ^ Css.to_string classes)
68 | `Group (`Group pseudo, classes) ->
69 let prefix = pseudo_to_string pseudo in
70 Css.make ("group-" ^ prefix ^ ":" ^ Css.to_string classes)
71 | `Group (`Peer pseudo, classes) ->
72 let prefix = pseudo_to_string pseudo in
73 Css.make ("peer-" ^ prefix ^ ":" ^ Css.to_string classes)
74 | `Special (`Not pseudo, classes) ->
75 let prefix = pseudo_to_string pseudo in
76 Css.make ("not-" ^ prefix ^ ":" ^ Css.to_string classes)
77 | `Special (`Has selector, classes) -> Css.make ("has-[" ^ selector ^ "]:" ^ Css.to_string classes)
78 | `Special (`Where selector, classes) -> Css.make ("where-[" ^ selector ^ "]:" ^ Css.to_string classes)
79 | `Special (`Is selector, classes) -> Css.make ("is-[" ^ selector ^ "]:" ^ Css.to_string classes)
80 | `Special (`Starting_style, classes) -> Css.make ("@starting-style:" ^ Css.to_string classes)
81 | `Special (`Inert, classes) -> Css.make ("inert:" ^ Css.to_string classes)
82 | `Special (`Open, classes) -> Css.make ("open:" ^ Css.to_string classes)
83 | `Special (`In variant, classes) -> Css.make ("in-" ^ variant ^ ":" ^ Css.to_string classes)
84
85let pseudo p classes = `Pseudo (p, classes)
86let pseudo_element pe classes = `Pseudo_element (pe, classes)
87let structural s classes = `Structural (s, classes)
88let group g classes = `Group (g, classes)
89let special s classes = `Special (s, classes)
90
91let apply variant_t classes =
92 Css.combine (to_class variant_t) classes
93
94let hover classes = Css.make ("hover:" ^ Css.to_string classes)
95let focus classes = Css.make ("focus:" ^ Css.to_string classes)
96let active classes = Css.make ("active:" ^ Css.to_string classes)
97let disabled classes = Css.make ("disabled:" ^ Css.to_string classes)
98let first classes = Css.make ("first:" ^ Css.to_string classes)
99let last classes = Css.make ("last:" ^ Css.to_string classes)
100let odd classes = Css.make ("odd:" ^ Css.to_string classes)
101let even classes = Css.make ("even:" ^ Css.to_string classes)
102let starting_style classes = Css.make ("@starting-style:" ^ Css.to_string classes)