Tailwind classes in OCaml
1# Tailwind OCaml 2 3An OCaml library for generating Tailwind CSS classes with compile-time 4validation and a companion HTML generation library using Htmlit. 5 6This project provides two main libraries: 7 8- **`tailwind`**: Core library for type-safe Tailwind CSS class generation 9- **`tailwind-html`**: HTML component library built on top of [Htmlit](https://github.com/dbuenzli/htmlit) 10 11## Features 12 13- Compile-time validation of Tailwind classes 14- Type-safe color variants and sizes 15- Exhaustive pattern matching for all utility classes 16 17### Comprehensive Coverage 18- **Typography**: Font sizes, weights, line heights, text alignment, decorations 19- **Layout**: Display, position, flexbox, grid, spacing 20- **Colors**: Full color palette with variants 21- **Effects**: Shadows, borders, rounded corners, transitions 22- **Responsive**: Breakpoint-based responsive utilities 23- **Variants**: Hover, focus, and other state variants 24 25### Using Dune 26 27Add to your `dune-project`: 28 29```dune 30(package 31 (name myproject) 32 (depends 33 ocaml 34 dune 35 tailwind 36 tailwind-html 37 htmlit)) 38``` 39 40## Quick Start 41 42### Basic Usage 43 44```ocaml 45open Tailwind 46 47(* Create a styled div *) 48let styled_div = 49 let classes = tw [ 50 Display.flex; 51 Flexbox.(to_class (justify `Center)); 52 Flexbox.(to_class (align_items `Center)); 53 Color.bg (Color.make `Gray ~variant:`V100 ()); 54 Spacing.(to_class (p (Size.rem 2.0))); 55 ] in 56 Printf.sprintf "<div class=\"%s\">Content</div>" (to_string classes) 57``` 58 59### With Htmlit Integration 60 61```ocaml 62open Htmlit 63open Tailwind 64 65let classes_attr tailwind_classes = 66 At.class' (Tailwind.to_string tailwind_classes) 67 68let create_card title content = 69 El.div ~at:[classes_attr (tw [ 70 Patterns.card; 71 Spacing.(to_class (p (Size.rem 1.5))); 72 Effects.shadow_md; 73 ])] [ 74 El.h2 ~at:[classes_attr (tw [ 75 Typography.(to_class (font_size `Xl)); 76 Typography.(to_class (font_weight `Bold)); 77 Spacing.(to_class (mb (Size.rem 1.0))); 78 ])] [El.txt title]; 79 El.p [El.txt content]; 80 ] 81``` 82 83## Examples 84 85The `examples/` directory contains several demonstration files: 86 87### Running Examples 88 89```bash 90# Build all examples 91dune build examples/ 92 93# Run comprehensive showcase (generates HTML + CSS) 94dune exec examples/comprehensive_showcase.exe 95 96# Run basic usage example 97dune exec examples/basic_usage.exe 98 99# Run HTML integration example 100dune exec examples/tailwind_html_example.exe 101``` 102 103### Comprehensive Showcase 104 105The comprehensive showcase demonstrates all library features and generates: 106- `showcase.html` - Complete HTML page with all Tailwind classes 107- `input.css` - Tailwind v4 CSS with custom theme extensions 108 109```bash 110dune exec examples/comprehensive_showcase.exe 111# Then open showcase.html in your browser 112``` 113 114## Tailwind v4 Support 115 116This library supports Tailwind v4's CSS-first approach: 117 118```css 119/* Generated input.css - no config file needed! */ 120@import "tailwindcss"; 121 122@theme { 123 --font-sans: 'Inter', system-ui, sans-serif; 124 --color-brand-600: #2563eb; 125 /* Custom theme extensions */ 126} 127``` 128 129To process the CSS: 130```bash 131npx tailwindcss@next -i input.css -o output.css 132``` 133 134## Module Documentation 135 136### Core Modules 137 138#### `Tailwind` 139Main module that exports all utilities and provides the `tw` function for composing classes. 140 141#### `Color` 142Type-safe color system with variants: 143```ocaml 144Color.bg (Color.make `Blue ~variant:`V600 ()) 145Color.text Color.white 146Color.border (Color.make `Gray ~variant:`V200 ()) 147``` 148 149#### `Typography` 150Font utilities: 151```ocaml 152Typography.(to_class (font_size `Xl2)) 153Typography.(to_class (font_weight `Bold)) 154Typography.(to_class (line_height `Relaxed)) 155``` 156 157#### `Spacing` 158Margin and padding utilities: 159```ocaml 160Spacing.(to_class (p (Size.rem 1.0))) (* padding *) 161Spacing.(to_class (mx Size.auto)) (* margin-x auto *) 162Spacing.(to_class (gap `All (Size.px 16.0))) (* gap *) 163``` 164 165#### `Layout` 166Layout utilities: 167```ocaml 168Layout.(to_class (width (Size.percent 100.0))) 169Layout.(to_class (height Size.screen)) 170Layout.(to_class (max_width (Size.rem 64.0))) 171``` 172 173#### `Flexbox` 174Flexbox utilities: 175```ocaml 176Display.flex 177Flexbox.(to_class (justify `Between)) 178Flexbox.(to_class (align_items `Center)) 179Flexbox.(to_class (direction `Col)) 180``` 181 182#### `Grid` 183CSS Grid utilities: 184```ocaml 185Display.grid 186Grid.(to_class (template_cols (`Cols 3))) 187Grid.(to_class (gap (Size.rem 1.0))) 188``` 189 190#### `Effects` 191Visual effects: 192```ocaml 193Effects.shadow_lg 194Effects.rounded_md 195Effects.border 196Effects.transition `All 197``` 198 199#### `Responsive` 200Responsive utilities: 201```ocaml 202Responsive.(to_class (at_breakpoint `Md Display.flex)) 203Responsive.(to_class (at_breakpoint `Lg (Grid.(to_class (template_cols (`Cols 4)))))) 204``` 205 206#### `Variants` 207State variants: 208```ocaml 209Variants.hover (Color.bg (Color.make `Blue ~variant:`V700 ())) 210Variants.focus Effects.ring 211``` 212 213#### `Patterns` 214Common layout patterns: 215```ocaml 216Patterns.container () 217Patterns.card 218Patterns.flex_center 219Patterns.stack ~gap:(Size.rem 1.0) () 220Patterns.sticky_header 221``` 222 223### HTML Components (`tailwind-html`) 224 225Pre-built components using Htmlit: 226 227```ocaml 228open Tailwind_html 229 230(* Button component *) 231Button.primary ~text:"Click me" ~onclick:"handleClick()" 232 233(* Card component *) 234Card.simple ~title:"Card Title" ~content:"Card content here" 235 236(* Layout components *) 237Layout.container [ 238 Layout.row [ 239 Layout.col ~span:6 [content]; 240 Layout.col ~span:6 [content]; 241 ] 242] 243``` 244 245## Testing 246 247Run the test suite: 248 249```bash 250dune test 251``` 252 253## Contributing 254 255Contributions are welcome! Please: 256 2571. Fork the repository 2582. Create a feature branch 2593. Make your changes with tests 2604. Submit a pull request 261 262## License 263 264MIT License - see LICENSE file for details 265 266## Acknowledgments 267 268- Built on top of [Htmlit](https://github.com/dbuenzli/htmlit) by Daniel Bünzli 269- Inspired by [Tailwind CSS](https://tailwindcss.com/) 270 271## Resources 272 273- [Tailwind CSS Documentation](https://tailwindcss.com/docs) 274- [Tailwind v4 Alpha](https://tailwindcss.com/blog/tailwindcss-v4-alpha) 275- [Htmlit Documentation](https://erratique.ch/software/htmlit/doc/)