type breakpoint = [ `Sm | `Md | `Lg | `Xl | `Xl2 ] type container_size = [ `Xs | `Sm | `Md | `Lg | `Xl | `Xl2 | `Xl3 | `Xl4 | `Xl5 | `Xl6 | `Xl7 ] type media_feature = [ `Dark | `Light | `Motion_safe | `Motion_reduce | `Contrast_more | `Contrast_less | `Portrait | `Landscape | `Print | `Screen ] type t = [ | `At_breakpoint of breakpoint * Css.t | `Max_breakpoint of breakpoint * Css.t | `At_container of container_size * Css.t | `Media of media_feature * Css.t | `Container of [`Normal | `Size | `Inline_size] option ] let to_class = function | `At_breakpoint (`Sm, classes) -> Css.make ("sm:" ^ Css.to_string classes) | `At_breakpoint (`Md, classes) -> Css.make ("md:" ^ Css.to_string classes) | `At_breakpoint (`Lg, classes) -> Css.make ("lg:" ^ Css.to_string classes) | `At_breakpoint (`Xl, classes) -> Css.make ("xl:" ^ Css.to_string classes) | `At_breakpoint (`Xl2, classes) -> Css.make ("2xl:" ^ Css.to_string classes) | `Max_breakpoint (`Sm, classes) -> Css.make ("max-sm:" ^ Css.to_string classes) | `Max_breakpoint (`Md, classes) -> Css.make ("max-md:" ^ Css.to_string classes) | `Max_breakpoint (`Lg, classes) -> Css.make ("max-lg:" ^ Css.to_string classes) | `Max_breakpoint (`Xl, classes) -> Css.make ("max-xl:" ^ Css.to_string classes) | `Max_breakpoint (`Xl2, classes) -> Css.make ("max-2xl:" ^ Css.to_string classes) | `Media (`Dark, classes) -> Css.make ("dark:" ^ Css.to_string classes) | `Media (`Light, classes) -> Css.make ("light:" ^ Css.to_string classes) | `Media (`Motion_safe, classes) -> Css.make ("motion-safe:" ^ Css.to_string classes) | `Media (`Motion_reduce, classes) -> Css.make ("motion-reduce:" ^ Css.to_string classes) | `Media (`Contrast_more, classes) -> Css.make ("contrast-more:" ^ Css.to_string classes) | `Media (`Contrast_less, classes) -> Css.make ("contrast-less:" ^ Css.to_string classes) | `Media (`Portrait, classes) -> Css.make ("portrait:" ^ Css.to_string classes) | `Media (`Landscape, classes) -> Css.make ("landscape:" ^ Css.to_string classes) | `Media (`Print, classes) -> Css.make ("print:" ^ Css.to_string classes) | `Media (`Screen, classes) -> Css.make ("screen:" ^ Css.to_string classes) | `Container None -> Css.make "container" | `Container (Some `Normal) -> Css.make "container" | `Container (Some `Size) -> Css.make "@container" | `Container (Some `Inline_size) -> Css.make "@container/inline-size" | `At_container (size, classes) -> let size_str = match size with | `Xs -> "@xs" | `Sm -> "@sm" | `Md -> "@md" | `Lg -> "@lg" | `Xl -> "@xl" | `Xl2 -> "@2xl" | `Xl3 -> "@3xl" | `Xl4 -> "@4xl" | `Xl5 -> "@5xl" | `Xl6 -> "@6xl" | `Xl7 -> "@7xl" in Css.make (size_str ^ ":" ^ Css.to_string classes) let at_breakpoint bp classes = `At_breakpoint (bp, classes) let max_breakpoint bp classes = `Max_breakpoint (bp, classes) let at_container size classes = `At_container (size, classes) let media feature classes = `Media (feature, classes) let container container_type = `Container container_type let apply responsive_t classes = Css.combine (to_class responsive_t) classes