diff --git a/apps/web-client/src/app/globals.css b/apps/web-client/src/app/globals.css index cfe9ade9..7fb3fcd4 100644 --- a/apps/web-client/src/app/globals.css +++ b/apps/web-client/src/app/globals.css @@ -147,12 +147,36 @@ @keyframes fadeIn { from { opacity: 0; - transform: translateY(8px); + transform: translateY(20px); + filter: blur(10px); } to { opacity: 1; transform: translateY(0); + filter: blur(0); + } +} + +/** + * EN: Mesh Gradient Animation - Creates dynamic moving color spots + * VI: Animation Mesh Gradient - Tạo các đốm màu di chuyển động + */ +@keyframes mesh-move { + 0% { + transform: translate(0, 0) scale(1); + } + + 33% { + transform: translate(5%, 10%) scale(1.1); + } + + 66% { + transform: translate(-5%, 5%) scale(0.9); + } + + 100% { + transform: translate(0, 0) scale(1); } } @@ -176,7 +200,48 @@ */ @layer utilities { .animate-fadeIn { - animation: fadeIn 0.3s ease-out forwards; + animation: fadeIn 0.8s var(--ease-spring) forwards; + } + + .mesh-gradient { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -20; + background: var(--bg-primary); + overflow: hidden; + } + + .mesh-spot { + position: absolute; + border-radius: 50%; + filter: blur(80px); + opacity: 0.15; + animation: mesh-move 20s infinite alternate var(--ease-in-out); + } + + .text-glow { + text-shadow: 0 0 20px rgba(255, 255, 255, 0.3); + } + + .text-brand-glow { + text-shadow: 0 0 30px rgba(59, 130, 246, 0.5); + } + + .glass-card { + background: var(--glass-bg); + backdrop-filter: blur(var(--glass-blur)); + border: 1px solid var(--glass-border); + transition: all var(--duration-normal) var(--ease-in-out); + } + + .glass-card:hover { + background: var(--glass-bg-hover); + border-color: rgba(59, 130, 246, 0.4); + transform: translateY(-4px); + box-shadow: var(--shadow-brand-lg); } .animate-shimmer { diff --git a/apps/web-client/src/app/page.tsx b/apps/web-client/src/app/page.tsx index 3b588a6f..94aee9ce 100644 --- a/apps/web-client/src/app/page.tsx +++ b/apps/web-client/src/app/page.tsx @@ -61,79 +61,98 @@ export default function Home() { return ( <> - {/* EN: Main content area with brand gradient background / VI: Khu vực nội dung chính với background gradient thương hiệu */} -
- {/* EN: Brand gradient overlay / VI: Overlay gradient thương hiệu */} -
- {/* EN: Decorative brand dots / VI: Chấm trang trí thương hiệu */} -
-
-
+ {/* EN: Dynamic Background - Mesh Gradient / VI: Nền động - Mesh Gradient */} +
+
+
+
+
-
- {/* EN: Brand Logo / VI: Logo thương hiệu */} -
- -
+
+ {/* EN: Decorative brand elements / VI: Các yếu tố trang trí thương hiệu */} +
+
- {/* EN: Hero Title / VI: Tiêu đề Hero */} -

- {t('home.title')} -

+
+ {/* EN: Hero Section / VI: Phần Hero */} +
+ - {/* EN: Subtitle/Description / VI: Phụ đề/Mô tả */} -

- {t('home.description')} -

+

+ {t('home.title')} +

- {/* EN: Conditional rendering based on authentication status / VI: Render có điều kiện dựa trên trạng thái xác thực */} -
- {isAuthenticated && user ? ( - // EN: Authenticated user welcome message / VI: Thông báo chào mừng người dùng đã xác thực -
-
- {user.email?.[0].toUpperCase()} -
-

- {t('home.welcome', { email: user.email })} -

-
- - {t('home.role', { role: user.role })} -
-
- ) : ( - // EN: Login prompt for unauthenticated users / VI: Nhắc đăng nhập cho người dùng chưa xác thực -
-

- {t('home.pleaseLogin')} -

-
+

+ {t('home.description')} +

+ +
+ {!isAuthenticated ? ( + <> + + ) : ( + + )} +
+
+ + {/* EN: Status / Context Area / VI: Khu vực trạng thái / ngữ cảnh */} +
+ {isAuthenticated && user ? ( +
+
+
+
+ {user.email?.[0].toUpperCase()} +
+
+

+ {t('home.welcome', { email: user.email })} +

+
+ + {user.role} +
+
+
+ ) : ( +
+
+

+ {t('home.pleaseLogin')} +

)}
- {/* EN: Feature highlights / VI: Điểm nổi bật tính năng */} + {/* EN: Feature Highlights / VI: Điểm nổi bật tính năng */} {!isAuthenticated && ( -
+
{[ { title: 'Fast Development', icon: Zap, desc: 'Build and deploy in minutes' }, { title: 'Enterprise Ready', icon: Building, desc: 'Production-grade platform' }, @@ -141,21 +160,25 @@ export default function Home() { ].map((feature, index) => (
-
- +
+
-

+

{feature.title}

-

{feature.desc}

+

+ {feature.desc} +

))}
)}
+