type pseudo = [ `Hover | `Focus | `Focus_within | `Focus_visible | `Active | `Visited | `Target | `Disabled | `Enabled | `Checked | `Indeterminate | `Default | `Required | `Valid | `Invalid | `In_range | `Out_of_range | `Placeholder_shown | `Autofill | `Read_only ] type pseudo_element = [ `Before | `After | `First_line | `First_letter | `Marker | `Selection | `File | `Backdrop | `Placeholder ] type structural = [ `First | `Last | `Only | `Odd | `Even | `First_of_type | `Last_of_type | `Only_of_type | `Empty | `Root | `Nth of int | `Nth_last of int ] type group = [ `Group of pseudo | `Peer of pseudo ] type special = [ `Not of pseudo | `Has of string | `Where of string | `Is of string | `Starting_style | `Inert | `Open | `In of string ] type t = [ | `Pseudo of pseudo * Css.t | `Pseudo_element of pseudo_element * Css.t | `Structural of structural * Css.t | `Group of group * Css.t | `Special of special * Css.t ] let pseudo_to_string = function | `Hover -> "hover" | `Focus -> "focus" | `Focus_within -> "focus-within" | `Focus_visible -> "focus-visible" | `Active -> "active" | `Visited -> "visited" | `Target -> "target" | `Disabled -> "disabled" | `Enabled -> "enabled" | `Checked -> "checked" | `Indeterminate -> "indeterminate" | `Default -> "default" | `Required -> "required" | `Valid -> "valid" | `Invalid -> "invalid" | `In_range -> "in-range" | `Out_of_range -> "out-of-range" | `Placeholder_shown -> "placeholder-shown" | `Autofill -> "autofill" | `Read_only -> "read-only" let to_class = function | `Pseudo (pseudo, classes) -> let prefix = pseudo_to_string pseudo in Css.make (prefix ^ ":" ^ Css.to_string classes) | `Pseudo_element (`Before, classes) -> Css.make ("before:" ^ Css.to_string classes) | `Pseudo_element (`After, classes) -> Css.make ("after:" ^ Css.to_string classes) | `Pseudo_element (`First_line, classes) -> Css.make ("first-line:" ^ Css.to_string classes) | `Pseudo_element (`First_letter, classes) -> Css.make ("first-letter:" ^ Css.to_string classes) | `Pseudo_element (`Marker, classes) -> Css.make ("marker:" ^ Css.to_string classes) | `Pseudo_element (`Selection, classes) -> Css.make ("selection:" ^ Css.to_string classes) | `Pseudo_element (`File, classes) -> Css.make ("file:" ^ Css.to_string classes) | `Pseudo_element (`Backdrop, classes) -> Css.make ("backdrop:" ^ Css.to_string classes) | `Pseudo_element (`Placeholder, classes) -> Css.make ("placeholder:" ^ Css.to_string classes) | `Structural (`First, classes) -> Css.make ("first:" ^ Css.to_string classes) | `Structural (`Last, classes) -> Css.make ("last:" ^ Css.to_string classes) | `Structural (`Only, classes) -> Css.make ("only:" ^ Css.to_string classes) | `Structural (`Odd, classes) -> Css.make ("odd:" ^ Css.to_string classes) | `Structural (`Even, classes) -> Css.make ("even:" ^ Css.to_string classes) | `Structural (`First_of_type, classes) -> Css.make ("first-of-type:" ^ Css.to_string classes) | `Structural (`Last_of_type, classes) -> Css.make ("last-of-type:" ^ Css.to_string classes) | `Structural (`Only_of_type, classes) -> Css.make ("only-of-type:" ^ Css.to_string classes) | `Structural (`Empty, classes) -> Css.make ("empty:" ^ Css.to_string classes) | `Structural (`Root, classes) -> Css.make ("root:" ^ Css.to_string classes) | `Structural (`Nth n, classes) -> Css.make (Printf.sprintf "nth-child(%d):" n ^ Css.to_string classes) | `Structural (`Nth_last n, classes) -> Css.make (Printf.sprintf "nth-last-child(%d):" n ^ Css.to_string classes) | `Group (`Group pseudo, classes) -> let prefix = pseudo_to_string pseudo in Css.make ("group-" ^ prefix ^ ":" ^ Css.to_string classes) | `Group (`Peer pseudo, classes) -> let prefix = pseudo_to_string pseudo in Css.make ("peer-" ^ prefix ^ ":" ^ Css.to_string classes) | `Special (`Not pseudo, classes) -> let prefix = pseudo_to_string pseudo in Css.make ("not-" ^ prefix ^ ":" ^ Css.to_string classes) | `Special (`Has selector, classes) -> Css.make ("has-[" ^ selector ^ "]:" ^ Css.to_string classes) | `Special (`Where selector, classes) -> Css.make ("where-[" ^ selector ^ "]:" ^ Css.to_string classes) | `Special (`Is selector, classes) -> Css.make ("is-[" ^ selector ^ "]:" ^ Css.to_string classes) | `Special (`Starting_style, classes) -> Css.make ("@starting-style:" ^ Css.to_string classes) | `Special (`Inert, classes) -> Css.make ("inert:" ^ Css.to_string classes) | `Special (`Open, classes) -> Css.make ("open:" ^ Css.to_string classes) | `Special (`In variant, classes) -> Css.make ("in-" ^ variant ^ ":" ^ Css.to_string classes) let pseudo p classes = `Pseudo (p, classes) let pseudo_element pe classes = `Pseudo_element (pe, classes) let structural s classes = `Structural (s, classes) let group g classes = `Group (g, classes) let special s classes = `Special (s, classes) let apply variant_t classes = Css.combine (to_class variant_t) classes let hover classes = Css.make ("hover:" ^ Css.to_string classes) let focus classes = Css.make ("focus:" ^ Css.to_string classes) let active classes = Css.make ("active:" ^ Css.to_string classes) let disabled classes = Css.make ("disabled:" ^ Css.to_string classes) let first classes = Css.make ("first:" ^ Css.to_string classes) let last classes = Css.make ("last:" ^ Css.to_string classes) let odd classes = Css.make ("odd:" ^ Css.to_string classes) let even classes = Css.make ("even:" ^ Css.to_string classes) let starting_style classes = Css.make ("@starting-style:" ^ Css.to_string classes)