diff --git a/src/app/globals.css b/src/app/globals.css index 104d828..3ba615b 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -174,10 +174,11 @@ font-family: var(--font-sans); letter-spacing: var(--tracking-normal); background: linear-gradient(135deg, - #1a1a2e 0%, - #16213e 25%, - #1a1a2e 50%, - #0f0f1a 75%, + #0f0f1a 0%, + #1a1a2e 20%, + #16213e 40%, + #1a1a2e 60%, + #0f0f1a 80%, #1a1a2e 100%); background-attachment: fixed; min-height: 100vh; @@ -191,9 +192,11 @@ right: 0; bottom: 0; background: - radial-gradient(ellipse at 20% 20%, rgba(120, 119, 198, 0.15) 0%, transparent 50%), - radial-gradient(ellipse at 80% 80%, rgba(74, 85, 104, 0.2) 0%, transparent 50%), - radial-gradient(ellipse at 40% 60%, rgba(45, 55, 72, 0.15) 0%, transparent 40%); + radial-gradient(ellipse at 15% 10%, rgba(99, 102, 241, 0.15) 0%, transparent 40%), + radial-gradient(ellipse at 85% 20%, rgba(168, 85, 247, 0.12) 0%, transparent 35%), + radial-gradient(ellipse at 50% 50%, rgba(45, 55, 72, 0.1) 0%, transparent 50%), + radial-gradient(ellipse at 20% 80%, rgba(34, 197, 94, 0.08) 0%, transparent 40%), + radial-gradient(ellipse at 80% 85%, rgba(239, 68, 68, 0.08) 0%, transparent 35%); pointer-events: none; z-index: -1; } @@ -202,4 +205,257 @@ .rdp { --rdp-cell-size: 36px; } + + /* Mobile calendar adjustments */ + @media (max-width: 640px) { + .rdp { + --rdp-cell-size: 32px; + font-size: 0.875rem; + } + } +} + +/* Animation keyframes */ +@keyframes fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes fade-in-up { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fade-in-down { + from { + opacity: 0; + transform: translateY(-20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes scale-in { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes slide-in-right { + from { + opacity: 0; + transform: translateX(20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes slide-in-left { + from { + opacity: 0; + transform: translateX(-20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes pulse-subtle { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.7; } +} + +@keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-5px); } +} + +@keyframes shimmer { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +@keyframes glow { + 0%, 100% { box-shadow: 0 0 5px rgba(99, 102, 241, 0.5); } + 50% { box-shadow: 0 0 20px rgba(99, 102, 241, 0.8); } +} + +/* Animation utility classes */ +.animate-fade-in { + animation: fade-in 0.5s ease-out forwards; +} + +.animate-fade-in-up { + animation: fade-in-up 0.5s ease-out forwards; +} + +.animate-fade-in-down { + animation: fade-in-down 0.5s ease-out forwards; +} + +.animate-scale-in { + animation: scale-in 0.4s ease-out forwards; +} + +.animate-slide-in-right { + animation: slide-in-right 0.5s ease-out forwards; +} + +.animate-slide-in-left { + animation: slide-in-left 0.5s ease-out forwards; +} + +.animate-pulse-subtle { + animation: pulse-subtle 2s ease-in-out infinite; +} + +.animate-float { + animation: float 3s ease-in-out infinite; +} + +.animate-glow { + animation: glow 2s ease-in-out infinite; +} + +/* Stagger delay utilities */ +.delay-100 { animation-delay: 100ms; } +.delay-200 { animation-delay: 200ms; } +.delay-300 { animation-delay: 300ms; } +.delay-400 { animation-delay: 400ms; } +.delay-500 { animation-delay: 500ms; } + +/* Start hidden for animations */ +.opacity-0 { opacity: 0; } + +/* Smooth transitions */ +.transition-smooth { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Interactive hover effects */ +.hover-lift { + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.hover-lift:hover { + transform: translateY(-2px); + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3); +} + +.hover-scale { + transition: transform 0.2s ease; +} + +.hover-scale:hover { + transform: scale(1.02); +} + +.hover-glow { + transition: box-shadow 0.3s ease; +} + +.hover-glow:hover { + box-shadow: 0 0 20px rgba(99, 102, 241, 0.4); +} + +/* Glassmorphism effect */ +.glass { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.glass-strong { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.15); +} + +/* Premium card effect */ +.card-premium { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); + backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.18); + box-shadow: + 0 8px 32px rgba(0, 0, 0, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.1); +} + +/* Gradient text */ +.gradient-text { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.gradient-text-warm { + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* Subtle inner glow for cards */ +.inner-glow { + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); +} + +/* Text shadow for better readability */ +.text-shadow { + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} + +.text-shadow-sm { + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +/* Gradient borders */ +.gradient-border { + position: relative; +} + +.gradient-border::before { + content: ''; + position: absolute; + inset: 0; + border-radius: inherit; + padding: 1px; + background: linear-gradient(135deg, rgba(99, 102, 241, 0.5), rgba(168, 85, 247, 0.5)); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + pointer-events: none; +} + +/* Noise texture overlay for depth */ +.noise-overlay { + position: relative; +} + +.noise-overlay::after { + 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='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); + opacity: 0.03; + pointer-events: none; + border-radius: inherit; } diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx index 4e492fc..5406971 100644 --- a/src/components/Dashboard.tsx +++ b/src/components/Dashboard.tsx @@ -137,35 +137,43 @@ export function Dashboard({ user }: DashboardProps) { {preferences && ( <> {/* Floating Log Button */} -