@import "tailwindcss"; @plugin "tailwindcss-animate"; @plugin "@tailwindcss/typography"; @custom-variant dark (&:is(.dark *)); /* ─────────────────────────────────────────────── NexaFlow Brand Palette ─────────────────────────────────────────────── */ :root { /* Rupam Portfolio Style - Neumorphic Light */ --background: 224 14% 90%; --foreground: 215 25% 27%; --card: 224 14% 90%; --card-foreground: 215 25% 27%; --popover: 224 14% 90%; --popover-foreground: 215 25% 27%; --primary: 248 73% 65%; --primary-foreground: 0 0% 100%; --secondary: 220 14% 96%; --secondary-foreground: 215 25% 27%; --muted: 220 14% 96%; --muted-foreground: 215 16% 47%; --accent: 248 73% 65%; --accent-foreground: 0 0% 100%; --destructive: 0 84% 60%; --destructive-foreground: 0 0% 100%; --border: 220 13% 91%; --input: 220 13% 91%; --ring: 248 73% 65%; --radius: 0.625rem; /* Semantic colors */ --success: 142 71% 45%; --success-foreground: 0 0% 100%; --warning: 38 92% 50%; --warning-foreground: 0 0% 100%; --info: 199 89% 48%; --info-foreground: 0 0% 100%; /* Chart colors */ --chart-1: 248 73% 65%; --chart-2: 160 60% 45%; --chart-3: 30 80% 55%; --chart-4: 280 65% 60%; --chart-5: 340 75% 55%; /* Neumorphism shadows - Rupam Style */ --neu-shadow-light: #ffffff; --neu-shadow-dark: #a3b1c6; --neu-distance: 20px; --neu-blur: 60px; --bg-primary: hsl(224, 14%, 90%); --bg-secondary: hsl(220, 14%, 96%); /* Floating blobs */ --blob-1: hsl(248, 73%, 65%); --blob-2: hsl(280, 65%, 60%); /* Gradient colors for premium look */ --gradient-start: 248 73% 65%; --gradient-mid: 270 70% 60%; --gradient-end: 290 65% 55%; } .dark { --background: 224 71% 4%; --foreground: 210 20% 98%; --card: 224 71% 4%; --card-foreground: 210 20% 98%; --popover: 224 71% 4%; --popover-foreground: 210 20% 98%; --primary: 248 73% 70%; --primary-foreground: 0 0% 100%; --secondary: 215 28% 17%; --secondary-foreground: 210 20% 98%; --muted: 215 28% 17%; --muted-foreground: 218 11% 65%; --accent: 248 73% 70%; --accent-foreground: 0 0% 100%; --destructive: 0 63% 31%; --destructive-foreground: 210 20% 98%; --border: 215 28% 17%; --input: 215 28% 17%; --ring: 248 73% 70%; /* Semantic colors (dark) */ --success: 142 71% 35%; --success-foreground: 0 0% 100%; --warning: 38 92% 40%; --warning-foreground: 0 0% 100%; --info: 199 89% 38%; --info-foreground: 0 0% 100%; /* Chart colors (dark) */ --chart-1: 248 73% 70%; --chart-2: 160 50% 40%; --chart-3: 30 70% 50%; --chart-4: 280 55% 55%; --chart-5: 340 65% 50%; /* Neumorphism shadows (dark) */ --neu-shadow-light: rgba(255, 255, 255, 0.05); --neu-shadow-dark: rgba(0, 0, 0, 0.5); --neu-distance: 20px; --neu-blur: 60px; --bg-primary: hsl(224, 71%, 4%); --bg-secondary: hsl(215, 28%, 17%); /* Floating blobs */ --blob-1: hsl(248, 73%, 70%); --blob-2: hsl(280, 55%, 55%); } /* ─────────────────────────────────────────────── Theme Mapping (Tailwind v4) ─────────────────────────────────────────────── */ @theme inline { --color-background: hsl(var(--background)); --color-foreground: hsl(var(--foreground)); --color-card: hsl(var(--card)); --color-card-foreground: hsl(var(--card-foreground)); --color-popover: hsl(var(--popover)); --color-popover-foreground: hsl(var(--popover-foreground)); --color-primary: hsl(var(--primary)); --color-primary-foreground: hsl(var(--primary-foreground)); --color-secondary: hsl(var(--secondary)); --color-secondary-foreground: hsl(var(--secondary-foreground)); --color-muted: hsl(var(--muted)); --color-muted-foreground: hsl(var(--muted-foreground)); --color-accent: hsl(var(--accent)); --color-accent-foreground: hsl(var(--accent-foreground)); --color-destructive: hsl(var(--destructive)); --color-destructive-foreground: hsl(var(--destructive-foreground)); --color-border: hsl(var(--border)); --color-input: hsl(var(--input)); --color-ring: hsl(var(--ring)); --color-chart-1: hsl(var(--chart-1)); --color-chart-2: hsl(var(--chart-2)); --color-chart-3: hsl(var(--chart-3)); --color-chart-4: hsl(var(--chart-4)); --color-chart-5: hsl(var(--chart-5)); /* Semantic */ --color-success: hsl(var(--success)); --color-success-foreground: hsl(var(--success-foreground)); --color-warning: hsl(var(--warning)); --color-warning-foreground: hsl(var(--warning-foreground)); --color-info: hsl(var(--info)); --color-info-foreground: hsl(var(--info-foreground)); /* Radius */ --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --radius-2xl: calc(var(--radius) + 8px); --radius-3xl: calc(var(--radius) + 12px); } /* ─────────────────────────────────────────────── Utilities ─────────────────────────────────────────────── */ @layer utilities { .container { margin-inline: auto; padding-inline: 1.5rem; } @media (min-width: 640px) { .container { max-width: 640px; } } @media (min-width: 768px) { .container { max-width: 768px; padding-inline: 2rem; } } @media (min-width: 1024px) { .container { max-width: 1024px; } } @media (min-width: 1280px) { .container { max-width: 1280px; } } /* Smooth scroll behavior */ .smooth-scroll { scroll-behavior: smooth; -webkit-overflow-scrolling: touch; } /* Hide scrollbar but keep functionality */ .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } /* Better focus styles */ .focus-ring { @apply outline-none ring-2 ring-primary/50 ring-offset-2; } /* Text balance for better typography */ .text-balance { text-wrap: balance; } /* Glass effect */ .glass { background: hsl(var(--background) / 0.8); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); } /* Gradient border */ .gradient-border { position: relative; } .gradient-border::before { content: ''; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(135deg, hsl(var(--primary)), hsl(var(--accent))); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } /* Section spacing */ .section-py { @apply py-16 md:py-20 lg:py-24; } /* Hide on scroll utility */ .hide-on-scroll { transform: translateY(0); transition: transform 0.3s ease; } .hide-on-scroll.scrolled { transform: translateY(-100%); } } /* ─────────────────────────────────────────────── Base Layer — Typography Scale & Defaults ─────────────────────────────────────────────── */ @layer base { * { @apply border-border outline-ring/50; } body { @apply bg-background text-foreground; font-feature-settings: "rlig" 1, "calt" 1; font-optical-sizing: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } h1, h2, h3, h4, h5, h6 { font-weight: 700; letter-spacing: -0.02em; line-height: 1.2; font-family: var(--font-heading), var(--font-sans); } h1 { font-size: clamp(2.5rem, 5vw, 4rem); } h2 { font-size: clamp(2rem, 4vw, 3rem); } h3 { font-size: clamp(1.5rem, 3vw, 2rem); } h4 { font-size: clamp(1.25rem, 2.5vw, 1.5rem); } /* Font family utilities */ .font-heading { font-family: var(--font-heading), var(--font-sans); } /* Utility typography classes */ .text-body { @apply text-base leading-relaxed; } .text-caption { @apply text-sm text-muted-foreground; } .text-overline { @apply text-xs font-semibold uppercase tracking-widest text-muted-foreground; } } /* ─────────────────────────────────────────────── CSS Animations (replacing Framer Motion) ─────────────────────────────────────────────── */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-12px); } to { opacity: 1; transform: translateY(0); } } @keyframes scaleIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } } @keyframes shimmer { 0% { background-position: -1000px 0; } 100% { background-position: 1000px 0; } } @keyframes float { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-10px); } } @keyframes pulse-glow { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.05); } } @keyframes gradient-shift { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } .animate-fade-in { animation: fadeIn 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; } .animate-fade-in-up { animation: fadeInUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; } .animate-fade-in-down { animation: fadeInDown 0.5s ease-out both; } .animate-scale-in { animation: scaleIn 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; } .animate-slide-in-left { animation: slideInLeft 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; } .animate-slide-in-right { animation: slideInRight 0.6s cubic-bezier(0.16, 1, 0.3, 1) both; } .animate-shimmer { background: linear-gradient( 90deg, transparent 0%, rgba(255, 255, 255, 0.1) 50%, transparent 100% ); background-size: 1000px 100%; animation: shimmer 3s infinite; } .animate-float { animation: float 3s ease-in-out infinite; } .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; } .animate-gradient { background-size: 200% 200%; animation: gradient-shift 8s ease infinite; } /* Stagger delays */ .animate-delay-1 { animation-delay: 0.1s; } .animate-delay-2 { animation-delay: 0.2s; } .animate-delay-3 { animation-delay: 0.3s; } .animate-delay-4 { animation-delay: 0.4s; } .animate-delay-5 { animation-delay: 0.5s; } .animate-delay-6 { animation-delay: 0.6s; } .animate-delay-7 { animation-delay: 0.7s; } /* Hover effects */ .hover-lift { transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1); } .hover-lift:hover { transform: translateY(-4px); } .hover-glow { transition: box-shadow 0.3s ease; } .hover-glow:hover { box-shadow: 0 0 20px rgba(var(--primary), 0.3); } /* Neumorphism styles */ .neu-flat { background: hsl(var(--background)); box-shadow: var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-shadow-dark), calc(var(--neu-distance) * -1) calc(var(--neu-distance) * -1) var(--neu-blur) var(--neu-shadow-light); border: none; transition: all 0.3s ease; } .neu-flat:hover { box-shadow: calc(var(--neu-distance) * 1.25) calc(var(--neu-distance) * 1.25) calc(var(--neu-blur) * 1.25) var(--neu-shadow-dark), calc(var(--neu-distance) * -1.25) calc(var(--neu-distance) * -1.25) calc(var(--neu-blur) * 1.25) var(--neu-shadow-light); } .neu-pressed { background: hsl(var(--background)); box-shadow: inset var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-shadow-dark), inset calc(var(--neu-distance) * -1) calc(var(--neu-distance) * -1) var(--neu-blur) var(--neu-shadow-light); border: none; transition: all 0.3s ease; } .neu-convex { background: linear-gradient(145deg, hsl(var(--background)), hsl(var(--muted))); box-shadow: var(--neu-distance) var(--neu-distance) var(--neu-blur) var(--neu-shadow-dark), calc(var(--neu-distance) * -1) calc(var(--neu-distance) * -1) var(--neu-blur) var(--neu-shadow-light); border: none; transition: all 0.3s ease; } .neu-convex:hover { box-shadow: inset 4px 4px 8px var(--neu-shadow-dark), inset -4px -4px 8px var(--neu-shadow-light); } .neu-concave { background: linear-gradient(145deg, hsl(var(--muted)), hsl(var(--background))); box-shadow: inset 5px 5px 10px var(--neu-shadow-dark), inset -5px -5px 10px var(--neu-shadow-light); border: none; transition: all 0.3s ease; } .neu-button { background: hsl(var(--background)); box-shadow: 8px 8px 16px var(--neu-shadow-dark), -8px -8px 16px var(--neu-shadow-light); border: none; transition: all 0.3s ease; } .neu-button:hover { transform: translateY(-2px); box-shadow: 10px 10px 20px var(--neu-shadow-dark), -10px -10px 20px var(--neu-shadow-light); } .neu-button:active { transform: translateY(0); box-shadow: inset 4px 4px 8px var(--neu-shadow-dark), inset -4px -4px 8px var(--neu-shadow-light); } .neu-card { background: hsl(var(--background)); box-shadow: 12px 12px 24px var(--neu-shadow-dark), -12px -12px 24px var(--neu-shadow-light); border: none; border-radius: 30px; transition: all 0.3s ease; } .neu-card:hover { box-shadow: 16px 16px 32px var(--neu-shadow-dark), -16px -16px 32px var(--neu-shadow-light); } .neu-input { background: hsl(var(--background)); box-shadow: inset 4px 4px 8px var(--neu-shadow-dark), inset -4px -4px 8px var(--neu-shadow-light); border: none; border-radius: 12px; padding: 12px 16px; transition: all 0.3s ease; } .neu-input:focus { box-shadow: inset 6px 6px 12px var(--neu-shadow-dark), inset -6px -6px 12px var(--neu-shadow-light); outline: none; } /* Advanced animation utilities */ .animate-on-scroll { opacity: 0; animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .bounce-subtle { animation: bounceSubtle 2s ease-in-out infinite; } @keyframes bounceSubtle { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-5px); } } .rotate-slow { animation: rotateSlow 20s linear infinite; } @keyframes rotateSlow { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .perspective-card { perspective: 1000px; transform-style: preserve-3d; transition: all 0.3s ease; } /* Premium gradient text */ .gradient-text { background: linear-gradient(135deg, hsl(var(--gradient-start)), hsl(var(--gradient-mid)), hsl(var(--gradient-end))); background-size: 200% 200%; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; animation: gradientShift 8s ease infinite; } @keyframes gradientShift { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } /* Floating background blobs */ .floating-blob { position: absolute; border-radius: 50%; filter: blur(80px); opacity: 0.3; animation: float 20s ease-in-out infinite; pointer-events: none; z-index: 0; } .floating-blob-1 { background: var(--blob-1); width: 400px; height: 400px; top: -200px; right: -100px; animation-delay: 0s; } .floating-blob-2 { background: var(--blob-2); width: 350px; height: 350px; bottom: -150px; left: -100px; animation-delay: 5s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -30px) scale(1.1); } 66% { transform: translate(-20px, 20px) scale(0.9); } } /* Shimmer effect for premium feel */ .shimmer { position: relative; overflow: hidden; } .shimmer::after { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); animation: shimmer 3s infinite; } @keyframes shimmer { 0% { left: -100%; } 100% { left: 100%; } } /* Glow effect on hover */ .glow-on-hover { position: relative; transition: all 0.3s ease; } .glow-on-hover::before { content: ''; position: absolute; inset: -2px; border-radius: inherit; background: linear-gradient(135deg, hsl(var(--primary)), hsl(var(--accent))); opacity: 0; transition: opacity 0.3s ease; z-index: -1; filter: blur(10px); } .glow-on-hover:hover::before { opacity: 0.6; } /* 3D Card Tilt Effect */ .card-3d { transform-style: preserve-3d; transition: transform 0.3s ease; } .card-3d:hover { transform: translateY(-8px); } /* Scroll reveal animations */ @keyframes reveal-up { from { opacity: 0; transform: translateY(40px); } to { opacity: 1; transform: translateY(0); } } @keyframes reveal-left { from { opacity: 0; transform: translateX(-40px); } to { opacity: 1; transform: translateX(0); } } @keyframes reveal-right { from { opacity: 0; transform: translateX(40px); } to { opacity: 1; transform: translateX(0); } } @keyframes scale-in { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } .reveal-up { animation: reveal-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .reveal-left { animation: reveal-left 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .reveal-right { animation: reveal-right 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .scale-in { animation: scale-in 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Magnetic button effect */ .magnetic-button { position: relative; transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1); } /* Text gradient animation */ .text-shimmer { background: linear-gradient(90deg, hsl(var(--foreground)) 0%, hsl(var(--primary)) 50%, hsl(var(--foreground)) 100% ); background-size: 200% auto; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; animation: text-shimmer 3s linear infinite; } @keyframes text-shimmer { to { background-position: 200% center; } } /* Pulse animation for icons */ .pulse-icon { animation: pulse-icon 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } @keyframes pulse-icon { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.05); } } /* Stagger children animation */ .stagger-children > * { opacity: 0; animation: reveal-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; } .stagger-children > *:nth-child(1) { animation-delay: 0.1s; } .stagger-children > *:nth-child(2) { animation-delay: 0.2s; } .stagger-children > *:nth-child(3) { animation-delay: 0.3s; } .stagger-children > *:nth-child(4) { animation-delay: 0.4s; } .stagger-children > *:nth-child(5) { animation-delay: 0.5s; } .stagger-children > *:nth-child(6) { animation-delay: 0.6s; } /* ─────────────────────────────────────────────── Creative UI Enhancements ─────────────────────────────────────────────── */ /* Animated gradient mesh background */ .gradient-mesh { background: radial-gradient(at 40% 20%, hsla(248, 73%, 65%, 0.3) 0px, transparent 50%), radial-gradient(at 80% 0%, hsla(280, 65%, 60%, 0.2) 0px, transparent 50%), radial-gradient(at 0% 50%, hsla(199, 89%, 48%, 0.2) 0px, transparent 50%), radial-gradient(at 80% 50%, hsla(340, 75%, 55%, 0.15) 0px, transparent 50%), radial-gradient(at 0% 100%, hsla(30, 80%, 55%, 0.2) 0px, transparent 50%), radial-gradient(at 80% 100%, hsla(160, 60%, 45%, 0.15) 0px, transparent 50%); animation: gradient-mesh-move 20s ease infinite; } @keyframes gradient-mesh-move { 0%, 100% { background-position: 0% 0%, 100% 0%, 0% 50%, 100% 50%, 0% 100%, 100% 100%; } 25% { background-position: 100% 0%, 0% 50%, 50% 0%, 0% 100%, 50% 50%, 0% 0%; } 50% { background-position: 100% 100%, 0% 0%, 100% 50%, 50% 0%, 100% 0%, 50% 50%; } 75% { background-position: 0% 100%, 100% 50%, 0% 0%, 100% 0%, 50% 50%, 100% 100%; } } /* Noise texture overlay for depth */ .noise-overlay { position: relative; } .noise-overlay::before { content: ''; position: absolute; inset: 0; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); opacity: 0.03; pointer-events: none; z-index: 1; } /* Morphing blob shapes */ @keyframes morph-blob { 0%, 100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; } 25% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; } 50% { border-radius: 50% 60% 30% 60% / 30% 60% 70% 40%; } 75% { border-radius: 60% 40% 60% 30% / 70% 30% 50% 60%; } } .morphing-blob { animation: morph-blob 15s ease-in-out infinite; } /* Floating particles effect */ @keyframes float-particle { 0%, 100% { transform: translateY(0) translateX(0) rotate(0deg); opacity: 0.3; } 25% { transform: translateY(-100px) translateX(50px) rotate(90deg); opacity: 0.6; } 50% { transform: translateY(-200px) translateX(-30px) rotate(180deg); opacity: 0.3; } 75% { transform: translateY(-100px) translateX(-50px) rotate(270deg); opacity: 0.6; } } .particle { position: absolute; width: 6px; height: 6px; border-radius: 50%; background: hsl(var(--primary)); opacity: 0.3; animation: float-particle 20s ease-in-out infinite; } /* Enhanced glass effect with animated border */ .glass-card { background: hsl(var(--background) / 0.6); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid hsl(var(--border) / 0.3); position: relative; overflow: hidden; } .glass-card::before { content: ''; position: absolute; inset: 0; background: linear-gradient( 135deg, hsl(var(--primary) / 0.1) 0%, transparent 50%, hsl(var(--accent) / 0.1) 100% ); opacity: 0; transition: opacity 0.5s ease; } .glass-card:hover::before { opacity: 1; } /* Animated gradient border */ .animated-border { position: relative; background: hsl(var(--background)); border-radius: var(--radius-lg); } .animated-border::before { content: ''; position: absolute; inset: -2px; border-radius: inherit; background: conic-gradient( from var(--angle, 0deg), hsl(var(--primary)), hsl(280, 65%, 60%), hsl(320, 75%, 55%), hsl(var(--primary)) ); z-index: -1; animation: rotate-gradient 4s linear infinite; } @keyframes rotate-gradient { to { --angle: 360deg; } } @property --angle { syntax: ''; initial-value: 0deg; inherits: false; } /* Split color text effect */ .split-color-text { background: linear-gradient( 135deg, hsl(var(--foreground)) 0%, hsl(var(--foreground)) 50%, hsl(var(--primary)) 50%, hsl(var(--primary)) 100% ); background-size: 200% 100%; background-position: 100% 0; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; transition: background-position 0.5s ease; } .split-color-text:hover { background-position: 0 0; } /* 3D perspective card with depth */ .card-3d-depth { transform-style: preserve-3d; perspective: 1000px; transition: transform 0.6s cubic-bezier(0.23, 1, 0.32, 1); } .card-3d-depth:hover { transform: rotateY(-5deg) rotateX(5deg) translateZ(20px); } .card-3d-depth::before { content: ''; position: absolute; inset: 0; background: linear-gradient( 135deg, hsl(var(--primary) / 0.1) 0%, transparent 100% ); opacity: 0; transition: opacity 0.3s ease; border-radius: inherit; z-index: -1; } .card-3d-depth:hover::before { opacity: 1; } /* Spotlight hover effect */ .spotlight-card { position: relative; overflow: hidden; } .spotlight-card::after { content: ''; position: absolute; width: 200px; height: 200px; background: radial-gradient( circle, hsl(var(--primary) / 0.15) 0%, transparent 70% ); border-radius: 50%; pointer-events: none; opacity: 0; transform: translate(-50%, -50%); transition: opacity 0.3s ease; } .spotlight-card:hover::after { opacity: 1; } /* Typewriter effect */ .typewriter { overflow: hidden; border-right: 2px solid hsl(var(--primary)); white-space: nowrap; animation: typing 3.5s steps(40, end), blink-caret 0.75s step-end infinite; } @keyframes typing { from { width: 0; } to { width: 100%; } } @keyframes blink-caret { from, to { border-color: transparent; } 50% { border-color: hsl(var(--primary)); } } /* Glitch text effect */ .glitch-text { position: relative; } .glitch-text::before, .glitch-text::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .glitch-text::before { animation: glitch-1 0.3s infinite linear alternate-reverse; color: hsl(0, 100%, 50%); z-index: -1; } .glitch-text::after { animation: glitch-2 0.3s infinite linear alternate-reverse; color: hsl(180, 100%, 50%); z-index: -2; } @keyframes glitch-1 { 0% { clip-path: inset(20% 0 60% 0); transform: translate(-2px, 2px); } 20% { clip-path: inset(60% 0 20% 0); transform: translate(2px, -2px); } 40% { clip-path: inset(40% 0 40% 0); transform: translate(-2px, 0); } 60% { clip-path: inset(80% 0 0% 0); transform: translate(0, 2px); } 80% { clip-path: inset(0% 0 80% 0); transform: translate(2px, 0); } 100% { clip-path: inset(50% 0 30% 0); transform: translate(-2px, -2px); } } @keyframes glitch-2 { 0% { clip-path: inset(60% 0 20% 0); transform: translate(2px, -2px); } 20% { clip-path: inset(20% 0 60% 0); transform: translate(-2px, 2px); } 40% { clip-path: inset(80% 0 0% 0); transform: translate(2px, 0); } 60% { clip-path: inset(40% 0 40% 0); transform: translate(0, -2px); } 80% { clip-path: inset(50% 0 30% 0); transform: translate(-2px, 0); } 100% { clip-path: inset(0% 0 80% 0); transform: translate(2px, 2px); } } /* Neon glow effect */ .neon-glow { text-shadow: 0 0 5px hsl(var(--primary)), 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)), 0 0 40px hsl(var(--primary)); animation: neon-pulse 2s ease-in-out infinite; } @keyframes neon-pulse { 0%, 100% { text-shadow: 0 0 5px hsl(var(--primary)), 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)), 0 0 40px hsl(var(--primary)); } 50% { text-shadow: 0 0 2px hsl(var(--primary)), 0 0 5px hsl(var(--primary)), 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)); } } /* Ripple button effect */ .ripple-button { position: relative; overflow: hidden; } .ripple-button::after { content: ''; position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: radial-gradient(circle, hsl(var(--primary-foreground) / 0.3) 10%, transparent 10%); background-size: 0 0; background-position: center; transition: background-size 0.5s ease; } .ripple-button:active::after { background-size: 200% 200%; } /* Aurora background effect */ .aurora-bg { position: relative; overflow: hidden; } .aurora-bg::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: conic-gradient(from 0deg at 50% 50%, hsla(248, 73%, 65%, 0.3) 0deg, transparent 60deg), conic-gradient(from 120deg at 50% 50%, hsla(280, 65%, 60%, 0.2) 0deg, transparent 60deg), conic-gradient(from 240deg at 50% 50%, hsla(199, 89%, 48%, 0.2) 0deg, transparent 60deg); animation: aurora-rotate 30s linear infinite; opacity: 0.5; } @keyframes aurora-rotate { to { transform: rotate(360deg); } } /* Scroll indicator */ .scroll-indicator { width: 30px; height: 50px; border: 2px solid hsl(var(--primary) / 0.5); border-radius: 25px; position: relative; } .scroll-indicator::before { content: ''; position: absolute; top: 8px; left: 50%; width: 6px; height: 6px; background: hsl(var(--primary)); border-radius: 50%; transform: translateX(-50%); animation: scroll-bounce 2s ease-in-out infinite; } @keyframes scroll-bounce { 0%, 100% { top: 8px; opacity: 1; } 50% { top: 32px; opacity: 0.3; } } /* Reveal animation on scroll */ .reveal { opacity: 0; transform: translateY(30px); transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .reveal.visible { opacity: 1; transform: translateY(0); } .reveal-left { opacity: 0; transform: translateX(-50px); transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .reveal-left.visible { opacity: 1; transform: translateX(0); } .reveal-right { opacity: 0; transform: translateX(50px); transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .reveal-right.visible { opacity: 1; transform: translateX(0); } .reveal-scale { opacity: 0; transform: scale(0.9); transition: all 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .reveal-scale.visible { opacity: 1; transform: scale(1); } /* Interactive underline */ .interactive-underline { position: relative; display: inline-block; } .interactive-underline::after { content: ''; position: absolute; bottom: -4px; left: 0; width: 0; height: 3px; background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--accent))); border-radius: 2px; transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .interactive-underline:hover::after { width: 100%; } /* Counter animation */ .counter-animate { display: inline-block; animation: counter-pop 0.6s cubic-bezier(0.16, 1, 0.3, 1); } @keyframes counter-pop { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } /* Shine effect */ .shine-effect { position: relative; overflow: hidden; } .shine-effect::after { content: ''; position: absolute; top: 0; left: -100%; width: 50%; height: 100%; background: linear-gradient( 90deg, transparent, hsl(var(--primary-foreground) / 0.2), transparent ); transform: skewX(-25deg); transition: left 0.5s ease; } .shine-effect:hover::after { left: 150%; } /* Orbit animation */ .orbit { animation: orbit-spin 20s linear infinite; } @keyframes orbit-spin { from { transform: rotate(0deg) translateX(100px) rotate(0deg); } to { transform: rotate(360deg) translateX(100px) rotate(-360deg); } } /* Wave text effect */ .wave-text span { display: inline-block; animation: wave 1s ease-in-out infinite; } .wave-text span:nth-child(1) { animation-delay: 0s; } .wave-text span:nth-child(2) { animation-delay: 0.1s; } .wave-text span:nth-child(3) { animation-delay: 0.2s; } .wave-text span:nth-child(4) { animation-delay: 0.3s; } .wave-text span:nth-child(5) { animation-delay: 0.4s; } .wave-text span:nth-child(6) { animation-delay: 0.5s; } @keyframes wave { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } /* Dark mode specific enhancements */ .dark .glass-card { background: hsl(var(--background) / 0.4); border: 1px solid hsl(var(--border) / 0.2); } .dark .gradient-mesh { background: radial-gradient(at 40% 20%, hsla(248, 73%, 70%, 0.15) 0px, transparent 50%), radial-gradient(at 80% 0%, hsla(280, 55%, 55%, 0.1) 0px, transparent 50%), radial-gradient(at 0% 50%, hsla(199, 89%, 48%, 0.1) 0px, transparent 50%), radial-gradient(at 80% 50%, hsla(340, 65%, 50%, 0.08) 0px, transparent 50%); } /* Underline animation */ .underline-animate { position: relative; } .underline-animate::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: hsl(var(--primary)); transition: width 0.3s ease; } .underline-animate:hover::after { width: 100%; } /* ─────────────────────────────────────────────── EXTREME ANIMATIONS - Next Level UI ─────────────────────────────────────────────── */ /* Electric pulse effect */ @keyframes electric-pulse { 0%, 100% { filter: drop-shadow(0 0 2px hsl(var(--primary))); } 25% { filter: drop-shadow(0 0 8px hsl(var(--primary))) drop-shadow(0 0 20px hsl(var(--primary))); } 50% { filter: drop-shadow(0 0 15px hsl(var(--primary))) drop-shadow(0 0 40px hsl(var(--primary))); } 75% { filter: drop-shadow(0 0 8px hsl(var(--primary))) drop-shadow(0 0 20px hsl(var(--primary))); } } .electric-glow { animation: electric-pulse 2s ease-in-out infinite; } /* Matrix rain effect */ @keyframes matrix-fall { 0% { transform: translateY(-100vh); opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { transform: translateY(100vh); opacity: 0; } } .matrix-char { position: absolute; font-family: monospace; font-size: 14px; color: hsl(var(--primary)); text-shadow: 0 0 10px hsl(var(--primary)); animation: matrix-fall linear infinite; pointer-events: none; } /* Holographic shimmer */ @keyframes holo-shimmer { 0% { background-position: 0% 50%; filter: hue-rotate(0deg); } 50% { background-position: 100% 50%; filter: hue-rotate(180deg); } 100% { background-position: 0% 50%; filter: hue-rotate(360deg); } } .holographic { background: linear-gradient( 90deg, hsl(280, 100%, 70%), hsl(320, 100%, 60%), hsl(360, 100%, 70%), hsl(40, 100%, 60%), hsl(80, 100%, 70%), hsl(120, 100%, 60%), hsl(160, 100%, 70%), hsl(200, 100%, 60%), hsl(240, 100%, 70%), hsl(280, 100%, 70%) ); background-size: 400% 100%; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; animation: holo-shimmer 4s linear infinite; } /* Cyberpunk glitch border */ @keyframes glitch-border { 0%, 100% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } 5% { clip-path: polygon(0 10%, 100% 0, 100% 90%, 0 100%); } 10% { clip-path: polygon(0 0, 90% 0, 100% 100%, 10% 100%); } 15% { clip-path: polygon(0 0, 100% 5%, 100% 100%, 0 95%); } 20% { clip-path: polygon(5% 0, 100% 0, 95% 100%, 0 100%); } 25% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } } .glitch-border { animation: glitch-border 3s ease-in-out infinite; } /* Extreme 3D flip card */ .flip-card { perspective: 2000px; transform-style: preserve-3d; } .flip-card-inner { position: relative; width: 100%; height: 100%; transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-style: preserve-3d; } .flip-card:hover .flip-card-inner { transform: rotateY(180deg); } .flip-card-front, .flip-card-back { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; border-radius: inherit; } .flip-card-back { transform: rotateY(180deg); } /* Liquid morphing animation */ @keyframes liquid-morph { 0%, 100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; transform: rotate(0deg) scale(1); } 25% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; transform: rotate(90deg) scale(1.1); } 50% { border-radius: 50% 60% 30% 60% / 30% 60% 70% 40%; transform: rotate(180deg) scale(1); } 75% { border-radius: 60% 40% 60% 30% / 70% 30% 50% 60%; transform: rotate(270deg) scale(1.1); } } .liquid-blob { animation: liquid-morph 20s ease-in-out infinite; } /* Plasma effect */ @keyframes plasma { 0%, 100% { filter: hue-rotate(0deg) saturate(1.5); transform: scale(1); } 33% { filter: hue-rotate(120deg) saturate(2); transform: scale(1.05); } 66% { filter: hue-rotate(240deg) saturate(1.8); transform: scale(0.95); } } .plasma-effect { animation: plasma 10s ease-in-out infinite; } /* Explosion particles */ @keyframes explode { 0% { transform: scale(0) rotate(0deg); opacity: 1; } 100% { transform: scale(3) rotate(180deg); opacity: 0; } } .explode-particle { animation: explode 1s cubic-bezier(0.36, 0, 0.66, -0.56) forwards; } /* Vortex spin */ @keyframes vortex { 0% { transform: rotate(0deg) scale(1); opacity: 1; } 50% { transform: rotate(180deg) scale(0.5); opacity: 0.5; } 100% { transform: rotate(360deg) scale(0); opacity: 0; } } .vortex-spin { animation: vortex 2s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite; } /* Breathing glow */ @keyframes breathe-glow { 0%, 100% { box-shadow: 0 0 5px hsl(var(--primary) / 0.3), 0 0 10px hsl(var(--primary) / 0.2), 0 0 20px hsl(var(--primary) / 0.1), inset 0 0 10px hsl(var(--primary) / 0.1); } 50% { box-shadow: 0 0 20px hsl(var(--primary) / 0.6), 0 0 40px hsl(var(--primary) / 0.4), 0 0 60px hsl(var(--primary) / 0.2), inset 0 0 20px hsl(var(--primary) / 0.2); } } .breathing-glow { animation: breathe-glow 4s ease-in-out infinite; } /* Cyber scan line */ @keyframes scan-line { 0% { top: 0%; } 100% { top: 100%; } } .scan-line::before { content: ''; position: absolute; left: 0; width: 100%; height: 2px; background: linear-gradient(90deg, transparent, hsl(var(--primary)), transparent); box-shadow: 0 0 10px hsl(var(--primary)); animation: scan-line 3s linear infinite; pointer-events: none; z-index: 100; } /* Floating island effect */ @keyframes floating-island { 0%, 100% { transform: translateY(0) rotateX(0deg) rotateY(0deg); } 25% { transform: translateY(-10px) rotateX(2deg) rotateY(-2deg); } 50% { transform: translateY(-5px) rotateX(0deg) rotateY(2deg); } 75% { transform: translateY(-15px) rotateX(-2deg) rotateY(0deg); } } .floating-island { animation: floating-island 8s ease-in-out infinite; transform-style: preserve-3d; } /* Extreme parallax depth */ .parallax-extreme { transform-style: preserve-3d; perspective: 1000px; } .parallax-layer-1 { transform: translateZ(-100px) scale(1.5); } .parallax-layer-2 { transform: translateZ(-50px) scale(1.25); } .parallax-layer-3 { transform: translateZ(0px) scale(1); } /* Energy wave */ @keyframes energy-wave { 0% { transform: scale(0.5); opacity: 1; } 100% { transform: scale(2); opacity: 0; } } .energy-wave { position: absolute; border: 2px solid hsl(var(--primary)); border-radius: 50%; animation: energy-wave 2s ease-out infinite; } .energy-wave:nth-child(2) { animation-delay: 0.5s; } .energy-wave:nth-child(3) { animation-delay: 1s; } /* Text reveal mask */ @keyframes text-reveal { 0% { clip-path: polygon(0 0, 0 0, 0 100%, 0 100%); } 100% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } } .text-reveal { animation: text-reveal 1s cubic-bezier(0.77, 0, 0.175, 1) forwards; } /* Stagger shake */ @keyframes stagger-shake { 0%, 100% { transform: translateX(0); } 10% { transform: translateX(-5px) rotate(-1deg); } 20% { transform: translateX(5px) rotate(1deg); } 30% { transform: translateX(-5px) rotate(0deg); } 40% { transform: translateX(5px) rotate(1deg); } 50% { transform: translateX(-3px) rotate(-1deg); } 60% { transform: translateX(3px) rotate(0deg); } 70% { transform: translateX(-2px) rotate(-1deg); } 80% { transform: translateX(2px) rotate(1deg); } 90% { transform: translateX(-1px) rotate(0deg); } } .shake-hover:hover { animation: stagger-shake 0.5s ease-in-out; } /* Rainbow border animation */ @keyframes rainbow-border { 0% { border-color: hsl(0, 100%, 60%); } 17% { border-color: hsl(60, 100%, 60%); } 33% { border-color: hsl(120, 100%, 60%); } 50% { border-color: hsl(180, 100%, 60%); } 67% { border-color: hsl(240, 100%, 60%); } 83% { border-color: hsl(300, 100%, 60%); } 100% { border-color: hsl(360, 100%, 60%); } } .rainbow-border { border-width: 3px; border-style: solid; animation: rainbow-border 5s linear infinite; } /* Morphing background */ @keyframes morph-bg { 0%, 100% { background-position: 0% 50%; background-size: 200% 200%; } 50% { background-position: 100% 50%; background-size: 300% 300%; } } .morphing-bg { background: linear-gradient(135deg, hsl(var(--primary)), hsl(280, 65%, 60%), hsl(320, 75%, 55%), hsl(199, 89%, 48%), hsl(var(--primary)) ); background-size: 400% 400%; animation: morph-bg 15s ease infinite; } /* Typing cursor */ @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } .typing-cursor::after { content: '|'; animation: blink 1s step-end infinite; color: hsl(var(--primary)); } /* Hyperdrive lines */ @keyframes hyperdrive { 0% { transform: scale(0) rotate(0deg); opacity: 1; } 100% { transform: scale(50) rotate(180deg); opacity: 0; } } .hyperdrive-line { position: absolute; width: 2px; height: 100px; background: linear-gradient(to bottom, transparent, hsl(var(--primary)), transparent); transform-origin: center bottom; animation: hyperdrive 1s linear infinite; } /* Cosmic dust */ @keyframes cosmic-dust { 0% { transform: translateY(0) rotate(0deg) scale(0); opacity: 0; } 10% { opacity: 1; transform: translateY(-10px) rotate(36deg) scale(1); } 100% { transform: translateY(-200px) rotate(360deg) scale(0); opacity: 0; } } .cosmic-dust { position: absolute; width: 4px; height: 4px; border-radius: 50%; background: hsl(var(--primary)); box-shadow: 0 0 6px hsl(var(--primary)); animation: cosmic-dust 3s ease-out infinite; } /* Spotlight follow */ .spotlight-follow { position: relative; overflow: hidden; } .spotlight-follow::before { content: ''; position: absolute; width: 300px; height: 300px; background: radial-gradient(circle, hsl(var(--primary) / 0.15) 0%, transparent 70%); border-radius: 50%; pointer-events: none; transform: translate(-50%, -50%); transition: opacity 0.3s ease; opacity: 0; } .spotlight-follow:hover::before { opacity: 1; } /* Elastic bounce */ @keyframes elastic-bounce { 0% { transform: scale(1); } 30% { transform: scale(1.25); } 40% { transform: scale(0.9); } 50% { transform: scale(1.15); } 65% { transform: scale(0.95); } 75% { transform: scale(1.05); } 100% { transform: scale(1); } } .elastic-bounce { animation: elastic-bounce 1s cubic-bezier(0.68, -0.55, 0.265, 1.55); } /* Tilt 3D effect */ .tilt-3d { transform-style: preserve-3d; transition: transform 0.3s ease; } .tilt-3d:hover { transform: perspective(1000px) rotateX(10deg) rotateY(-10deg) scale(1.05); } /* Magnetic attraction */ .magnetic { transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1); } /* Quantum particle */ @keyframes quantum { 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.8; } 25% { transform: translate(20px, -20px) scale(0.8); opacity: 0.4; } 50% { transform: translate(-10px, 10px) scale(1.2); opacity: 1; } 75% { transform: translate(-20px, -10px) scale(0.9); opacity: 0.6; } } .quantum-particle { animation: quantum 5s ease-in-out infinite; } /* Inverted perspective */ .inverted-perspective { transform: perspective(500px) rotateX(5deg); transition: transform 0.5s ease; } .inverted-perspective:hover { transform: perspective(500px) rotateX(-5deg) translateY(-10px); } /* Trail effect */ .trail-effect { position: relative; } .trail-effect::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: inherit; opacity: 0; transform: scale(1.1); transition: all 0.3s ease; z-index: -1; } .trail-effect:hover::after { opacity: 0.3; transform: scale(1.2) translateY(10px); } /*霓虹 Noir */ .neon-noir { color: hsl(var(--foreground)); text-shadow: 0 0 5px hsl(var(--primary)), 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)), 0 0 40px hsl(var(--primary)), 0 0 80px hsl(var(--primary)); animation: neon-flicker 0.15s infinite; } @keyframes neon-flicker { 0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { text-shadow: 0 0 5px hsl(var(--primary)), 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)), 0 0 40px hsl(var(--primary)), 0 0 80px hsl(var(--primary)); } 20%, 24%, 55% { text-shadow: none; } } /* Glass morphism extreme */ .glass-extreme { background: linear-gradient( 135deg, hsl(var(--background) / 0.1) 0%, hsl(var(--background) / 0.05) 50%, hsl(var(--background) / 0.1) 100% ); backdrop-filter: blur(20px) saturate(180%); -webkit-backdrop-filter: blur(20px) saturate(180%); border: 1px solid hsl(var(--border) / 0.2); box-shadow: 0 8px 32px hsl(var(--background) / 0.3), inset 0 1px 0 hsl(var(--foreground) / 0.1), inset 0 -1px 0 hsl(var(--background) / 0.1); } /* Cyber grid */ .cyber-grid { background-image: linear-gradient(hsl(var(--primary) / 0.03) 1px, transparent 1px), linear-gradient(90deg, hsl(var(--primary) / 0.03) 1px, transparent 1px); background-size: 50px 50px; animation: grid-move 20s linear infinite; } @keyframes grid-move { 0% { background-position: 0 0; } 100% { background-position: 50px 50px; } } /* Morphing card */ .morph-card { transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1); } .morph-card:hover { border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%; } /* Glitch image */ @keyframes glitch-image { 0% { filter: hue-rotate(0deg); transform: translate(0); } 10% { filter: hue-rotate(90deg); transform: translate(-5px, 5px); } 20% { filter: hue-rotate(180deg); transform: translate(5px, -5px); } 30% { filter: hue-rotate(270deg); transform: translate(-5px, -5px); } 40% { filter: hue-rotate(360deg); transform: translate(5px, 5px); } 50%, 100% { filter: hue-rotate(0deg); transform: translate(0); } } .glitch-image:hover { animation: glitch-image 0.5s ease-in-out; } /* Infinite rotate */ @keyframes infinite-rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .infinite-rotate { animation: infinite-rotate 30s linear infinite; } /* Scale pulse */ @keyframes scale-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } .scale-pulse { animation: scale-pulse 2s ease-in-out infinite; } /* Text scramble effect placeholder */ .scramble-text { font-family: monospace; } /* Bounce in */ @keyframes bounce-in { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.2); } 100% { transform: scale(1); opacity: 1; } } .bounce-in { animation: bounce-in 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55); } /* Slide up fade */ @keyframes slide-up-fade { 0% { transform: translateY(50px); opacity: 0; } 100% { transform: translateY(0); opacity: 1; } } .slide-up-fade { animation: slide-up-fade 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; } /* Glow text */ .glow-text { text-shadow: 0 0 10px hsl(var(--primary)), 0 0 20px hsl(var(--primary)), 0 0 30px hsl(var(--primary)), 0 0 40px hsl(var(--primary)); } /* Extrude 3D */ .extrude-3d { text-shadow: 1px 1px 0 hsl(var(--primary) / 0.3), 2px 2px 0 hsl(var(--primary) / 0.25), 3px 3px 0 hsl(var(--primary) / 0.2), 4px 4px 0 hsl(var(--primary) / 0.15), 5px 5px 0 hsl(var(--primary) / 0.1); transition: all 0.3s ease; } .extrude-3d:hover { text-shadow: 1px 1px 0 hsl(var(--primary) / 0.3), 2px 2px 0 hsl(var(--primary) / 0.25), 3px 3px 0 hsl(var(--primary) / 0.2), 4px 4px 0 hsl(var(--primary) / 0.15), 5px 5px 0 hsl(var(--primary) / 0.1), 6px 6px 10px hsl(var(--background)); transform: translate(-3px, -3px); } /* Suspended animation */ @keyframes suspended { 0%, 100% { transform: translateY(0) rotate(0deg); } 25% { transform: translateY(-8px) rotate(1deg); } 50% { transform: translateY(-4px) rotate(-1deg); } 75% { transform: translateY(-12px) rotate(0.5deg); } } .suspended { animation: suspended 6s ease-in-out infinite; } /* Dynamic underline */ .dynamic-underline { position: relative; display: inline-block; } .dynamic-underline::after { content: ''; position: absolute; bottom: -4px; left: 50%; width: 0; height: 3px; background: linear-gradient(90deg, hsl(var(--primary)), hsl(280, 65%, 60%)); transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); transform: translateX(-50%); border-radius: 2px; } .dynamic-underline:hover::after { width: 120%; } /* Particle burst on click */ @keyframes particle-burst { 0% { transform: translate(0, 0) scale(1); opacity: 1; } 100% { transform: translate(var(--x, 0), var(--y, 0)) scale(0); opacity: 0; } } .particle-burst { position: absolute; width: 10px; height: 10px; border-radius: 50%; background: hsl(var(--primary)); pointer-events: none; animation: particle-burst 0.6s ease-out forwards; }