Tailwind classes in OCaml
1type t = Css.t 2 3(* Module aliases *) 4module Css = Css 5module Color = Color 6module Size = Size 7module Spacing = Spacing 8module Display = Display 9module Flexbox = Flexbox 10module Grid = Grid 11module Position = Position 12module Layout = Layout 13module Typography = Typography 14module Effects = Effects 15module Responsive = Responsive 16module Variants = Variants 17module Reset = Reset 18module Patterns = Patterns 19 20(* Convenience aliases *) 21module C = Color 22module S = Spacing 23module E = Effects 24module T = Typography 25module F = Flexbox 26module G = Grid 27module P = Patterns 28module R = Reset 29 30let tw classes = Css.concat classes 31 32let class_list pairs = 33 List.fold_left (fun acc (classes, condition) -> 34 if condition then Css.combine acc classes else acc 35 ) Css.empty pairs 36 37let to_string = Css.to_string 38 39(* Core utility functions *) 40 41let sr_only = 42 tw [ 43 Css.make "sr-only"; 44 ] 45 46let focus_ring ?color ?width () = 47 let base_classes = [ 48 Css.make "focus:outline-none"; 49 Css.make "focus:ring-2"; 50 Css.make "focus:ring-offset-2"; 51 ] in 52 let color_class = match color with 53 | Some c -> [Color.ring c] 54 | None -> [Css.make "focus:ring-blue-500"] 55 in 56 let width_class = match width with 57 | Some _ -> [] (* Could implement width variations *) 58 | None -> [] 59 in 60 tw (base_classes @ color_class @ width_class) 61 62 63module V4 = struct 64 let container_query size classes = 65 let container_class = match size with 66 | `Xs -> "@xs:" 67 | `Sm -> "@sm:" 68 | `Md -> "@md:" 69 | `Lg -> "@lg:" 70 | `Xl -> "@xl:" 71 | `Xl2 -> "@2xl:" 72 | `Xl3 -> "@3xl:" 73 | `Xl4 -> "@4xl:" 74 | `Xl5 -> "@5xl:" 75 | `Xl6 -> "@6xl:" 76 | `Xl7 -> "@7xl:" 77 in 78 Css.make (container_class ^ Css.to_string classes) 79 80 let starting_style classes = 81 Css.make ("@starting-style " ^ Css.to_string classes) 82 83 let text_shadow shadow_size = 84 let class_name = match shadow_size with 85 | `None -> "text-shadow-none" 86 | `Sm -> "text-shadow-sm" 87 | `Base -> "text-shadow" 88 | `Lg -> "text-shadow-lg" 89 | `Xl -> "text-shadow-xl" 90 in 91 Css.make class_name 92 93 let mask mask_type = 94 let class_name = match mask_type with 95 | `Auto -> "mask-auto" 96 | `Cover -> "mask-cover" 97 | `Contain -> "mask-contain" 98 in 99 Css.make class_name 100 101 let perspective perspective_type = 102 let class_name = match perspective_type with 103 | `None -> "perspective-none" 104 | `Distant -> "perspective-distant" 105 | `Normal -> "perspective-normal" 106 | `Near -> "perspective-near" 107 in 108 Css.make class_name 109end