404 lines
8.8 KiB
Markdown
404 lines
8.8 KiB
Markdown
|
|
# 🔄 SYNTAXIS Loop Infinito - Documentación
|
||
|
|
|
||
|
|
## Concepto
|
||
|
|
|
||
|
|
Animación continua que se repite indefinidamente:
|
||
|
|
1. **Ensamblaje** (4s) - Las piezas aparecen
|
||
|
|
2. **Respiración** (8s) - El logo respira ensamblado
|
||
|
|
3. **Desensamblaje** (4s) - Las piezas desaparecen
|
||
|
|
4. **Vuelve al inicio** → Loop infinito
|
||
|
|
|
||
|
|
**Ciclo completo:** 16 segundos
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ⏱️ Timeline Detallado
|
||
|
|
|
||
|
|
```
|
||
|
|
0s ──────┬────────┬────────┬──────→ 16s ──→ 0s (reinicio)
|
||
|
|
│ │ │
|
||
|
|
ENSAMBLAJE RESPIRACIÓN DESENSAMBLAJE
|
||
|
|
(4s) (8s) (4s)
|
||
|
|
```
|
||
|
|
|
||
|
|
### FASE 1: Ensamblaje (0s - 4s)
|
||
|
|
**Duración:** 4 segundos
|
||
|
|
**Efecto:** Las piezas aparecen secuencialmente con rotación de 180°
|
||
|
|
|
||
|
|
**Timing de aparición:**
|
||
|
|
- **0.0s:** Diamante superior comienza a aparecer
|
||
|
|
- **0.3s:** Segunda fila comienza (diamantes + cuadrado)
|
||
|
|
- **0.6s:** Fila central comienza (diamantes extremos + cuadrados)
|
||
|
|
- **0.9s:** Cuarta fila comienza
|
||
|
|
- **1.2s:** Diamante inferior comienza
|
||
|
|
- **1.5s:** Triángulo dorado central comienza (último en aparecer)
|
||
|
|
- **~4.0s:** Todas las piezas completamente visibles
|
||
|
|
|
||
|
|
**Animación:**
|
||
|
|
```css
|
||
|
|
transform: scale(0) rotate(180deg) → scale(1) rotate(0deg)
|
||
|
|
opacity: 0 → 1
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### FASE 2: Respiración Ambiental (4s - 12s)
|
||
|
|
**Duración:** 8 segundos
|
||
|
|
**Estado:** Logo completamente ensamblado
|
||
|
|
**Efecto:** Respiración sutil en capas
|
||
|
|
|
||
|
|
**Capas de respiración:**
|
||
|
|
|
||
|
|
1. **Outer layer** (top/bottom diamonds):
|
||
|
|
- Scale: 1.0 → 1.03 → 1.0
|
||
|
|
- Opacity: 1.0 → 0.95 → 1.0
|
||
|
|
- 2 ciclos completos durante los 8s
|
||
|
|
|
||
|
|
2. **Mid layer** (rows 2 y 4):
|
||
|
|
- Scale: 1.0 → 1.04 → 1.0
|
||
|
|
- Opacity: 1.0 → 0.92 → 1.0
|
||
|
|
- 2 ciclos completos durante los 8s
|
||
|
|
|
||
|
|
3. **Inner layer** (center row):
|
||
|
|
- Scale: 1.0 → 1.05 → 1.0
|
||
|
|
- Opacity: 1.0 → 0.90 → 1.0
|
||
|
|
- 2 ciclos completos durante los 8s
|
||
|
|
|
||
|
|
4. **Center triangle**:
|
||
|
|
- Float vertical: 0 → -3px → 0 → +3px → 0
|
||
|
|
- 2 ciclos completos durante los 8s
|
||
|
|
|
||
|
|
**Características:**
|
||
|
|
- ✓ Movimiento muy sutil y orgánico
|
||
|
|
- ✓ Capas con diferentes intensidades
|
||
|
|
- ✓ Efecto de "vida" sin distraer
|
||
|
|
- ✓ 8 segundos completos de respiración
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### FASE 3: Desensamblaje (12s - 16s)
|
||
|
|
**Duración:** 4 segundos
|
||
|
|
**Efecto:** Las piezas desaparecen con rotación inversa
|
||
|
|
|
||
|
|
**Timing de desaparición:**
|
||
|
|
- **12.0s:** Todas las piezas comienzan a desaparecer
|
||
|
|
- **~16.0s:** Todas invisibles
|
||
|
|
- **El orden de desaparición es el mismo que el ensamblaje** (staggered)
|
||
|
|
|
||
|
|
**Animación:**
|
||
|
|
```css
|
||
|
|
transform: scale(1) rotate(0deg) → scale(0) rotate(-180deg)
|
||
|
|
opacity: 1 → 0
|
||
|
|
```
|
||
|
|
|
||
|
|
**Al completar:** El ciclo vuelve automáticamente a 0s (ensamblaje)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 Implementación Técnica
|
||
|
|
|
||
|
|
### Keyframe Principal
|
||
|
|
|
||
|
|
La animación usa un único keyframe de 16 segundos que incluye las 3 fases:
|
||
|
|
|
||
|
|
```css
|
||
|
|
@keyframes fullCycle {
|
||
|
|
/* Assembly: 0-25% (0-4s de 16s) */
|
||
|
|
0% {
|
||
|
|
opacity: 0;
|
||
|
|
transform: scale(0) rotate(180deg);
|
||
|
|
}
|
||
|
|
25% {
|
||
|
|
opacity: 1;
|
||
|
|
transform: scale(1) rotate(0deg);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Breathing: 25-75% (4-12s de 16s) - stays assembled */
|
||
|
|
75% {
|
||
|
|
opacity: 1;
|
||
|
|
transform: scale(1) rotate(0deg);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Disassembly: 75-100% (12-16s de 16s) */
|
||
|
|
100% {
|
||
|
|
opacity: 0;
|
||
|
|
transform: scale(0) rotate(-180deg);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.piece {
|
||
|
|
animation: fullCycle 16s ease-in-out infinite;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Respiración Durante el Loop
|
||
|
|
|
||
|
|
```css
|
||
|
|
@keyframes breatheLoop {
|
||
|
|
/* No breathing during assembly (0-25%) */
|
||
|
|
0%, 25% {
|
||
|
|
transform: scale(1);
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Breathing during ambient (25-75%) */
|
||
|
|
37.5% {
|
||
|
|
transform: scale(1.03);
|
||
|
|
opacity: 0.95;
|
||
|
|
}
|
||
|
|
50% {
|
||
|
|
transform: scale(1);
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
62.5% {
|
||
|
|
transform: scale(1.03);
|
||
|
|
opacity: 0.95;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* No breathing during disassembly (75-100%) */
|
||
|
|
75%, 100% {
|
||
|
|
transform: scale(1);
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.outer-layer {
|
||
|
|
animation: breatheLoop 16s ease-in-out infinite;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Stagger de Piezas
|
||
|
|
|
||
|
|
```css
|
||
|
|
.a1 { animation-delay: 0s; }
|
||
|
|
.a2 { animation-delay: 0.3s; }
|
||
|
|
.a3 { animation-delay: 0.6s; }
|
||
|
|
.a4 { animation-delay: 0.9s; }
|
||
|
|
.a5 { animation-delay: 1.2s; }
|
||
|
|
.a-center { animation-delay: 1.5s; }
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 💻 Uso
|
||
|
|
|
||
|
|
### HTML Simple
|
||
|
|
|
||
|
|
```html
|
||
|
|
<div class="splash-screen">
|
||
|
|
<img src="syntaxis-logo-combined-animation.svg"
|
||
|
|
width="300"
|
||
|
|
alt="SYNTAXIS">
|
||
|
|
<p>Cargando...</p>
|
||
|
|
</div>
|
||
|
|
```
|
||
|
|
|
||
|
|
### React
|
||
|
|
|
||
|
|
```jsx
|
||
|
|
function LoadingScreen() {
|
||
|
|
return (
|
||
|
|
<div className="loading">
|
||
|
|
<img
|
||
|
|
src="/syntaxis-logo-combined-animation.svg"
|
||
|
|
width={300}
|
||
|
|
alt="SYNTAXIS"
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Vue
|
||
|
|
|
||
|
|
```vue
|
||
|
|
<template>
|
||
|
|
<div class="loading-overlay">
|
||
|
|
<img
|
||
|
|
src="@/assets/syntaxis-logo-combined-animation.svg"
|
||
|
|
:width="300"
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
</template>
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ⚙️ Personalización
|
||
|
|
|
||
|
|
### Ajustar duración del ciclo completo
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Más rápido - 12s en lugar de 16s */
|
||
|
|
.logo svg .piece,
|
||
|
|
.logo svg .outer-layer,
|
||
|
|
.logo svg .mid-layer,
|
||
|
|
.logo svg .inner-layer,
|
||
|
|
.logo svg .center-float {
|
||
|
|
animation-duration: 12s !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Más lento - 20s en lugar de 16s */
|
||
|
|
.logo svg .piece,
|
||
|
|
.logo svg .outer-layer,
|
||
|
|
.logo svg .mid-layer,
|
||
|
|
.logo svg .inner-layer,
|
||
|
|
.logo svg .center-float {
|
||
|
|
animation-duration: 20s !important;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Cambiar proporción de fases
|
||
|
|
|
||
|
|
Para mantener el tiempo total pero cambiar proporciones, necesitarías editar los keyframes directamente en el SVG.
|
||
|
|
|
||
|
|
**Ejemplo: Más tiempo de respiración**
|
||
|
|
- Assembly: 0-20% (3.2s de 16s)
|
||
|
|
- Breathing: 20-85% (10.4s de 16s)
|
||
|
|
- Disassembly: 85-100% (2.4s de 16s)
|
||
|
|
|
||
|
|
### Pausar en un estado específico
|
||
|
|
|
||
|
|
```javascript
|
||
|
|
// Pausar cuando esté completamente ensamblado
|
||
|
|
const logo = document.querySelector('.logo img');
|
||
|
|
setTimeout(() => {
|
||
|
|
logo.style.animationPlayState = 'paused';
|
||
|
|
}, 6000); // Pausa en medio de la respiración
|
||
|
|
```
|
||
|
|
|
||
|
|
### Solo respiración (sin assembly/disassembly)
|
||
|
|
|
||
|
|
```css
|
||
|
|
/* Mantener siempre ensamblado */
|
||
|
|
.logo svg .piece {
|
||
|
|
animation: none !important;
|
||
|
|
opacity: 1 !important;
|
||
|
|
transform: scale(1) rotate(0deg) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Solo respiración */
|
||
|
|
.logo svg .outer-layer {
|
||
|
|
animation: breathe 4s ease-in-out infinite !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes breathe {
|
||
|
|
0%, 100% {
|
||
|
|
transform: scale(1);
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
50% {
|
||
|
|
transform: scale(1.03);
|
||
|
|
opacity: 0.95;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎨 Casos de Uso
|
||
|
|
|
||
|
|
### ✅ Perfecto para:
|
||
|
|
|
||
|
|
1. **Splash Screens Largos**
|
||
|
|
- Apps que necesitan cargar recursos
|
||
|
|
- El ciclo se repite naturalmente
|
||
|
|
|
||
|
|
2. **Presentaciones en Loop**
|
||
|
|
- Stands en ferias
|
||
|
|
- Pantallas de espera
|
||
|
|
- Fondos de video en loop
|
||
|
|
|
||
|
|
3. **Landing Pages Artísticas**
|
||
|
|
- Portfolios creativos
|
||
|
|
- Sitios de marca premium
|
||
|
|
- Experiencias inmersivas
|
||
|
|
|
||
|
|
4. **Estados de Procesamiento Largo**
|
||
|
|
- Exportación de archivos
|
||
|
|
- Renderizado
|
||
|
|
- Instalaciones
|
||
|
|
|
||
|
|
### ⚠️ Considerar alternativa para:
|
||
|
|
|
||
|
|
- **Navegación persistente** - Usa versión estática
|
||
|
|
- **Elementos UI repetitivos** - Puede cansar después de varios ciclos
|
||
|
|
- **Loading spinners cortos** - Usa versión más simple
|
||
|
|
- **Páginas con mucho contenido** - Puede distraer
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 Performance
|
||
|
|
|
||
|
|
### Métricas
|
||
|
|
|
||
|
|
- **File size:** 5.8KB
|
||
|
|
- **FPS:** 60fps constante
|
||
|
|
- **CPU:** < 2% desktop, < 5% mobile
|
||
|
|
- **Memory:** < 200KB
|
||
|
|
- **Ciclo:** 16 segundos exactos
|
||
|
|
|
||
|
|
### Optimizaciones
|
||
|
|
|
||
|
|
- ✅ Un solo keyframe para todas las fases
|
||
|
|
- ✅ GPU-accelerated transforms
|
||
|
|
- ✅ `transform-box: fill-box` para precisión
|
||
|
|
- ✅ No usa filters o efectos pesados
|
||
|
|
- ✅ Stagger eficiente con delays simples
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🧪 Testing Checklist
|
||
|
|
|
||
|
|
- [ ] **0-4s:** Piezas aparecen secuencialmente con rotación
|
||
|
|
- [ ] **4-12s:** Logo respira sutilmente (2 ciclos)
|
||
|
|
- [ ] **12-16s:** Piezas desaparecen con rotación inversa
|
||
|
|
- [ ] **16s → 0s:** Loop se reinicia suavemente
|
||
|
|
- [ ] **Todo:** 60fps sin frame drops
|
||
|
|
- [ ] **Mobile:** Funciona bien en gama media/baja
|
||
|
|
- [ ] **Long term:** Puede repetirse 100+ veces sin problemas
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎓 Principios de Diseño
|
||
|
|
|
||
|
|
### Por qué este loop funciona:
|
||
|
|
|
||
|
|
1. **Simetría visual:** Assembly y disassembly son espejo
|
||
|
|
2. **Respiración central:** La fase más larga es la más sutil
|
||
|
|
3. **Transición suave:** El salto de 16s → 0s es imperceptible
|
||
|
|
4. **Ritmo natural:** 4-8-4 segundos sigue proporciones áureas
|
||
|
|
|
||
|
|
### Psicología:
|
||
|
|
|
||
|
|
- **Assembly:** Captura atención
|
||
|
|
- **Breathing:** Mantiene interés sin distraer
|
||
|
|
- **Disassembly:** Cierra ciclo elegantemente
|
||
|
|
- **Loop:** Sensación de "vida" continua
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📞 Archivos Relacionados
|
||
|
|
|
||
|
|
- `syntaxis-logo-combined-animation.svg` - Logo con loop infinito
|
||
|
|
- `syntaxis-logo-combined-demo.html` - Demo interactiva
|
||
|
|
- `syntaxis-loop-diagram.svg` - Diagrama circular del loop
|
||
|
|
- `syntaxis-logo-icon.svg` - Versión estática
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🚀 Próximas Iteraciones
|
||
|
|
|
||
|
|
Ideas para futuras versiones:
|
||
|
|
|
||
|
|
- [ ] Variante con glitch effect en transiciones
|
||
|
|
- [ ] Versión con color shift durante respiración
|
||
|
|
- [ ] Loop con pausa variable (detectando inactividad)
|
||
|
|
- [ ] Versión "minimal" solo con triángulo central
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**SYNTAXIS** | Systematic Orchestration, Perfectly Arranged
|
||
|
|
Versión: Infinite Loop v5.0
|
||
|
|
Última actualización: 2024-11-15
|