yatri-ai / static /css /aurora.css
siddharthnavnath7's picture
UI/UX
90b7b85
Raw
History Blame Contribute Delete
38.7 kB
/* ═══════════════════════════════════════════════════════════════
AURORA β€” Advanced Animation System for Yatri AI
High-performance, GPU-accelerated animations
═══════════════════════════════════════════════════════════════ */
/* ─── ANIMATION TOKENS ─── */
:root {
--spring-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
--spring-smooth: cubic-bezier(0.16, 1, 0.3, 1);
--spring-snap: cubic-bezier(0.68, -0.6, 0.32, 1.6);
--ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
--ease-out-quint: cubic-bezier(0.22, 1, 0.36, 1);
--ease-in-out-circ: cubic-bezier(0.85, 0, 0.15, 1);
--ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55);
--dur-fast: 0.2s;
--dur-normal: 0.4s;
--dur-slow: 0.6s;
--dur-slower: 0.8s;
--dur-slowest: 1.2s;
--stagger-base: 60ms;
}
/* ─── GPU HINTS ─── */
.aurora-gpu {
will-change: transform, opacity;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
transform: translateZ(0);
}
/* ═══════════════════════════════════════════════════════════════
SCROLL-TRIGGERED REVEAL ANIMATIONS
Elements start invisible, animate in when scrolled into view
═══════════════════════════════════════════════════════════════ */
/* Base: elements waiting to be revealed */
[data-reveal] {
opacity: 0;
will-change: transform, opacity;
transition: none;
}
[data-reveal].revealed {
animation-fill-mode: forwards;
animation-timing-function: var(--spring-smooth);
}
/* Reveal: fade up */
[data-reveal="up"].revealed {
animation: auroraRevealUp var(--dur-slow) var(--spring-smooth) forwards;
}
@keyframes auroraRevealUp {
from { opacity: 0; transform: translateY(60px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
/* Reveal: fade down */
[data-reveal="down"].revealed {
animation: auroraRevealDown var(--dur-slow) var(--spring-smooth) forwards;
}
@keyframes auroraRevealDown {
from { opacity: 0; transform: translateY(-40px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
/* Reveal: slide left */
[data-reveal="left"].revealed {
animation: auroraRevealLeft var(--dur-slow) var(--spring-smooth) forwards;
}
@keyframes auroraRevealLeft {
from { opacity: 0; transform: translateX(-60px) rotate(-2deg); }
to { opacity: 1; transform: translateX(0) rotate(0deg); }
}
/* Reveal: slide right */
[data-reveal="right"].revealed {
animation: auroraRevealRight var(--dur-slow) var(--spring-smooth) forwards;
}
@keyframes auroraRevealRight {
from { opacity: 0; transform: translateX(60px) rotate(2deg); }
to { opacity: 1; transform: translateX(0) rotate(0deg); }
}
/* Reveal: scale up (zoom in) */
[data-reveal="scale"].revealed {
animation: auroraRevealScale var(--dur-slow) var(--spring-bounce) forwards;
}
@keyframes auroraRevealScale {
from { opacity: 0; transform: scale(0.7); }
to { opacity: 1; transform: scale(1); }
}
/* Reveal: flip in */
[data-reveal="flip"].revealed {
animation: auroraRevealFlip var(--dur-slower) var(--spring-smooth) forwards;
perspective: 800px;
}
@keyframes auroraRevealFlip {
from { opacity: 0; transform: perspective(800px) rotateY(-30deg) translateX(-30px); }
to { opacity: 1; transform: perspective(800px) rotateY(0deg) translateX(0); }
}
/* Reveal: rotate in */
[data-reveal="rotate"].revealed {
animation: auroraRevealRotate var(--dur-slower) var(--spring-bounce) forwards;
}
@keyframes auroraRevealRotate {
from { opacity: 0; transform: rotate(-12deg) scale(0.8); }
60% { opacity: 1; transform: rotate(3deg) scale(1.02); }
to { opacity: 1; transform: rotate(0deg) scale(1); }
}
/* Reveal: blur in */
[data-reveal="blur"].revealed {
animation: auroraRevealBlur var(--dur-slower) var(--ease-out-expo) forwards;
}
@keyframes auroraRevealBlur {
from { opacity: 0; filter: blur(12px); transform: scale(1.1); }
to { opacity: 1; filter: blur(0px); transform: scale(1); }
}
/* Reveal: spring bounce */
[data-reveal="spring"].revealed {
animation: auroraRevealSpring var(--dur-slowest) var(--spring-bounce) forwards;
}
@keyframes auroraRevealSpring {
0% { opacity: 0; transform: translateY(80px) scale(0.9); }
40% { opacity: 1; transform: translateY(-10px) scale(1.02); }
70% { transform: translateY(4px) scale(0.99); }
100% { opacity: 1; transform: translateY(0) scale(1); }
}
/* Stagger delays (applied via data-reveal-delay or auto-stagger) */
[data-reveal-delay="1"], [data-reveal-stagger] > *:nth-child(1) { animation-delay: calc(var(--stagger-base) * 1) !important; }
[data-reveal-delay="2"], [data-reveal-stagger] > *:nth-child(2) { animation-delay: calc(var(--stagger-base) * 2) !important; }
[data-reveal-delay="3"], [data-reveal-stagger] > *:nth-child(3) { animation-delay: calc(var(--stagger-base) * 3) !important; }
[data-reveal-delay="4"], [data-reveal-stagger] > *:nth-child(4) { animation-delay: calc(var(--stagger-base) * 4) !important; }
[data-reveal-delay="5"], [data-reveal-stagger] > *:nth-child(5) { animation-delay: calc(var(--stagger-base) * 5) !important; }
[data-reveal-delay="6"], [data-reveal-stagger] > *:nth-child(6) { animation-delay: calc(var(--stagger-base) * 6) !important; }
[data-reveal-delay="7"], [data-reveal-stagger] > *:nth-child(7) { animation-delay: calc(var(--stagger-base) * 7) !important; }
[data-reveal-delay="8"], [data-reveal-stagger] > *:nth-child(8) { animation-delay: calc(var(--stagger-base) * 8) !important; }
[data-reveal-delay="9"], [data-reveal-stagger] > *:nth-child(9) { animation-delay: calc(var(--stagger-base) * 9) !important; }
[data-reveal-delay="10"], [data-reveal-stagger] > *:nth-child(10) { animation-delay: calc(var(--stagger-base) * 10) !important; }
[data-reveal-delay="11"], [data-reveal-stagger] > *:nth-child(11) { animation-delay: calc(var(--stagger-base) * 11) !important; }
[data-reveal-delay="12"], [data-reveal-stagger] > *:nth-child(12) { animation-delay: calc(var(--stagger-base) * 12) !important; }
/* ═══════════════════════════════════════════════════════════════
PAGE TRANSITIONS
Smooth morphing between SPA pages
═══════════════════════════════════════════════════════════════ */
.page {
transition: none;
}
.page.page-entering {
animation: pageEnter 0.5s var(--ease-out-expo) forwards;
}
.page.page-leaving {
animation: pageLeave 0.3s var(--ease-in-out-circ) forwards;
pointer-events: none;
}
@keyframes pageEnter {
from { opacity: 0; transform: translateY(16px) scale(0.99); filter: blur(4px); }
to { opacity: 1; transform: translateY(0) scale(1); filter: blur(0px); }
}
@keyframes pageLeave {
from { opacity: 1; transform: translateY(0) scale(1); }
to { opacity: 0; transform: translateY(-8px) scale(0.99); }
}
/* Page-specific enter animations */
#page-home.page-entering .hero { animation: heroEnter 0.8s var(--ease-out-expo) forwards; }
@keyframes heroEnter {
from { opacity: 0; transform: scale(1.03); }
to { opacity: 1; transform: scale(1); }
}
#page-assistant.page-entering .chat-page { animation: chatEnter 0.4s var(--ease-out-expo) forwards; }
@keyframes chatEnter {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: translateX(0); }
}
#page-explore.page-entering .explore-header { animation: exploreHeaderEnter 0.5s var(--ease-out-expo) forwards; }
@keyframes exploreHeaderEnter {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: translateY(0); }
}
/* ═══════════════════════════════════════════════════════════════
3D CARD TILT EFFECT
Cards respond to mouse movement with perspective
═══════════════════════════════════════════════════════════════ */
[data-tilt] {
transform-style: preserve-3d;
perspective: 1000px;
transition: transform 0.1s linear;
}
[data-tilt] .tilt-shine {
position: absolute;
inset: 0;
border-radius: inherit;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.25) 0%,
rgba(255, 255, 255, 0) 60%
);
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
z-index: 2;
}
[data-tilt]:hover .tilt-shine {
opacity: 1;
}
/* ═══════════════════════════════════════════════════════════════
MAGNETIC BUTTON EFFECT
Buttons subtly attract toward cursor on hover
═══════════════════════════════════════════════════════════════ */
[data-magnetic] {
transition: transform 0.3s var(--spring-smooth);
}
/* ═══════════════════════════════════════════════════════════════
RIPPLE EFFECT
Material-style ripple on click for all interactive elements
═══════════════════════════════════════════════════════════════ */
.ripple-container {
position: relative;
overflow: hidden;
}
.ripple-wave {
position: absolute;
border-radius: 50%;
background: radial-gradient(circle, rgba(232, 101, 43, 0.3) 0%, rgba(232, 101, 43, 0) 70%);
transform: scale(0);
animation: rippleExpand 0.6s var(--ease-out-expo) forwards;
pointer-events: none;
z-index: 1;
}
.ripple-wave.ripple-light {
background: radial-gradient(circle, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0) 70%);
}
@keyframes rippleExpand {
0% { transform: scale(0); opacity: 1; }
100% { transform: scale(4); opacity: 0; }
}
/* ═══════════════════════════════════════════════════════════════
LIQUID GRADIENT BACKGROUND
Animated morphing gradient blobs
═══════════════════════════════════════════════════════════════ */
.liquid-bg {
position: absolute;
inset: 0;
overflow: hidden;
z-index: 0;
}
.liquid-blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
opacity: 0.5;
animation: blobFloat 12s ease-in-out infinite alternate;
will-change: transform;
}
.liquid-blob:nth-child(1) {
width: 500px; height: 500px;
background: radial-gradient(circle, rgba(232, 101, 43, 0.4), transparent 70%);
top: -20%; left: -10%;
animation-duration: 14s;
}
.liquid-blob:nth-child(2) {
width: 400px; height: 400px;
background: radial-gradient(circle, rgba(212, 160, 23, 0.35), transparent 70%);
top: 20%; right: -15%;
animation-duration: 11s;
animation-delay: -3s;
}
.liquid-blob:nth-child(3) {
width: 350px; height: 350px;
background: radial-gradient(circle, rgba(107, 15, 26, 0.25), transparent 70%);
bottom: -10%; left: 30%;
animation-duration: 16s;
animation-delay: -7s;
}
@keyframes blobFloat {
0% { transform: translate(0, 0) scale(1) rotate(0deg); }
33% { transform: translate(30px, -40px) scale(1.1) rotate(60deg); }
66% { transform: translate(-20px, 20px) scale(0.95) rotate(180deg); }
100% { transform: translate(15px, -25px) scale(1.05) rotate(360deg); }
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED HERO SECTION
═══════════════════════════════════════════════════════════════ */
/* Particle canvas overlay */
.hero-particles {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
}
/* Hero badge pulse */
.hero-badge {
animation: fadeIn 0.8s ease, badgePulse 3s ease-in-out 1s infinite;
}
@keyframes badgePulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.2); }
50% { box-shadow: 0 0 0 8px rgba(255, 255, 255, 0); }
}
/* Hero text character reveal */
.hero-char {
display: inline-block;
opacity: 0;
transform: translateY(30px) rotate(5deg);
animation: charReveal 0.5s var(--spring-smooth) forwards;
}
@keyframes charReveal {
to { opacity: 1; transform: translateY(0) rotate(0deg); }
}
/* Hero floating icons enhanced */
.hero-float {
transition: transform 0.5s ease;
animation: floatEnhanced 6s ease-in-out infinite !important;
}
@keyframes floatEnhanced {
0% { transform: translateY(0) rotate(0deg) scale(1); }
25% { transform: translateY(-12px) rotate(3deg) scale(1.05); }
50% { transform: translateY(-6px) rotate(-2deg) scale(0.98); }
75% { transform: translateY(-14px) rotate(1deg) scale(1.03); }
100% { transform: translateY(0) rotate(0deg) scale(1); }
}
/* Wave divider enhanced */
.wave-divider svg path {
animation: waveMorph 8s ease-in-out infinite;
}
@keyframes waveMorph {
0%, 100% { d: path("M0,60 C150,100 350,0 600,60 C850,120 1050,20 1200,60 L1200,120 L0,120 Z"); }
50% { d: path("M0,70 C200,30 400,100 600,50 C800,0 1000,90 1200,50 L1200,120 L0,120 Z"); }
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED ACTION CARDS
═══════════════════════════════════════════════════════════════ */
.action-card {
position: relative;
overflow: hidden;
transform-style: preserve-3d;
transition: transform 0.4s var(--spring-bounce), box-shadow 0.4s ease !important;
}
.action-card::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: conic-gradient(
from 0deg,
transparent 0deg,
rgba(232, 101, 43, 0.05) 60deg,
transparent 120deg
);
animation: cardShine 6s linear infinite;
opacity: 0;
transition: opacity 0.3s ease;
}
.action-card:hover::before {
opacity: 1;
}
@keyframes cardShine {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.action-icon {
transition: transform 0.4s var(--spring-bounce), box-shadow 0.3s ease;
}
.action-card:hover .action-icon {
transform: scale(1.15) rotate(-5deg);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}
.action-card:active {
transform: scale(0.93) !important;
transition-duration: 0.1s !important;
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED CHAT MESSAGES
═══════════════════════════════════════════════════════════════ */
.msg {
animation: none !important; /* Override inline animations β€” JS handles reveal */
opacity: 1;
}
.msg.msg-animate {
opacity: 0;
}
.msg.msg-animate.msg-user {
animation: msgEnterUser 0.45s var(--spring-smooth) forwards !important;
}
.msg.msg-animate.msg-bot {
animation: msgEnterBot 0.45s var(--spring-smooth) forwards !important;
}
@keyframes msgEnterUser {
from { opacity: 0; transform: translateX(30px) translateY(10px) scale(0.95); }
to { opacity: 1; transform: translateX(0) translateY(0) scale(1); }
}
@keyframes msgEnterBot {
from { opacity: 0; transform: translateX(-30px) translateY(10px) scale(0.95); }
to { opacity: 1; transform: translateX(0) translateY(0) scale(1); }
}
/* Typing indicator enhanced */
.typing-indicator {
animation: typingEnter 0.3s var(--spring-smooth) forwards;
}
@keyframes typingEnter {
from { opacity: 0; transform: translateY(10px) scale(0.9); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.typing-dots span {
animation: typingDotBounce 1.4s var(--spring-bounce) infinite !important;
}
@keyframes typingDotBounce {
0%, 60%, 100% { transform: translateY(0) scale(1); opacity: 0.4; }
30% { transform: translateY(-10px) scale(1.2); opacity: 1; }
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED PLACE CARDS
═══════════════════════════════════════════════════════════════ */
.place-card {
transition: transform 0.4s var(--spring-bounce), box-shadow 0.4s ease !important;
animation: none !important;
transform-style: preserve-3d;
}
.place-card:hover {
transform: translateY(-6px) !important;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08) !important;
}
.place-card .place-card-img {
transition: transform 0.8s var(--ease-out-expo) !important;
}
.place-card:hover .place-card-img {
transform: scale(1.08) !important;
}
/* Place detail expand animation */
.place-detail.open {
animation: detailExpand 0.4s var(--spring-smooth) forwards !important;
}
@keyframes detailExpand {
from { opacity: 0; max-height: 0; transform: translateY(-10px); }
to { opacity: 1; max-height: 600px; transform: translateY(0); }
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED SOS CARDS
═══════════════════════════════════════════════════════════════ */
.sos-card {
transition: transform 0.3s var(--spring-bounce), box-shadow 0.3s ease, border-color 0.3s ease !important;
}
.sos-card:hover {
transform: translateY(-4px) scale(1.02) !important;
box-shadow: 0 12px 32px rgba(220, 38, 38, 0.15) !important;
}
.sos-card:hover .sos-icon {
animation: sosIconPulse 0.4s var(--spring-bounce);
}
@keyframes sosIconPulse {
0% { transform: scale(1); }
50% { transform: scale(1.15) rotate(-5deg); }
100% { transform: scale(1); }
}
.sos-card:active {
transform: scale(0.92) !important;
transition-duration: 0.1s !important;
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED BUTTONS & INPUTS
═══════════════════════════════════════════════════════════════ */
/* Hero CTA button glow */
.hero-cta {
position: relative;
overflow: hidden;
transition: transform 0.3s var(--spring-bounce), box-shadow 0.3s ease !important;
}
.hero-cta::after {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(
45deg,
transparent 30%,
rgba(255, 255, 255, 0.3) 50%,
transparent 70%
);
transform: translateX(-100%);
transition: none;
}
.hero-cta:hover::after {
animation: ctaSheen 0.8s ease forwards;
}
@keyframes ctaSheen {
from { transform: translateX(-100%); }
to { transform: translateX(100%); }
}
/* Mic button recording enhanced */
.btn-mic.recording {
animation: micRecordPulse 1.2s ease-in-out infinite !important;
}
@keyframes micRecordPulse {
0% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.5), 0 6px 24px rgba(239, 68, 68, 0.4); }
50% { box-shadow: 0 0 0 14px rgba(239, 68, 68, 0), 0 6px 24px rgba(239, 68, 68, 0.4); }
100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.5), 0 6px 24px rgba(239, 68, 68, 0.4); }
}
/* Send button entrance */
.btn-send.ready {
animation: sendBtnPop 0.3s var(--spring-bounce);
}
@keyframes sendBtnPop {
from { transform: scale(0.5) rotate(-90deg); }
to { transform: scale(1) rotate(0deg); }
}
/* Input focus glow */
.chat-input:focus {
box-shadow: 0 0 0 4px rgba(232, 101, 43, 0.08), 0 0 20px rgba(232, 101, 43, 0.05) !important;
animation: inputFocusGlow 2s ease-in-out infinite;
}
@keyframes inputFocusGlow {
0%, 100% { box-shadow: 0 0 0 4px rgba(232, 101, 43, 0.08), 0 0 20px rgba(232, 101, 43, 0.05); }
50% { box-shadow: 0 0 0 6px rgba(232, 101, 43, 0.12), 0 0 30px rgba(232, 101, 43, 0.08); }
}
/* ═══════════════════════════════════════════════════════════════
ENHANCED NAVIGATION
═══════════════════════════════════════════════════════════════ */
/* Navbar entrance */
.navbar {
animation: navbarSlideDown 0.6s var(--ease-out-expo) forwards;
}
@keyframes navbarSlideDown {
from { transform: translateY(-100%); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
/* Nav link hover effect */
.nav-link {
position: relative;
overflow: hidden;
}
.nav-link::before {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 2px;
background: rgba(255, 255, 255, 0.5);
transition: width 0.3s var(--spring-smooth), left 0.3s var(--spring-smooth);
border-radius: 1px;
}
.nav-link:hover::before, .nav-link.active::before {
width: 60%;
left: 20%;
}
/* Mobile bottom nav */
.mobile-nav {
animation: mobileNavSlideUp 0.4s var(--ease-out-expo) 0.3s both;
}
@keyframes mobileNavSlideUp {
from { transform: translateY(100%); }
to { transform: translateY(0); }
}
.mobile-nav button {
transition: transform 0.2s var(--spring-bounce), color 0.2s ease !important;
}
.mobile-nav button:active {
transform: scale(0.85) !important;
}
.mobile-nav button.active i {
animation: navIconBounce 0.4s var(--spring-bounce);
}
@keyframes navIconBounce {
0% { transform: scale(0.6) translateY(4px); }
50% { transform: scale(1.2) translateY(-2px); }
100% { transform: scale(1) translateY(0); }
}
/* ═══════════════════════════════════════════════════════════════
MODALS & OVERLAYS
═══════════════════════════════════════════════════════════════ */
.loc-picker-overlay.open,
.chat-sidebar-overlay.open {
animation: overlayFadeIn 0.3s ease forwards;
}
@keyframes overlayFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.loc-picker-sheet {
animation: sheetSlideUp 0.45s var(--spring-smooth) forwards !important;
}
@keyframes sheetSlideUp {
from { transform: translateY(100%); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.chat-sidebar.open {
animation: sidebarSlideIn 0.35s var(--spring-smooth) forwards;
}
@keyframes sidebarSlideIn {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
/* ═══════════════════════════════════════════════════════════════
TOAST ENHANCED
═══════════════════════════════════════════════════════════════ */
#toast {
transition: all 0.4s var(--spring-bounce) !important;
}
#toast[style*="opacity: 1"],
#toast[style*="opacity:1"] {
animation: toastBounceIn 0.5s var(--spring-bounce);
}
@keyframes toastBounceIn {
0% { transform: translateX(-50%) translateY(-30px) scale(0.8); opacity: 0; }
60% { transform: translateX(-50%) translateY(4px) scale(1.02); opacity: 1; }
100% { transform: translateX(-50%) translateY(0) scale(1); opacity: 1; }
}
/* ═══════════════════════════════════════════════════════════════
SKELETON LOADING ENHANCED
═══════════════════════════════════════════════════════════════ */
.skeleton {
position: relative;
overflow: hidden;
background: linear-gradient(90deg, #f0ece6 0%, #f0ece6 100%) !important;
}
.skeleton::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.6) 50%,
transparent 100%
);
animation: skeletonWave 1.8s ease-in-out infinite;
}
@keyframes skeletonWave {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* ═══════════════════════════════════════════════════════════════
AUTH PAGES ENHANCED
═══════════════════════════════════════════════════════════════ */
.auth-card {
animation: authCardEnter 0.6s var(--spring-smooth) forwards !important;
}
@keyframes authCardEnter {
from { opacity: 0; transform: translateY(40px) scale(0.95); filter: blur(4px); }
to { opacity: 1; transform: translateY(0) scale(1); filter: blur(0px); }
}
.auth-field {
animation: authFieldSlide 0.5s var(--spring-smooth) forwards;
opacity: 0;
}
.auth-field:nth-child(1) { animation-delay: 0.15s; }
.auth-field:nth-child(2) { animation-delay: 0.25s; }
.auth-field:nth-child(3) { animation-delay: 0.35s; }
.auth-field:nth-child(4) { animation-delay: 0.45s; }
@keyframes authFieldSlide {
from { opacity: 0; transform: translateX(-20px); }
to { opacity: 1; transform: translateX(0); }
}
.auth-btn {
position: relative;
overflow: hidden;
transition: transform 0.3s var(--spring-bounce), box-shadow 0.3s ease !important;
}
.auth-btn:hover:not(:disabled) {
transform: translateY(-2px) !important;
box-shadow: 0 8px 25px rgba(232, 101, 43, 0.3) !important;
}
.auth-btn:active:not(:disabled) {
transform: translateY(0) scale(0.98) !important;
}
/* ═══════════════════════════════════════════════════════════════
PROFILE PAGE ENHANCED
═══════════════════════════════════════════════════════════════ */
.profile-avatar {
animation: avatarFloat 4s ease-in-out infinite;
transition: transform 0.3s var(--spring-bounce) !important;
}
.profile-avatar:hover {
transform: scale(1.1) !important;
}
@keyframes avatarFloat {
0%, 100% { transform: translateY(0); box-shadow: 0 4px 20px rgba(232, 101, 43, 0.3); }
50% { transform: translateY(-6px); box-shadow: 0 12px 30px rgba(232, 101, 43, 0.2); }
}
.profile-stat {
transition: transform 0.3s var(--spring-bounce), box-shadow 0.3s ease;
}
.profile-stat:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
/* Animated counter */
.profile-stat .num {
transition: transform 0.3s var(--spring-bounce);
}
.profile-stat:hover .num {
transform: scale(1.15);
}
/* ═══════════════════════════════════════════════════════════════
MAP ENHANCEMENTS
═══════════════════════════════════════════════════════════════ */
.map-place-card.show {
animation: mapCardSlideUp 0.45s var(--spring-smooth) forwards !important;
}
@keyframes mapCardSlideUp {
from { opacity: 0; transform: translateY(100%); }
to { opacity: 1; transform: translateY(0); }
}
.route-panel.open {
animation: routePanelEnter 0.4s var(--spring-smooth) forwards !important;
}
@keyframes routePanelEnter {
from { opacity: 0; transform: translateX(-30px) scale(0.95); }
to { opacity: 1; transform: translateX(0) scale(1); }
}
.map-btn {
transition: transform 0.2s var(--spring-bounce), color 0.2s ease, box-shadow 0.2s ease !important;
}
.map-btn:hover {
transform: scale(1.1) !important;
}
.map-btn:active {
transform: scale(0.9) !important;
}
/* ═══════════════════════════════════════════════════════════════
FILTER CHIPS ENHANCED
═══════════════════════════════════════════════════════════════ */
.filter-chip, .lang-chip, .map-filter-chip {
transition: transform 0.2s var(--spring-bounce), border-color 0.2s ease,
background 0.2s ease, color 0.2s ease, box-shadow 0.2s ease !important;
}
.filter-chip:active, .lang-chip:active, .map-filter-chip:active {
transform: scale(0.9) !important;
}
.filter-chip.active, .lang-chip.active, .map-filter-chip.active {
animation: chipActivate 0.3s var(--spring-bounce);
}
@keyframes chipActivate {
0% { transform: scale(0.85); }
60% { transform: scale(1.08); }
100% { transform: scale(1); }
}
/* ═══════════════════════════════════════════════════════════════
CHAT SIDEBAR ENHANCED
═══════════════════════════════════════════════════════════════ */
.chat-sidebar-item {
transition: transform 0.2s var(--spring-bounce), background 0.2s ease !important;
}
.chat-sidebar-item:hover {
transform: translateX(4px);
}
.chat-sidebar-item:active {
transform: scale(0.97);
}
/* ═══════════════════════════════════════════════════════════════
CHAT WELCOME ENHANCED
═══════════════════════════════════════════════════════════════ */
.chat-welcome-icon {
animation: welcomeIconFloat 4s ease-in-out infinite, welcomeIconEnter 0.6s var(--spring-bounce) !important;
}
@keyframes welcomeIconEnter {
from { opacity: 0; transform: scale(0.3) rotate(-15deg); }
to { opacity: 1; transform: scale(1) rotate(0deg); }
}
.chat-welcome-chip {
transition: transform 0.25s var(--spring-bounce), border-color 0.2s ease,
box-shadow 0.2s ease, color 0.2s ease !important;
}
.chat-welcome-chip:hover {
transform: translateY(-3px) scale(1.03) !important;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.08) !important;
}
.chat-welcome-chip:active {
transform: scale(0.93) !important;
}
/* ═══════════════════════════════════════════════════════════════
HELPLINE ITEMS ENHANCED
═══════════════════════════════════════════════════════════════ */
.helpline-item {
transition: transform 0.2s var(--spring-bounce), background 0.2s ease,
box-shadow 0.2s ease !important;
}
.helpline-item:hover {
transform: translateX(6px) !important;
box-shadow: 0 4px 16px rgba(220, 38, 38, 0.1) !important;
}
.helpline-item:active {
transform: scale(0.97) !important;
}
.helpline-call {
transition: transform 0.2s var(--spring-bounce), background 0.2s ease !important;
}
.helpline-call:hover {
transform: scale(1.1);
}
/* ═══════════════════════════════════════════════════════════════
SCROLLBAR ENHANCED
═══════════════════════════════════════════════════════════════ */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, var(--saffron-light), var(--saffron));
border-radius: 3px;
transition: background 0.3s ease;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg, var(--saffron), var(--saffron-dark));
}
/* ═══════════════════════════════════════════════════════════════
CONTINUOUS ANIMATIONS
═══════════════════════════════════════════════════════════════ */
/* Gradient shift for hero */
.hero {
background-size: 300% 300% !important;
animation: heroGradientShift 10s ease infinite !important;
}
@keyframes heroGradientShift {
0% { background-position: 0% 0%; }
25% { background-position: 100% 0%; }
50% { background-position: 100% 100%; }
75% { background-position: 0% 100%; }
100% { background-position: 0% 0%; }
}
/* Status dot pulse */
.status-dot.online {
animation: statusPulse 2s ease-in-out infinite !important;
}
@keyframes statusPulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.6); }
50% { box-shadow: 0 0 0 6px rgba(74, 222, 128, 0); }
}
/* ═══════════════════════════════════════════════════════════════
HOVER INTERACTION PATTERNS
═══════════════════════════════════════════════════════════════ */
/* Universal button hover lift */
button:not(.mobile-nav button):not(.nav-link):not(.chat-sidebar-toggle):not(.mpc-close) {
transition: transform 0.2s var(--spring-bounce), box-shadow 0.2s ease,
background 0.2s ease, color 0.2s ease, border-color 0.2s ease,
opacity 0.2s ease !important;
}
/* Info banner shimmer */
.info-banner {
position: relative;
overflow: hidden;
}
.info-banner::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
animation: bannerShimmer 6s ease-in-out infinite;
}
@keyframes bannerShimmer {
0%, 80%, 100% { left: -100%; }
40% { left: 150%; }
}
/* ═══════════════════════════════════════════════════════════════
ACCESSIBILITY β€” REDUCED MOTION
═══════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
[data-reveal] {
opacity: 1 !important;
transform: none !important;
filter: none !important;
}
.liquid-blob {
animation: none !important;
}
.hero {
animation: none !important;
background-size: 100% 100% !important;
}
}
/* ═══════════════════════════════════════════════════════════════
MOBILE-SPECIFIC ENHANCEMENTS
═══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
/* Faster animations on mobile for snappier feel */
:root {
--dur-fast: 0.15s;
--dur-normal: 0.3s;
--dur-slow: 0.4s;
--dur-slower: 0.6s;
--stagger-base: 40ms;
}
/* Disable heavy effects on mobile for performance */
.liquid-blob {
filter: blur(50px);
}
[data-tilt] {
transform: none !important;
}
/* Swipe indicator */
.swipe-indicator {
position: fixed;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 60px;
background: rgba(232, 101, 43, 0.3);
border-radius: 2px;
z-index: 999;
opacity: 0;
transition: opacity 0.2s ease;
pointer-events: none;
}
.swipe-indicator.left { left: 0; }
.swipe-indicator.right { right: 0; }
.swipe-indicator.active { opacity: 1; }
}