@vanduo-oss/framework 1.2.5 → 1.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Vanduo Framework v1.2.5
1
+ # Vanduo Framework v1.2.6
2
2
 
3
3
  <p align="center">
4
4
  <img src="vanduo-banner.svg" alt="Vanduo Framework Banner" width="100%">
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Vanduo Framework - Color Utility Classes
3
+ *
4
+ * Per-hue background and text color utilities for all Open Color scales.
5
+ * Usage:
6
+ * Background: .vd-bg-{color}-{shade} (e.g. .vd-bg-teal-3)
7
+ * Text: .vd-text-{color}-{shade} (e.g. .vd-text-indigo-7)
8
+ *
9
+ * Covers 13 hues × 10 shades (0–9) × 2 properties = 260 classes.
10
+ * All values reference existing CSS custom properties from colors.css.
11
+ *
12
+ * @since 1.2.6
13
+ * @license MIT
14
+ */
15
+
16
+ /* ═══════════════════════════════════════════════════════════════════════════
17
+ * RED
18
+ * ═══════════════════════════════════════════════════════════════════════════ */
19
+
20
+ .vd-bg-red-0 { background-color: var(--red-0); }
21
+ .vd-bg-red-1 { background-color: var(--red-1); }
22
+ .vd-bg-red-2 { background-color: var(--red-2); }
23
+ .vd-bg-red-3 { background-color: var(--red-3); }
24
+ .vd-bg-red-4 { background-color: var(--red-4); }
25
+ .vd-bg-red-5 { background-color: var(--red-5); }
26
+ .vd-bg-red-6 { background-color: var(--red-6); }
27
+ .vd-bg-red-7 { background-color: var(--red-7); }
28
+ .vd-bg-red-8 { background-color: var(--red-8); }
29
+ .vd-bg-red-9 { background-color: var(--red-9); }
30
+
31
+ .vd-text-red-0 { color: var(--red-0); }
32
+ .vd-text-red-1 { color: var(--red-1); }
33
+ .vd-text-red-2 { color: var(--red-2); }
34
+ .vd-text-red-3 { color: var(--red-3); }
35
+ .vd-text-red-4 { color: var(--red-4); }
36
+ .vd-text-red-5 { color: var(--red-5); }
37
+ .vd-text-red-6 { color: var(--red-6); }
38
+ .vd-text-red-7 { color: var(--red-7); }
39
+ .vd-text-red-8 { color: var(--red-8); }
40
+ .vd-text-red-9 { color: var(--red-9); }
41
+
42
+ /* ═══════════════════════════════════════════════════════════════════════════
43
+ * ORANGE
44
+ * ═══════════════════════════════════════════════════════════════════════════ */
45
+
46
+ .vd-bg-orange-0 { background-color: var(--orange-0); }
47
+ .vd-bg-orange-1 { background-color: var(--orange-1); }
48
+ .vd-bg-orange-2 { background-color: var(--orange-2); }
49
+ .vd-bg-orange-3 { background-color: var(--orange-3); }
50
+ .vd-bg-orange-4 { background-color: var(--orange-4); }
51
+ .vd-bg-orange-5 { background-color: var(--orange-5); }
52
+ .vd-bg-orange-6 { background-color: var(--orange-6); }
53
+ .vd-bg-orange-7 { background-color: var(--orange-7); }
54
+ .vd-bg-orange-8 { background-color: var(--orange-8); }
55
+ .vd-bg-orange-9 { background-color: var(--orange-9); }
56
+
57
+ .vd-text-orange-0 { color: var(--orange-0); }
58
+ .vd-text-orange-1 { color: var(--orange-1); }
59
+ .vd-text-orange-2 { color: var(--orange-2); }
60
+ .vd-text-orange-3 { color: var(--orange-3); }
61
+ .vd-text-orange-4 { color: var(--orange-4); }
62
+ .vd-text-orange-5 { color: var(--orange-5); }
63
+ .vd-text-orange-6 { color: var(--orange-6); }
64
+ .vd-text-orange-7 { color: var(--orange-7); }
65
+ .vd-text-orange-8 { color: var(--orange-8); }
66
+ .vd-text-orange-9 { color: var(--orange-9); }
67
+
68
+ /* ═══════════════════════════════════════════════════════════════════════════
69
+ * YELLOW
70
+ * ═══════════════════════════════════════════════════════════════════════════ */
71
+
72
+ .vd-bg-yellow-0 { background-color: var(--yellow-0); }
73
+ .vd-bg-yellow-1 { background-color: var(--yellow-1); }
74
+ .vd-bg-yellow-2 { background-color: var(--yellow-2); }
75
+ .vd-bg-yellow-3 { background-color: var(--yellow-3); }
76
+ .vd-bg-yellow-4 { background-color: var(--yellow-4); }
77
+ .vd-bg-yellow-5 { background-color: var(--yellow-5); }
78
+ .vd-bg-yellow-6 { background-color: var(--yellow-6); }
79
+ .vd-bg-yellow-7 { background-color: var(--yellow-7); }
80
+ .vd-bg-yellow-8 { background-color: var(--yellow-8); }
81
+ .vd-bg-yellow-9 { background-color: var(--yellow-9); }
82
+
83
+ .vd-text-yellow-0 { color: var(--yellow-0); }
84
+ .vd-text-yellow-1 { color: var(--yellow-1); }
85
+ .vd-text-yellow-2 { color: var(--yellow-2); }
86
+ .vd-text-yellow-3 { color: var(--yellow-3); }
87
+ .vd-text-yellow-4 { color: var(--yellow-4); }
88
+ .vd-text-yellow-5 { color: var(--yellow-5); }
89
+ .vd-text-yellow-6 { color: var(--yellow-6); }
90
+ .vd-text-yellow-7 { color: var(--yellow-7); }
91
+ .vd-text-yellow-8 { color: var(--yellow-8); }
92
+ .vd-text-yellow-9 { color: var(--yellow-9); }
93
+
94
+ /* ═══════════════════════════════════════════════════════════════════════════
95
+ * LIME
96
+ * ═══════════════════════════════════════════════════════════════════════════ */
97
+
98
+ .vd-bg-lime-0 { background-color: var(--lime-0); }
99
+ .vd-bg-lime-1 { background-color: var(--lime-1); }
100
+ .vd-bg-lime-2 { background-color: var(--lime-2); }
101
+ .vd-bg-lime-3 { background-color: var(--lime-3); }
102
+ .vd-bg-lime-4 { background-color: var(--lime-4); }
103
+ .vd-bg-lime-5 { background-color: var(--lime-5); }
104
+ .vd-bg-lime-6 { background-color: var(--lime-6); }
105
+ .vd-bg-lime-7 { background-color: var(--lime-7); }
106
+ .vd-bg-lime-8 { background-color: var(--lime-8); }
107
+ .vd-bg-lime-9 { background-color: var(--lime-9); }
108
+
109
+ .vd-text-lime-0 { color: var(--lime-0); }
110
+ .vd-text-lime-1 { color: var(--lime-1); }
111
+ .vd-text-lime-2 { color: var(--lime-2); }
112
+ .vd-text-lime-3 { color: var(--lime-3); }
113
+ .vd-text-lime-4 { color: var(--lime-4); }
114
+ .vd-text-lime-5 { color: var(--lime-5); }
115
+ .vd-text-lime-6 { color: var(--lime-6); }
116
+ .vd-text-lime-7 { color: var(--lime-7); }
117
+ .vd-text-lime-8 { color: var(--lime-8); }
118
+ .vd-text-lime-9 { color: var(--lime-9); }
119
+
120
+ /* ═══════════════════════════════════════════════════════════════════════════
121
+ * GREEN
122
+ * ═══════════════════════════════════════════════════════════════════════════ */
123
+
124
+ .vd-bg-green-0 { background-color: var(--green-0); }
125
+ .vd-bg-green-1 { background-color: var(--green-1); }
126
+ .vd-bg-green-2 { background-color: var(--green-2); }
127
+ .vd-bg-green-3 { background-color: var(--green-3); }
128
+ .vd-bg-green-4 { background-color: var(--green-4); }
129
+ .vd-bg-green-5 { background-color: var(--green-5); }
130
+ .vd-bg-green-6 { background-color: var(--green-6); }
131
+ .vd-bg-green-7 { background-color: var(--green-7); }
132
+ .vd-bg-green-8 { background-color: var(--green-8); }
133
+ .vd-bg-green-9 { background-color: var(--green-9); }
134
+
135
+ .vd-text-green-0 { color: var(--green-0); }
136
+ .vd-text-green-1 { color: var(--green-1); }
137
+ .vd-text-green-2 { color: var(--green-2); }
138
+ .vd-text-green-3 { color: var(--green-3); }
139
+ .vd-text-green-4 { color: var(--green-4); }
140
+ .vd-text-green-5 { color: var(--green-5); }
141
+ .vd-text-green-6 { color: var(--green-6); }
142
+ .vd-text-green-7 { color: var(--green-7); }
143
+ .vd-text-green-8 { color: var(--green-8); }
144
+ .vd-text-green-9 { color: var(--green-9); }
145
+
146
+ /* ═══════════════════════════════════════════════════════════════════════════
147
+ * TEAL
148
+ * ═══════════════════════════════════════════════════════════════════════════ */
149
+
150
+ .vd-bg-teal-0 { background-color: var(--teal-0); }
151
+ .vd-bg-teal-1 { background-color: var(--teal-1); }
152
+ .vd-bg-teal-2 { background-color: var(--teal-2); }
153
+ .vd-bg-teal-3 { background-color: var(--teal-3); }
154
+ .vd-bg-teal-4 { background-color: var(--teal-4); }
155
+ .vd-bg-teal-5 { background-color: var(--teal-5); }
156
+ .vd-bg-teal-6 { background-color: var(--teal-6); }
157
+ .vd-bg-teal-7 { background-color: var(--teal-7); }
158
+ .vd-bg-teal-8 { background-color: var(--teal-8); }
159
+ .vd-bg-teal-9 { background-color: var(--teal-9); }
160
+
161
+ .vd-text-teal-0 { color: var(--teal-0); }
162
+ .vd-text-teal-1 { color: var(--teal-1); }
163
+ .vd-text-teal-2 { color: var(--teal-2); }
164
+ .vd-text-teal-3 { color: var(--teal-3); }
165
+ .vd-text-teal-4 { color: var(--teal-4); }
166
+ .vd-text-teal-5 { color: var(--teal-5); }
167
+ .vd-text-teal-6 { color: var(--teal-6); }
168
+ .vd-text-teal-7 { color: var(--teal-7); }
169
+ .vd-text-teal-8 { color: var(--teal-8); }
170
+ .vd-text-teal-9 { color: var(--teal-9); }
171
+
172
+ /* ═══════════════════════════════════════════════════════════════════════════
173
+ * CYAN
174
+ * ═══════════════════════════════════════════════════════════════════════════ */
175
+
176
+ .vd-bg-cyan-0 { background-color: var(--cyan-0); }
177
+ .vd-bg-cyan-1 { background-color: var(--cyan-1); }
178
+ .vd-bg-cyan-2 { background-color: var(--cyan-2); }
179
+ .vd-bg-cyan-3 { background-color: var(--cyan-3); }
180
+ .vd-bg-cyan-4 { background-color: var(--cyan-4); }
181
+ .vd-bg-cyan-5 { background-color: var(--cyan-5); }
182
+ .vd-bg-cyan-6 { background-color: var(--cyan-6); }
183
+ .vd-bg-cyan-7 { background-color: var(--cyan-7); }
184
+ .vd-bg-cyan-8 { background-color: var(--cyan-8); }
185
+ .vd-bg-cyan-9 { background-color: var(--cyan-9); }
186
+
187
+ .vd-text-cyan-0 { color: var(--cyan-0); }
188
+ .vd-text-cyan-1 { color: var(--cyan-1); }
189
+ .vd-text-cyan-2 { color: var(--cyan-2); }
190
+ .vd-text-cyan-3 { color: var(--cyan-3); }
191
+ .vd-text-cyan-4 { color: var(--cyan-4); }
192
+ .vd-text-cyan-5 { color: var(--cyan-5); }
193
+ .vd-text-cyan-6 { color: var(--cyan-6); }
194
+ .vd-text-cyan-7 { color: var(--cyan-7); }
195
+ .vd-text-cyan-8 { color: var(--cyan-8); }
196
+ .vd-text-cyan-9 { color: var(--cyan-9); }
197
+
198
+ /* ═══════════════════════════════════════════════════════════════════════════
199
+ * BLUE
200
+ * ═══════════════════════════════════════════════════════════════════════════ */
201
+
202
+ .vd-bg-blue-0 { background-color: var(--blue-0); }
203
+ .vd-bg-blue-1 { background-color: var(--blue-1); }
204
+ .vd-bg-blue-2 { background-color: var(--blue-2); }
205
+ .vd-bg-blue-3 { background-color: var(--blue-3); }
206
+ .vd-bg-blue-4 { background-color: var(--blue-4); }
207
+ .vd-bg-blue-5 { background-color: var(--blue-5); }
208
+ .vd-bg-blue-6 { background-color: var(--blue-6); }
209
+ .vd-bg-blue-7 { background-color: var(--blue-7); }
210
+ .vd-bg-blue-8 { background-color: var(--blue-8); }
211
+ .vd-bg-blue-9 { background-color: var(--blue-9); }
212
+
213
+ .vd-text-blue-0 { color: var(--blue-0); }
214
+ .vd-text-blue-1 { color: var(--blue-1); }
215
+ .vd-text-blue-2 { color: var(--blue-2); }
216
+ .vd-text-blue-3 { color: var(--blue-3); }
217
+ .vd-text-blue-4 { color: var(--blue-4); }
218
+ .vd-text-blue-5 { color: var(--blue-5); }
219
+ .vd-text-blue-6 { color: var(--blue-6); }
220
+ .vd-text-blue-7 { color: var(--blue-7); }
221
+ .vd-text-blue-8 { color: var(--blue-8); }
222
+ .vd-text-blue-9 { color: var(--blue-9); }
223
+
224
+ /* ═══════════════════════════════════════════════════════════════════════════
225
+ * INDIGO
226
+ * ═══════════════════════════════════════════════════════════════════════════ */
227
+
228
+ .vd-bg-indigo-0 { background-color: var(--indigo-0); }
229
+ .vd-bg-indigo-1 { background-color: var(--indigo-1); }
230
+ .vd-bg-indigo-2 { background-color: var(--indigo-2); }
231
+ .vd-bg-indigo-3 { background-color: var(--indigo-3); }
232
+ .vd-bg-indigo-4 { background-color: var(--indigo-4); }
233
+ .vd-bg-indigo-5 { background-color: var(--indigo-5); }
234
+ .vd-bg-indigo-6 { background-color: var(--indigo-6); }
235
+ .vd-bg-indigo-7 { background-color: var(--indigo-7); }
236
+ .vd-bg-indigo-8 { background-color: var(--indigo-8); }
237
+ .vd-bg-indigo-9 { background-color: var(--indigo-9); }
238
+
239
+ .vd-text-indigo-0 { color: var(--indigo-0); }
240
+ .vd-text-indigo-1 { color: var(--indigo-1); }
241
+ .vd-text-indigo-2 { color: var(--indigo-2); }
242
+ .vd-text-indigo-3 { color: var(--indigo-3); }
243
+ .vd-text-indigo-4 { color: var(--indigo-4); }
244
+ .vd-text-indigo-5 { color: var(--indigo-5); }
245
+ .vd-text-indigo-6 { color: var(--indigo-6); }
246
+ .vd-text-indigo-7 { color: var(--indigo-7); }
247
+ .vd-text-indigo-8 { color: var(--indigo-8); }
248
+ .vd-text-indigo-9 { color: var(--indigo-9); }
249
+
250
+ /* ═══════════════════════════════════════════════════════════════════════════
251
+ * VIOLET
252
+ * ═══════════════════════════════════════════════════════════════════════════ */
253
+
254
+ .vd-bg-violet-0 { background-color: var(--violet-0); }
255
+ .vd-bg-violet-1 { background-color: var(--violet-1); }
256
+ .vd-bg-violet-2 { background-color: var(--violet-2); }
257
+ .vd-bg-violet-3 { background-color: var(--violet-3); }
258
+ .vd-bg-violet-4 { background-color: var(--violet-4); }
259
+ .vd-bg-violet-5 { background-color: var(--violet-5); }
260
+ .vd-bg-violet-6 { background-color: var(--violet-6); }
261
+ .vd-bg-violet-7 { background-color: var(--violet-7); }
262
+ .vd-bg-violet-8 { background-color: var(--violet-8); }
263
+ .vd-bg-violet-9 { background-color: var(--violet-9); }
264
+
265
+ .vd-text-violet-0 { color: var(--violet-0); }
266
+ .vd-text-violet-1 { color: var(--violet-1); }
267
+ .vd-text-violet-2 { color: var(--violet-2); }
268
+ .vd-text-violet-3 { color: var(--violet-3); }
269
+ .vd-text-violet-4 { color: var(--violet-4); }
270
+ .vd-text-violet-5 { color: var(--violet-5); }
271
+ .vd-text-violet-6 { color: var(--violet-6); }
272
+ .vd-text-violet-7 { color: var(--violet-7); }
273
+ .vd-text-violet-8 { color: var(--violet-8); }
274
+ .vd-text-violet-9 { color: var(--violet-9); }
275
+
276
+ /* ═══════════════════════════════════════════════════════════════════════════
277
+ * GRAPE
278
+ * ═══════════════════════════════════════════════════════════════════════════ */
279
+
280
+ .vd-bg-grape-0 { background-color: var(--grape-0); }
281
+ .vd-bg-grape-1 { background-color: var(--grape-1); }
282
+ .vd-bg-grape-2 { background-color: var(--grape-2); }
283
+ .vd-bg-grape-3 { background-color: var(--grape-3); }
284
+ .vd-bg-grape-4 { background-color: var(--grape-4); }
285
+ .vd-bg-grape-5 { background-color: var(--grape-5); }
286
+ .vd-bg-grape-6 { background-color: var(--grape-6); }
287
+ .vd-bg-grape-7 { background-color: var(--grape-7); }
288
+ .vd-bg-grape-8 { background-color: var(--grape-8); }
289
+ .vd-bg-grape-9 { background-color: var(--grape-9); }
290
+
291
+ .vd-text-grape-0 { color: var(--grape-0); }
292
+ .vd-text-grape-1 { color: var(--grape-1); }
293
+ .vd-text-grape-2 { color: var(--grape-2); }
294
+ .vd-text-grape-3 { color: var(--grape-3); }
295
+ .vd-text-grape-4 { color: var(--grape-4); }
296
+ .vd-text-grape-5 { color: var(--grape-5); }
297
+ .vd-text-grape-6 { color: var(--grape-6); }
298
+ .vd-text-grape-7 { color: var(--grape-7); }
299
+ .vd-text-grape-8 { color: var(--grape-8); }
300
+ .vd-text-grape-9 { color: var(--grape-9); }
301
+
302
+ /* ═══════════════════════════════════════════════════════════════════════════
303
+ * PINK
304
+ * ═══════════════════════════════════════════════════════════════════════════ */
305
+
306
+ .vd-bg-pink-0 { background-color: var(--pink-0); }
307
+ .vd-bg-pink-1 { background-color: var(--pink-1); }
308
+ .vd-bg-pink-2 { background-color: var(--pink-2); }
309
+ .vd-bg-pink-3 { background-color: var(--pink-3); }
310
+ .vd-bg-pink-4 { background-color: var(--pink-4); }
311
+ .vd-bg-pink-5 { background-color: var(--pink-5); }
312
+ .vd-bg-pink-6 { background-color: var(--pink-6); }
313
+ .vd-bg-pink-7 { background-color: var(--pink-7); }
314
+ .vd-bg-pink-8 { background-color: var(--pink-8); }
315
+ .vd-bg-pink-9 { background-color: var(--pink-9); }
316
+
317
+ .vd-text-pink-0 { color: var(--pink-0); }
318
+ .vd-text-pink-1 { color: var(--pink-1); }
319
+ .vd-text-pink-2 { color: var(--pink-2); }
320
+ .vd-text-pink-3 { color: var(--pink-3); }
321
+ .vd-text-pink-4 { color: var(--pink-4); }
322
+ .vd-text-pink-5 { color: var(--pink-5); }
323
+ .vd-text-pink-6 { color: var(--pink-6); }
324
+ .vd-text-pink-7 { color: var(--pink-7); }
325
+ .vd-text-pink-8 { color: var(--pink-8); }
326
+ .vd-text-pink-9 { color: var(--pink-9); }
327
+
328
+ /* ═══════════════════════════════════════════════════════════════════════════
329
+ * GRAY
330
+ * ═══════════════════════════════════════════════════════════════════════════ */
331
+
332
+ .vd-bg-gray-0 { background-color: var(--gray-0); }
333
+ .vd-bg-gray-1 { background-color: var(--gray-1); }
334
+ .vd-bg-gray-2 { background-color: var(--gray-2); }
335
+ .vd-bg-gray-3 { background-color: var(--gray-3); }
336
+ .vd-bg-gray-4 { background-color: var(--gray-4); }
337
+ .vd-bg-gray-5 { background-color: var(--gray-5); }
338
+ .vd-bg-gray-6 { background-color: var(--gray-6); }
339
+ .vd-bg-gray-7 { background-color: var(--gray-7); }
340
+ .vd-bg-gray-8 { background-color: var(--gray-8); }
341
+ .vd-bg-gray-9 { background-color: var(--gray-9); }
342
+
343
+ .vd-text-gray-0 { color: var(--gray-0); }
344
+ .vd-text-gray-1 { color: var(--gray-1); }
345
+ .vd-text-gray-2 { color: var(--gray-2); }
346
+ .vd-text-gray-3 { color: var(--gray-3); }
347
+ .vd-text-gray-4 { color: var(--gray-4); }
348
+ .vd-text-gray-5 { color: var(--gray-5); }
349
+ .vd-text-gray-6 { color: var(--gray-6); }
350
+ .vd-text-gray-7 { color: var(--gray-7); }
351
+ .vd-text-gray-8 { color: var(--gray-8); }
352
+ .vd-text-gray-9 { color: var(--gray-9); }
package/css/vanduo.css CHANGED
@@ -70,6 +70,9 @@
70
70
  @import url('utilities/media.css');
71
71
  @import url('utilities/table.css');
72
72
 
73
+ /* Utilities - Color palette (per-hue bg/text classes) */
74
+ @import url('utilities/color-utilities.css');
75
+
73
76
  /* Effects - Phase 7 */
74
77
  @import url('effects/parallax.css');
75
78
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.2.5",
3
- "builtAt": "2026-03-08T10:52:48.224Z",
4
- "commit": "f37c545",
2
+ "version": "1.2.6",
3
+ "builtAt": "2026-03-11T06:15:19.191Z",
4
+ "commit": "3283a0d",
5
5
  "mode": "development+production"
6
6
  }
@@ -1,4 +1,4 @@
1
- /*! Vanduo v1.2.5 | Built: 2026-03-08T10:52:48.224Z | git:f37c545 | development */
1
+ /*! Vanduo v1.2.6 | Built: 2026-03-11T06:15:19.191Z | git:3283a0d | development */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -132,7 +132,7 @@ module.exports = __toCommonJS(index_exports);
132
132
  // js/vanduo.js
133
133
  (function() {
134
134
  "use strict";
135
- const VANDUO_VERSION = true ? "1.2.5" : "0.0.0-dev";
135
+ const VANDUO_VERSION = true ? "1.2.6" : "0.0.0-dev";
136
136
  const Vanduo2 = {
137
137
  version: VANDUO_VERSION,
138
138
  components: {},
@@ -1,5 +1,5 @@
1
- /*! Vanduo v1.2.5 | Built: 2026-03-08T10:52:48.224Z | git:f37c545 | production */
2
- var N=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var se=(d,e)=>{for(var t in e)N(d,t,{get:e[t],enumerable:!0})},ie=(d,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of te(e))!ne.call(d,s)&&s!==t&&N(d,s,{get:()=>e[s],enumerable:!(n=ee(e,s))||n.enumerable});return d};var ae=d=>ie(N({},"__esModule",{value:!0}),d);var re={};se(re,{Vanduo:()=>B,default:()=>oe});module.exports=ae(re);(function(){"use strict";let d={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){d.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){d.unregister(n)})},getAll:function(){let e=[];return this.instances.forEach(function(t,n){e.push({element:n,component:t.component,registeredAt:t.registeredAt})}),e},has:function(e){return this.instances.has(e)}};window.addEventListener("beforeunload",function(){d.destroyAll()}),window.VanduoLifecycle=d,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",d)})();(function(){"use strict";let e={version:"1.2.5",components:{},init:function(){typeof ready<"u"?ready(()=>{this.initComponents()}):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{this.initComponents()}):this.initComponents()},initComponents:function(){Object.keys(this.components).forEach(t=>{let n=this.components[t];if(n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to initialize component "'+t+'":',s)}}),console.log("Vanduo Framework v"+this.version+" initialized")},register:function(t,n){this.components[t]=n},reinit:function(t){let n=this.components[t];if(n&&n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to reinitialize component "'+t+'":',s)}},destroyAll:function(){let t=Object.keys(this.components);for(let n=0;n<t.length;n++){let s=this.components[t[n]];if(s&&s.destroyAll&&typeof s.destroyAll=="function")try{s.destroyAll()}catch(i){console.warn('[Vanduo] Failed to destroy component "'+t[n]+'":',i)}}typeof window.VanduoLifecycle<"u"&&window.VanduoLifecycle.destroyAll()},getComponent:function(t){return this.components[t]||null}};window.Vanduo=e})();(function(){"use strict";let d={_snippetIdCounter:0,getSnippetInstanceId:function(e){if(e.dataset.codeSnippetId)return e.dataset.codeSnippetId;let t=(e.id||"").trim();return t?(e.dataset.codeSnippetId=`snippet-${t}`,e.dataset.codeSnippetId):(this._snippetIdCounter+=1,e.dataset.codeSnippetId=`snippet-auto-${this._snippetIdCounter}`,e.dataset.codeSnippetId)},addListener:function(e,t,n,s){t&&(t.addEventListener(n,s),e._codeSnippetCleanup||(e._codeSnippetCleanup=[]),e._codeSnippetCleanup.push(()=>t.removeEventListener(n,s)))},init:function(){document.querySelectorAll(".vd-code-snippet").forEach(t=>{t.dataset.initialized||this.initSnippet(t)})},initSnippet:function(e){e.dataset.initialized="true",e._codeSnippetCleanup=[];let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&n&&this.initCollapsible(e,t,n);let s=e.querySelectorAll(".vd-code-snippet-tab"),i=e.querySelectorAll(".vd-code-snippet-pane");s.length>0&&this.initTabs(e,s,i);let a=e.querySelector(".vd-code-snippet-copy");a&&this.initCopyButton(e,a),e.querySelectorAll("[data-extract]").forEach(c=>{this.extractHtml(c)}),e.querySelectorAll(".has-line-numbers").forEach(c=>{this.addLineNumbers(c)})},initCollapsible:function(e,t,n){let s=e.dataset.expanded==="true";t.setAttribute("aria-expanded",s),n.dataset.visible=s,this.addListener(e,t,"click",()=>{let i=e.dataset.expanded==="true";e.dataset.expanded=!i,t.setAttribute("aria-expanded",!i),n.dataset.visible=!i,i||n.querySelectorAll("[data-extract]:not([data-extracted])").forEach(r=>{this.extractHtml(r)});let a=new CustomEvent("codesnippet:toggle",{bubbles:!0,detail:{snippet:e,expanded:!i}});e.dispatchEvent(a)})},initTabs:function(e,t,n){let s=this.getSnippetInstanceId(e),i=e.querySelector(".vd-code-snippet-tabs");i&&i.setAttribute("role","tablist"),t.forEach((a,o)=>{let r=a.dataset.lang,c=a.classList.contains("is-active");a.setAttribute("role","tab"),a.setAttribute("aria-selected",c),a.setAttribute("tabindex",c?"0":"-1"),a.id=a.id||`code-tab-${s}-${r||"tab"}-${o}`;let l=e.querySelector(`.vd-code-snippet-pane[data-lang="${r}"]`);l&&(l.id=l.id||`code-pane-${s}-${r||"pane"}-${o}`,l.setAttribute("role","tabpanel"),a.setAttribute("aria-controls",l.id),l.setAttribute("aria-labelledby",a.id)),this.addListener(e,a,"click",()=>{this.switchTab(e,a,t,n)}),this.addListener(e,a,"keydown",h=>{this.handleTabKeydown(h,e,t,n)})})},switchTab:function(e,t,n,s){let i=t.dataset.lang;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1")}),s.forEach(r=>{r.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0");let a=e.querySelector(`.vd-code-snippet-pane[data-lang="${i}"]`);a&&a.classList.add("is-active");let o=new CustomEvent("codesnippet:tabchange",{bubbles:!0,detail:{snippet:e,tab:t,lang:i}});e.dispatchEvent(o)},handleTabKeydown:function(e,t,n,s){let i=Array.from(n),a=i.indexOf(e.target),o;switch(e.key){case"ArrowLeft":e.preventDefault(),o=a>0?a-1:i.length-1;break;case"ArrowRight":e.preventDefault(),o=a<i.length-1?a+1:0;break;case"Home":e.preventDefault(),o=0;break;case"End":e.preventDefault(),o=i.length-1;break;default:return}o!==a&&(i[o].focus(),this.switchTab(t,i[o],n,s))},initCopyButton:function(e,t){this.addListener(e,t,"click",async()=>{await this.copyCode(e,t)})},copyCode:async function(e,t){let n=e.querySelector(".vd-code-snippet-pane.is-active")||e.querySelector(".vd-code-snippet-pane");if(!n){console.warn("CodeSnippet: No code pane found");return}let i=(n.querySelector("code")||n).textContent;try{await navigator.clipboard.writeText(i),this.showCopyFeedback(t,!0)}catch{let r=this.fallbackCopy(i);this.showCopyFeedback(t,r)}let a=new CustomEvent("codesnippet:copy",{bubbles:!0,detail:{snippet:e,code:i,success:!0}});e.dispatchEvent(a)},fallbackCopy:function(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",t.style.top="-9999px",document.body.appendChild(t),t.focus(),t.select();let n=!1;try{n=document.execCommand("copy")}catch(s){console.warn("CodeSnippet: Fallback copy failed",s)}return document.body.removeChild(t),n},showCopyFeedback:function(e,t){if(t){e.classList.add("is-copied");let n=document.createElement("span");n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.className="sr-only",n.textContent="Code copied to clipboard",e.appendChild(n),setTimeout(()=>{e.classList.remove("is-copied"),n.parentNode&&n.parentNode.removeChild(n)},2e3)}},extractHtml:function(e){let t=e.dataset.extract;if(!t)return;let n=document.querySelector(t);if(!n){console.warn(`CodeSnippet: Source element not found: ${t}`);return}let s=n.innerHTML;s=this.formatHtml(s),s=this.escapeHtml(s),s=this.highlightHtml(s);let i=document.createElement("code");i.innerHTML=s,e.replaceChildren(i),e.dataset.extracted="true"},formatHtml:function(e){e=e.trim();let t=e.split(`
1
+ /*! Vanduo v1.2.6 | Built: 2026-03-11T06:15:19.191Z | git:3283a0d | production */
2
+ var N=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.prototype.hasOwnProperty;var se=(d,e)=>{for(var t in e)N(d,t,{get:e[t],enumerable:!0})},ie=(d,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of te(e))!ne.call(d,s)&&s!==t&&N(d,s,{get:()=>e[s],enumerable:!(n=ee(e,s))||n.enumerable});return d};var ae=d=>ie(N({},"__esModule",{value:!0}),d);var re={};se(re,{Vanduo:()=>B,default:()=>oe});module.exports=ae(re);(function(){"use strict";let d={instances:new Map,register:function(e,t,n=[]){if(this.instances.has(e)){let s=this.instances.get(e);s.cleanup=s.cleanup.concat(n);return}this.instances.set(e,{component:t,cleanup:n,registeredAt:Date.now()})},unregister:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(function(n){try{n()}catch(s){console.warn("[Vanduo Lifecycle] Cleanup error:",s)}}),this.instances.delete(e))},destroyAll:function(e){let t=[];this.instances.forEach(function(n,s){(!e||n.component===e)&&t.push(s)}),t.forEach(function(n){d.unregister(n)})},destroyAllInContainer:function(e){let t=[];this.instances.forEach(function(n,s){e.contains(s)&&t.push(s)}),t.forEach(function(n){d.unregister(n)})},getAll:function(){let e=[];return this.instances.forEach(function(t,n){e.push({element:n,component:t.component,registeredAt:t.registeredAt})}),e},has:function(e){return this.instances.has(e)}};window.addEventListener("beforeunload",function(){d.destroyAll()}),window.VanduoLifecycle=d,typeof window.Vanduo<"u"&&window.Vanduo.register("lifecycle",d)})();(function(){"use strict";let e={version:"1.2.6",components:{},init:function(){typeof ready<"u"?ready(()=>{this.initComponents()}):document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{this.initComponents()}):this.initComponents()},initComponents:function(){Object.keys(this.components).forEach(t=>{let n=this.components[t];if(n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to initialize component "'+t+'":',s)}}),console.log("Vanduo Framework v"+this.version+" initialized")},register:function(t,n){this.components[t]=n},reinit:function(t){let n=this.components[t];if(n&&n.init&&typeof n.init=="function")try{n.init()}catch(s){console.warn('[Vanduo] Failed to reinitialize component "'+t+'":',s)}},destroyAll:function(){let t=Object.keys(this.components);for(let n=0;n<t.length;n++){let s=this.components[t[n]];if(s&&s.destroyAll&&typeof s.destroyAll=="function")try{s.destroyAll()}catch(i){console.warn('[Vanduo] Failed to destroy component "'+t[n]+'":',i)}}typeof window.VanduoLifecycle<"u"&&window.VanduoLifecycle.destroyAll()},getComponent:function(t){return this.components[t]||null}};window.Vanduo=e})();(function(){"use strict";let d={_snippetIdCounter:0,getSnippetInstanceId:function(e){if(e.dataset.codeSnippetId)return e.dataset.codeSnippetId;let t=(e.id||"").trim();return t?(e.dataset.codeSnippetId=`snippet-${t}`,e.dataset.codeSnippetId):(this._snippetIdCounter+=1,e.dataset.codeSnippetId=`snippet-auto-${this._snippetIdCounter}`,e.dataset.codeSnippetId)},addListener:function(e,t,n,s){t&&(t.addEventListener(n,s),e._codeSnippetCleanup||(e._codeSnippetCleanup=[]),e._codeSnippetCleanup.push(()=>t.removeEventListener(n,s)))},init:function(){document.querySelectorAll(".vd-code-snippet").forEach(t=>{t.dataset.initialized||this.initSnippet(t)})},initSnippet:function(e){e.dataset.initialized="true",e._codeSnippetCleanup=[];let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&n&&this.initCollapsible(e,t,n);let s=e.querySelectorAll(".vd-code-snippet-tab"),i=e.querySelectorAll(".vd-code-snippet-pane");s.length>0&&this.initTabs(e,s,i);let a=e.querySelector(".vd-code-snippet-copy");a&&this.initCopyButton(e,a),e.querySelectorAll("[data-extract]").forEach(c=>{this.extractHtml(c)}),e.querySelectorAll(".has-line-numbers").forEach(c=>{this.addLineNumbers(c)})},initCollapsible:function(e,t,n){let s=e.dataset.expanded==="true";t.setAttribute("aria-expanded",s),n.dataset.visible=s,this.addListener(e,t,"click",()=>{let i=e.dataset.expanded==="true";e.dataset.expanded=!i,t.setAttribute("aria-expanded",!i),n.dataset.visible=!i,i||n.querySelectorAll("[data-extract]:not([data-extracted])").forEach(r=>{this.extractHtml(r)});let a=new CustomEvent("codesnippet:toggle",{bubbles:!0,detail:{snippet:e,expanded:!i}});e.dispatchEvent(a)})},initTabs:function(e,t,n){let s=this.getSnippetInstanceId(e),i=e.querySelector(".vd-code-snippet-tabs");i&&i.setAttribute("role","tablist"),t.forEach((a,o)=>{let r=a.dataset.lang,c=a.classList.contains("is-active");a.setAttribute("role","tab"),a.setAttribute("aria-selected",c),a.setAttribute("tabindex",c?"0":"-1"),a.id=a.id||`code-tab-${s}-${r||"tab"}-${o}`;let l=e.querySelector(`.vd-code-snippet-pane[data-lang="${r}"]`);l&&(l.id=l.id||`code-pane-${s}-${r||"pane"}-${o}`,l.setAttribute("role","tabpanel"),a.setAttribute("aria-controls",l.id),l.setAttribute("aria-labelledby",a.id)),this.addListener(e,a,"click",()=>{this.switchTab(e,a,t,n)}),this.addListener(e,a,"keydown",h=>{this.handleTabKeydown(h,e,t,n)})})},switchTab:function(e,t,n,s){let i=t.dataset.lang;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1")}),s.forEach(r=>{r.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0");let a=e.querySelector(`.vd-code-snippet-pane[data-lang="${i}"]`);a&&a.classList.add("is-active");let o=new CustomEvent("codesnippet:tabchange",{bubbles:!0,detail:{snippet:e,tab:t,lang:i}});e.dispatchEvent(o)},handleTabKeydown:function(e,t,n,s){let i=Array.from(n),a=i.indexOf(e.target),o;switch(e.key){case"ArrowLeft":e.preventDefault(),o=a>0?a-1:i.length-1;break;case"ArrowRight":e.preventDefault(),o=a<i.length-1?a+1:0;break;case"Home":e.preventDefault(),o=0;break;case"End":e.preventDefault(),o=i.length-1;break;default:return}o!==a&&(i[o].focus(),this.switchTab(t,i[o],n,s))},initCopyButton:function(e,t){this.addListener(e,t,"click",async()=>{await this.copyCode(e,t)})},copyCode:async function(e,t){let n=e.querySelector(".vd-code-snippet-pane.is-active")||e.querySelector(".vd-code-snippet-pane");if(!n){console.warn("CodeSnippet: No code pane found");return}let i=(n.querySelector("code")||n).textContent;try{await navigator.clipboard.writeText(i),this.showCopyFeedback(t,!0)}catch{let r=this.fallbackCopy(i);this.showCopyFeedback(t,r)}let a=new CustomEvent("codesnippet:copy",{bubbles:!0,detail:{snippet:e,code:i,success:!0}});e.dispatchEvent(a)},fallbackCopy:function(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.left="-9999px",t.style.top="-9999px",document.body.appendChild(t),t.focus(),t.select();let n=!1;try{n=document.execCommand("copy")}catch(s){console.warn("CodeSnippet: Fallback copy failed",s)}return document.body.removeChild(t),n},showCopyFeedback:function(e,t){if(t){e.classList.add("is-copied");let n=document.createElement("span");n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.className="sr-only",n.textContent="Code copied to clipboard",e.appendChild(n),setTimeout(()=>{e.classList.remove("is-copied"),n.parentNode&&n.parentNode.removeChild(n)},2e3)}},extractHtml:function(e){let t=e.dataset.extract;if(!t)return;let n=document.querySelector(t);if(!n){console.warn(`CodeSnippet: Source element not found: ${t}`);return}let s=n.innerHTML;s=this.formatHtml(s),s=this.escapeHtml(s),s=this.highlightHtml(s);let i=document.createElement("code");i.innerHTML=s,e.replaceChildren(i),e.dataset.extracted="true"},formatHtml:function(e){e=e.trim();let t=e.split(`
3
3
  `),n=0,s=2,i=[];return t.forEach(a=>{if(a=a.trim(),!a)return;a.match(/^<\/\w/)&&(n=Math.max(0,n-s)),i.push(" ".repeat(n)+a);let o=/<[a-zA-Z]/.test(a),r=a.includes("/>");o&&!r&&(a.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)/i)||a.match(/<\/\w+>$/)||(n+=s))}),i.join(`
4
4
  `)},escapeHtml:function(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML},highlightHtml:function(e){return e=e.replace(/(&lt;\/?)([\w-]+)/g,'$1<span class="code-tag">$2</span>'),e=e.replace(/([\w-]+)(=)(&quot;|&#39;)/g,'<span class="code-attr">$1</span>$2$3'),e=e.replace(/(&quot;|&#39;)([^&]*)(&quot;|&#39;)/g,'$1<span class="code-string">$2</span>$3'),e=e.replace(/(&lt;!--)(.*?)(--&gt;)/g,'<span class="code-comment">$1$2$3</span>'),e},highlightCss:function(e){return e=e.replace(/([.#]?[a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*\{)/g,'<span class="code-selector">$1</span>$2'),e=e.replace(/([a-zA-Z][a-zA-Z0-9_-]{0,200})(\s*:)/g,'<span class="code-property">$1</span>$2'),e=e.replace(/:\s*([^;{}]+)(;)/g,': <span class="code-value">$1</span>$2'),e=e.replace(/(\d+)(px|rem|em|%|vh|vw|deg|s|ms)/g,'<span class="code-number">$1</span><span class="code-unit">$2</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},highlightJs:function(e){return["const","let","var","function","return","if","else","for","while","switch","case","break","continue","new","this","class","extends","import","export","default","async","await","try","catch","throw","typeof","instanceof"].forEach(n=>{let s=new RegExp(`\\b(${n})\\b`,"g");e=e.replace(s,'<span class="code-keyword">$1</span>')}),e=e.replace(/('(?:[^'\\]|\\.){0,10000}'|"(?:[^"\\]|\\.){0,10000}"|`(?:[^`\\]|\\.){0,10000}`)/g,'<span class="code-string">$1</span>'),e=e.replace(/\b(\d+\.?\d*)\b/g,'<span class="code-number">$1</span>'),e=e.replace(/\b([\w]+)(\s*\()/g,'<span class="code-function">$1</span>$2'),e=e.replace(/(\/\/.*$)/gm,'<span class="code-comment">$1</span>'),e=e.replace(/(\/\*[\s\S]*?\*\/)/g,'<span class="code-comment">$1</span>'),e},addLineNumbers:function(e){let t=e.querySelector("code");if(!t)return;let s=t.innerHTML.split(`
5
5
  `).length,i=document.createElement("div");i.className="vd-code-snippet-line-numbers",i.setAttribute("aria-hidden","true");for(let o=1;o<=s;o++){let r=document.createElement("span");r.textContent=o,i.appendChild(r)}let a=document.createElement("div");a.className="vd-code-snippet-code",a.appendChild(t.cloneNode(!0)),t.parentNode.removeChild(t),e.appendChild(i),e.appendChild(a)},expand:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="true";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","true"),n&&(n.dataset.visible="true")},collapse:function(e){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;e.dataset.expanded="false";let t=e.querySelector(".vd-code-snippet-toggle"),n=e.querySelector(".vd-code-snippet-content");t&&t.setAttribute("aria-expanded","false"),n&&(n.dataset.visible="false")},showLang:function(e,t){if(typeof e=="string"&&(e=document.querySelector(e)),!e)return;let n=e.querySelector(`.vd-code-snippet-tab[data-lang="${t}"]`),s=e.querySelectorAll(".vd-code-snippet-tab"),i=e.querySelectorAll(".vd-code-snippet-pane");n&&this.switchTab(e,n,s,i)},destroy:function(e){typeof e=="string"&&(e=document.querySelector(e)),e&&(e._codeSnippetCleanup&&(e._codeSnippetCleanup.forEach(t=>t()),delete e._codeSnippetCleanup),delete e.dataset.initialized)},destroyAll:function(){document.querySelectorAll('.vd-code-snippet[data-initialized="true"]').forEach(t=>this.destroy(t))}};typeof window.Vanduo<"u"&&window.Vanduo.register("codeSnippet",d),window.CodeSnippet=d})();(function(){"use strict";let d={instances:new Map,init:function(){document.querySelectorAll(".vd-collapsible, .accordion").forEach(t=>{this.instances.has(t)||this.initCollapsible(t)})},initCollapsible:function(e){let t=e.classList.contains("accordion"),n=e.querySelectorAll(".vd-collapsible-item, .accordion-item"),s=[];n.forEach(i=>{let a=i.querySelector(".vd-collapsible-header, .accordion-header"),o=i.querySelector(".vd-collapsible-body, .accordion-body"),r=i.querySelector(".vd-collapsible-trigger, .accordion-trigger")||a;if(!a||!o)return;i.classList.contains("is-open")?this.openItem(i,o,!1):this.closeItem(i,o,!1);let c=l=>{l.preventDefault(),this.toggleItem(i,o,e,t)};r.addEventListener("click",c),s.push(()=>r.removeEventListener("click",c))}),this.instances.set(e,{cleanup:s})},toggleItem:function(e,t,n,s){e.classList.contains("is-open")?this.closeItem(e,t):(s&&n.querySelectorAll(".vd-collapsible-item.is-open, .accordion-item.is-open").forEach(o=>{if(o!==e){let r=o.querySelector(".vd-collapsible-body, .accordion-body");this.closeItem(o,r)}}),this.openItem(e,t))},openItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.add("is-open"),e.setAttribute("aria-expanded","true");let s=t.scrollHeight;t.style.maxHeight=`${s}px`,n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:open",{bubbles:!0}))},closeItem:function(e,t,n=!0){n||(t.style.transition="none"),e.classList.remove("is-open"),e.setAttribute("aria-expanded","false"),t.style.maxHeight="0",n||setTimeout(()=>{t.style.transition=""},0),e.dispatchEvent(new CustomEvent("collapsible:close",{bubbles:!0}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.openItem(t,n)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body");n&&this.closeItem(t,n)}},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-collapsible-body, .accordion-body"),s=t.closest(".vd-collapsible, .accordion"),i=s&&s.classList.contains("accordion");n&&this.toggleItem(t,n,s,i)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("collapsible",d),window.VanduoCollapsible=d})();(function(){"use strict";let d={instances:new Map,_typeaheadBuffer:"",_typeaheadTimer:null,init:function(){document.querySelectorAll(".vd-dropdown").forEach(t=>{this.instances.has(t)||this.initDropdown(t)})},initDropdown:function(e){let t=e.querySelector(".vd-dropdown-toggle"),n=e.querySelector(".vd-dropdown-menu");if(!t||!n)return;let s=[];t.setAttribute("aria-haspopup","true"),t.setAttribute("aria-expanded","false"),n.setAttribute("role","menu"),n.setAttribute("aria-hidden","true");let i=c=>{c.preventDefault(),c.stopPropagation(),this.toggleDropdown(e,t,n)};t.addEventListener("click",i),s.push(()=>t.removeEventListener("click",i));let a=c=>{!e.contains(c.target)&&n.classList.contains("is-open")&&this.closeDropdown(e,t,n)};document.addEventListener("click",a),s.push(()=>document.removeEventListener("click",a));let o=c=>{this.handleKeydown(c,e,t,n)};t.addEventListener("keydown",o),s.push(()=>t.removeEventListener("keydown",o)),n.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)").forEach(c=>{let l=f=>{f.preventDefault(),this.selectItem(c,e,t,n)};c.addEventListener("click",l),s.push(()=>c.removeEventListener("click",l));let h=f=>{(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),this.selectItem(c,e,t,n))};c.addEventListener("keydown",h),s.push(()=>c.removeEventListener("keydown",h))}),this.instances.set(e,{toggle:t,menu:n,cleanup:s})},toggleDropdown:function(e,t,n){n.classList.contains("is-open")?this.closeDropdown(e,t,n):this.openDropdown(e,t,n)},openDropdown:function(e,t,n){document.querySelectorAll(".vd-dropdown-menu.is-open").forEach(a=>{if(a!==n){let o=a.closest(".vd-dropdown"),r=o.querySelector(".vd-dropdown-toggle");this.closeDropdown(o,r,a)}}),e.classList.add("is-open"),n.classList.add("is-open"),t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false"),this.positionMenu(e,n);let i=n.querySelector(".vd-dropdown-item:not(.disabled):not(.is-disabled)");i&&setTimeout(()=>i.focus(),0)},closeDropdown:function(e,t,n){e.classList.remove("is-open"),n.classList.remove("is-open"),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true"),t.focus()},positionMenu:function(e,t){let n=e.getBoundingClientRect(),s=t.getBoundingClientRect(),i=window.innerWidth,a=window.innerHeight,o=8;n.left+s.width>i-o&&(t.classList.add("vd-dropdown-menu-end"),t.classList.remove("vd-dropdown-menu-start")),t.classList.contains("dropdown-menu-top")?n.top-s.height<o&&t.classList.remove("vd-dropdown-menu-top"):n.bottom+s.height>a-o&&t.classList.add("vd-dropdown-menu-top")},handleKeydown:function(e,t,n,s){let i=s.classList.contains("is-open"),a=Array.from(s.querySelectorAll(".vd-dropdown-item:not(.disabled):not(.is-disabled)")),o=a.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":case"ArrowDown":if(e.preventDefault(),!i)this.openDropdown(t,n,s);else if(e.key==="ArrowDown"){let r=o<a.length-1?o+1:0;a[r].focus()}break;case"ArrowUp":if(i){e.preventDefault();let r=o>0?o-1:a.length-1;a[r].focus()}break;case"Escape":i&&(e.preventDefault(),this.closeDropdown(t,n,s));break;case"Home":i&&(e.preventDefault(),a[0].focus());break;case"End":i&&(e.preventDefault(),a[a.length-1].focus());break;default:if(i&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let r=a.find(c=>c.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));r&&r.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},selectItem:function(e,t,n,s){s.querySelectorAll(".vd-dropdown-item").forEach(i=>{i.classList.remove("active","is-active")}),e.classList.add("active","is-active"),(n.tagName==="BUTTON"||n.classList.contains("btn"))&&(n.textContent=e.textContent.trim()),this.closeDropdown(t,n,s),e.dispatchEvent(new CustomEvent("dropdown:select",{bubbles:!0,detail:{item:e,value:e.dataset.value||e.textContent}}))},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.openDropdown(t,n,s)}},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(t){let n=t.querySelector(".vd-dropdown-toggle"),s=t.querySelector(".vd-dropdown-menu");n&&s&&this.closeDropdown(t,n,s)}},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("dropdown",d),window.VanduoDropdown=d})();(function(){"use strict";let d={STORAGE_KEY:"vanduo-font-preference",isInitialized:!1,fonts:{system:{name:"System Default",family:null},inter:{name:"Inter",family:"'Inter', sans-serif"},"source-sans":{name:"Source Sans 3",family:"'Source Sans 3', sans-serif"},"fira-sans":{name:"Fira Sans",family:"'Fira Sans', sans-serif"},"ibm-plex":{name:"IBM Plex Sans",family:"'IBM Plex Sans', sans-serif"},"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif",category:"sans-serif",description:"Friendly, humanist sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif",category:"sans-serif",description:"Neutral, highly readable"},rubik:{name:"Rubik",family:"'Rubik', sans-serif",category:"sans-serif",description:"Modern, geometric"},"titillium-web":{name:"Titillium Web",family:"'Titillium Web', sans-serif",category:"sans-serif",description:"Technical, elegant"}},init:function(){if(this.state={preference:this.getPreference()},this.isInitialized){this.applyFont(),this.renderUI(),this.updateUI();return}this.isInitialized=!0,this.applyFont(),this.renderUI(),console.log("Vanduo Font Switcher initialized")},getPreference:function(){return this.getStorageValue(this.STORAGE_KEY,"ubuntu")},setPreference:function(e){if(!this.fonts[e]){console.warn("Unknown font:",e);return}this.state.preference=e,this.setStorageValue(this.STORAGE_KEY,e),this.applyFont(),this.updateUI();let t=new CustomEvent("font:change",{bubbles:!0,detail:{font:e,fontData:this.fonts[e]}});document.dispatchEvent(t)},applyFont:function(){let e=this.state.preference;e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e)},renderUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.getAttribute("data-font-initialized")==="true"){t.tagName==="SELECT"&&(t.value=this.state.preference);return}if(t.tagName==="SELECT"){t.value=this.state.preference;let n=s=>{this.setPreference(s.target.value)};t.addEventListener("change",n),t._fontToggleHandler=n}else{let n=()=>{let s=Object.keys(this.fonts),a=(s.indexOf(this.state.preference)+1)%s.length;this.setPreference(s[a])};t.addEventListener("click",n),t._fontToggleHandler=n}t.setAttribute("data-font-initialized","true")})},updateUI:function(){document.querySelectorAll('[data-toggle="font"]').forEach(t=>{if(t.tagName==="SELECT")t.value=this.state.preference;else{let n=t.querySelector(".font-current-label");n&&(n.textContent=this.fonts[this.state.preference].name)}})},getCurrentFont:function(){return this.state.preference},getFontData:function(e){return this.fonts[e]||null},destroyAll:function(){document.querySelectorAll('[data-toggle="font"][data-font-initialized="true"]').forEach(t=>{if(t._fontToggleHandler){let n=t.tagName==="SELECT"?"change":"click";t.removeEventListener(n,t._fontToggleHandler),delete t._fontToggleHandler}t.removeAttribute("data-font-initialized")}),this.isInitialized=!1},getStorageValue:function(e,t){if(typeof window.safeStorageGet=="function")return window.safeStorageGet(e,t);try{let n=localStorage.getItem(e);return n!==null?n:t}catch{return t}},setStorageValue:function(e,t){if(typeof window.safeStorageSet=="function")return window.safeStorageSet(e,t);try{return localStorage.setItem(e,t),!0}catch{return!1}}};window.Vanduo&&window.Vanduo.register("fontSwitcher",d),window.FontSwitcher=d})();(function(){"use strict";let d=(function(){try{return CSS.supports("selector(:has(*))")}catch{return!1}})(),e={instances:new Map,init:function(){document.querySelectorAll("[data-layout-mode]").forEach(function(n){this.instances.has(n)||this.initContainer(n)}.bind(this)),this.initToggleButtons()},initContainer:function(t){let n=t.getAttribute("data-layout-mode")||"standard",s=[];this.applyMode(t,n),t.setAttribute("role","region"),t.setAttribute("aria-label","Grid layout: "+n+" mode"),this.instances.set(t,{cleanup:s,mode:n})},initToggleButtons:function(){document.querySelectorAll("[data-grid-toggle]").forEach(function(n){if(n.getAttribute("data-grid-initialized")==="true")return;let s=function(i){i.preventDefault();let a=n.getAttribute("data-grid-toggle"),o;a?o=document.querySelector(a):o=n.closest("[data-layout-mode]"),o&&this.toggle(o)}.bind(this);n.addEventListener("click",s),n.setAttribute("data-grid-initialized","true"),n.setAttribute("aria-pressed","false"),n._gridCleanup=function(){n.removeEventListener("click",s),n.removeAttribute("data-grid-initialized"),n.removeAttribute("aria-pressed")}}.bind(this))},applyFibFallback:function(t){if(d)return;t.querySelectorAll(".vd-row, .row").forEach(function(s){let a=s.querySelectorAll(':scope > [class*="vd-col-"], :scope > [class*="col-"]').length;a===1?s.style.gridTemplateColumns="1fr":a===2?s.style.gridTemplateColumns="1fr 1.618fr":a===3?s.style.gridTemplateColumns="2fr 3fr 5fr":a===4?s.style.gridTemplateColumns="1fr 2fr 3fr 5fr":s.style.gridTemplateColumns="repeat("+a+", 1fr)"})},removeFibFallback:function(t){t.querySelectorAll(".vd-row, .row").forEach(function(s){s.style.gridTemplateColumns=""})},applyMode:function(t,n){t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),n==="fibonacci"?(t.classList.add("vd-grid-fibonacci"),this.applyFibFallback(t)):(t.classList.add("vd-grid-standard"),this.removeFibFallback(t)),t.setAttribute("data-layout-mode",n),t.setAttribute("aria-label","Grid layout: "+n+" mode"),document.querySelectorAll("[data-grid-toggle]").forEach(function(o){let r=o.getAttribute("data-grid-toggle");if(r&&t.matches(r)){let c=n==="fibonacci";c?o.classList.add("is-active"):o.classList.remove("is-active"),o.setAttribute("aria-pressed",c?"true":"false")}});let i=this.instances.get(t);i&&(i.mode=n);let a;try{a=new CustomEvent("grid:modechange",{bubbles:!0,detail:{container:t,mode:n}})}catch{a=document.createEvent("CustomEvent"),a.initCustomEvent("grid:modechange",!0,!0,{container:t,mode:n})}t.dispatchEvent(a)},toggle:function(t){if(typeof t=="string"&&(t=document.querySelector(t)),!t)return;let s=(t.getAttribute("data-layout-mode")||"standard")==="fibonacci"?"standard":"fibonacci";this.applyMode(t,s)},setMode:function(t,n){typeof t=="string"&&(t=document.querySelector(t)),t&&(n!=="fibonacci"&&n!=="standard"||this.applyMode(t,n))},getMode:function(t){return typeof t=="string"&&(t=document.querySelector(t)),t?t.getAttribute("data-layout-mode")||"standard":null},destroy:function(t){let n=this.instances.get(t);n&&(n.cleanup.forEach(function(s){s()}),t.classList.remove("vd-grid-standard","vd-grid-fibonacci"),t.removeAttribute("aria-label"),this.removeFibFallback(t),this.instances.delete(t))},destroyAll:function(){this.instances.forEach(function(n,s){this.destroy(s)}.bind(this)),document.querySelectorAll('[data-grid-initialized="true"]').forEach(function(n){n._gridCleanup&&(n._gridCleanup(),delete n._gridCleanup)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("gridLayout",e),window.VanduoGridLayout=e})();(function(){"use strict";let d={backdrop:null,container:null,img:null,closeBtn:null,caption:null,currentTrigger:null,scrollThreshold:50,initialScrollY:0,isOpen:!1,_cleanupFunctions:[],init:function(){this.createBackdrop(),this.bindTriggers()},createBackdrop:function(){if(this.backdrop||document.querySelector(".vd-image-box-backdrop")){this.backdrop||(this.backdrop=document.querySelector(".vd-image-box-backdrop"),this.container=this.backdrop.querySelector(".vd-image-box-container"),this.img=this.backdrop.querySelector(".vd-image-box-img"),this.closeBtn=this.backdrop.querySelector(".vd-image-box-close"),this.caption=this.backdrop.querySelector(".vd-image-box-caption"),this.bindBackdropEvents());return}this.backdrop=document.createElement("div"),this.backdrop.className="vd-image-box-backdrop",this.backdrop.setAttribute("role","dialog"),this.backdrop.setAttribute("aria-modal","true"),this.backdrop.setAttribute("aria-label","Image viewer"),this.backdrop.setAttribute("tabindex","-1"),this.container=document.createElement("div"),this.container.className="vd-image-box-container",this.img=document.createElement("img"),this.img.className="vd-image-box-img",this.img.alt="",this.closeBtn=document.createElement("button"),this.closeBtn.className="vd-image-box-close",this.closeBtn.setAttribute("aria-label","Close image viewer"),this.closeBtn.innerHTML="&times;",this.caption=document.createElement("div"),this.caption.className="vd-image-box-caption",this.container.appendChild(this.img),this.backdrop.appendChild(this.closeBtn),this.backdrop.appendChild(this.container),this.backdrop.appendChild(this.caption),document.body.appendChild(this.backdrop),this.bindBackdropEvents()},bindBackdropEvents:function(){let e=this,t=function(o){(o.target===e.backdrop||o.target===e.container)&&e.close()};this.backdrop.addEventListener("click",t),this._cleanupFunctions.push(()=>this.backdrop.removeEventListener("click",t));let n=function(){e.close()};this.img.addEventListener("click",n),this._cleanupFunctions.push(()=>this.img.removeEventListener("click",n));let s=function(){e.close()};this.closeBtn.addEventListener("click",s),this._cleanupFunctions.push(()=>this.closeBtn.removeEventListener("click",s));let i=function(o){o.key==="Escape"&&e.isOpen&&e.close()};document.addEventListener("keydown",i),this._cleanupFunctions.push(()=>document.removeEventListener("keydown",i));let a=function(){if(!e.isOpen)return;let o=window.scrollY;Math.abs(o-e.initialScrollY)>e.scrollThreshold&&e.close()};window.addEventListener("scroll",a,{passive:!0}),this._cleanupFunctions.push(()=>window.removeEventListener("scroll",a))},bindTriggers:function(){let e=this;document.querySelectorAll("[data-image-box]").forEach(function(n){if(n.dataset.imageBoxInitialized)return;if(n.dataset.imageBoxInitialized="true",n.classList.add("vd-image-box-trigger"),n.tagName==="IMG"){n.complete&&n.naturalWidth===0&&n.classList.add("is-broken");let i=function(){n.classList.add("is-broken")};n.addEventListener("error",i);let a=function(){n.classList.remove("is-broken")};n.addEventListener("load",a)}let s=function(i){i.preventDefault(),e.open(n)};if(n.addEventListener("click",s),n._imageBoxCleanup=()=>n.removeEventListener("click",s),n.tagName!=="BUTTON"&&n.tagName!=="A"){n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label","View enlarged image");let i=function(o){(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),e.open(n))};n.addEventListener("keydown",i);let a=n._imageBoxCleanup;n._imageBoxCleanup=()=>{a(),n.removeEventListener("keydown",i)}}})},open:function(e){if(this.isOpen)return;this.currentTrigger=e,this.isOpen=!0,this.initialScrollY=window.scrollY;let t=e.dataset.imageBoxFullSrc||e.dataset.imageBoxSrc||e.src||e.href;if(!t){console.warn("[Vanduo ImageBox] No image source found for trigger:",e);return}let n=e.dataset.imageBoxCaption||e.alt||"";this.img.src=t,this.img.alt=e.alt||"",n?(this.caption.textContent=n,this.caption.style.display="block"):this.caption.style.display="none";let s=window.innerWidth-document.documentElement.clientWidth;document.body.style.setProperty("--scrollbar-width",`${s}px`),document.body.classList.add("body-image-box-open"),this.backdrop.classList.add("is-visible"),this.backdrop.focus(),e.dispatchEvent(new CustomEvent("imageBox:open",{bubbles:!0,detail:{src:t}})),this.img.complete||(this.img.style.opacity="0",this.img.onload=()=>{this.img.style.opacity=""})},close:function(){this.isOpen&&(this.isOpen=!1,this.backdrop.classList.remove("is-visible"),document.body.classList.remove("body-image-box-open"),document.body.style.removeProperty("--scrollbar-width"),this.currentTrigger&&(this.currentTrigger.focus(),this.currentTrigger.dispatchEvent(new CustomEvent("imageBox:close",{bubbles:!0})),this.currentTrigger=null),setTimeout(()=>{this.isOpen||(this.img.src="",this.img.alt="")},300))},reinit:function(){this.bindTriggers()},destroy:function(){this.isOpen&&this.close(),this.backdrop&&this.backdrop.parentNode&&this.backdrop.parentNode.removeChild(this.backdrop),this._cleanupFunctions.forEach(t=>t()),this._cleanupFunctions=[],document.querySelectorAll("[data-image-box-initialized]").forEach(t=>{t.classList.remove("vd-image-box-trigger"),t._imageBoxCleanup&&(t._imageBoxCleanup(),delete t._imageBoxCleanup),delete t.dataset.imageBoxInitialized}),this.backdrop=null,this.container=null,this.img=null,this.closeBtn=null,this.caption=null,this.currentTrigger=null,this.isOpen=!1},destroyAll:function(){this.destroy()}};typeof window.Vanduo<"u"&&window.Vanduo.register("imageBox",d),window.VanduoImageBox=d})();(function(){"use strict";let d={modals:new Map,openModals:[],zIndexCounter:1050,_triggerCleanups:[],init:function(){document.querySelectorAll(".vd-modal").forEach(n=>{this.modals.has(n)||this.initModal(n)}),document.querySelectorAll("[data-modal]").forEach(n=>{if(n.dataset.modalTriggerInitialized)return;n.dataset.modalTriggerInitialized="true";let s=i=>{i.preventDefault();let a=n.dataset.modal,o=document.querySelector(a);o&&this.open(o)};n.addEventListener("click",s),this._triggerCleanups.push(()=>n.removeEventListener("click",s))})},initModal:function(e){let t=this.createBackdrop(e),n=e.querySelectorAll('.vd-modal-close, [data-dismiss="modal"]'),s=e.querySelector(".vd-modal-dialog");if(!s)return;let i=[];e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-hidden","true"),e.id||(e.id="modal-"+Math.random().toString(36).substr(2,9));let a=e.querySelector(".vd-modal-title");a&&!a.id&&(a.id=e.id+"-title",e.setAttribute("aria-labelledby",a.id)),n.forEach(c=>{let l=()=>{this.close(e)};c.addEventListener("click",l),i.push(()=>c.removeEventListener("click",l))});let o=c=>{c.target===t&&e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",o),i.push(()=>t.removeEventListener("click",o));let r=c=>{if(c.key==="Escape"&&this.openModals.length>0){let l=this.openModals[this.openModals.length-1];l===e&&l.dataset.keyboard!=="false"&&this.close(l)}};document.addEventListener("keydown",r),i.push(()=>document.removeEventListener("keydown",r)),this.modals.set(e,{backdrop:t,dialog:s,trapHandler:null,cleanup:i})},createBackdrop:function(e){let t=e.querySelector(".vd-modal-backdrop");return t||(t=document.createElement("div"),t.className="vd-modal-backdrop",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,dialog:i}=n;if(this.zIndexCounter+=10,t.style.zIndex=this.zIndexCounter,s.style.zIndex=this.zIndexCounter-1,this.openModals.push(t),s.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),this.openModals.length===1){document.body.classList.add("body-modal-open");let o=window.innerWidth-document.documentElement.clientWidth;o>0&&(document.body.style.paddingRight=`${o}px`)}let a=this.trapFocus(t);n.trapHandler=a,setTimeout(()=>{let o=this.getFocusableElements(t)[0];o&&o.focus()},100),t.dispatchEvent(new CustomEvent("modal:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t){console.warn("[Vanduo Modals] Modal element not found:",e);return}if(!this.modals.has(t)){console.warn("[Vanduo Modals] Modal not initialized:",t);return}let n=this.modals.get(t),{backdrop:s,trapHandler:i}=n;i&&(t.removeEventListener("keydown",i),n.trapHandler=null);let a=this.openModals.indexOf(t);if(a>-1&&this.openModals.splice(a,1),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),this.openModals.length===0)s.classList.remove("is-visible"),document.body.classList.remove("body-modal-open"),document.body.style.paddingRight="",this.zIndexCounter=1050;else{let r=this.openModals[this.openModals.length-1];this.modals.get(r).backdrop.classList.add("is-visible")}let o=document.querySelector(`[data-modal="#${t.id}"]`);o&&o.focus(),t.dispatchEvent(new CustomEvent("modal:close",{bubbles:!0}))},trapFocus:function(e){let t=this,n=function(s){if(s.key!=="Tab")return;let i=t.getFocusableElements(e),a=i[0],o=i[i.length-1];s.shiftKey?document.activeElement===a&&(s.preventDefault(),o.focus()):document.activeElement===o&&(s.preventDefault(),a.focus())};return e.addEventListener("keydown",n),n},getFocusableElements:function(e){return Array.from(e.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(n=>!n.hasAttribute("disabled")&&n.offsetWidth>0&&n.offsetHeight>0)},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},destroy:function(e){let t=this.modals.get(e);t&&(e.classList.contains("is-open")&&this.close(e),t.cleanup&&t.cleanup.forEach(n=>n()),t.backdrop&&t.backdrop.parentNode&&t.backdrop.parentNode.removeChild(t.backdrop),this.modals.delete(e))},destroyAll:function(){this.modals.forEach((e,t)=>{this.destroy(t)}),this._triggerCleanups.forEach(e=>e()),this._triggerCleanups=[]}};typeof window.Vanduo<"u"&&window.Vanduo.register("modals",d),window.VanduoModals=d})();(function(){"use strict";let d={instances:new Map,getBreakpoint:function(){let t=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-lg").trim(),n=parseInt(t,10);return isNaN(n)?992:n},init:function(){document.querySelectorAll(".vd-navbar").forEach(t=>{this.instances.has(t)||this.initNavbar(t)})},initNavbar:function(e){let t=e.querySelector(".vd-navbar-toggle, .vd-navbar-burger"),n=e.querySelector(".vd-navbar-menu"),s=e.querySelector(".vd-navbar-overlay")||this.createOverlay(e);if(!t||!n)return;let i=[],a=f=>{f.preventDefault(),f.stopPropagation(),this.toggleMenu(e,t,n,s)};if(t.addEventListener("click",a),i.push(()=>t.removeEventListener("click",a)),s){let f=()=>{this.closeMenu(e,t,n,s)};s.addEventListener("click",f),i.push(()=>s.removeEventListener("click",f))}let o=f=>{f.key==="Escape"&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)};document.addEventListener("keydown",o),i.push(()=>document.removeEventListener("keydown",o));let r,c=()=>{clearTimeout(r),r=setTimeout(()=>{let f=this.getBreakpoint();window.innerWidth>=f&&n.classList.contains("is-open")&&this.closeMenu(e,t,n,s)},250)};window.addEventListener("resize",c),i.push(()=>{clearTimeout(r),window.removeEventListener("resize",c)});let l=f=>{n.classList.contains("is-open")&&!e.contains(f.target)&&!n.contains(f.target)&&this.closeMenu(e,t,n,s)};document.addEventListener("click",l),i.push(()=>document.removeEventListener("click",l)),n.querySelectorAll(".vd-navbar-dropdown > .vd-nav-link, .vd-navbar-dropdown > .nav-link").forEach(f=>{let w=L=>{let v=this.getBreakpoint();if(window.innerWidth<v){L.preventDefault();let S=f.parentElement.querySelector(".vd-navbar-dropdown-menu");S&&S.classList.toggle("is-open")}};f.addEventListener("click",w),i.push(()=>f.removeEventListener("click",w))}),this.instances.set(e,{toggle:t,menu:n,overlay:s,cleanup:i})},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})},toggleMenu:function(e,t,n,s){n.classList.contains("is-open")?this.closeMenu(e,t,n,s):this.openMenu(e,t,n,s)},openMenu:function(e,t,n,s){n.classList.add("is-open"),t.classList.add("is-active"),s&&s.classList.add("is-active"),document.body.style.overflow="hidden",t.setAttribute("aria-expanded","true"),n.setAttribute("aria-hidden","false")},closeMenu:function(e,t,n,s){n.classList.remove("is-open"),t.classList.remove("is-active"),s&&s.classList.remove("is-active"),document.body.style.overflow="",n.querySelectorAll(".vd-navbar-dropdown-menu.is-open").forEach(a=>{a.classList.remove("is-open")}),t.setAttribute("aria-expanded","false"),n.setAttribute("aria-hidden","true")},createOverlay:function(e){let t=document.createElement("div");return t.className="vd-navbar-overlay",document.body.appendChild(t),t}};typeof window.Vanduo<"u"&&window.Vanduo.register("navbar",d),window.VanduoNavbar=d})();(function(){"use strict";let d={instances:new Map,init:function(){document.querySelectorAll(".vd-pagination[data-pagination]").forEach(t=>{this.instances.has(t)||this.initPagination(t)})},initPagination:function(e){let t=parseInt(e.dataset.totalPages)||1,n=parseInt(e.dataset.currentPage)||1,s=parseInt(e.dataset.maxVisible)||7;this.render(e,{totalPages:t,currentPage:n,maxVisible:s});let i=a=>{let o=a.target.closest(".vd-pagination-link");if(!o||o.closest(".vd-pagination-item.disabled")||o.closest(".vd-pagination-item.active"))return;a.preventDefault();let r=o.closest(".vd-pagination-item"),c=r.dataset.page;c?this.goToPage(e,parseInt(c)):r.classList.contains("pagination-prev")?this.prevPage(e):r.classList.contains("pagination-next")&&this.nextPage(e)};e.addEventListener("click",i),this.instances.set(e,{cleanup:[()=>e.removeEventListener("click",i)]})},render:function(e,t){let{totalPages:n,currentPage:s,maxVisible:i}=t;if(n<=1){e.innerHTML="";return}let a="";a+=`<li class="vd-pagination-item vd-pagination-prev pagination-item pagination-prev ${s===1?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Previous">Previous</a>',a+="</li>";let o=this.calculatePages(s,n,i),r=0;o.forEach(c=>{if(c==="ellipsis")a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>';else{c!==r+1&&r>0&&(a+='<li class="vd-pagination-item pagination-item"><span class="vd-pagination-ellipsis pagination-ellipsis">\u2026</span></li>');let l=Number(c);a+=`<li class="vd-pagination-item pagination-item ${l===s?"active":""}" data-page="${l}">`,a+=`<a class="vd-pagination-link pagination-link" href="#" aria-label="Page ${l}">${l}</a>`,a+="</li>",r=c}}),a+=`<li class="vd-pagination-item vd-pagination-next pagination-item pagination-next ${s===n?"disabled":""}">`,a+='<a class="vd-pagination-link pagination-link" href="#" aria-label="Next">Next</a>',a+="</li>",e.innerHTML=a,e.dataset.currentPage=s},calculatePages:function(e,t,n){let s=[],i=Math.floor(n/2);if(t<=n)for(let a=1;a<=t;a++)s.push(a);else{s.push(1);let a=Math.max(2,e-i),o=Math.min(t-1,e+i);e<=i+1&&(o=Math.min(t-1,n-1)),e>=t-i&&(a=Math.max(2,t-n+2)),a>2&&s.push("ellipsis");for(let r=a;r<=o;r++)s.push(r);o<t-1&&s.push("ellipsis"),t>1&&s.push(t)}return s},goToPage:function(e,t){let n=parseInt(e.dataset.totalPages)||1,s=parseInt(e.dataset.maxVisible)||7;t<1||t>n||(this.render(e,{totalPages:n,currentPage:t,maxVisible:s}),e.dispatchEvent(new CustomEvent("pagination:change",{bubbles:!0,detail:{page:t,totalPages:n}})))},prevPage:function(e){let t=parseInt(e.dataset.currentPage)||1;t>1&&this.goToPage(e,t-1)},nextPage:function(e){let t=parseInt(e.dataset.currentPage)||1,n=parseInt(e.dataset.totalPages)||1;t<n&&this.goToPage(e,t+1)},update:function(e,t){let n=typeof e=="string"?document.querySelector(e):e;n&&(t.totalPages!==void 0&&(n.dataset.totalPages=t.totalPages),t.currentPage!==void 0&&(n.dataset.currentPage=t.currentPage),t.maxVisible!==void 0&&(n.dataset.maxVisible=t.maxVisible),this.render(n,{totalPages:parseInt(n.dataset.totalPages)||1,currentPage:parseInt(n.dataset.currentPage)||1,maxVisible:parseInt(n.dataset.maxVisible)||7}))},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("pagination",d),window.VanduoPagination=d})();(function(){"use strict";let d={parallaxElements:new Map,ticking:!1,isMobile:window.innerWidth<768,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,isInitialized:!1,_onScroll:null,_onResize:null,init:function(){if(this.isInitialized){this.refresh();return}if(this.isInitialized=!0,this.reducedMotion)return;document.querySelectorAll(".vd-parallax").forEach(t=>{t.dataset.parallaxInitialized||this.initParallax(t)}),this.handleScroll(),this._onScroll=()=>{this.handleScroll()},window.addEventListener("scroll",this._onScroll,{passive:!0}),this._onResize=()=>{this.isMobile=window.innerWidth<768,this.updateAll()},window.addEventListener("resize",this._onResize)},initParallax:function(e){e.dataset.parallaxInitialized="true";let t=e.classList.contains("parallax-disable-mobile");if(t&&this.isMobile)return;let n=e.querySelectorAll(".vd-parallax-layer, .vd-parallax-bg"),s=this.getSpeed(e),i=e.classList.contains("parallax-horizontal")?"horizontal":"vertical";this.parallaxElements.set(e,{layers:Array.from(n),speed:s,direction:i,disableMobile:t}),this.updateParallax(e)},getSpeed:function(e){return e.classList.contains("parallax-slow")?.5:e.classList.contains("parallax-fast")?1.5:1},handleScroll:function(){this.ticking||(window.requestAnimationFrame(()=>{this.updateAll(),this.ticking=!1}),this.ticking=!0)},updateAll:function(){this.parallaxElements.forEach((e,t)=>{e.disableMobile&&this.isMobile||this.updateParallax(t)})},updateParallax:function(e){let t=this.parallaxElements.get(e);if(!t)return;let n=e.getBoundingClientRect(),s=window.innerHeight,i=n.top,a=n.height,r=(Math.max(0,Math.min(1,(s-i)/(s+a)))-.5)*t.speed*100;t.layers.forEach((c,l)=>{let h=c.dataset.parallaxSpeed?parseFloat(c.dataset.parallaxSpeed):1,f=r*h;t.direction==="horizontal"?c.style.transform=`translateX(${f}px)`:c.style.transform=`translateY(${f}px)`})},destroy:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&this.parallaxElements.has(t)&&(this.parallaxElements.get(t).layers.forEach(s=>{s.style.transform=""}),this.parallaxElements.delete(t))},refresh:function(){this.updateAll()},destroyAll:function(){this.parallaxElements.forEach((e,t)=>{this.destroy(t)}),this.parallaxElements.clear(),this._onScroll&&(window.removeEventListener("scroll",this._onScroll),this._onScroll=null),this._onResize&&(window.removeEventListener("resize",this._onResize),this._onResize=null),this.isInitialized=!1}};typeof window.Vanduo<"u"&&window.Vanduo.register("parallax",d),window.VanduoParallax=d})();(function(){"use strict";let d={init:function(){document.querySelectorAll(".progress-bar[data-progress]").forEach(t=>{t.dataset.progressInitialized||this.initProgressBar(t)})},initProgressBar:function(e){e.dataset.progressInitialized="true";let t=parseInt(e.dataset.progress)||0;this.setProgress(e,t,!1)},setProgress:function(e,t,n=!0){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;t=Math.max(0,Math.min(100,t)),n?s.style.transition="width var(--transition-duration-slow) var(--transition-ease)":(s.style.transition="none",setTimeout(()=>{s.style.transition=""},0)),s.style.width=t+"%",s.setAttribute("aria-valuenow",t),s.setAttribute("aria-valuemin",0),s.setAttribute("aria-valuemax",100);let i=s.querySelector(".progress-text");i&&(i.textContent=t+"%"),s.dispatchEvent(new CustomEvent("progress:update",{bubbles:!0,detail:{value:t,max:100}})),t>=100&&s.dispatchEvent(new CustomEvent("progress:complete",{bubbles:!0,detail:{value:t,max:100}}))},animateProgress:function(e,t,n=1e3){let s=typeof e=="string"?document.querySelector(e):e;if(!s)return;let i=parseInt(s.style.width)||0,a=t-i,o=performance.now(),r=c=>{let l=c-o,h=Math.min(l/n,1),f=1-Math.pow(1-h,3),w=i+a*f;this.setProgress(s,w,!1),h<1&&requestAnimationFrame(r)};requestAnimationFrame(r)},show:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="inline-block",t.setAttribute("aria-hidden","false"))},hide:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display="none",t.setAttribute("aria-hidden","true"))},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.style.display==="none"||t.getAttribute("aria-hidden")==="true"?this.show(t):this.hide(t))},destroyAll:function(){document.querySelectorAll('.progress-bar[data-progress-initialized="true"]').forEach(t=>{delete t.dataset.progressInitialized})}};typeof window.Vanduo<"u"&&window.Vanduo.register("preloader",d),window.VanduoPreloader=d})();(function(){"use strict";let d={instances:new Map,_typeaheadBuffer:"",_typeaheadTimer:null,init:function(){document.querySelectorAll("select.vd-custom-select-input, select[data-custom-select]").forEach(t=>{this.instances.has(t)||this.initSelect(t)})},initSelect:function(e){if(e.closest(".vd-custom-select-wrapper"))return;let t=[],n=document.createElement("div");n.className="custom-select-wrapper",e.parentNode.insertBefore(n,e),n.appendChild(e);let s=document.createElement("button");s.type="button",s.className="custom-select-button",s.setAttribute("aria-haspopup","listbox"),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-labelledby",e.id||this.generateId(e));let i=document.createElement("div");if(i.className="custom-select-dropdown",i.setAttribute("role","listbox"),e.dataset.searchable==="true"){let l=document.createElement("div");l.className="custom-select-search";let h=document.createElement("input");h.type="text",h.className="input input-sm",h.placeholder="Search...",h.setAttribute("aria-label","Search options"),l.appendChild(h),i.appendChild(l);let f=L=>{this.filterOptions(i,L.target.value)},w=typeof debounce=="function"?debounce(f,150):f;h.addEventListener("input",w),t.push(()=>h.removeEventListener("input",w))}this.buildOptions(e,i,s),n.appendChild(s),n.appendChild(i),this.updateButtonText(e,s);let a=l=>{l.preventDefault(),l.stopPropagation(),this.toggleDropdown(s,i)};s.addEventListener("click",a),t.push(()=>s.removeEventListener("click",a));let o=l=>{!n.contains(l.target)&&i.classList.contains("is-open")&&this.closeDropdown(s,i)};document.addEventListener("click",o),t.push(()=>document.removeEventListener("click",o));let r=l=>{this.handleKeydown(l,e,s,i)};s.addEventListener("keydown",r),t.push(()=>s.removeEventListener("keydown",r));let c=()=>{this.updateButtonText(e,s),this.updateSelectedOptions(e,i)};e.addEventListener("change",c),t.push(()=>e.removeEventListener("change",c)),this.instances.set(e,{wrapper:n,button:s,dropdown:i,cleanup:t})},buildOptions:function(e,t,n){let s=e.querySelectorAll("option"),i=document.createDocumentFragment();s.forEach((a,o)=>{if(a.parentElement.tagName==="OPTGROUP"){let c=a.parentElement;if(!t.querySelector(`[data-group="${c.label}"]`)){let l=document.createElement("div");l.className="custom-select-option-group",l.textContent=c.label,l.dataset.group=c.label,i.appendChild(l)}}if(a.value===""&&!a.textContent.trim())return;let r=document.createElement("div");r.className="custom-select-option",r.textContent=a.textContent,r.setAttribute("role","option"),r.setAttribute("data-value",a.value),r.setAttribute("data-index",o),a.selected&&(r.classList.add("is-selected"),r.setAttribute("aria-selected","true")),a.disabled&&(r.classList.add("is-disabled"),r.setAttribute("aria-disabled","true")),r.addEventListener("click",c=>{a.disabled||this.selectOption(e,a,r,n,t)}),i.appendChild(r)}),t.appendChild(i)},selectOption:function(e,t,n,s,i){e.multiple?(t.selected=!t.selected,n.classList.toggle("is-selected"),n.setAttribute("aria-selected",t.selected)):(e.value=t.value,e.dispatchEvent(new Event("change",{bubbles:!0})),this.closeDropdown(s,i)),this.updateButtonText(e,s)},updateButtonText:function(e,t){if(e.multiple){let n=Array.from(e.selectedOptions);n.length===0?t.textContent=e.dataset.placeholder||"Select options...":n.length===1?t.textContent=n[0].textContent:t.textContent=`${n.length} selected`}else{let n=e.options[e.selectedIndex];t.textContent=n?n.textContent:e.dataset.placeholder||"Select..."}},updateSelectedOptions:function(e,t){let n=t.querySelectorAll(".vd-custom-select-option"),s=Array.from(e.selectedOptions).map(i=>i.value);n.forEach(i=>{let a=i.dataset.value;s.includes(a)?(i.classList.add("is-selected"),i.setAttribute("aria-selected","true")):(i.classList.remove("is-selected"),i.setAttribute("aria-selected","false"))})},toggleDropdown:function(e,t){t.classList.contains("is-open")?this.closeDropdown(e,t):this.openDropdown(e,t)},openDropdown:function(e,t){t.classList.add("is-open"),e.setAttribute("aria-expanded","true");let n=t.querySelector(".vd-custom-select-option:not(.is-disabled)");n&&n.focus()},closeDropdown:function(e,t){t.classList.remove("is-open"),e.setAttribute("aria-expanded","false")},handleKeydown:function(e,t,n,s){let i=s.classList.contains("is-open"),a=Array.from(s.querySelectorAll(".vd-custom-select-option:not(.is-disabled)")),o=a.findIndex(r=>r===document.activeElement);switch(e.key){case"Enter":case" ":if(e.preventDefault(),i&&o>=0){let r=a[o],c=t.options[parseInt(r.dataset.index)];this.selectOption(t,c,r,n,s)}else this.openDropdown(n,s);break;case"Escape":i&&(e.preventDefault(),this.closeDropdown(n,s),n.focus());break;case"ArrowDown":if(e.preventDefault(),!i)this.openDropdown(n,s);else{let r=o<a.length-1?o+1:0;a[r].focus()}break;case"ArrowUp":if(e.preventDefault(),i){let r=o>0?o-1:a.length-1;a[r].focus()}break;case"Home":i&&(e.preventDefault(),a[0].focus());break;case"End":i&&(e.preventDefault(),a[a.length-1].focus());break;default:if(i&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){clearTimeout(this._typeaheadTimer),this._typeaheadBuffer+=e.key.toLowerCase();let r=a.find(c=>c.textContent.trim().toLowerCase().startsWith(this._typeaheadBuffer));r&&r.focus(),this._typeaheadTimer=setTimeout(()=>{this._typeaheadBuffer=""},500)}break}},filterOptions:function(e,t){let n=e.querySelectorAll(".vd-custom-select-option"),s=t.toLowerCase();n.forEach(i=>{i.textContent.toLowerCase().includes(s)?i.style.display="block":i.style.display="none"})},generateId:function(e){return e.id?e.id:"select-"+Math.random().toString(36).substr(2,9)},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),t.wrapper&&t.wrapper.parentNode&&(t.wrapper.parentNode.insertBefore(e,t.wrapper),t.wrapper.parentNode.removeChild(t.wrapper)),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("select",d)})();(function(){"use strict";let d={sidenavs:new Map,breakpoint:992,_globalCleanups:[],isFixedVariant:function(e){return e.classList.contains("vd-sidenav-fixed")||e.classList.contains("sidenav-fixed")},isPushVariant:function(e){return e.classList.contains("vd-sidenav-push")||e.classList.contains("sidenav-push")},isRightVariant:function(e){return e.classList.contains("vd-sidenav-right")||e.classList.contains("sidenav-right")},init:function(){document.querySelectorAll(".vd-sidenav").forEach(s=>{this.sidenavs.has(s)||this.initSidenav(s)}),document.querySelectorAll("[data-sidenav-toggle]").forEach(s=>{if(s.dataset.sidenavToggleInitialized)return;s.dataset.sidenavToggleInitialized="true";let i=a=>{a.preventDefault();let o=s.dataset.sidenavToggle,r=document.querySelector(o);r&&this.toggle(r)};s.addEventListener("click",i),this._globalCleanups.push(()=>s.removeEventListener("click",i))}),this.handleResize();let n=()=>{this.handleResize()};window.addEventListener("resize",n),this._globalCleanups.push(()=>window.removeEventListener("resize",n))},initSidenav:function(e){let t=this.createOverlay(e),n=e.querySelector(".vd-sidenav-close"),s=[];if(e.setAttribute("role","navigation"),e.setAttribute("aria-hidden","true"),n){let o=()=>{this.close(e)};n.addEventListener("click",o),s.push(()=>n.removeEventListener("click",o))}let i=()=>{e.dataset.backdrop!=="static"&&this.close(e)};t.addEventListener("click",i),s.push(()=>t.removeEventListener("click",i));let a=o=>{o.key==="Escape"&&e.classList.contains("is-open")&&e.dataset.keyboard!=="false"&&this.close(e)};document.addEventListener("keydown",a),s.push(()=>document.removeEventListener("keydown",a)),this.sidenavs.set(e,{overlay:t,cleanup:s})},createOverlay:function(e){let t=e.querySelector(".vd-sidenav-overlay");return t||(t=document.createElement("div"),t.className="vd-sidenav-overlay",document.body.appendChild(t)),t},open:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);this.isFixedVariant(t)||n.classList.add("is-visible"),t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),document.body.classList.add("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!0),t.dispatchEvent(new CustomEvent("sidenav:open",{bubbles:!0}))},close:function(e){let t=typeof e=="string"?document.querySelector(e):e;if(!t||!this.sidenavs.has(t))return;let{overlay:n}=this.sidenavs.get(t);n.classList.remove("is-visible"),t.classList.remove("is-open"),t.setAttribute("aria-hidden","true"),document.body.classList.remove("body-sidenav-open"),this.isPushVariant(t)&&this.handlePushVariant(t,!1),t.dispatchEvent(new CustomEvent("sidenav:close",{bubbles:!0}))},toggle:function(e){let t=typeof e=="string"?document.querySelector(e):e;t&&(t.classList.contains("is-open")?this.close(t):this.open(t))},handlePushVariant:function(e,t){let n=document.querySelector('main, .main-content, .content, [role="main"]')||document.body;t?window.innerWidth>=this.breakpoint&&(this.isRightVariant(e)?n.style.marginRight=e.offsetWidth+"px":n.style.marginLeft=e.offsetWidth+"px"):(n.style.marginLeft="",n.style.marginRight="")},handleResize:function(){this.sidenavs.forEach(({overlay:e},t)=>{window.innerWidth>=this.breakpoint?this.isFixedVariant(t)&&!t.classList.contains("is-open")&&(t.classList.add("is-open"),t.setAttribute("aria-hidden","false"),e.classList.remove("is-visible")):this.isFixedVariant(t)&&t.classList.contains("is-open")&&this.close(t)})},destroy:function(e){let t=this.sidenavs.get(e);t&&(e.classList.contains("is-open")&&this.close(e),t.cleanup.forEach(n=>n()),t.overlay&&t.overlay.parentNode&&t.overlay.parentNode.removeChild(t.overlay),this.sidenavs.delete(e))},destroyAll:function(){this.sidenavs.forEach((e,t)=>{this.destroy(t)}),this._globalCleanups.forEach(e=>e()),this._globalCleanups=[]}};typeof window.Vanduo<"u"&&window.Vanduo.register("sidenav",d),window.VanduoSidenav=d})();(function(){"use strict";let d={instances:new Map,init:function(){document.querySelectorAll(".vd-tabs, [data-tabs]").forEach(t=>{this.instances.has(t)||this.initTabs(t)})},initTabs:function(e){let t=e.querySelector('.vd-tab-list, [role="tablist"]'),n=e.querySelectorAll(".vd-tab-link, [data-tab]"),s=e.querySelectorAll(".vd-tab-pane, [data-tab-pane]");if(!t||n.length===0)return;let i=[];t.setAttribute("role","tablist"),n.forEach((o,r)=>{let c=o.dataset.tab||o.getAttribute("href")?.replace("#","")||`tab-${r}`,l=this.findPane(e,c,s);o.setAttribute("role","tab"),o.setAttribute("aria-selected",o.classList.contains("is-active")?"true":"false"),o.setAttribute("tabindex",o.classList.contains("is-active")?"0":"-1"),o.id||(o.id=`tab-btn-${c}`),l&&(l.setAttribute("role","tabpanel"),l.setAttribute("aria-labelledby",o.id),l.id||(l.id=`tab-pane-${c}`),o.setAttribute("aria-controls",l.id));let h=w=>{w.preventDefault(),!o.classList.contains("disabled")&&!o.disabled&&this.activateTab(e,o,n,s)};o.addEventListener("click",h),i.push(()=>o.removeEventListener("click",h));let f=w=>{this.handleKeydown(w,e,o,n,s)};o.addEventListener("keydown",f),i.push(()=>o.removeEventListener("keydown",f))}),!e.querySelector(".vd-tab-link.is-active, [data-tab].is-active")&&n.length>0&&this.activateTab(e,n[0],n,s),this.instances.set(e,{cleanup:i})},findPane:function(e,t,n){let s=e.querySelector(`[data-tab-pane="${t}"]`);return s||(s=e.querySelector(`#${t}`)),s||e.querySelectorAll(".vd-tab-link, [data-tab]").forEach((a,o)=>{(a.dataset.tab||a.getAttribute("href")?.replace("#",""))===t&&n[o]&&(s=n[o])}),s},activateTab:function(e,t,n,s){let i=t.dataset.tab||t.getAttribute("href")?.replace("#","")||t.id;n.forEach(r=>{r.classList.remove("is-active"),r.setAttribute("aria-selected","false"),r.setAttribute("tabindex","-1"),r.parentElement&&r.parentElement.classList.contains("tab-item")&&r.parentElement.classList.remove("is-active")}),s.forEach(r=>{r.classList.remove("is-active")}),t.classList.add("is-active"),t.setAttribute("aria-selected","true"),t.setAttribute("tabindex","0"),t.parentElement&&t.parentElement.classList.contains("tab-item")&&t.parentElement.classList.add("is-active");let a=this.findPane(e,i,s);a&&a.classList.add("is-active");let o=new CustomEvent("tab:change",{bubbles:!0,detail:{tab:t,pane:a,tabId:i}});e.dispatchEvent(o)},handleKeydown:function(e,t,n,s,i){let a=t.classList.contains("tabs-vertical"),o=Array.from(s).filter(l=>!l.classList.contains("disabled")&&!l.disabled),r=o.indexOf(n),c=r;switch(e.key){case"ArrowLeft":a||(e.preventDefault(),c=r>0?r-1:o.length-1);break;case"ArrowRight":a||(e.preventDefault(),c=r<o.length-1?r+1:0);break;case"ArrowUp":a&&(e.preventDefault(),c=r>0?r-1:o.length-1);break;case"ArrowDown":a&&(e.preventDefault(),c=r<o.length-1?r+1:0);break;case"Home":e.preventDefault(),c=0;break;case"End":e.preventDefault(),c=o.length-1;break;case"Enter":case" ":e.preventDefault(),this.activateTab(t,n,s,i);return;default:return}c!==r&&(o[c].focus(),this.activateTab(t,o[c],s,i))},show:function(e){let t;if(typeof e=="string"?t=document.querySelector(`[data-tab="${e}"], [href="#${e}"]`):t=e,!t)return;let n=t.closest(".vd-tabs, [data-tabs]");if(!n)return;let s=n.querySelectorAll(".vd-tab-link, [data-tab]"),i=n.querySelectorAll(".vd-tab-pane, [data-tab-pane]");this.activateTab(n,t,s,i)},destroy:function(e){let t=this.instances.get(e);t&&(t.cleanup.forEach(n=>n()),this.instances.delete(e))},destroyAll:function(){this.instances.forEach((e,t)=>{this.destroy(t)})}};typeof window.Vanduo<"u"&&window.Vanduo.register("tabs",d)})();(function(){"use strict";let d={STORAGE_KEYS:{PRIMARY:"vanduo-primary-color",NEUTRAL:"vanduo-neutral-color",RADIUS:"vanduo-radius",FONT:"vanduo-font-preference",THEME:"vanduo-theme-preference"},DEFAULTS:{PRIMARY_LIGHT:"black",PRIMARY_DARK:"amber",NEUTRAL:"neutral",RADIUS:"0.5",FONT:"ubuntu",THEME:"system"},PRIMARY_COLORS:{black:{name:"Black",color:"#000000"},red:{name:"Red",color:"#fa5252"},orange:{name:"Orange",color:"#fd7e14"},amber:{name:"Amber",color:"#f59f00"},yellow:{name:"Yellow",color:"#fcc419"},lime:{name:"Lime",color:"#82c91e"},green:{name:"Green",color:"#40c057"},emerald:{name:"Emerald",color:"#20c997"},teal:{name:"Teal",color:"#12b886"},cyan:{name:"Cyan",color:"#22b8cf"},sky:{name:"Sky",color:"#3bc9db"},blue:{name:"Blue",color:"#228be6"},indigo:{name:"Indigo",color:"#4c6ef5"},violet:{name:"Violet",color:"#7950f2"},purple:{name:"Purple",color:"#be4bdb"},fuchsia:{name:"Fuchsia",color:"#f06595"},pink:{name:"Pink",color:"#e64980"},rose:{name:"Rose",color:"#ff8787"}},NEUTRAL_COLORS:{slate:{name:"Slate",color:"#64748b"},gray:{name:"Gray",color:"#6b7280"},zinc:{name:"Zinc",color:"#71717a"},neutral:{name:"Neutral",color:"#737373"},stone:{name:"Stone",color:"#78716c"}},RADIUS_OPTIONS:["0","0.125","0.25","0.375","0.5"],FONT_OPTIONS:{"jetbrains-mono":{name:"JetBrains Mono",family:"'JetBrains Mono', monospace"},inter:{name:"Inter",family:"'Inter', sans-serif"},"source-sans":{name:"Source Sans 3",family:"'Source Sans 3', sans-serif"},"fira-sans":{name:"Fira Sans",family:"'Fira Sans', sans-serif"},"ibm-plex":{name:"IBM Plex Sans",family:"'IBM Plex Sans', sans-serif"},system:{name:"System Default",family:null},ubuntu:{name:"Ubuntu",family:"'Ubuntu', sans-serif"},"open-sans":{name:"Open Sans",family:"'Open Sans', sans-serif"},rubik:{name:"Rubik",family:"'Rubik', sans-serif"},"titillium-web":{name:"Titillium Web",family:"'Titillium Web', sans-serif"}},THEME_MODES:["system","dark","light"],state:{primary:null,neutral:null,radius:null,font:null,theme:null,isOpen:!1},isInitialized:!1,_cleanup:[],elements:{customizer:null,trigger:null,panel:null,overlay:null},init:function(){if(this.isInitialized){this.bindExistingElements(),this.bindPanelEvents(),this.updateUI();return}this.isInitialized=!0,this._cleanup=[],this.loadPreferences(),this.applyAllPreferences(),this.bindExistingElements(),this.bindEvents(),console.log("Vanduo Theme Customizer initialized")},addListener:function(e,t,n,s){e&&(e.addEventListener(t,n,s),this._cleanup.push(()=>e.removeEventListener(t,n,s)))},getDefaultPrimary:function(e){return e==="system"?window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT:e==="dark"?this.DEFAULTS.PRIMARY_DARK:this.DEFAULTS.PRIMARY_LIGHT},loadPreferences:function(){this.state.theme=this.getStorageValue(this.STORAGE_KEYS.THEME,this.DEFAULTS.THEME),this.state.primary=this.getStorageValue(this.STORAGE_KEYS.PRIMARY,this.getDefaultPrimary(this.state.theme)),this.state.neutral=this.getStorageValue(this.STORAGE_KEYS.NEUTRAL,this.DEFAULTS.NEUTRAL),this.state.radius=this.getStorageValue(this.STORAGE_KEYS.RADIUS,this.DEFAULTS.RADIUS),this.state.font=this.getStorageValue(this.STORAGE_KEYS.FONT,this.DEFAULTS.FONT)},savePreference:function(e,t){this.setStorageValue(e,t)},applyAllPreferences:function(){this.applyPrimary(this.state.primary),this.applyNeutral(this.state.neutral),this.applyRadius(this.state.radius),this.applyFont(this.state.font),this.applyTheme(this.state.theme)},applyPrimary:function(e){this.PRIMARY_COLORS[e]||(e=this.getDefaultPrimary(this.state.theme)),this.state.primary=e,document.documentElement.setAttribute("data-primary",e),this.savePreference(this.STORAGE_KEYS.PRIMARY,e),this.dispatchEvent("primary-change",{color:e})},applyNeutral:function(e){this.NEUTRAL_COLORS[e]||(e=this.DEFAULTS.NEUTRAL),this.state.neutral=e,document.documentElement.setAttribute("data-neutral",e),this.savePreference(this.STORAGE_KEYS.NEUTRAL,e),this.dispatchEvent("neutral-change",{neutral:e})},applyRadius:function(e){this.RADIUS_OPTIONS.includes(e)||(e=this.DEFAULTS.RADIUS),this.state.radius=e,document.documentElement.setAttribute("data-radius",e),document.documentElement.style.setProperty("--radius-scale",e),this.savePreference(this.STORAGE_KEYS.RADIUS,e),this.dispatchEvent("radius-change",{radius:e})},applyFont:function(e){this.FONT_OPTIONS[e]||(e=this.DEFAULTS.FONT),this.state.font=e,e==="system"?document.documentElement.removeAttribute("data-font"):document.documentElement.setAttribute("data-font",e),this.savePreference(this.STORAGE_KEYS.FONT,e),window.FontSwitcher&&window.FontSwitcher.setPreference&&(window.FontSwitcher.state.preference=e,window.FontSwitcher.applyFont()),this.dispatchEvent("font-change",{font:e})},applyTheme:function(e){this.THEME_MODES.includes(e)||(e=this.DEFAULTS.THEME);let t=this.getDefaultPrimary(this.state.theme);if(this.state.primary===t){let n=this.getDefaultPrimary(e);n!==this.state.primary&&this.applyPrimary(n)}if(this.state.theme=e,e==="system"?document.documentElement.removeAttribute("data-theme"):document.documentElement.setAttribute("data-theme",e),this.savePreference(this.STORAGE_KEYS.THEME,e),window.Vanduo&&window.Vanduo.components.themeSwitcher){let n=window.Vanduo.components.themeSwitcher;n.state&&(n.state.preference=e)}this.dispatchEvent("mode-change",{mode:e})},dispatchEvent:function(e,t){let n=new CustomEvent("theme:"+e,{bubbles:!0,detail:t});document.dispatchEvent(n);let s=new CustomEvent("theme:change",{bubbles:!0,detail:{type:e,value:t[Object.keys(t)[0]],state:{...this.state}}});document.dispatchEvent(s)},bindExistingElements:function(){if(this.elements.customizer=document.querySelector(".vd-theme-customizer"),this.elements.customizer)this.elements.trigger=this.elements.customizer.querySelector(".vd-theme-customizer-trigger"),this.elements.panel=this.elements.customizer.querySelector(".vd-theme-customizer-panel"),this.elements.overlay=this.elements.customizer.querySelector(".vd-theme-customizer-overlay");else{let e=document.querySelector("[data-theme-customizer-trigger]");e&&this.createDynamicPanel(e)}this.updateUI()},createDynamicPanel:function(e){let t=document.createElement("div");t.className="vd-theme-customizer",this.elements.trigger=e;let n=document.createElement("div");n.className="vd-theme-customizer-overlay";let s=document.createElement("div");s.className="vd-theme-customizer-panel",s.innerHTML=this.getPanelHTML(),document.body.appendChild(n),document.body.appendChild(s),this.elements.panel=s,this.elements.overlay=n,this.elements.customizer={contains:i=>s.contains(i)||e.contains(i)},this.positionPanel(),this.bindPanelEvents(),this.addListener(window,"resize",()=>this.positionPanel())},positionPanel:function(){if(!this.elements.panel||!this.elements.trigger)return;if(window.innerWidth<768)this.elements.panel.style.top="",this.elements.panel.style.right="",this.elements.panel.style.left="",this.elements.panel.style.height="",this.elements.panel.style.maxHeight="";else{let t=this.elements.trigger.getBoundingClientRect(),n=320,s=t.bottom+8,i=window.innerWidth,a=i-t.right;i-a-n<8&&(a=i-n-8),this.elements.panel.style.top=s+"px",this.elements.panel.style.right=a+"px",this.elements.panel.style.left="",this.elements.panel.style.height="auto",this.elements.panel.style.maxHeight="calc(100vh - "+s+"px)"}},bindPanelEvents:function(){if(!this.elements.panel||this.elements.panel.getAttribute("data-customizer-initialized")==="true")return;this.elements.panel.setAttribute("data-customizer-initialized","true"),this.elements.panel.querySelectorAll("[data-color]").forEach(s=>{this.addListener(s,"click",()=>{this.applyPrimary(s.dataset.color),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-neutral]").forEach(s=>{this.addListener(s,"click",()=>{this.applyNeutral(s.dataset.neutral),this.updateUI()})}),this.elements.panel.querySelectorAll("[data-radius]").forEach(s=>{this.addListener(s,"click",()=>{this.applyRadius(s.dataset.radius),this.updateUI()})});let e=this.elements.panel.querySelector("[data-customizer-font]");e&&this.addListener(e,"change",s=>{this.applyFont(s.target.value),this.updateUI()});let t=this.elements.panel.querySelector(".customizer-reset");t&&this.addListener(t,"click",()=>{this.reset()});let n=this.elements.panel.querySelector(".customizer-mobile-close");n&&this.addListener(n,"click",()=>{this.close()}),this.elements.overlay&&this.addListener(this.elements.overlay,"click",()=>{this.close()})},getPanelHTML:function(){let e=typeof escapeHtml=="function"?escapeHtml:function(o){let r=document.createElement("div");return r.textContent=String(o??""),r.innerHTML},t=function(o){let r=String(o??"").trim();return/^(#[0-9a-fA-F]{3,8}|rgb[a]?\([^)]{1,60}\)|hsl[a]?\([^)]{1,60}\)|var\(--[a-zA-Z0-9_-]{1,40}\))$/.test(r)?r:"#000000"},n="";for(let[o,r]of Object.entries(this.PRIMARY_COLORS))n+=`<button class="tc-color-swatch${o===this.state.primary?" is-active":""}" data-color="${e(o)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"></button>`;let s="";for(let[o,r]of Object.entries(this.NEUTRAL_COLORS))s+=`<button class="tc-neutral-swatch${o===this.state.neutral?" is-active":""}" data-neutral="${e(o)}" style="--swatch-color: ${t(r.color)}" title="${e(r.name)}"><span>${e(r.name)}</span></button>`;let i="";this.RADIUS_OPTIONS.forEach(o=>{i+=`<button class="tc-radius-btn${o===this.state.radius?" is-active":""}" data-radius="${e(o)}">${e(o)}</button>`});let a="";for(let[o,r]of Object.entries(this.FONT_OPTIONS))a+=`<option value="${e(o)}"${o===this.state.font?" selected":""}>${e(r.name)}</option>`;return`