···
-
(* 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 (Css.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 (Css.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 (Css.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 (Css.tw [
-
Spacing.(to_class (p (Size.rem 1.5)));
-
]); At.class' "text-center"] [
-
El.h3 ~at:[classes_attr (Css.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 (Css.tw [
-
Typography.(to_class (font_size `Sm));
-
Color.text (Color.make `Gray ~variant:`V600 ());
-
])] [El.txt "shadow-sm"];
-
El.div ~at:[classes_attr (Css.tw [
-
Spacing.(to_class (p (Size.rem 1.5)));
-
]); At.class' "text-center"] [
-
El.h3 ~at:[classes_attr (Css.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 (Css.tw [
-
Typography.(to_class (font_size `Sm));
-
Color.text (Color.make `Gray ~variant:`V600 ());
-
])] [El.txt "shadow-md"];
-
El.div ~at:[classes_attr (Css.tw [
-
Spacing.(to_class (p (Size.rem 1.5)));
-
]); At.class' "text-center"] [
-
El.h3 ~at:[classes_attr (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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 (Css.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