@import 'tailwindcss'; @import '@nuxt/ui'; /* Prevent horizontal overflow from decorative elements (gradient orbs, etc.) */ html, body { overflow-x: hidden; } /* Ensure all content respects container boundaries on mobile (accounts for scrollbar) */ @media (max-width: 640px) { .grid { max-width: 100%; } .grid > * { min-width: 0; max-width: 100%; } } /* Theme configuration with new teal/cyan/violet palette */ @theme { /* Typography - Bricolage Grotesque for headings, DM Sans for body */ --font-sans: 'DM Sans', system-ui, sans-serif; --font-heading: 'Bricolage Grotesque', system-ui, sans-serif; /* Primary color - Teal/Cyan gradient base */ --color-primary-50: #f0fdfa; --color-primary-100: #ccfbf1; --color-primary-200: #99f6e4; --color-primary-300: #5eead4; --color-primary-400: #2dd4bf; --color-primary-500: #14b8a6; --color-primary-600: #0d9488; --color-primary-700: #0f766e; --color-primary-800: #115e59; --color-primary-900: #134e4a; --color-primary-950: #042f2e; /* Accent color - Violet for highlights */ --color-accent-50: #f5f3ff; --color-accent-100: #ede9fe; --color-accent-200: #ddd6fe; --color-accent-300: #c4b5fd; --color-accent-400: #a78bfa; --color-accent-500: #8b5cf6; --color-accent-600: #7c3aed; --color-accent-700: #6d28d9; --color-accent-800: #5b21b6; --color-accent-900: #4c1d95; --color-accent-950: #2e1065; /* Cyan for gradient effects */ --color-cyan-50: #ecfeff; --color-cyan-100: #cffafe; --color-cyan-200: #a5f3fc; --color-cyan-300: #67e8f9; --color-cyan-400: #22d3ee; --color-cyan-500: #06b6d4; --color-cyan-600: #0891b2; --color-cyan-700: #0e7490; --color-cyan-800: #155e75; --color-cyan-900: #164e63; --color-cyan-950: #083344; /* Success color - Emerald */ --color-success-50: #ecfdf5; --color-success-100: #d1fae5; --color-success-200: #a7f3d0; --color-success-300: #6ee7b7; --color-success-400: #34d399; --color-success-500: #10b981; --color-success-600: #059669; --color-success-700: #047857; --color-success-800: #065f46; --color-success-900: #064e3b; --color-success-950: #022c22; /* Warning color - Amber */ --color-warning-50: #fffbeb; --color-warning-100: #fef3c7; --color-warning-200: #fde68a; --color-warning-300: #fcd34d; --color-warning-400: #fbbf24; --color-warning-500: #f59e0b; --color-warning-600: #d97706; --color-warning-700: #b45309; --color-warning-800: #92400e; --color-warning-900: #78350f; --color-warning-950: #451a03; /* Animation durations */ --animate-duration-slow: 1s; --animate-duration-normal: 0.5s; --animate-duration-fast: 0.2s; } /* Heading styles with Bricolage Grotesque */ .font-heading { font-family: var(--font-heading); } h1, h2, h3 { font-family: var(--font-heading); } /* Gradient text effect */ .gradient-text { background: linear-gradient( 135deg, var(--color-primary-500) 0%, var(--color-cyan-500) 50%, var(--color-accent-500) 100% ); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .gradient-text-teal { background: linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-cyan-500) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ============================================ ANIMATIONS ============================================ */ /* Fade in up animation */ @keyframes fade-in-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Fade in animation */ @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } } /* Float animation for orbs */ @keyframes orb-float { 0%, 100% { transform: translate(0, 0) scale(1); } 25% { transform: translate(10px, -20px) scale(1.05); } 50% { transform: translate(-5px, -10px) scale(0.95); } 75% { transform: translate(-15px, -25px) scale(1.02); } } /* Slower float for large elements - more noticeable movement */ @keyframes float-slow { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-15px); } } /* Fast float for small elements */ @keyframes float-fast { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-10px) rotate(2deg); } } /* Gradient rotation for backgrounds */ @keyframes gradient-rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Shimmer effect */ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } /* Pulse glow effect */ @keyframes pulse-glow { 0%, 100% { opacity: 0.5; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.05); } } /* Particle drift */ @keyframes particle-drift { 0% { transform: translate(0, 0) rotate(0deg); opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { transform: translate(var(--drift-x, 100px), var(--drift-y, -100px)) rotate(360deg); opacity: 0; } } /* Scale in animation */ @keyframes scale-in { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } /* Border gradient animation */ @keyframes border-dance { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } /* Count up number animation */ @keyframes count-pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.02); } } /* Tilt hover animation */ @keyframes tilt-hover { 0%, 100% { transform: perspective(1000px) rotateX(0deg) rotateY(0deg); } 25% { transform: perspective(1000px) rotateX(2deg) rotateY(-2deg); } 75% { transform: perspective(1000px) rotateX(-2deg) rotateY(2deg); } } /* ============================================ ANIMATION UTILITY CLASSES ============================================ */ .animate-fade-in-up { animation: fade-in-up 0.7s ease-out forwards; } .animate-fade-in { animation: fade-in 0.5s ease-out forwards; } .animate-orb-float { animation: orb-float 20s ease-in-out infinite; } .animate-float-slow { animation: float-slow 4s ease-in-out infinite; } .animate-float-fast { animation: float-fast 4s ease-in-out infinite; } .animate-gradient-rotate { animation: gradient-rotate 20s linear infinite; } .animate-shimmer { background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); background-size: 200% 100%; animation: shimmer 2s infinite; } .animate-pulse-glow { animation: pulse-glow 3s ease-in-out infinite; } .animate-scale-in { animation: scale-in 0.6s ease-out forwards; } .animate-border-dance { background-size: 200% 200%; animation: border-dance 4s ease infinite; } .animate-tilt-hover { animation: tilt-hover 6s ease-in-out infinite; } /* Staggered animation delays */ .delay-75 { animation-delay: 75ms; } .delay-100 { animation-delay: 100ms; } .delay-150 { animation-delay: 150ms; } .delay-200 { animation-delay: 200ms; } .delay-300 { animation-delay: 300ms; } .delay-400 { animation-delay: 400ms; } .delay-500 { animation-delay: 500ms; } .delay-600 { animation-delay: 600ms; } .delay-700 { animation-delay: 700ms; } .delay-800 { animation-delay: 800ms; } .delay-1000 { animation-delay: 1000ms; } /* Initial state for animated elements */ .animate-on-scroll { opacity: 0; } .animate-on-scroll.is-visible { animation: fade-in-up 0.7s ease-out forwards; } /* ============================================ REDUCED MOTION SUPPORT ============================================ */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .animate-orb-float, .animate-float-slow, .animate-float-fast, .animate-gradient-rotate, .animate-shimmer, .animate-pulse-glow, .animate-border-dance, .animate-tilt-hover { animation: none; } } /* ============================================ GRADIENT BACKGROUNDS ============================================ */ /* Light hero gradient with orbs */ .hero-gradient-light { background: linear-gradient(180deg, #ffffff 0%, #f0fdfa 50%, #ecfeff 100%); } /* Dark hero gradient */ .dark .hero-gradient-light { background: linear-gradient(180deg, #0a0a0a 0%, #042f2e 50%, #083344 100%); } /* Gradient orb styles */ .gradient-orb { position: absolute; border-radius: 50%; filter: blur(80px); opacity: 0.6; } .gradient-orb-teal { background: linear-gradient(135deg, var(--color-primary-400), var(--color-cyan-400)); } .gradient-orb-violet { background: linear-gradient(135deg, var(--color-accent-400), var(--color-accent-600)); } .gradient-orb-cyan { background: linear-gradient(135deg, var(--color-cyan-300), var(--color-primary-400)); } .dark .gradient-orb { opacity: 0.3; } /* Mesh gradient for CTAs */ .mesh-gradient-cta { background: radial-gradient(at 40% 20%, var(--color-primary-500) 0px, transparent 50%), radial-gradient(at 80% 0%, var(--color-cyan-400) 0px, transparent 50%), radial-gradient(at 0% 50%, var(--color-accent-500) 0px, transparent 50%), radial-gradient(at 80% 50%, var(--color-primary-400) 0px, transparent 50%), radial-gradient(at 0% 100%, var(--color-cyan-500) 0px, transparent 50%), linear-gradient(135deg, var(--color-primary-600) 0%, var(--color-accent-600) 100%); } /* ============================================ GLASS MORPHISM ============================================ */ .glass { background: rgba(255, 255, 255, 0.7); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.3); } .dark .glass { background: rgba(0, 0, 0, 0.4); border: 1px solid rgba(255, 255, 255, 0.1); } .glass-subtle { background: rgba(255, 255, 255, 0.5); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); } .dark .glass-subtle { background: rgba(0, 0, 0, 0.3); border: 1px solid rgba(255, 255, 255, 0.05); } /* ============================================ CARD EFFECTS ============================================ */ /* Card with gradient border on hover */ .card-gradient-border { position: relative; background: white; border-radius: 1rem; transition: all 0.3s ease; } .card-gradient-border::before { content: ''; position: absolute; inset: -2px; border-radius: inherit; background: linear-gradient(135deg, var(--color-primary-400), var(--color-cyan-400), var(--color-accent-400)); opacity: 0; transition: opacity 0.3s ease; z-index: -1; } .card-gradient-border:hover::before { opacity: 1; } .dark .card-gradient-border { background: #1a1a1a; } /* Card hover lift effect - subtle version without clipping issues */ .card-hover-lift { transition: transform 0.3s ease, box-shadow 0.3s ease; } .card-hover-lift:hover { transform: translateY(-4px); box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); } /* Spotlight effect for cards */ .card-spotlight { position: relative; overflow: hidden; } .card-spotlight::after { content: ''; position: absolute; inset: 0; background: radial-gradient( 600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(20, 184, 166, 0.1), transparent 40% ); opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } .card-spotlight:hover::after { opacity: 1; } /* 3D tilt effect */ .card-3d { transform-style: preserve-3d; perspective: 1000px; } .card-3d-inner { transition: transform 0.3s ease; transform-style: preserve-3d; } .card-3d:hover .card-3d-inner { transform: rotateX(5deg) rotateY(-5deg); } /* ============================================ BUTTON STYLES ============================================ */ /* Gradient button */ .btn-gradient { background: linear-gradient(135deg, var(--color-primary-500) 0%, var(--color-cyan-500) 100%); color: white; border: none; position: relative; overflow: hidden; transition: all 0.3s ease; } .btn-gradient::before { content: ''; position: absolute; inset: 0; background: linear-gradient(135deg, var(--color-cyan-500) 0%, var(--color-accent-500) 100%); opacity: 0; transition: opacity 0.3s ease; } .btn-gradient:hover::before { opacity: 1; } .btn-gradient span { position: relative; z-index: 1; } /* Outline gradient button */ .btn-outline-gradient { position: relative; background: transparent; border: 2px solid transparent; background-image: linear-gradient(white, white), linear-gradient(135deg, var(--color-primary-500), var(--color-cyan-500)); background-origin: border-box; background-clip: padding-box, border-box; transition: all 0.3s ease; } .dark .btn-outline-gradient { background-image: linear-gradient(#1a1a1a, #1a1a1a), linear-gradient(135deg, var(--color-primary-500), var(--color-cyan-500)); } .btn-outline-gradient:hover { background-image: linear-gradient(var(--color-primary-50), var(--color-primary-50)), linear-gradient(135deg, var(--color-primary-500), var(--color-cyan-500)); } .dark .btn-outline-gradient:hover { background-image: linear-gradient(var(--color-primary-950), var(--color-primary-950)), linear-gradient(135deg, var(--color-primary-500), var(--color-cyan-500)); } /* ============================================ DECORATIVE ELEMENTS ============================================ */ /* Dots pattern */ .dots-pattern { background-image: radial-gradient(var(--color-primary-200) 1px, transparent 1px); background-size: 24px 24px; } .dark .dots-pattern { background-image: radial-gradient(var(--color-primary-800) 1px, transparent 1px); } /* Grid pattern */ .grid-pattern { background-image: linear-gradient(to right, var(--color-primary-100) 1px, transparent 1px), linear-gradient(to bottom, var(--color-primary-100) 1px, transparent 1px); background-size: 40px 40px; } .dark .grid-pattern { background-image: linear-gradient(to right, var(--color-primary-900) 1px, transparent 1px), linear-gradient(to bottom, var(--color-primary-900) 1px, transparent 1px); } /* Section divider with gradient */ .section-divider { height: 1px; background: linear-gradient(90deg, transparent, var(--color-primary-300), var(--color-cyan-300), transparent); } .dark .section-divider { background: linear-gradient(90deg, transparent, var(--color-primary-700), var(--color-cyan-700), transparent); } /* Gradient line accent */ .gradient-line { height: 4px; border-radius: 2px; background: linear-gradient(90deg, var(--color-primary-500), var(--color-cyan-500), var(--color-accent-500)); } /* ============================================ ACCESSIBILITY ============================================ */ /* Focus styles */ :focus-visible { outline: 2px solid var(--color-primary-500); outline-offset: 2px; } /* Skip link */ .skip-link { position: absolute; top: -40px; left: 0; background: var(--color-primary-600); color: white; padding: 8px 16px; z-index: 100; transition: top 0.3s; border-radius: 0 0 8px 0; } .skip-link:focus { top: 0; } /* ============================================ PARTICLES (for newsletter section) ============================================ */ .particle { position: absolute; width: 6px; height: 6px; border-radius: 50%; background: var(--color-primary-400); opacity: 0; animation: particle-drift 8s ease-in-out infinite; } .particle:nth-child(1) { --drift-x: 80px; --drift-y: -120px; animation-delay: 0s; left: 10%; top: 80%; } .particle:nth-child(2) { --drift-x: -60px; --drift-y: -100px; animation-delay: 1s; left: 20%; top: 70%; } .particle:nth-child(3) { --drift-x: 100px; --drift-y: -80px; animation-delay: 2s; left: 80%; top: 90%; } .particle:nth-child(4) { --drift-x: -80px; --drift-y: -140px; animation-delay: 3s; left: 70%; top: 75%; } .particle:nth-child(5) { --drift-x: 60px; --drift-y: -90px; animation-delay: 4s; left: 30%; top: 85%; } .particle:nth-child(6) { --drift-x: -100px; --drift-y: -110px; animation-delay: 5s; left: 90%; top: 80%; } .particle:nth-child(7) { --drift-x: 40px; --drift-y: -130px; animation-delay: 6s; left: 50%; top: 95%; } .particle:nth-child(8) { --drift-x: -40px; --drift-y: -70px; animation-delay: 7s; left: 40%; top: 70%; } /* Particle color variations */ .particle:nth-child(odd) { background: var(--color-cyan-400); } .particle:nth-child(3n) { background: var(--color-accent-400); width: 8px; height: 8px; } /* ============================================ BENTO GRID ============================================ */ .bento-grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: minmax(200px, auto); gap: 1.5rem; } .bento-item-large { grid-column: span 2; grid-row: span 2; } .bento-item-tall { grid-row: span 2; } .bento-item-wide { grid-column: span 2; } @media (max-width: 1024px) { .bento-grid { grid-template-columns: repeat(2, 1fr); } .bento-item-large { grid-column: span 2; grid-row: span 1; } } @media (max-width: 640px) { .bento-grid { grid-template-columns: 1fr; } .bento-item-large, .bento-item-wide { grid-column: span 1; } .bento-item-tall { grid-row: span 1; } }