Tailwind classes in OCaml
at main 5.6 kB view raw
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)