/* HarborSmith - Animation Styles */ /* ========================= */ /* Fade Animations */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInLeft { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } } @keyframes fadeInRight { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } } /* Scale Animations */ @keyframes scaleIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } /* Rotate Animations */ @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Slide Animations */ @keyframes slideInLeft { from { transform: translateX(-100%); } to { transform: translateX(0); } } @keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } } @keyframes slideInUp { from { transform: translateY(100%); } to { transform: translateY(0); } } @keyframes slideInDown { from { transform: translateY(-100%); } to { transform: translateY(0); } } /* Special Effects */ @keyframes shimmer { 0% { background-position: -1000px 0; } 100% { background-position: 1000px 0; } } @keyframes ripple { 0% { transform: scale(0); opacity: 1; } 100% { transform: scale(4); opacity: 0; } } @keyframes wave { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-25px); } 75% { transform: translateX(25px); } } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } @keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-30px); } 60% { transform: translateY(-15px); } } /* Loading Animation */ @keyframes loading { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loading-spinner { width: 40px; height: 40px; border: 3px solid var(--border); border-top-color: var(--primary); border-radius: 50%; animation: loading 1s linear infinite; } /* Utility Classes */ .animate-fade-in { animation: fadeIn 0.5s ease-out; } .animate-fade-up { animation: fadeInUp 0.6s ease-out; } .animate-fade-up-delay { animation: fadeInUp 0.6s ease-out 0.2s both; } .animate-fade-up-delay-2 { animation: fadeInUp 0.6s ease-out 0.4s both; } .animate-scale-in { animation: scaleIn 0.5s ease-out; } .animate-pulse { animation: pulse 2s ease-in-out infinite; } .animate-float { animation: float 3s ease-in-out infinite; } .animate-bounce { animation: bounce 2s ease-in-out infinite; } /* Scroll Animations */ .scroll-animate { opacity: 0; transform: translateY(30px); transition: all 0.6s ease-out; } .scroll-animate.visible { opacity: 1; transform: translateY(0); } .scroll-animate-left { opacity: 0; transform: translateX(-30px); transition: all 0.6s ease-out; } .scroll-animate-left.visible { opacity: 1; transform: translateX(0); } .scroll-animate-right { opacity: 0; transform: translateX(30px); transition: all 0.6s ease-out; } .scroll-animate-right.visible { opacity: 1; transform: translateX(0); } .scroll-animate-scale { opacity: 0; transform: scale(0.9); transition: all 0.6s ease-out; } .scroll-animate-scale.visible { opacity: 1; transform: scale(1); } /* Parallax Effects */ .parallax { transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); } .parallax-slow { transition: transform 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94); } .parallax-fast { transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); } /* Hover Effects */ .hover-lift { transition: transform 0.3s ease; } .hover-lift:hover { transform: translateY(-5px); } .hover-grow { transition: transform 0.3s ease; } .hover-grow:hover { transform: scale(1.05); } .hover-shrink { transition: transform 0.3s ease; } .hover-shrink:hover { transform: scale(0.95); } .hover-rotate { transition: transform 0.3s ease; } .hover-rotate:hover { transform: rotate(5deg); } /* Text Effects */ .text-gradient-animate { background: linear-gradient( 90deg, var(--primary) 0%, var(--accent) 25%, var(--primary) 50%, var(--accent) 75%, var(--primary) 100% ); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: shimmer 3s linear infinite; } /* Page Transitions */ .page-transition-fade { animation: fadeIn 0.5s ease-out; } .page-transition-slide-up { animation: slideInUp 0.5s ease-out; } .page-transition-slide-left { animation: slideInLeft 0.5s ease-out; } /* Stagger Animations */ .stagger-animate > * { opacity: 0; transform: translateY(20px); animation: fadeInUp 0.5s ease-out forwards; } .stagger-animate > *:nth-child(1) { animation-delay: 0.1s; } .stagger-animate > *:nth-child(2) { animation-delay: 0.2s; } .stagger-animate > *:nth-child(3) { animation-delay: 0.3s; } .stagger-animate > *:nth-child(4) { animation-delay: 0.4s; } .stagger-animate > *:nth-child(5) { animation-delay: 0.5s; } .stagger-animate > *:nth-child(6) { animation-delay: 0.6s; } /* Skeleton Loading */ .skeleton { background: linear-gradient( 90deg, var(--surface) 25%, var(--border) 50%, var(--surface) 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; } /* Progress Bar Animation */ .progress-bar-fill { animation: fillProgress 2s ease-out forwards; } @keyframes fillProgress { from { width: 0%; } to { width: var(--progress, 100%); } } /* Counter Animation */ .counter-animate { animation: countUp 2s ease-out; } @keyframes countUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* Water Wave Effect */ @keyframes waterWave { 0% { transform: translateX(0) translateZ(0) scaleY(1); } 50% { transform: translateX(-25%) translateZ(0) scaleY(0.8); } 100% { transform: translateX(-50%) translateZ(0) scaleY(1); } } .water-wave { background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 120' preserveAspectRatio='none'%3E%3Cpath d='M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V0H0V27.35A600.21,600.21,0,0,0,321.39,56.44Z' fill='%23ffffff' fill-opacity='0.3'%3E%3C/path%3E%3C/svg%3E"); background-size: 200% 100%; animation: waterWave 10s linear infinite; }