···
1
-
(* Example 05: Effects and Variants - Interactive Elements and Visual Effects *)
1
+
(* Example 05: Effects and Variants - Visual effects with GADT *)
6
-
let classes_attr tailwind_classes =
7
-
At.class' (Tailwind.to_string tailwind_classes)
let create_effects_demo () =
11
-
(* Create comprehensive effects demonstration *)
12
-
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"] ();
16
-
El.title [El.txt "Effects and Variants"];
11
+
El.title [txt "Effects and Variants"];
El.link ~at:[At.rel "stylesheet"; At.href "effects_and_variants_05.css"] ();
19
-
El.body ~at:[At.class' "min-h-screen bg-gray-50 p-8"] [
20
-
El.div ~at:[At.class' "max-w-6xl mx-auto"] [
21
-
El.h1 ~at:[classes_attr (Css.tw [
22
-
Typography.(to_class (font_size `Xl2));
23
-
Typography.(to_class (font_weight `Bold));
24
-
Color.text (Color.make `Gray ~variant:`V800 ());
25
-
]); At.class' "mb-8 text-center"] [El.txt "Effects and Variants Demo"];
14
+
El.body ~at:[classes_attr [
23
+
text_color (gray 800);
25
+
margin_bottom (rem 2.0);
26
+
] [txt "Effects and Variants Demo"];
28
-
El.section ~at:[At.class' "mb-8"] [
29
-
El.h2 ~at:[classes_attr (Css.tw [
30
-
Typography.(to_class (font_size `Xl));
31
-
Typography.(to_class (font_weight `Semibold));
32
-
Color.text (Color.make `Gray ~variant:`V700 ());
33
-
]); At.class' "mb-6"] [El.txt "Shadow Effects"];
29
+
section ~styles:[margin_bottom (rem 2.0)] [
32
+
font_weight `Semibold;
33
+
text_color (gray 700);
34
+
margin_bottom (rem 1.5);
35
+
] [txt "Shadow Effects"];
35
-
El.div ~at:[classes_attr (Css.tw [
37
-
Grid.(to_class (template_cols (`Cols 1)));
38
-
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 3))))));
39
-
Spacing.(to_class (gap `All (Size.rem 1.5)));
41
-
El.div ~at:[classes_attr (Css.tw [
42
-
Color.bg Color.white;
43
-
Spacing.(to_class (p (Size.rem 1.5)));
46
-
]); At.class' "text-center"] [
47
-
El.h3 ~at:[classes_attr (Css.tw [
48
-
Typography.(to_class (font_weight `Semibold));
49
-
Color.text (Color.make `Gray ~variant:`V700 ());
50
-
]); At.class' "mb-2"] [El.txt "Small Shadow"];
51
-
El.p ~at:[classes_attr (Css.tw [
52
-
Typography.(to_class (font_size `Sm));
53
-
Color.text (Color.make `Gray ~variant:`V600 ());
54
-
])] [El.txt "shadow-sm"];
43
+
bg_color (Tailwind.Color.white);
47
+
margin_bottom (rem 1.0);
51
+
font_weight `Semibold;
52
+
text_color (gray 700);
53
+
margin_bottom (rem 0.5);
54
+
] [txt "Small Shadow"];
57
+
text_color (gray 600);
58
+
] [txt "shadow-sm"];
57
-
El.div ~at:[classes_attr (Css.tw [
58
-
Color.bg Color.white;
59
-
Spacing.(to_class (p (Size.rem 1.5)));
62
-
]); At.class' "text-center"] [
63
-
El.h3 ~at:[classes_attr (Css.tw [
64
-
Typography.(to_class (font_weight `Semibold));
65
-
Color.text (Color.make `Gray ~variant:`V700 ());
66
-
]); At.class' "mb-2"] [El.txt "Medium Shadow"];
67
-
El.p ~at:[classes_attr (Css.tw [
68
-
Typography.(to_class (font_size `Sm));
69
-
Color.text (Color.make `Gray ~variant:`V600 ());
70
-
])] [El.txt "shadow-md"];
62
+
bg_color (Tailwind.Color.white);
66
+
margin_bottom (rem 1.0);
70
+
font_weight `Semibold;
71
+
text_color (gray 700);
72
+
margin_bottom (rem 0.5);
73
+
] [txt "Medium Shadow"];
76
+
text_color (gray 600);
77
+
] [txt "shadow-md"];
73
-
El.div ~at:[classes_attr (Css.tw [
74
-
Color.bg Color.white;
75
-
Spacing.(to_class (p (Size.rem 1.5)));
78
-
]); At.class' "text-center"] [
79
-
El.h3 ~at:[classes_attr (Css.tw [
80
-
Typography.(to_class (font_weight `Semibold));
81
-
Color.text (Color.make `Gray ~variant:`V700 ());
82
-
]); At.class' "mb-2"] [El.txt "Large Shadow"];
83
-
El.p ~at:[classes_attr (Css.tw [
84
-
Typography.(to_class (font_size `Sm));
85
-
Color.text (Color.make `Gray ~variant:`V600 ());
86
-
])] [El.txt "shadow-lg"];
81
+
bg_color (Tailwind.Color.white);
88
+
font_weight `Semibold;
89
+
text_color (gray 700);
90
+
margin_bottom (rem 0.5);
91
+
] [txt "Large Shadow"];
94
+
text_color (gray 600);
95
+
] [txt "shadow-lg"];
92
-
El.section ~at:[At.class' "mb-8"] [
93
-
El.h2 ~at:[classes_attr (Css.tw [
94
-
Typography.(to_class (font_size `Xl));
95
-
Typography.(to_class (font_weight `Semibold));
96
-
Color.text (Color.make `Gray ~variant:`V700 ());
97
-
]); At.class' "mb-6"] [El.txt "Border Radius"];
101
+
section ~styles:[margin_bottom (rem 2.0)] [
104
+
font_weight `Semibold;
105
+
text_color (gray 700);
106
+
margin_bottom (rem 1.5);
107
+
] [txt "Border Radius"];
99
-
El.div ~at:[classes_attr (Css.tw [
101
-
Flexbox.(to_class (wrap `Wrap));
102
-
Spacing.(to_class (gap `All (Size.rem 1.0)));
103
-
Flexbox.(to_class (justify `Center));
105
-
El.div ~at:[classes_attr (Css.tw [
106
-
Color.bg (Color.make `Blue ~variant:`V100 ());
107
-
Spacing.(to_class (p (Size.rem 1.0)));
108
-
(* No rounded corners *)
109
-
]); At.class' "text-center"] [El.txt "No Radius"];
115
+
bg_color (blue 100);
119
+
margin_bottom (rem 1.0);
120
+
] [txt "Small Radius"];
111
-
El.div ~at:[classes_attr (Css.tw [
112
-
Color.bg (Color.make `Green ~variant:`V100 ());
113
-
Spacing.(to_class (p (Size.rem 1.0)));
114
-
Effects.rounded_sm;
115
-
]); At.class' "text-center"] [El.txt "Small"];
123
+
bg_color (green 100);
127
+
margin_bottom (rem 1.0);
128
+
] [txt "Medium Radius"];
117
-
El.div ~at:[classes_attr (Css.tw [
118
-
Color.bg (Color.make `Purple ~variant:`V100 ());
119
-
Spacing.(to_class (p (Size.rem 1.0)));
120
-
Effects.rounded_md;
121
-
]); At.class' "text-center"] [El.txt "Medium"];
123
-
El.div ~at:[classes_attr (Css.tw [
124
-
Color.bg (Color.make `Red ~variant:`V100 ());
125
-
Spacing.(to_class (p (Size.rem 1.0)));
126
-
Effects.rounded_lg;
127
-
]); At.class' "text-center"] [El.txt "Large"];
131
+
bg_color (purple 100);
135
+
margin_bottom (rem 1.0);
136
+
] [txt "Large Radius"];
129
-
El.div ~at:[classes_attr (Css.tw [
130
-
Color.bg (Color.make `Yellow ~variant:`V100 ());
131
-
Spacing.(to_class (p (Size.rem 1.0)));
132
-
Effects.rounded_full;
133
-
]); At.class' "text-center"] [El.txt "Full"];
139
+
bg_color (yellow 100);
143
+
] [txt "Full Radius"];
(* Interactive Buttons *)
138
-
El.section ~at:[At.class' "mb-8"] [
139
-
El.h2 ~at:[classes_attr (Css.tw [
140
-
Typography.(to_class (font_size `Xl));
141
-
Typography.(to_class (font_weight `Semibold));
142
-
Color.text (Color.make `Gray ~variant:`V700 ());
143
-
]); At.class' "mb-6"] [El.txt "Interactive Buttons"];
148
+
section ~styles:[margin_bottom (rem 2.0)] [
151
+
font_weight `Semibold;
152
+
text_color (gray 700);
153
+
margin_bottom (rem 1.5);
154
+
] [txt "Interactive Buttons"];
145
-
El.div ~at:[classes_attr (Css.tw [
147
-
Flexbox.(to_class (wrap `Wrap));
148
-
Spacing.(to_class (gap `All (Size.rem 1.0)));
149
-
Flexbox.(to_class (justify `Center));
151
-
(* Hover color change *)
152
-
El.button ~at:[classes_attr (Css.tw [
153
-
Color.bg (Color.make `Blue ~variant:`V500 ());
154
-
Color.text Color.white;
155
-
Spacing.(to_class (px (Size.rem 1.5)));
156
-
Spacing.(to_class (py (Size.rem 0.75)));
157
-
Effects.rounded_md;
158
-
Typography.(to_class (font_weight `Medium));
159
-
Effects.transition `All;
160
-
Variants.hover (Color.bg (Color.make `Blue ~variant:`V600 ()));
161
-
])] [El.txt "Hover Color"];
164
-
El.button ~at:[classes_attr (Css.tw [
165
-
Color.bg (Color.make `Green ~variant:`V500 ());
166
-
Color.text Color.white;
167
-
Spacing.(to_class (px (Size.rem 1.5)));
168
-
Spacing.(to_class (py (Size.rem 0.75)));
169
-
Effects.rounded_md;
170
-
Typography.(to_class (font_weight `Medium));
172
-
Effects.transition `All;
173
-
Variants.hover Effects.shadow_lg;
174
-
])] [El.txt "Hover Shadow"];
177
-
El.button ~at:[classes_attr (Css.tw [
178
-
Color.bg (Color.make `Purple ~variant:`V500 ());
179
-
Color.text Color.white;
180
-
Spacing.(to_class (px (Size.rem 1.5)));
181
-
Spacing.(to_class (py (Size.rem 0.75)));
182
-
Effects.rounded_md;
183
-
Typography.(to_class (font_weight `Medium));
184
-
Effects.transition `All;
185
-
]); At.class' "hover:scale-105 active:scale-95"] [El.txt "Scale Effect"];
188
-
El.button ~at:[classes_attr (Css.tw [
189
-
Color.bg (Color.make `Red ~variant:`V500 ());
190
-
Color.text Color.white;
191
-
Spacing.(to_class (px (Size.rem 1.5)));
192
-
Spacing.(to_class (py (Size.rem 0.75)));
193
-
Effects.rounded_md;
194
-
Typography.(to_class (font_weight `Medium));
195
-
Effects.transition `All;
196
-
Variants.focus Effects.shadow_md;
197
-
])] [El.txt "Focus Ring"];
201
-
(* Card Hover Effects *)
202
-
El.section ~at:[At.class' "mb-8"] [
203
-
El.h2 ~at:[classes_attr (Css.tw [
204
-
Typography.(to_class (font_size `Xl));
205
-
Typography.(to_class (font_weight `Semibold));
206
-
Color.text (Color.make `Gray ~variant:`V700 ());
207
-
]); At.class' "mb-6"] [El.txt "Card Hover Effects"];
209
-
El.div ~at:[classes_attr (Css.tw [
211
-
Grid.(to_class (template_cols (`Cols 1)));
212
-
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 2))))));
213
-
Spacing.(to_class (gap `All (Size.rem 1.5)));
215
-
(* Hover shadow card *)
216
-
El.div ~at:[classes_attr (Css.tw [
217
-
Color.bg Color.white;
218
-
Spacing.(to_class (p (Size.rem 1.5)));
219
-
Effects.rounded_lg;
221
-
Effects.transition `All;
222
-
Variants.hover Effects.shadow_lg;
223
-
]); At.class' "cursor-pointer"] [
224
-
El.h3 ~at:[classes_attr (Css.tw [
225
-
Typography.(to_class (font_size `Lg));
226
-
Typography.(to_class (font_weight `Semibold));
227
-
Color.text (Color.make `Gray ~variant:`V800 ());
228
-
]); At.class' "mb-2"] [El.txt "Shadow Lift"];
229
-
El.p ~at:[classes_attr (Css.tw [
230
-
Color.text (Color.make `Gray ~variant:`V600 ());
231
-
])] [El.txt "Hover to see the shadow increase. This creates a lifting effect."];
234
-
(* Scale and shadow card *)
235
-
El.div ~at:[classes_attr (Css.tw [
236
-
Color.bg Color.white;
237
-
Spacing.(to_class (p (Size.rem 1.5)));
238
-
Effects.rounded_lg;
240
-
Effects.transition `All;
241
-
]); At.class' "cursor-pointer hover:scale-105 hover:shadow-xl"] [
242
-
El.h3 ~at:[classes_attr (Css.tw [
243
-
Typography.(to_class (font_size `Lg));
244
-
Typography.(to_class (font_weight `Semibold));
245
-
Color.text (Color.make `Gray ~variant:`V800 ());
246
-
]); At.class' "mb-2"] [El.txt "Scale + Shadow"];
247
-
El.p ~at:[classes_attr (Css.tw [
248
-
Color.text (Color.make `Gray ~variant:`V600 ());
249
-
])] [El.txt "This card both scales up and increases shadow on hover."];
161
+
btn_primary [txt "Primary Button with Hover"];
162
+
btn_secondary [txt "Secondary Button"];
163
+
btn_outline [txt "Outline Button"];
256
-
El.h2 ~at:[classes_attr (Css.tw [
257
-
Typography.(to_class (font_size `Xl));
258
-
Typography.(to_class (font_weight `Semibold));
259
-
Color.text (Color.make `Gray ~variant:`V700 ());
260
-
]); At.class' "mb-6"] [El.txt "Border Effects"];
171
+
font_weight `Semibold;
172
+
text_color (gray 700);
173
+
margin_bottom (rem 1.5);
174
+
] [txt "Border Effects"];
262
-
El.div ~at:[classes_attr (Css.tw [
264
-
Grid.(to_class (template_cols (`Cols 1)));
265
-
Responsive.(to_class (at_breakpoint `Md (Grid.(to_class (template_cols (`Cols 3))))));
266
-
Spacing.(to_class (gap `All (Size.rem 1.5)));
269
-
El.div ~at:[classes_attr (Css.tw [
270
-
Color.bg Color.white;
271
-
Spacing.(to_class (p (Size.rem 1.5)));
273
-
Color.border (Color.make `Gray ~variant:`V200 ());
274
-
Effects.rounded_lg;
275
-
]); At.class' "text-center"] [
276
-
El.h3 ~at:[classes_attr (Css.tw [
277
-
Typography.(to_class (font_weight `Semibold));
278
-
Color.text (Color.make `Gray ~variant:`V700 ());
279
-
]); At.class' "mb-2"] [El.txt "Regular Border"];
280
-
El.p ~at:[classes_attr (Css.tw [
281
-
Typography.(to_class (font_size `Sm));
282
-
Color.text (Color.make `Gray ~variant:`V600 ());
283
-
])] [El.txt "border border-gray-200"];
183
+
bg_color (Tailwind.Color.white);
186
+
border_color (gray 200);
189
+
margin_bottom (rem 1.0);
192
+
font_weight `Semibold;
193
+
text_color (gray 700);
194
+
margin_bottom (rem 0.5);
195
+
] [txt "Regular Border"];
198
+
text_color (gray 600);
199
+
] [txt "border border-gray-200"];
287
-
El.div ~at:[classes_attr (Css.tw [
288
-
Color.bg Color.white;
289
-
Spacing.(to_class (p (Size.rem 1.5)));
291
-
Color.border (Color.make `Blue ~variant:`V300 ());
292
-
Effects.rounded_lg;
293
-
]); At.class' "text-center"] [
294
-
El.h3 ~at:[classes_attr (Css.tw [
295
-
Typography.(to_class (font_weight `Semibold));
296
-
Color.text (Color.make `Blue ~variant:`V600 ());
297
-
]); At.class' "mb-2"] [El.txt "Colored Border"];
298
-
El.p ~at:[classes_attr (Css.tw [
299
-
Typography.(to_class (font_size `Sm));
300
-
Color.text (Color.make `Gray ~variant:`V600 ());
301
-
])] [El.txt "border border-blue-300"];
305
-
El.div ~at:[At.class' "bg-white p-6 border-2 border-purple-300 rounded-lg text-center"] [
306
-
El.h3 ~at:[classes_attr (Css.tw [
307
-
Typography.(to_class (font_weight `Semibold));
308
-
Color.text (Color.make `Purple ~variant:`V600 ());
309
-
]); At.class' "mb-2"] [El.txt "Thick Border"];
310
-
El.p ~at:[classes_attr (Css.tw [
311
-
Typography.(to_class (font_size `Sm));
312
-
Color.text (Color.make `Gray ~variant:`V600 ());
313
-
])] [El.txt "border-2 border-purple-300"];
204
+
bg_color (Tailwind.Color.white);
207
+
border_color (blue 300);
212
+
font_weight `Semibold;
213
+
text_color (blue 600);
214
+
margin_bottom (rem 0.5);
215
+
] [txt "Colored Border"];
218
+
text_color (gray 600);
219
+
] [txt "border border-blue-300"];
323
-
(* Output HTML to stdout *)
324
-
let html_doc = create_effects_demo () in
325
-
let html_string = El.to_string ~doctype:true html_doc in
326
-
print_string html_string
229
+
let html = create_effects_demo () in
230
+
print_string (El.to_string ~doctype:true html)