diff --git a/app/app.css b/app/app.css index bd0014d..97b4e54 100644 --- a/app/app.css +++ b/app/app.css @@ -123,3 +123,152 @@ @apply bg-background text-foreground; } } + +/* ── Animation keyframes ── */ + +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-in-up { + from { opacity: 0; transform: translateY(16px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes fade-in-down { + from { opacity: 0; transform: translateY(-12px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes slide-in-left { + from { opacity: 0; transform: translateX(-20px); } + to { opacity: 1; transform: translateX(0); } +} + +@keyframes scale-in { + from { opacity: 0; transform: scale(0.95); } + to { opacity: 1; transform: scale(1); } +} + +@keyframes scale-bounce { + 0% { opacity: 0; transform: scale(0.5); } + 60% { opacity: 1; transform: scale(1.08); } + 100% { opacity: 1; transform: scale(1); } +} + +@keyframes float-in { + 0% { opacity: 0; transform: translateY(24px) scale(0.97); } + 100% { opacity: 1; transform: translateY(0) scale(1); } +} + +@keyframes shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +@keyframes pulse-soft { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.7; } +} + +/* ── Utility classes ── */ + +.animate-fade-in { + animation: fade-in 0.5s ease-out both; +} + +.animate-fade-in-up { + animation: fade-in-up 0.5s ease-out both; +} + +.animate-fade-in-down { + animation: fade-in-down 0.4s ease-out both; +} + +.animate-slide-in-left { + animation: slide-in-left 0.5s ease-out both; +} + +.animate-scale-in { + animation: scale-in 0.4s ease-out both; +} + +.animate-scale-bounce { + animation: scale-bounce 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) both; +} + +.animate-float-in { + animation: float-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +.animate-shimmer { + background: linear-gradient(90deg, transparent 25%, var(--primary) 50%, transparent 75%); + background-size: 200% 100%; + animation: shimmer 2s infinite; +} + +.animate-pulse-soft { + animation: pulse-soft 2s ease-in-out infinite; +} + +/* Stagger delays for children */ +.stagger-1 { animation-delay: 0.05s; } +.stagger-2 { animation-delay: 0.1s; } +.stagger-3 { animation-delay: 0.15s; } +.stagger-4 { animation-delay: 0.2s; } +.stagger-5 { animation-delay: 0.25s; } +.stagger-6 { animation-delay: 0.3s; } +.stagger-7 { animation-delay: 0.35s; } +.stagger-8 { animation-delay: 0.4s; } + +/* Button press effect */ +.btn-press { + transition: transform 0.15s ease, box-shadow 0.15s ease; +} +.btn-press:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} +.btn-press:active { + transform: translateY(0.5px); + box-shadow: none; +} + +/* Card hover lift */ +.card-hover { + transition: transform 0.25s ease, box-shadow 0.25s ease; +} +.card-hover:hover { + transform: translateY(-4px); + box-shadow: 0 12px 24px -8px rgba(0, 0, 0, 0.12); +} + +/* Smooth loading skeleton */ +.skeleton { + background: linear-gradient(90deg, var(--muted) 25%, var(--accent) 50%, var(--muted) 75%); + background-size: 200% 100%; + animation: shimmer 1.5s ease-in-out infinite; + border-radius: 0.5rem; +} + +/* Reduced motion preference */ +@media (prefers-reduced-motion: reduce) { + .animate-fade-in, + .animate-fade-in-up, + .animate-fade-in-down, + .animate-slide-in-left, + .animate-scale-in, + .animate-scale-bounce, + .animate-float-in { + animation: none !important; + opacity: 1 !important; + transform: none !important; + } + .card-hover:hover { + transform: none; + } + .btn-press:hover { + transform: none; + } +} diff --git a/app/routes/create-form.tsx b/app/routes/create-form.tsx index 171f771..78c1118 100644 --- a/app/routes/create-form.tsx +++ b/app/routes/create-form.tsx @@ -87,7 +87,7 @@ export default function CreateFormPage() { Back to forms -