···
-
(* Complete demonstration of Tailwind OCaml library with HTML generation *)
-
let classes_attr tailwind_classes =
-
At.class' (Tailwind.to_string tailwind_classes)
-
let nav_classes = Tailwind.tw [
-
Tailwind.Color.bg Tailwind.Color.white;
-
Tailwind.Effects.shadow_sm;
-
Tailwind.Effects.border;
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V200 ());
-
El.nav ~at:[classes_attr nav_classes] [
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Css.make "max-w-7xl";
-
Tailwind.Css.make "mx-auto";
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Flexbox.(to_class (justify `Between));
-
Tailwind.Flexbox.(to_class (align_items `Center));
-
Tailwind.Layout.(to_class (height (Tailwind.Size.rem 4.0)));
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Xl));
-
Tailwind.Typography.(to_class (font_weight `Bold));
-
Tailwind.Color.text (Tailwind.Color.make `Blue ~variant:`V600 ());
-
])] [El.txt "Tailwind OCaml"];
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Display.hidden;
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Display.flex)));
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 2.0)));
-
classes_attr (Tailwind.tw [
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
-
classes_attr (Tailwind.tw [
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
-
classes_attr (Tailwind.tw [
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
-
Tailwind.Variants.hover (Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V900 ()));
-
El.button ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
-
Tailwind.Color.text Tailwind.Color.white;
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.5)));
-
Tailwind.Effects.rounded_md;
-
Tailwind.Typography.(to_class (font_size `Sm));
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
-
])] [El.txt "Get Started"];
-
El.section ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Position.(to_class (position `Relative));
-
Tailwind.Flexbox.(to_class (align_items `Center));
-
Tailwind.Flexbox.(to_class (justify `Center));
-
Tailwind.Layout.(to_class (min_height (Tailwind.Size.screen)));
-
Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V900 ());
-
Tailwind.Color.text Tailwind.Color.white;
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Css.make "text-center";
-
Tailwind.Css.make "max-w-4xl";
-
Tailwind.Css.make "mx-auto";
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
-
El.h1 ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Xl4));
-
Tailwind.Typography.(to_class (font_weight `Bold));
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.5)));
-
])] [El.txt "Type-Safe Tailwind CSS for OCaml"];
-
El.p ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Xl));
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V300 ());
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 2.0)));
-
])] [El.txt "Build beautiful, responsive web interfaces with the power of OCaml's type system and Tailwind's utility classes."];
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Flexbox.(to_class (justify `Center));
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 1.0)));
-
El.button ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
-
Tailwind.Color.text Tailwind.Color.white;
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 2.0)));
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.75)));
-
Tailwind.Effects.rounded_lg;
-
Tailwind.Typography.(to_class (font_size `Lg));
-
Tailwind.Typography.(to_class (font_weight `Medium));
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
-
])] [El.txt "Get Started"];
-
El.button ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Effects.border;
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V300 ());
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V300 ());
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 2.0)));
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 0.75)));
-
Tailwind.Effects.rounded_lg;
-
Tailwind.Typography.(to_class (font_size `Lg));
-
Tailwind.Typography.(to_class (font_weight `Medium));
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V800 ()));
-
])] [El.txt "View Docs"];
-
let create_feature_card ~icon ~title ~description =
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Effects.rounded_lg;
-
Tailwind.Effects.border;
-
Tailwind.Color.border (Tailwind.Color.make `Gray ~variant:`V200 ());
-
Tailwind.Color.bg Tailwind.Color.white;
-
Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.5)));
-
Tailwind.Effects.shadow_sm;
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.0)));
-
El.h3 ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Lg));
-
Tailwind.Typography.(to_class (font_weight `Semibold));
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 0.5)));
-
El.p ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
-
])] [El.txt description];
-
let create_features () =
-
El.section ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Spacing.(to_class (py (Tailwind.Size.rem 5.0)));
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Css.make "max-w-7xl";
-
Tailwind.Css.make "mx-auto";
-
Tailwind.Spacing.(to_class (px (Tailwind.Size.rem 1.0)));
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Css.make "text-center";
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 3.0)));
-
El.h2 ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Xl3));
-
Tailwind.Typography.(to_class (font_weight `Bold));
-
Tailwind.Spacing.(to_class (mb (Tailwind.Size.rem 1.0)));
-
])] [El.txt "Why Choose Tailwind OCaml?"];
-
El.p ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Typography.(to_class (font_size `Lg));
-
Tailwind.Color.text (Tailwind.Color.make `Gray ~variant:`V600 ());
-
])] [El.txt "Everything you need to build modern web applications with OCaml"];
-
El.div ~at:[classes_attr (Tailwind.tw [
-
Tailwind.Grid.(to_class (template_cols (`Cols 1)));
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Grid.(to_class (template_cols (`Cols 2))))));
-
Tailwind.Responsive.(to_class (at_breakpoint `Lg (Tailwind.Grid.(to_class (template_cols (`Cols 3))))));
-
Tailwind.Spacing.(to_class (gap `All (Tailwind.Size.rem 2.0)));
-
create_feature_card ~icon:"🔒" ~title:"Type Safety"
-
~description:"Catch CSS errors at compile time with OCaml's powerful type system";
-
create_feature_card ~icon:"⚡" ~title:"Performance"
-
~description:"Zero runtime overhead - all CSS classes are generated at compile time";
-
create_feature_card ~icon:"🎨" ~title:"Full Tailwind"
-
~description:"Complete coverage of Tailwind CSS v4 including the latest features";
-
create_feature_card ~icon:"🔧" ~title:"Composable"
-
~description:"Build complex layouts by composing simple, reusable utility functions";
-
create_feature_card ~icon:"📱" ~title:"Responsive"
-
~description:"First-class support for responsive design and media queries";
-
create_feature_card ~icon:"🚀" ~title:"Modern"
-
~description:"Support for CSS Grid, Flexbox, and modern web standards";
-
Printf.printf "=== Complete Tailwind OCaml Demo ===\n";
-
let html_doc = El.html [
-
El.meta ~at:[At.charset "utf-8"] ();
-
El.meta ~at:[At.name "viewport"; At.content "width=device-width, initial-scale=1"] ();
-
El.title [El.txt "Tailwind OCaml - Type-Safe CSS Utilities"];
-
El.script ~at:[At.src "https://cdn.tailwindcss.com"] [];
-
let html_string = El.to_string ~doctype:true html_doc in
-
Printf.printf "Generated complete website (%d characters)\n" (String.length html_string);
-
(* Show a snippet of the generated HTML *)
-
let preview_length = 800 in
-
let preview = if String.length html_string > preview_length then
-
(String.sub html_string 0 preview_length) ^ "..."
-
Printf.printf "\nHTML Preview:\n%s\n" preview;
-
(* Demonstrate advanced class combinations *)
-
Printf.printf "\n=== Advanced Class Combinations ===\n";
-
let responsive_card = Tailwind.tw [
-
Tailwind.Effects.rounded_lg;
-
Tailwind.Color.bg Tailwind.Color.white;
-
Tailwind.Effects.shadow_sm;
-
(* Responsive padding *)
-
Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.0)));
-
Tailwind.Responsive.(to_class (at_breakpoint `Md (Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 1.5))))));
-
Tailwind.Responsive.(to_class (at_breakpoint `Lg (Tailwind.Spacing.(to_class (p (Tailwind.Size.rem 2.0))))));
-
Tailwind.Effects.transition `All;
-
Tailwind.Variants.hover (Tailwind.Effects.shadow_md);
-
(* Dark mode support *)
-
Tailwind.Responsive.(to_class (media `Dark (Tailwind.Color.bg (Tailwind.Color.make `Gray ~variant:`V800 ()))));
-
Printf.printf "Responsive Card: %s\n" (Tailwind.to_string responsive_card);
-
let complex_button = Tailwind.tw [
-
Tailwind.Display.inline_flex;
-
Tailwind.Flexbox.(to_class (align_items `Center));
-
Tailwind.Flexbox.(to_class (justify `Center));
-
Tailwind.Effects.rounded_md;
-
Tailwind.Typography.(to_class (font_size `Sm));
-
Tailwind.Typography.(to_class (font_weight `Medium));
-
(* Colors with variants *)
-
Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V600 ());
-
Tailwind.Color.text Tailwind.Color.white;
-
Tailwind.Variants.hover (Tailwind.Color.bg (Tailwind.Color.make `Blue ~variant:`V700 ()));
-
Tailwind.Variants.focus (Tailwind.Css.make "focus:ring-2");
-
Tailwind.Variants.disabled (Tailwind.Effects.(to_class (opacity 50)));
-
Tailwind.V4.starting_style (Tailwind.Effects.(to_class (opacity 0)));
-
Printf.printf "Complex Button: %s\n" (Tailwind.to_string complex_button);
-
Printf.printf "\n✅ Complete demo generated successfully!\n";
-
Printf.printf "📄 Ready to serve as a static HTML file\n";
-
Printf.printf "🎨 Demonstrates full Tailwind OCaml capabilities\n"