- Migrated from Express.js to Next.js 15 with TypeScript - Added Docker Compose v2 with multi-stage builds - Implemented Docker Bake support for improved builds - Created professional component structure with Tailwind CSS - Added enhanced visual design with glass morphism effects - Improved responsive layout and better UX flow - Updated all dependencies and configurations - Added proper TypeScript types and modern practices - Created development scripts for easy container management - Cleaned up excessive animations for better user experience
335 lines
6.8 KiB
CSS
335 lines
6.8 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
:root {
|
|
--font-heading: 'Fredoka One', cursive;
|
|
--font-body: 'Open Sans', sans-serif;
|
|
--primary-color: #667eea;
|
|
--secondary-color: #764ba2;
|
|
--accent-color: #f093fb;
|
|
--gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
--gradient-secondary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
|
--gradient-rainbow: linear-gradient(135deg, #667eea 0%, #764ba2 25%, #f093fb 50%, #f5576c 75%, #4facfe 100%);
|
|
--glass-primary: rgba(255, 255, 255, 0.25);
|
|
--glass-secondary: rgba(255, 255, 255, 0.15);
|
|
}
|
|
|
|
/* Custom animations */
|
|
@keyframes float {
|
|
0%, 100% {
|
|
transform: translateY(0px) rotate(0deg);
|
|
}
|
|
33% {
|
|
transform: translateY(-15px) rotate(1deg);
|
|
}
|
|
66% {
|
|
transform: translateY(-5px) rotate(-1deg);
|
|
}
|
|
}
|
|
|
|
@keyframes bounce-slow {
|
|
0%, 20%, 53%, 80%, 100% {
|
|
animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
|
|
transform: translate3d(0,0,0);
|
|
}
|
|
40%, 43% {
|
|
animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
|
|
transform: translate3d(0, -30px, 0);
|
|
}
|
|
70% {
|
|
animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
|
|
transform: translate3d(0, -15px, 0);
|
|
}
|
|
90% {
|
|
transform: translate3d(0,-4px,0);
|
|
}
|
|
}
|
|
|
|
@keyframes pulse-slow {
|
|
0%, 100% {
|
|
opacity: 0.6;
|
|
transform: scale(1);
|
|
}
|
|
50% {
|
|
opacity: 1;
|
|
transform: scale(1.05);
|
|
}
|
|
}
|
|
|
|
@keyframes rainbow {
|
|
0% { background-position: 0% 50%; }
|
|
50% { background-position: 100% 50%; }
|
|
100% { background-position: 0% 50%; }
|
|
}
|
|
|
|
@keyframes sparkle {
|
|
0%, 100% { transform: scale(0) rotate(0deg); opacity: 0; }
|
|
50% { transform: scale(1) rotate(180deg); opacity: 1; }
|
|
}
|
|
|
|
@keyframes shimmer {
|
|
0% {
|
|
background-position: -1000px 0;
|
|
}
|
|
100% {
|
|
background-position: 1000px 0;
|
|
}
|
|
}
|
|
|
|
@keyframes glow {
|
|
0%, 100% {
|
|
box-shadow: 0 0 20px rgba(102, 126, 234, 0.3);
|
|
}
|
|
50% {
|
|
box-shadow: 0 0 40px rgba(102, 126, 234, 0.6), 0 0 60px rgba(118, 75, 162, 0.4);
|
|
}
|
|
}
|
|
|
|
@keyframes spin-slow {
|
|
from {
|
|
transform: rotate(0deg);
|
|
}
|
|
to {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
|
|
/* Utility classes */
|
|
.animate-float {
|
|
animation: float 6s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-bounce-slow {
|
|
animation: bounce-slow 2s infinite;
|
|
}
|
|
|
|
.animate-pulse-slow {
|
|
animation: pulse-slow 3s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-rainbow {
|
|
animation: rainbow 3s ease infinite;
|
|
background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
|
|
background-size: 400% 400%;
|
|
}
|
|
|
|
.animate-shimmer {
|
|
animation: shimmer 2s infinite;
|
|
background: linear-gradient(
|
|
90deg,
|
|
transparent,
|
|
rgba(255, 255, 255, 0.4),
|
|
transparent
|
|
);
|
|
background-size: 1000px 100%;
|
|
}
|
|
|
|
.animate-glow {
|
|
animation: glow 3s ease-in-out infinite;
|
|
}
|
|
|
|
.animate-spin-slow {
|
|
animation: spin-slow 8s linear infinite;
|
|
}
|
|
|
|
/* Robot animations */
|
|
.robot-eye {
|
|
animation: blink 3s infinite;
|
|
}
|
|
|
|
@keyframes blink {
|
|
0%, 90%, 100% { height: 20px; }
|
|
95% { height: 2px; }
|
|
}
|
|
|
|
/* Glass morphism effect */
|
|
.glass {
|
|
background: var(--glass-primary);
|
|
backdrop-filter: blur(15px);
|
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.glass-secondary {
|
|
background: var(--glass-secondary);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
/* Button styles */
|
|
.btn-primary {
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
color: white;
|
|
font-weight: 600;
|
|
padding: 12px 24px;
|
|
border-radius: 16px;
|
|
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
|
|
transform: translateY(0);
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
border: none;
|
|
cursor: pointer;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
|
|
}
|
|
|
|
.btn-primary:active {
|
|
transform: translateY(0);
|
|
}
|
|
|
|
.btn-secondary {
|
|
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
|
color: white;
|
|
font-weight: 600;
|
|
padding: 10px 20px;
|
|
border-radius: 12px;
|
|
box-shadow: 0 4px 12px rgba(240, 147, 251, 0.3);
|
|
transform: translateY(0);
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
border: none;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.btn-secondary:hover {
|
|
background: linear-gradient(135deg, #e879f9 0%, #ef4444 100%);
|
|
transform: translateY(-1px);
|
|
box-shadow: 0 6px 18px rgba(240, 147, 251, 0.4);
|
|
}
|
|
|
|
/* Card styles */
|
|
.card {
|
|
background: white;
|
|
border-radius: 20px;
|
|
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.1);
|
|
padding: 24px;
|
|
transform: translateY(0);
|
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
}
|
|
|
|
.card:hover {
|
|
box-shadow: 0 30px 70px rgba(0, 0, 0, 0.15);
|
|
transform: translateY(-8px);
|
|
}
|
|
|
|
.card-glass {
|
|
background: var(--glass-primary);
|
|
backdrop-filter: blur(15px);
|
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
border-radius: 20px;
|
|
padding: 24px;
|
|
transform: scale(1);
|
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.card-glass:hover {
|
|
transform: scale(1.02);
|
|
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
/* Gradient text */
|
|
.gradient-text {
|
|
background: linear-gradient(135deg, #667eea 0%, #f093fb 50%, #667eea 100%);
|
|
background-size: 200% 200%;
|
|
background-clip: text;
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
animation: rainbow 4s ease infinite;
|
|
}
|
|
|
|
/* Interactive elements */
|
|
.interactive-hover {
|
|
transform: scale(1);
|
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
cursor: pointer;
|
|
}
|
|
|
|
.interactive-hover:hover {
|
|
transform: scale(1.05);
|
|
}
|
|
|
|
/* Sparkle effect */
|
|
.sparkle::before {
|
|
content: '✨';
|
|
position: absolute;
|
|
animation: sparkle 2s infinite;
|
|
}
|
|
|
|
/* Custom scrollbar */
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #f1f1f1;
|
|
border-radius: 10px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: linear-gradient(45deg, #667eea, #764ba2);
|
|
border-radius: 10px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: linear-gradient(45deg, #5a67d8, #6b46c1);
|
|
}
|
|
|
|
/* Typography */
|
|
.heading-font {
|
|
font-family: var(--font-heading);
|
|
}
|
|
|
|
.body-font {
|
|
font-family: var(--font-body);
|
|
}
|
|
|
|
@keyframes blink {
|
|
0%, 90%, 100% {
|
|
transform: scaleY(1);
|
|
}
|
|
95% {
|
|
transform: scaleY(0.1);
|
|
}
|
|
}
|
|
|
|
/* Gradient backgrounds */
|
|
.gradient-primary {
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
}
|
|
|
|
.gradient-secondary {
|
|
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
|
|
}
|
|
|
|
/* Glass morphism effect */
|
|
.glass {
|
|
background: rgba(255, 255, 255, 0.25);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
}
|
|
|
|
/* Custom scrollbar */
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #f1f1f1;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #667eea;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #5a67d8;
|
|
}
|