@mks2508/sidebar-headless 0.3.0 → 0.4.0
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/dist/MobileOptimizations.css +570 -0
- package/dist/components/Sidebar/SidebarToggle.d.ts.map +1 -1
- package/dist/hooks/use-liquid-glass.d.ts +27 -4
- package/dist/hooks/use-liquid-glass.d.ts.map +1 -1
- package/dist/hooks/use-sidebar-liquid-glass.d.ts +4 -4
- package/dist/index.cjs +11021 -13154
- package/dist/index.cjs.map +1 -1
- package/dist/{dist/index.css → index.css} +10 -47
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +2235 -0
- package/dist/index.d.ts +162 -4
- package/dist/index.js +11001 -13097
- package/dist/index.js.map +1 -1
- package/dist/tooltip-keyframes.css +329 -0
- package/package.json +5 -4
- package/dist/dist/index.css.map +0 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tooltip Transition Keyframes
|
|
3
|
+
*
|
|
4
|
+
* Sistema de animaciones CSS para transiciones de tooltip con:
|
|
5
|
+
* - Items staggered enter/exit
|
|
6
|
+
* - Grid-based height transitions
|
|
7
|
+
* - 3D title rotations
|
|
8
|
+
*
|
|
9
|
+
* Performance: GPU-accelerated (transform + opacity only)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* ============================================================================
|
|
13
|
+
ITEMS ANIMATIONS - Staggered Enter/Exit
|
|
14
|
+
============================================================================ */
|
|
15
|
+
|
|
16
|
+
@keyframes tooltip-item-enter {
|
|
17
|
+
from {
|
|
18
|
+
opacity: 0;
|
|
19
|
+
transform: translateX(-8px);
|
|
20
|
+
}
|
|
21
|
+
to {
|
|
22
|
+
opacity: 1;
|
|
23
|
+
transform: translateX(0);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@keyframes tooltip-item-exit {
|
|
28
|
+
from {
|
|
29
|
+
opacity: 1;
|
|
30
|
+
transform: translateX(0);
|
|
31
|
+
}
|
|
32
|
+
to {
|
|
33
|
+
opacity: 0;
|
|
34
|
+
transform: translateX(-4px);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Item States con CSS Custom Properties
|
|
40
|
+
*
|
|
41
|
+
* Uso: <div style="--animation-order: 0" data-state="entering">
|
|
42
|
+
*/
|
|
43
|
+
.sidebar-sublink[data-state="entering"] {
|
|
44
|
+
animation: tooltip-item-enter 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
45
|
+
animation-delay: calc(var(--animation-order, 0) * 30ms + 150ms);
|
|
46
|
+
animation-fill-mode: both;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.sidebar-sublink[data-state="leaving"] {
|
|
50
|
+
animation: tooltip-item-exit 100ms cubic-bezier(0.4, 0, 0.6, 1);
|
|
51
|
+
animation-delay: calc(var(--animation-order, 0) * 20ms);
|
|
52
|
+
animation-fill-mode: both;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ============================================================================
|
|
56
|
+
TITLE 3D ROTATIONS
|
|
57
|
+
============================================================================ */
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Title Rotate Up (direction-aware)
|
|
61
|
+
* Usado cuando navegamos hacia arriba en el sidebar
|
|
62
|
+
*/
|
|
63
|
+
@keyframes tooltip-title-rotate-up {
|
|
64
|
+
from {
|
|
65
|
+
transform: rotateX(0deg);
|
|
66
|
+
opacity: 1;
|
|
67
|
+
}
|
|
68
|
+
to {
|
|
69
|
+
transform: rotateX(-90deg);
|
|
70
|
+
opacity: 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@keyframes tooltip-title-enter-from-below {
|
|
75
|
+
from {
|
|
76
|
+
transform: rotateX(90deg);
|
|
77
|
+
opacity: 0;
|
|
78
|
+
}
|
|
79
|
+
to {
|
|
80
|
+
transform: rotateX(0deg);
|
|
81
|
+
opacity: 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Title Rotate Down (direction-aware)
|
|
87
|
+
* Usado cuando navegamos hacia abajo en el sidebar
|
|
88
|
+
*/
|
|
89
|
+
@keyframes tooltip-title-rotate-down {
|
|
90
|
+
from {
|
|
91
|
+
transform: rotateX(0deg);
|
|
92
|
+
opacity: 1;
|
|
93
|
+
}
|
|
94
|
+
to {
|
|
95
|
+
transform: rotateX(90deg);
|
|
96
|
+
opacity: 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@keyframes tooltip-title-enter-from-above {
|
|
101
|
+
from {
|
|
102
|
+
transform: rotateX(-90deg);
|
|
103
|
+
opacity: 0;
|
|
104
|
+
}
|
|
105
|
+
to {
|
|
106
|
+
transform: rotateX(0deg);
|
|
107
|
+
opacity: 1;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Title States
|
|
113
|
+
*/
|
|
114
|
+
.tooltip-title[data-direction="up"][data-state="leaving"] {
|
|
115
|
+
animation: tooltip-title-rotate-up 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.tooltip-title[data-direction="up"][data-state="entering"] {
|
|
119
|
+
animation: tooltip-title-enter-from-below 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.tooltip-title[data-direction="down"][data-state="leaving"] {
|
|
123
|
+
animation: tooltip-title-rotate-down 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.tooltip-title[data-direction="down"][data-state="entering"] {
|
|
127
|
+
animation: tooltip-title-enter-from-above 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* ============================================================================
|
|
131
|
+
3D CUBE FACES (Enfoque A: Multi-cara)
|
|
132
|
+
============================================================================ */
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Cubo 3D con 6 caras para títulos
|
|
136
|
+
*
|
|
137
|
+
* Estructura:
|
|
138
|
+
* .title-scene (perspective)
|
|
139
|
+
* └─ .title-cube (preserve-3d)
|
|
140
|
+
* ├─ .title-face--front
|
|
141
|
+
* ├─ .title-face--back
|
|
142
|
+
* ├─ .title-face--top
|
|
143
|
+
* ├─ .title-face--bottom
|
|
144
|
+
* ├─ .title-face--left
|
|
145
|
+
* └─ .title-face--right
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
.title-scene {
|
|
149
|
+
perspective: 600px;
|
|
150
|
+
position: relative;
|
|
151
|
+
width: 100%;
|
|
152
|
+
height: 2rem;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.title-cube {
|
|
156
|
+
width: 100%;
|
|
157
|
+
height: 100%;
|
|
158
|
+
position: relative;
|
|
159
|
+
transform-style: preserve-3d;
|
|
160
|
+
transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
161
|
+
/* Empujar hacia atrás para evitar blur en texto */
|
|
162
|
+
transform: translateZ(-1rem);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.title-face {
|
|
166
|
+
position: absolute;
|
|
167
|
+
width: 100%;
|
|
168
|
+
height: 100%;
|
|
169
|
+
backface-visibility: hidden;
|
|
170
|
+
display: flex;
|
|
171
|
+
align-items: center;
|
|
172
|
+
justify-content: flex-start;
|
|
173
|
+
padding: 0 1rem;
|
|
174
|
+
font-weight: 500;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* Posicionamiento de caras - Vertical rotation (rotateX) */
|
|
178
|
+
.title-face--front {
|
|
179
|
+
transform: rotateX(0deg) translateZ(1rem);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.title-face--top {
|
|
183
|
+
transform: rotateX(90deg) translateZ(1rem);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.title-face--bottom {
|
|
187
|
+
transform: rotateX(-90deg) translateZ(1rem);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.title-face--back {
|
|
191
|
+
transform: rotateX(180deg) translateZ(1rem);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Estados del cubo - Direction-aware */
|
|
195
|
+
.title-cube[data-face="front"] {
|
|
196
|
+
transform: translateZ(-1rem) rotateX(0deg);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.title-cube[data-face="top"] {
|
|
200
|
+
transform: translateZ(-1rem) rotateX(-90deg);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.title-cube[data-face="bottom"] {
|
|
204
|
+
transform: translateZ(-1rem) rotateX(90deg);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.title-cube[data-face="back"] {
|
|
208
|
+
transform: translateZ(-1rem) rotateX(180deg);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* ============================================================================
|
|
212
|
+
GRID HEIGHT TRANSITION (Grid Trick)
|
|
213
|
+
============================================================================ */
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Grid trick para height: auto transitions
|
|
217
|
+
*
|
|
218
|
+
* Técnica: grid-template-rows: 0fr → 1fr
|
|
219
|
+
* Browser support: Chrome 107+, Firefox 117+, Safari 16.4+
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
.tooltip-content-grid {
|
|
223
|
+
display: grid;
|
|
224
|
+
grid-template-rows: 0fr;
|
|
225
|
+
transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
226
|
+
transition-delay: 50ms; /* Empieza después del fade-out de items */
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.tooltip-content-grid[data-state="open"] {
|
|
230
|
+
grid-template-rows: 1fr;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.tooltip-content-inner {
|
|
234
|
+
overflow: hidden;
|
|
235
|
+
min-height: 0; /* Crítico para que grid trick funcione */
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* ============================================================================
|
|
239
|
+
UTILITY CLASSES
|
|
240
|
+
============================================================================ */
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Contenedor con perspective para títulos crossfade
|
|
244
|
+
*/
|
|
245
|
+
.tooltip-title-perspective {
|
|
246
|
+
perspective: 600px;
|
|
247
|
+
position: relative;
|
|
248
|
+
width: 100%;
|
|
249
|
+
height: 2rem;
|
|
250
|
+
overflow: hidden;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Disable animations durante hover rápido (opcional)
|
|
255
|
+
* Usar con cuidado: puede causar flickering
|
|
256
|
+
*/
|
|
257
|
+
.tooltip-no-animations * {
|
|
258
|
+
animation: none !important;
|
|
259
|
+
transition: none !important;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* ============================================================================
|
|
263
|
+
DEBUG HELPERS
|
|
264
|
+
============================================================================ */
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Visualización de estados en debug mode
|
|
268
|
+
*/
|
|
269
|
+
[data-tooltip-debug="true"] .sidebar-sublink[data-state]::before {
|
|
270
|
+
content: attr(data-state);
|
|
271
|
+
position: absolute;
|
|
272
|
+
top: 0;
|
|
273
|
+
right: 0;
|
|
274
|
+
font-size: 8px;
|
|
275
|
+
background: rgba(255, 0, 0, 0.8);
|
|
276
|
+
color: white;
|
|
277
|
+
padding: 2px 4px;
|
|
278
|
+
border-radius: 2px;
|
|
279
|
+
pointer-events: none;
|
|
280
|
+
z-index: 1000;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
[data-tooltip-debug="true"] .tooltip-title[data-direction]::after {
|
|
284
|
+
content: "dir:" attr(data-direction);
|
|
285
|
+
position: absolute;
|
|
286
|
+
bottom: 0;
|
|
287
|
+
left: 0;
|
|
288
|
+
font-size: 8px;
|
|
289
|
+
background: rgba(0, 0, 255, 0.8);
|
|
290
|
+
color: white;
|
|
291
|
+
padding: 2px 4px;
|
|
292
|
+
border-radius: 2px;
|
|
293
|
+
pointer-events: none;
|
|
294
|
+
z-index: 1000;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* ============================================================================
|
|
298
|
+
PERFORMANCE OPTIMIZATIONS
|
|
299
|
+
============================================================================ */
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* GPU acceleration hints
|
|
303
|
+
*/
|
|
304
|
+
.sidebar-sublink[data-state],
|
|
305
|
+
.tooltip-title[data-state],
|
|
306
|
+
.title-cube {
|
|
307
|
+
will-change: transform, opacity;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Contain layout/paint/style para mejor performance
|
|
312
|
+
*/
|
|
313
|
+
.tooltip-content-grid {
|
|
314
|
+
contain: layout style paint;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Reduce motion para accesibilidad
|
|
319
|
+
*/
|
|
320
|
+
@media (prefers-reduced-motion: reduce) {
|
|
321
|
+
.sidebar-sublink[data-state],
|
|
322
|
+
.tooltip-title[data-state],
|
|
323
|
+
.title-cube,
|
|
324
|
+
.tooltip-content-grid {
|
|
325
|
+
animation-duration: 0.01ms !important;
|
|
326
|
+
animation-iteration-count: 1 !important;
|
|
327
|
+
transition-duration: 0.01ms !important;
|
|
328
|
+
}
|
|
329
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mks2508/sidebar-headless",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Headless sidebar and mobile bottom navigation components for React with advanced animations, keyboard navigation, and full WAI-ARIA accessibility",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,14 +28,15 @@
|
|
|
28
28
|
"scripts": {
|
|
29
29
|
"dev": "cd playground && vite",
|
|
30
30
|
"dev:clean": "killall -9 node || true && cd playground && vite",
|
|
31
|
-
"build": "
|
|
32
|
-
"build:watch": "
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"build:watch": "tsup --watch",
|
|
33
33
|
"preview": "cd playground && vite preview",
|
|
34
34
|
"typecheck": "mkdir -p dist && tsgo --declaration --emitDeclarationOnly --noEmit false",
|
|
35
35
|
"typecheck:watch": "mkdir -p dist && tsgo --declaration --emitDeclarationOnly --noEmit false --watch",
|
|
36
|
+
"flatten-dts": "bun run scripts/flatten-declarations.ts",
|
|
36
37
|
"lint": "oxlint",
|
|
37
38
|
"lint:fix": "oxlint --fix",
|
|
38
|
-
"prepublishOnly": "bun run build && bun run typecheck"
|
|
39
|
+
"prepublishOnly": "bun run build && bun run typecheck && bun run flatten-dts"
|
|
39
40
|
},
|
|
40
41
|
"keywords": [
|
|
41
42
|
"react",
|
package/dist/dist/index.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.css","names":[],"sources":["../../src/components/ui/text-cylinder.module.css","../../src/animations/tooltip-keyframes.css","../../src/components/BottomNavBar/MobileOptimizations.css"],"sourcesContent":["/* CSS Custom Properties for dynamic configuration */\n.container {\n position: relative;\n overflow: hidden;\n perspective: var(--cylinder-perspective, 1000px);\n}\n\n.cylinder {\n position: relative;\n width: 100%;\n height: 100%;\n transform-style: preserve-3d;\n /* Rotation is controlled by Web Animations API */\n transform: rotateX(var(--cylinder-rotation, 0deg));\n}\n\n.face {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n backface-visibility: hidden;\n /* Transform is set via inline style for dynamic positioning */\n transition: opacity 0.3s ease;\n}\n\n.face.visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.face.hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n/* Optional: Add will-change for performance on faces that are animating */\n.cylinder.animating .face {\n will-change: opacity;\n}\n\n.cylinder.animating {\n will-change: transform;\n}\n","/**\n * Tooltip Transition Keyframes\n *\n * Sistema de animaciones CSS para transiciones de tooltip con:\n * - Items staggered enter/exit\n * - Grid-based height transitions\n * - 3D title rotations\n *\n * Performance: GPU-accelerated (transform + opacity only)\n */\n\n/* ============================================================================\n ITEMS ANIMATIONS - Staggered Enter/Exit\n ============================================================================ */\n\n@keyframes tooltip-item-enter {\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes tooltip-item-exit {\n from {\n opacity: 1;\n transform: translateX(0);\n }\n to {\n opacity: 0;\n transform: translateX(-4px);\n }\n}\n\n/**\n * Item States con CSS Custom Properties\n *\n * Uso: <div style=\"--animation-order: 0\" data-state=\"entering\">\n */\n.sidebar-sublink[data-state=\"entering\"] {\n animation: tooltip-item-enter 150ms cubic-bezier(0.4, 0, 0.2, 1);\n animation-delay: calc(var(--animation-order, 0) * 30ms + 150ms);\n animation-fill-mode: both;\n}\n\n.sidebar-sublink[data-state=\"leaving\"] {\n animation: tooltip-item-exit 100ms cubic-bezier(0.4, 0, 0.6, 1);\n animation-delay: calc(var(--animation-order, 0) * 20ms);\n animation-fill-mode: both;\n}\n\n/* ============================================================================\n TITLE 3D ROTATIONS\n ============================================================================ */\n\n/**\n * Title Rotate Up (direction-aware)\n * Usado cuando navegamos hacia arriba en el sidebar\n */\n@keyframes tooltip-title-rotate-up {\n from {\n transform: rotateX(0deg);\n opacity: 1;\n }\n to {\n transform: rotateX(-90deg);\n opacity: 0;\n }\n}\n\n@keyframes tooltip-title-enter-from-below {\n from {\n transform: rotateX(90deg);\n opacity: 0;\n }\n to {\n transform: rotateX(0deg);\n opacity: 1;\n }\n}\n\n/**\n * Title Rotate Down (direction-aware)\n * Usado cuando navegamos hacia abajo en el sidebar\n */\n@keyframes tooltip-title-rotate-down {\n from {\n transform: rotateX(0deg);\n opacity: 1;\n }\n to {\n transform: rotateX(90deg);\n opacity: 0;\n }\n}\n\n@keyframes tooltip-title-enter-from-above {\n from {\n transform: rotateX(-90deg);\n opacity: 0;\n }\n to {\n transform: rotateX(0deg);\n opacity: 1;\n }\n}\n\n/**\n * Title States\n */\n.tooltip-title[data-direction=\"up\"][data-state=\"leaving\"] {\n animation: tooltip-title-rotate-up 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n.tooltip-title[data-direction=\"up\"][data-state=\"entering\"] {\n animation: tooltip-title-enter-from-below 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n.tooltip-title[data-direction=\"down\"][data-state=\"leaving\"] {\n animation: tooltip-title-rotate-down 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n.tooltip-title[data-direction=\"down\"][data-state=\"entering\"] {\n animation: tooltip-title-enter-from-above 250ms cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n/* ============================================================================\n 3D CUBE FACES (Enfoque A: Multi-cara)\n ============================================================================ */\n\n/**\n * Cubo 3D con 6 caras para títulos\n *\n * Estructura:\n * .title-scene (perspective)\n * └─ .title-cube (preserve-3d)\n * ├─ .title-face--front\n * ├─ .title-face--back\n * ├─ .title-face--top\n * ├─ .title-face--bottom\n * ├─ .title-face--left\n * └─ .title-face--right\n */\n\n.title-scene {\n perspective: 600px;\n position: relative;\n width: 100%;\n height: 2rem;\n}\n\n.title-cube {\n width: 100%;\n height: 100%;\n position: relative;\n transform-style: preserve-3d;\n transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);\n /* Empujar hacia atrás para evitar blur en texto */\n transform: translateZ(-1rem);\n}\n\n.title-face {\n position: absolute;\n width: 100%;\n height: 100%;\n backface-visibility: hidden;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n padding: 0 1rem;\n font-weight: 500;\n}\n\n/* Posicionamiento de caras - Vertical rotation (rotateX) */\n.title-face--front {\n transform: rotateX(0deg) translateZ(1rem);\n}\n\n.title-face--top {\n transform: rotateX(90deg) translateZ(1rem);\n}\n\n.title-face--bottom {\n transform: rotateX(-90deg) translateZ(1rem);\n}\n\n.title-face--back {\n transform: rotateX(180deg) translateZ(1rem);\n}\n\n/* Estados del cubo - Direction-aware */\n.title-cube[data-face=\"front\"] {\n transform: translateZ(-1rem) rotateX(0deg);\n}\n\n.title-cube[data-face=\"top\"] {\n transform: translateZ(-1rem) rotateX(-90deg);\n}\n\n.title-cube[data-face=\"bottom\"] {\n transform: translateZ(-1rem) rotateX(90deg);\n}\n\n.title-cube[data-face=\"back\"] {\n transform: translateZ(-1rem) rotateX(180deg);\n}\n\n/* ============================================================================\n GRID HEIGHT TRANSITION (Grid Trick)\n ============================================================================ */\n\n/**\n * Grid trick para height: auto transitions\n *\n * Técnica: grid-template-rows: 0fr → 1fr\n * Browser support: Chrome 107+, Firefox 117+, Safari 16.4+\n */\n\n.tooltip-content-grid {\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 200ms cubic-bezier(0.4, 0, 0.2, 1);\n transition-delay: 50ms; /* Empieza después del fade-out de items */\n}\n\n.tooltip-content-grid[data-state=\"open\"] {\n grid-template-rows: 1fr;\n}\n\n.tooltip-content-inner {\n overflow: hidden;\n min-height: 0; /* Crítico para que grid trick funcione */\n}\n\n/* ============================================================================\n UTILITY CLASSES\n ============================================================================ */\n\n/**\n * Contenedor con perspective para títulos crossfade\n */\n.tooltip-title-perspective {\n perspective: 600px;\n position: relative;\n width: 100%;\n height: 2rem;\n overflow: hidden;\n}\n\n/**\n * Disable animations durante hover rápido (opcional)\n * Usar con cuidado: puede causar flickering\n */\n.tooltip-no-animations * {\n animation: none !important;\n transition: none !important;\n}\n\n/* ============================================================================\n DEBUG HELPERS\n ============================================================================ */\n\n/**\n * Visualización de estados en debug mode\n */\n[data-tooltip-debug=\"true\"] .sidebar-sublink[data-state]::before {\n content: attr(data-state);\n position: absolute;\n top: 0;\n right: 0;\n font-size: 8px;\n background: rgba(255, 0, 0, 0.8);\n color: white;\n padding: 2px 4px;\n border-radius: 2px;\n pointer-events: none;\n z-index: 1000;\n}\n\n[data-tooltip-debug=\"true\"] .tooltip-title[data-direction]::after {\n content: \"dir:\" attr(data-direction);\n position: absolute;\n bottom: 0;\n left: 0;\n font-size: 8px;\n background: rgba(0, 0, 255, 0.8);\n color: white;\n padding: 2px 4px;\n border-radius: 2px;\n pointer-events: none;\n z-index: 1000;\n}\n\n/* ============================================================================\n PERFORMANCE OPTIMIZATIONS\n ============================================================================ */\n\n/**\n * GPU acceleration hints\n */\n.sidebar-sublink[data-state],\n.tooltip-title[data-state],\n.title-cube {\n will-change: transform, opacity;\n}\n\n/**\n * Contain layout/paint/style para mejor performance\n */\n.tooltip-content-grid {\n contain: layout style paint;\n}\n\n/**\n * Reduce motion para accesibilidad\n */\n@media (prefers-reduced-motion: reduce) {\n .sidebar-sublink[data-state],\n .tooltip-title[data-state],\n .title-cube,\n .tooltip-content-grid {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n","/**\n * Mobile Optimizations CSS\n *\n * This file contains CSS optimizations for mobile devices,\n * specifically targeting iOS Safari and Android Chrome.\n * Updated for 2025 with modern viewport units and safe area handling.\n *\n * CRITICAL: iOS 26 Safari has major bugs with fixed/sticky positioning.\n * This file includes workarounds for these issues.\n *\n * Known iOS 26 Issues (as of December 2025):\n * - Fixed elements shift when address bar shrinks/expands\n * - visualViewport.offsetTop doesn't reset after keyboard dismissal\n * - 100dvh creates gaps at bottom for overlays\n * - position: fixed breaks after keyboard interaction\n *\n * @fileoverview Mobile-first CSS optimizations for bottom navigation\n * @author v0\n * @version 2.0.0 - iOS 26 compatibility update\n */\n\n/* ============================================\n CSS Custom Properties for Mobile Navigation\n ============================================ */\n\n:root {\n /* Navigation dimensions */\n --mobile-nav-height: 4.5rem; /* 72px - optimal touch target */\n --mobile-nav-padding-x: 1rem;\n --mobile-nav-padding-y: 0.5rem;\n --mobile-nav-gap: 0.25rem;\n\n /* Safe area handling for notched devices */\n --safe-area-bottom: env(safe-area-inset-bottom, 0px);\n --safe-area-left: env(safe-area-inset-left, 0px);\n --safe-area-right: env(safe-area-inset-right, 0px);\n\n /* Touch target sizes (WCAG 2.2 Level AAA) */\n --touch-target-min: 44px;\n --touch-target-optimal: 48px;\n\n /* Glassmorphism properties */\n --glass-blur: 20px;\n --glass-saturation: 180%;\n --glass-bg-light: rgba(255, 255, 255, 0.72);\n --glass-bg-dark: rgba(17, 17, 17, 0.72);\n --glass-border-light: rgba(255, 255, 255, 0.18);\n --glass-border-dark: rgba(255, 255, 255, 0.08);\n\n /* Animation timing */\n --nav-transition-duration: 200ms;\n --nav-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);\n\n /* iOS 26 Safari workaround: extra padding for floating bar */\n --ios26-bottom-offset: 0px;\n}\n\n/* ============================================\n iOS 26 Safari Critical Workarounds\n ============================================\n \n iOS 26 has major bugs with position: fixed elements:\n 1. Elements shift when scrolling and address bar changes\n 2. After keyboard dismissal, visualViewport doesn't reset\n 3. 100dvh doesn't cover full screen in some cases\n \n The workaround from Apple's own website:\n - Use a wrapper with fixed positioning\n - Apply 100vh to inner content\n - This creates proper stacking under the floating URL bar\n*/\n\n/* Detect iOS Safari using feature queries */\n@supports (-webkit-touch-callout: none) {\n /* \n * iOS 26 Safari Fix:\n * Move scroll from window to body to prevent fixed element drift.\n * This is the most reliable workaround as of iOS 26.1\n */\n html.ios-safari-fix {\n height: 100%;\n height: 100dvh;\n overflow: hidden;\n }\n\n html.ios-safari-fix body {\n height: 100%;\n height: 100dvh;\n overflow: auto;\n overscroll-behavior: contain;\n /* Prevent momentum scroll affecting fixed elements */\n -webkit-overflow-scrolling: touch;\n }\n}\n\n/* ============================================\n Modern Viewport Units Support\n ============================================ */\n\n/**\n * Dynamic Viewport Height (dvh) - Adjusts as browser UI appears/disappears\n * Small Viewport Height (svh) - Minimum viewport when browser UI is visible\n * Large Viewport Height (lvh) - Maximum viewport when browser UI is hidden\n *\n * IMPORTANT for iOS 26:\n * - dvh has inconsistent behavior after keyboard dismissal\n * - svh is more reliable for bottom navigation\n * - Consider using 100% with proper parent height chains\n */\n\n/* Fallback for older browsers (iOS < 15.4) */\n@supports not (height: 100dvh) {\n .mobile-nav-container {\n bottom: 0;\n /* iOS 11.0-11.2 legacy support */\n bottom: constant(safe-area-inset-bottom);\n }\n}\n\n/* Modern browsers with dynamic viewport units */\n@supports (height: 100dvh) {\n .mobile-nav-container {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n }\n}\n\n/* ============================================\n Base Mobile Navigation Styles\n ============================================ */\n\n.mobile-nav-root {\n /* Positioning - using fixed with iOS 26 considerations */\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 50;\n\n /* Safe area padding for notched devices */\n padding-bottom: var(--safe-area-bottom);\n padding-left: var(--safe-area-left);\n padding-right: var(--safe-area-right);\n\n /* \n * iOS 26 Fix: Force GPU layer to prevent drift\n * translateZ(0) creates a new stacking context and compositing layer\n */\n transform: translateZ(0);\n -webkit-transform: translateZ(0);\n\n /* Hardware acceleration hints */\n will-change: transform;\n backface-visibility: hidden;\n -webkit-backface-visibility: hidden;\n\n /* \n * iOS 26 Fix: contain property helps isolate layout\n * This prevents the element from being affected by parent layout changes\n */\n contain: layout style;\n}\n\n/*\n * Alternative iOS 26 workaround using sticky positioning\n * Some developers report sticky works better than fixed in iOS 26\n * Uncomment if fixed positioning continues to have issues\n */\n.mobile-nav-root--sticky-fallback {\n position: sticky;\n bottom: 0;\n /* Sticky requires a positioned ancestor or viewport */\n}\n\n/* ============================================\n Glassmorphism Effect\n ============================================ */\n\n.mobile-nav-glass {\n /* Glassmorphism background */\n background: var(--glass-bg-light);\n\n /* \n * Backdrop blur with vendor prefix for Safari\n * Note: backdrop-filter can cause performance issues on older devices\n */\n -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturation));\n backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturation));\n\n /* Border for depth perception */\n border-top: 1px solid var(--glass-border-light);\n\n /* Text rendering optimization */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n/* Dark mode glassmorphism */\n.dark .mobile-nav-glass,\n[data-theme=\"dark\"] .mobile-nav-glass {\n background: var(--glass-bg-dark);\n border-top-color: var(--glass-border-dark);\n}\n\n/* Fallback for browsers without backdrop-filter support */\n@supports not (backdrop-filter: blur(1px)) {\n .mobile-nav-glass {\n background: rgba(255, 255, 255, 0.95);\n }\n\n .dark .mobile-nav-glass,\n [data-theme=\"dark\"] .mobile-nav-glass {\n background: rgba(17, 17, 17, 0.95);\n }\n}\n\n/* ============================================\n Navigation List Styles\n ============================================ */\n\n.mobile-nav-list {\n /* Flexbox layout */\n display: flex;\n align-items: center;\n justify-content: space-around;\n\n /* Dimensions */\n height: var(--mobile-nav-height);\n width: 100%;\n max-width: 100%;\n\n /* Padding */\n padding: var(--mobile-nav-padding-y) var(--mobile-nav-padding-x);\n\n /* Reset list styles */\n list-style: none;\n margin: 0;\n}\n\n/* ============================================\n Navigation Item Styles\n ============================================ */\n\n.mobile-nav-item {\n /* Flexbox centering */\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--mobile-nav-gap);\n\n /* Touch target (minimum 44x44px per WCAG 2.2) */\n min-width: var(--touch-target-min);\n min-height: var(--touch-target-min);\n padding: 0.5rem 0.75rem;\n\n /* Reset button/anchor styles */\n background: transparent;\n border: none;\n cursor: pointer;\n text-decoration: none;\n\n /* Typography - 16px minimum to prevent iOS zoom on focus */\n font-size: 0.75rem; /* 12px for labels */\n line-height: 1;\n\n /* Transition */\n transition: color var(--nav-transition-duration) var(--nav-transition-easing), transform\n var(--nav-transition-duration) var(--nav-transition-easing);\n\n /* Prevent text selection on touch */\n -webkit-user-select: none;\n user-select: none;\n\n /* Prevent double-tap zoom */\n touch-action: manipulation;\n\n /* Remove tap highlight on mobile */\n -webkit-tap-highlight-color: transparent;\n}\n\n/* Active/pressed state */\n.mobile-nav-item:active {\n transform: scale(0.95);\n}\n\n/* Focus visible for accessibility (keyboard navigation) */\n.mobile-nav-item:focus-visible {\n outline: 2px solid currentColor;\n outline-offset: 2px;\n border-radius: 0.5rem;\n}\n\n/* Icon container */\n.mobile-nav-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.5rem; /* 24px */\n height: 1.5rem; /* 24px */\n}\n\n/* Label text */\n.mobile-nav-label {\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 4rem;\n}\n\n/* ============================================\n iOS Safari Specific Fixes (All versions)\n ============================================ */\n\n@supports (-webkit-touch-callout: none) {\n .mobile-nav-root {\n /* Prevent rubber-banding effect on the nav */\n overscroll-behavior: none;\n\n /* Ensure proper stacking above Safari's UI */\n position: fixed;\n bottom: 0;\n }\n\n /* Spacer component to prevent content from going under navigation */\n .mobile-nav-spacer {\n height: calc(var(--mobile-nav-height) + var(--safe-area-bottom));\n /* Add extra space for iOS 26 floating bar when needed */\n padding-bottom: var(--ios26-bottom-offset);\n }\n}\n\n/* ============================================\n iOS 26+ Specific Workarounds\n ============================================\n \n These are specifically for iOS 26 Safari bugs.\n The main issues are:\n 1. Fixed elements drift when address bar shrinks\n 2. visualViewport doesn't reset after keyboard\n 3. 100dvh doesn't account for floating tab bar\n*/\n\n/* \n * iOS 26 Detection Hack:\n * iOS 26 introduced the floating tab bar which affects layout.\n * We use a combination of feature detection and JS-added classes.\n */\n\n/* When JS detects iOS 26, it adds this class to html */\nhtml.ios-26-fix .mobile-nav-root {\n /* \n * Apple's workaround: Use a pseudo-element that extends beyond\n * the visible area to account for the floating bar\n */\n position: fixed;\n bottom: 0;\n}\n\nhtml.ios-26-fix .mobile-nav-root::after {\n content: \"\";\n position: absolute;\n bottom: calc(-1 * var(--safe-area-bottom) - 20px);\n left: 0;\n right: 0;\n height: calc(var(--safe-area-bottom) + 20px);\n background: inherit;\n -webkit-backdrop-filter: inherit;\n backdrop-filter: inherit;\n}\n\n/* \n * Alternative: Force recalculation on scroll\n * This class is toggled by JS when scroll events occur\n */\n.mobile-nav-root--ios26-scroll-fix {\n /* Trigger repaint */\n transform: translateZ(0) translateY(0);\n}\n\n/* ============================================\n Android Chrome Specific Fixes\n ============================================ */\n\n@supports not (-webkit-touch-callout: none) {\n .mobile-nav-root {\n /* Android uses standard fixed positioning well */\n bottom: 0;\n }\n\n /* Android gesture navigation safe area */\n .mobile-nav-spacer {\n height: calc(var(--mobile-nav-height) + var(--safe-area-bottom));\n }\n}\n\n/* ============================================\n Keyboard Visibility Handling\n ============================================\n \n iOS 26 Bug: After keyboard dismissal, fixed elements\n remain offset. This requires JS intervention.\n*/\n\n/* When keyboard is visible, optionally hide nav */\nhtml.keyboard-visible .mobile-nav-root--hide-on-keyboard {\n transform: translateY(100%);\n transition: transform 0.2s ease-out;\n}\n\n/* Force reset after keyboard dismissal (JS adds this class) */\nhtml.keyboard-dismissed .mobile-nav-root {\n /* Force layout recalculation */\n transform: translateZ(0);\n animation: ios26-reset 0.01s forwards;\n}\n\n@keyframes ios26-reset {\n from {\n transform: translateZ(0) translateY(0.01px);\n }\n to {\n transform: translateZ(0) translateY(0);\n }\n}\n\n/* ============================================\n Reduced Motion Support\n ============================================ */\n\n@media (prefers-reduced-motion: reduce) {\n .mobile-nav-item {\n transition: none;\n }\n\n .mobile-nav-item:active {\n transform: none;\n }\n\n html.keyboard-visible .mobile-nav-root--hide-on-keyboard {\n transition: none;\n }\n}\n\n/* ============================================\n High Contrast Mode Support\n ============================================ */\n\n@media (prefers-contrast: high) {\n .mobile-nav-glass {\n background: Canvas;\n border-top: 2px solid CanvasText;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n }\n\n .mobile-nav-item {\n color: CanvasText;\n }\n\n .mobile-nav-item:focus-visible {\n outline-width: 3px;\n }\n}\n\n/* ============================================\n Landscape Orientation Adjustments\n ============================================ */\n\n@media (orientation: landscape) and (max-height: 500px) {\n :root {\n --mobile-nav-height: 3.5rem;\n }\n\n .mobile-nav-label {\n display: none;\n }\n\n .mobile-nav-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\n/* ============================================\n Foldable/Dual Screen Support\n ============================================ */\n\n@media (horizontal-viewport-segments: 2) {\n .mobile-nav-root {\n width: 100%;\n }\n\n .mobile-nav-list {\n /* Adjust for fold in the middle */\n padding-left: max(var(--mobile-nav-padding-x), env(fold-left, 0px));\n padding-right: max(var(--mobile-nav-padding-x), env(fold-right, 0px));\n }\n}\n\n/* Samsung Galaxy Fold specific */\n@media (min-width: 280px) and (max-width: 320px) {\n .mobile-nav-list {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n}\n\n/* ============================================\n Very Small Screens (older devices)\n ============================================ */\n\n@media (max-width: 320px) {\n :root {\n --mobile-nav-height: 4rem;\n --mobile-nav-padding-x: 0.5rem;\n }\n\n .mobile-nav-label {\n font-size: 0.625rem;\n max-width: 3rem;\n }\n}\n\n/* ============================================\n Print Styles\n ============================================ */\n\n@media print {\n .mobile-nav-root,\n .mobile-nav-spacer {\n display: none !important;\n }\n}\n\n/* ============================================\n Utility Classes\n ============================================ */\n\n/* Hide visually but keep accessible to screen readers */\n.mobile-nav-sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Skip to content link for keyboard users */\n.mobile-nav-skip-link {\n position: absolute;\n top: -100%;\n left: 50%;\n transform: translateX(-50%);\n z-index: 100;\n padding: 0.5rem 1rem;\n background: var(--glass-bg-light);\n border-radius: 0.5rem;\n transition: top 0.2s;\n}\n\n.mobile-nav-skip-link:focus {\n top: 0.5rem;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA"}
|