···
+
(* Example 05: Effects and Variants - Interactive Elements and Visual Effects *)
+
let classes_attr tailwind_classes =
+
At.class' (Tailwind.to_string tailwind_classes)
+
let create_effects_demo () =
+
(* Create comprehensive effects demonstration *)
+
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 "Effects and Variants"];
+
El.link ~at:[At.rel "stylesheet"; At.href "effects_and_variants_05.css"] ();
+
El.body ~at:[At.class' "min-h-screen bg-gray-50 p-8"] [
+
El.div ~at:[At.class' "max-w-6xl mx-auto"] [
+
El.h1 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl2));
+
Typography.(to_class (font_weight `Bold));
+
Color.text (Color.make `Gray ~variant:`V800 ());
+
]); At.class' "mb-8 text-center"] [El.txt "Effects and Variants Demo"];
+
El.section ~at:[At.class' "mb-8"] [
+
El.h2 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-6"] [El.txt "Shadow Effects"];
+
El.div ~at:[classes_attr (tw [
+
Grid.(to_class (template_cols (`Cols 1)));
+
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 3))))));
+
Spacing.(to_class (gap `All (Size.rem 1.5)));
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
]); At.class' "text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-2"] [El.txt "Small Shadow"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "shadow-sm"];
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
]); At.class' "text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-2"] [El.txt "Medium Shadow"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "shadow-md"];
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
]); At.class' "text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-2"] [El.txt "Large Shadow"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "shadow-lg"];
+
El.section ~at:[At.class' "mb-8"] [
+
El.h2 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-6"] [El.txt "Border Radius"];
+
El.div ~at:[classes_attr (tw [
+
Flexbox.(to_class (wrap `Wrap));
+
Spacing.(to_class (gap `All (Size.rem 1.0)));
+
Flexbox.(to_class (justify `Center));
+
El.div ~at:[classes_attr (tw [
+
Color.bg (Color.make `Blue ~variant:`V100 ());
+
Spacing.(to_class (p (Size.rem 1.0)));
+
(* No rounded corners *)
+
]); At.class' "text-center"] [El.txt "No Radius"];
+
El.div ~at:[classes_attr (tw [
+
Color.bg (Color.make `Green ~variant:`V100 ());
+
Spacing.(to_class (p (Size.rem 1.0)));
+
]); At.class' "text-center"] [El.txt "Small"];
+
El.div ~at:[classes_attr (tw [
+
Color.bg (Color.make `Purple ~variant:`V100 ());
+
Spacing.(to_class (p (Size.rem 1.0)));
+
]); At.class' "text-center"] [El.txt "Medium"];
+
El.div ~at:[classes_attr (tw [
+
Color.bg (Color.make `Red ~variant:`V100 ());
+
Spacing.(to_class (p (Size.rem 1.0)));
+
]); At.class' "text-center"] [El.txt "Large"];
+
El.div ~at:[classes_attr (tw [
+
Color.bg (Color.make `Yellow ~variant:`V100 ());
+
Spacing.(to_class (p (Size.rem 1.0)));
+
]); At.class' "text-center"] [El.txt "Full"];
+
(* Interactive Buttons *)
+
El.section ~at:[At.class' "mb-8"] [
+
El.h2 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-6"] [El.txt "Interactive Buttons"];
+
El.div ~at:[classes_attr (tw [
+
Flexbox.(to_class (wrap `Wrap));
+
Spacing.(to_class (gap `All (Size.rem 1.0)));
+
Flexbox.(to_class (justify `Center));
+
(* Hover color change *)
+
El.button ~at:[classes_attr (tw [
+
Color.bg (Color.make `Blue ~variant:`V500 ());
+
Color.text Color.white;
+
Spacing.(to_class (px (Size.rem 1.5)));
+
Spacing.(to_class (py (Size.rem 0.75)));
+
Typography.(to_class (font_weight `Medium));
+
Effects.transition `All;
+
Variants.hover (Color.bg (Color.make `Blue ~variant:`V600 ()));
+
])] [El.txt "Hover Color"];
+
El.button ~at:[classes_attr (tw [
+
Color.bg (Color.make `Green ~variant:`V500 ());
+
Color.text Color.white;
+
Spacing.(to_class (px (Size.rem 1.5)));
+
Spacing.(to_class (py (Size.rem 0.75)));
+
Typography.(to_class (font_weight `Medium));
+
Effects.transition `All;
+
Variants.hover Effects.shadow_lg;
+
])] [El.txt "Hover Shadow"];
+
El.button ~at:[classes_attr (tw [
+
Color.bg (Color.make `Purple ~variant:`V500 ());
+
Color.text Color.white;
+
Spacing.(to_class (px (Size.rem 1.5)));
+
Spacing.(to_class (py (Size.rem 0.75)));
+
Typography.(to_class (font_weight `Medium));
+
Effects.transition `All;
+
]); At.class' "hover:scale-105 active:scale-95"] [El.txt "Scale Effect"];
+
El.button ~at:[classes_attr (tw [
+
Color.bg (Color.make `Red ~variant:`V500 ());
+
Color.text Color.white;
+
Spacing.(to_class (px (Size.rem 1.5)));
+
Spacing.(to_class (py (Size.rem 0.75)));
+
Typography.(to_class (font_weight `Medium));
+
Effects.transition `All;
+
Variants.focus Effects.shadow_md;
+
])] [El.txt "Focus Ring"];
+
(* Card Hover Effects *)
+
El.section ~at:[At.class' "mb-8"] [
+
El.h2 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-6"] [El.txt "Card Hover Effects"];
+
El.div ~at:[classes_attr (tw [
+
Grid.(to_class (template_cols (`Cols 1)));
+
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 2))))));
+
Spacing.(to_class (gap `All (Size.rem 1.5)));
+
(* Hover shadow card *)
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
Effects.transition `All;
+
Variants.hover Effects.shadow_lg;
+
]); At.class' "cursor-pointer"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Lg));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V800 ());
+
]); At.class' "mb-2"] [El.txt "Shadow Lift"];
+
El.p ~at:[classes_attr (tw [
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "Hover to see the shadow increase. This creates a lifting effect."];
+
(* Scale and shadow card *)
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
Effects.transition `All;
+
]); At.class' "cursor-pointer hover:scale-105 hover:shadow-xl"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Lg));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V800 ());
+
]); At.class' "mb-2"] [El.txt "Scale + Shadow"];
+
El.p ~at:[classes_attr (tw [
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "This card both scales up and increases shadow on hover."];
+
El.h2 ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Xl));
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-6"] [El.txt "Border Effects"];
+
El.div ~at:[classes_attr (tw [
+
Grid.(to_class (template_cols (`Cols 1)));
+
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 3))))));
+
Spacing.(to_class (gap `All (Size.rem 1.5)));
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
Color.border (Color.make `Gray ~variant:`V200 ());
+
]); At.class' "text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Gray ~variant:`V700 ());
+
]); At.class' "mb-2"] [El.txt "Regular Border"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "border border-gray-200"];
+
El.div ~at:[classes_attr (tw [
+
Spacing.(to_class (p (Size.rem 1.5)));
+
Color.border (Color.make `Blue ~variant:`V300 ());
+
]); At.class' "text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Blue ~variant:`V600 ());
+
]); At.class' "mb-2"] [El.txt "Colored Border"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "border border-blue-300"];
+
El.div ~at:[At.class' "bg-white p-6 border-2 border-purple-300 rounded-lg text-center"] [
+
El.h3 ~at:[classes_attr (tw [
+
Typography.(to_class (font_weight `Semibold));
+
Color.text (Color.make `Purple ~variant:`V600 ());
+
]); At.class' "mb-2"] [El.txt "Thick Border"];
+
El.p ~at:[classes_attr (tw [
+
Typography.(to_class (font_size `Sm));
+
Color.text (Color.make `Gray ~variant:`V600 ());
+
])] [El.txt "border-2 border-purple-300"];
+
(* Output HTML to stdout *)
+
let html_doc = create_effects_demo () in
+
let html_string = El.to_string ~doctype:true html_doc in
+
print_string html_string