constants/app_durations library
Sistema de duraciones para animaciones, transiciones y delays
Este módulo proporciona duraciones estandarizadas siguiendo las mejores prácticas de UX y Material Design Motion para garantizar animaciones fluidas, naturales y consistentes en toda la aplicación.
🆕 API Recomendada (Nueva)
// Duraciones base - para animaciones generales
AnimatedContainer(
duration: Consts.durations.base.md, // 300ms - Estándar
curve: Curves.easeInOut,
child: MyWidget(),
)
// Duraciones por feature - casos de uso específicos
Timer(Consts.durations.feat.searchDebounce, () => search());
Tooltip(waitDuration: Consts.durations.feat.tooltipDelay);
🔄 API Legacy (Compatible)
// Sigue funcionando para mantener compatibilidad
AnimatedContainer(duration: AppDurations.md);
Timer(AppDurations.searchDebounce, callback);
⏱️ Filosofía de Timing
Las duraciones están diseñadas según principios de motion design:
- Ultra rápidas (50-150ms): Feedback inmediato, no bloquean la UI
- Rápidas (200-400ms): Balance ideal velocidad/claridad ⭐
- Moderadas (500-800ms): Transiciones importantes, estados destacados
- Extendidas (1000-3000ms): Loading, notificaciones, efectos especiales
📏 Escala de Duraciones Base
| Nombre | Duración | Uso Principal |
|---|---|---|
xxs |
50ms | Hover sutiles, ripples instantáneos |
xs |
100ms | Cambios de estado, toggles |
sm |
150ms | Navegación, transiciones de página |
smd |
200ms | Fade, ripples, micro-interacciones ⭐ |
mds |
250ms | Expansión cards, slides suaves |
md |
300ms | Animaciones estándar ⭐⭐⭐ |
mdl |
350ms | Transformaciones complejas |
lg |
400ms | Hero animations, layouts importantes |
xl |
500ms | Onboarding, efectos especiales |
xxl |
600ms | Animaciones de celebración |
xxxl |
800ms | Secuencias complejas |
huge |
1000ms | Progress indicators, loading cycles |
massive |
1500ms | Shimmer effects, skeleton screens |
giant |
2000ms | Snackbars, toasts, notificaciones |
mega |
3000ms | Mensajes importantes con acciones |
🎯 Duraciones por Feature
| Nombre | Duración | Descripción |
|---|---|---|
searchDebounce |
300ms | Debounce de búsqueda |
filterDebounce |
400ms | Debounce de filtros |
quickDebounce |
200ms | Validación en tiempo real |
tooltipDelay |
500ms | Delay antes de mostrar tooltip |
snackbarDuration |
2000ms | Tiempo visible del snackbar |
pageTransition |
150ms | Transición entre páginas |
hoverEffect |
100ms | Hover en botones/cards |
rippleEffect |
200ms | Material ripple |
shimmerAnimation |
1500ms | Skeleton loading |
apiSimulatedDelay |
1500ms | Mock API delay |
💡 Guía de Selección Rápida
Por tipo de animación:
// Micro-interacciones → xxs a smd (50-200ms)
MouseRegion(onEnter: ..., duration: Consts.durations.base.xs);
// UI transitions → smd a md (200-300ms) ⭐
AnimatedContainer(duration: Consts.durations.base.md);
// Transiciones importantes → lg a xl (400-500ms)
Hero(transitionDuration: Consts.durations.base.lg);
// Estados de carga → huge a massive (1000-1500ms)
shimmer.repeat(period: Consts.durations.base.massive);
Por complejidad:
- 1 propiedad →
smd(200ms) - 2-3 propiedades →
md(300ms) ⭐ - 4+ propiedades →
lg(400ms)
Por distancia visual:
- Pequeña (< 20px) →
smdamd(200-300ms) - Mediana (20-100px) →
mdalg(300-400ms) - Grande (> 100px) →
lgaxl(400-500ms)
🎬 Combinación con Curves
// Entrada (aparece)
AnimatedContainer(
duration: Consts.durations.base.md,
curve: Curves.easeOut, // Desacelera al final
)
// Salida (desaparece)
AnimatedContainer(
duration: Consts.durations.base.smd, // Más rápido
curve: Curves.easeIn, // Acelera al final
)
// Bidireccional
AnimatedContainer(
duration: Consts.durations.base.md,
curve: Curves.easeInOut, // Suave en ambos extremos
)
// Con bounce
AnimatedContainer(
duration: Consts.durations.base.lg, // Más largo
curve: Curves.elasticOut,
)
♿ Accesibilidad
Duration getAnimationDuration(BuildContext context) {
final reduceMotion = MediaQuery.of(context).disableAnimations;
return reduceMotion ? Duration.zero : Consts.durations.base.md;
}
❌ Anti-patrones
// ❌ Duraciones arbitrarias
AnimatedContainer(duration: Duration(milliseconds: 273));
// ✅ Usa duraciones predefinidas
AnimatedContainer(duration: Consts.durations.base.md);
// ❌ Animaciones muy lentas en UI frecuente
AnimatedOpacity(duration: Duration(seconds: 2));
// ✅ Duraciones apropiadas al contexto
AnimatedOpacity(duration: Consts.durations.base.smd);
📚 Referencias
Classes
- AppDurations
- API Legacy - Clase de compatibilidad
- AppDurationsSystem
- Sistema de duraciones con acceso organizado
- BaseDurations
- Duraciones base del sistema de diseño
- FeatDurations
- Duraciones específicas por caso de uso (features)