Files
gremiumhub/landing/app/assets/css/main.css

838 lines
17 KiB
CSS

@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;
}
}