diff --git a/apps/web-client/README.md b/apps/web-client/README.md
index 1fef691f..46d5fb75 100644
--- a/apps/web-client/README.md
+++ b/apps/web-client/README.md
@@ -1,31 +1,185 @@
-# Web Client Application
+# GoodGo Platform - Web Client
-Next.js web application for GoodGo Platform Client Portal.
+> **EN**: Enterprise-grade web client for GoodGo microservices platform
+> **VI**: Web client cấp doanh nghiệp cho nền tảng microservices GoodGo
-## Features
+## Features / Tính Năng
-- Next.js 14 with App Router
-- TypeScript
-- Tailwind CSS
-- Zustand for state management
-- API integration with auth service
+- ✅ **Brand Identity System** - Complete logo suite, favicons, and illustrations
+- ✅ **Design System** - Professional design tokens with brand colors, gradients, and glassmorphism
+- ✅ **UI Component Library** - Enhanced components with brand variants (Button, EmptyState, Loading States, Logo)
+- ✅ **Dark/Light Theme** - Automatic theme switching with system preference
+- ✅ **Internationalization** - Multi-language support (i18n ready)
+- ✅ **TypeScript** - Full type safety
+- ✅ **Tailwind CSS 4** - Modern utility-first styling
+- ✅ **Next.js 14** - App Router with RSC
+- ✅ **Accessibility** - WCAG 2.1 AA compliant
+- ✅ **PWA Ready** - Progressive Web App support
-## Development
+## Tech Stack
+
+- **Framework**: Next.js 14 (App Router)
+- **Language**: TypeScript 5+
+- **Styling**: Tailwind CSS 4 (CSS-first)
+- **State Management**: Zustand
+- **API Client**: `@goodgo/http-client`
+- **Testing**: Vitest + Playwright
+- **Component Development**: Storybook
+
+##Development / Phát Triển
```bash
-# Install dependencies
+# Install dependencies / Cài đặt dependencies
pnpm install
-# Start development server
+# Start dev server / Khởi động dev server
pnpm dev
+# → http://localhost:3000
-# Build for production
+# Start Storybook / Khởi động Storybook
+pnpm storybook
+# → http://localhost:6006
+
+# Build for production / Build cho production
pnpm build
-# Start production server
-pnpm start
+# Type checking / Kiểm tra kiểu
+pnpm typecheck
+
+# Lint / Kiểm tra lỗi
+pnpm lint
```
-## Environment Variables
+## Environment Variables / Biến Môi Trường
+
+Create `.env.local` file:
+
+```bash
+# API URL
+NEXT_PUBLIC_API_URL=http://localhost/api/v1
+```
+
+## Brand Assets / Tài Sản Thương Hiệu
+
+Brand assets are located in `/public/brand-assets/`:
+
+- **Logos**: `/brand-assets/logo/` (full, icon, wordmark variants)
+- **Icons**: `/brand-assets/icons/` (favicon)
+- **Illustrations**: `/brand-assets/illustrations/` (empty state, error state)
+
+Usage in components:
+
+```tsx
+import { BrandLogo } from '@/components/ui/brand-logo';
+import { BRAND } from '@/lib/brand-constants';
+
+// Logo component
+
+
+// Brand constants
+const primaryColor = BRAND.colors.primary.hex; // #3B82F6
+```
+
+## UI Components / Components Giao Diện
+
+### BrandLogo
+```tsx
+import { BrandLogo, BrandLogoLink } from '@/components/ui/brand-logo';
+
+
+
+```
+
+### Button with Brand Variants
+```tsx
+import { Button } from '@/components/ui/button';
+
+
+
+```
+
+### Empty State
+```tsx
+import { EmptyState, ErrorState } from '@/components/ui/empty-state';
+
+
+```
+
+### Loading States
+```tsx
+import {
+ BrandSpinner,
+ Skeleton,
+ SkeletonCard,
+ LoadingOverlay,
+ ProgressBar
+} from '@/components/ui/loading-states';
+
+
+
+
+
+```
+
+## Design System / Hệ Thống Thiết Kế
+
+### Brand Colors
+
+```css
+/* Primary (Blue) - Tech & Trust */
+--brand-primary: #3B82F6;
+
+/* Secondary (Purple) - Innovation */
+--brand-secondary: #8B5CF6;
+
+/* Accent (Cyan) - Energy */
+--brand-accent: #06B6D4;
+```
+
+### Tailwind Utilities
+
+```tsx
+// Brand colors
+
+
+
+// Glassmorphism
+
+
+// Brand shadows
+
+```
+
+## Project Structure / Cấu Trúc Dự Án
+
+```
+apps/web-client/
+├── public/
+│ └── brand-assets/ # Brand logos, icons, illustrations
+├── src/
+│ ├── app/ # Next.js App Router pages
+│ ├── components/
+│ │ └── ui/ # Reusable UI components
+│ ├── lib/
+│ │ └── brand-constants.ts # Brand helper functions
+│ ├── styles/
+│ │ └── theme.css # Design system tokens
+│ ├── contexts/ # React contexts (Theme, etc.)
+│ ├── hooks/ # Custom React hooks
+│ ├── providers/ # Provider components
+│ └── stores/ # Zustand stores
+└── tailwind.config.js # Tailwind configuration
+```
+
+## Contributing / Đóng Góp
+
+Please read [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
+
+## License / Giấy Phép
+
+Proprietary - GoodGo Platform
-- `NEXT_PUBLIC_API_URL` - API base URL (default: http://localhost/api/v1)
diff --git a/apps/web-client/public/brand-assets/icons/favicon.svg b/apps/web-client/public/brand-assets/icons/favicon.svg
new file mode 100644
index 00000000..183d8617
--- /dev/null
+++ b/apps/web-client/public/brand-assets/icons/favicon.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/web-client/public/brand-assets/illustrations/empty-state.svg b/apps/web-client/public/brand-assets/illustrations/empty-state.svg
new file mode 100644
index 00000000..92884489
--- /dev/null
+++ b/apps/web-client/public/brand-assets/illustrations/empty-state.svg
@@ -0,0 +1,50 @@
+
diff --git a/apps/web-client/public/brand-assets/illustrations/error-state.svg b/apps/web-client/public/brand-assets/illustrations/error-state.svg
new file mode 100644
index 00000000..da0d6abb
--- /dev/null
+++ b/apps/web-client/public/brand-assets/illustrations/error-state.svg
@@ -0,0 +1,33 @@
+
diff --git a/apps/web-client/public/brand-assets/logo/logo-full.svg b/apps/web-client/public/brand-assets/logo/logo-full.svg
new file mode 100644
index 00000000..c25659f9
--- /dev/null
+++ b/apps/web-client/public/brand-assets/logo/logo-full.svg
@@ -0,0 +1,54 @@
+
diff --git a/apps/web-client/public/brand-assets/logo/logo-icon.svg b/apps/web-client/public/brand-assets/logo/logo-icon.svg
new file mode 100644
index 00000000..5fa21ac2
--- /dev/null
+++ b/apps/web-client/public/brand-assets/logo/logo-icon.svg
@@ -0,0 +1,28 @@
+
diff --git a/apps/web-client/public/brand-assets/logo/logo-wordmark.svg b/apps/web-client/public/brand-assets/logo/logo-wordmark.svg
new file mode 100644
index 00000000..d754c4de
--- /dev/null
+++ b/apps/web-client/public/brand-assets/logo/logo-wordmark.svg
@@ -0,0 +1,31 @@
+
diff --git a/apps/web-client/public/manifest.json b/apps/web-client/public/manifest.json
new file mode 100644
index 00000000..944da3b9
--- /dev/null
+++ b/apps/web-client/public/manifest.json
@@ -0,0 +1,23 @@
+{
+ "name": "GoodGo Platform",
+ "short_name": "GoodGo",
+ "description": "Enterprise Microservices Platform - Build, deploy, and scale with confidence",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#000000",
+ "theme_color": "#3B82F6",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/brand-assets/icons/favicon.svg",
+ "sizes": "any",
+ "type": "image/svg+xml",
+ "purpose": "any maskable"
+ }
+ ],
+ "categories": [
+ "developer tools",
+ "productivity"
+ ],
+ "lang": "en-US"
+}
\ No newline at end of file
diff --git a/apps/web-client/src/app/globals.css b/apps/web-client/src/app/globals.css
index 439915f8..3e05ecdf 100644
--- a/apps/web-client/src/app/globals.css
+++ b/apps/web-client/src/app/globals.css
@@ -31,7 +31,7 @@
font-size: var(--text-base);
line-height: 1.5;
transition: background-color var(--duration-normal) var(--ease-in-out),
- color var(--duration-normal) var(--ease-in-out);
+ color var(--duration-normal) var(--ease-in-out);
}
/**
@@ -42,8 +42,8 @@
*::before,
*::after {
transition: background-color var(--duration-normal) var(--ease-in-out),
- color var(--duration-normal) var(--ease-in-out),
- border-color var(--duration-normal) var(--ease-in-out);
+ color var(--duration-normal) var(--ease-in-out),
+ border-color var(--duration-normal) var(--ease-in-out);
}
/**
@@ -122,10 +122,14 @@
* VI: Animation cho Typing Indicator
*/
@keyframes typing-pulse {
- 0%, 60%, 100% {
+
+ 0%,
+ 60%,
+ 100% {
opacity: 0.3;
transform: scale(0.8);
}
+
30% {
opacity: 1;
transform: scale(1);
@@ -145,12 +149,27 @@
opacity: 0;
transform: translateY(8px);
}
+
to {
opacity: 1;
transform: translateY(0);
}
}
+/**
+ * EN: Shimmer animation for skeleton loaders
+ * VI: Animation shimmer cho skeleton loaders
+ */
+@keyframes shimmer {
+ 0% {
+ transform: translateX(-100%);
+ }
+
+ 100% {
+ transform: translateX(100%);
+ }
+}
+
/**
* EN: Ensure smooth animations and prevent layout shift
* VI: Đảm bảo animation mượt mà và ngăn layout shift
@@ -159,4 +178,8 @@
.animate-fadeIn {
animation: fadeIn 0.3s ease-out forwards;
}
-}
+
+ .animate-shimmer {
+ animation: shimmer 2s infinite;
+ }
+}
\ No newline at end of file
diff --git a/apps/web-client/src/app/layout.tsx b/apps/web-client/src/app/layout.tsx
index 20ca0152..6390505a 100644
--- a/apps/web-client/src/app/layout.tsx
+++ b/apps/web-client/src/app/layout.tsx
@@ -10,8 +10,45 @@ import { SkipToContent } from '../components/accessibility/skip-to-content';
* VI: Metadata cho ứng dụng
*/
export const metadata: Metadata = {
- title: 'GoodGo Platform',
- description: 'Enterprise microservices platform / Nền tảng microservices doanh nghiệp',
+ title: {
+ default: 'GoodGo Platform - Enterprise Microservices',
+ template: '%s | GoodGo Platform',
+ },
+ description: 'Build, deploy, and scale microservices with confidence. Enterprise-grade microservices platform for modern development teams.',
+ keywords: ['microservices', 'enterprise', 'platform', 'cloud', 'kubernetes', 'devops'],
+
+ // EN: Brand icons for all platforms / VI: Brand icons cho tất cả platforms
+ icons: {
+ icon: '/brand-assets/icons/favicon.svg',
+ apple: '/brand-assets/icons/favicon.svg',
+ },
+
+ // EN: Open Graph for social media sharing / VI: Open Graph cho chia sẻ mạng xã hội
+ openGraph: {
+ type: 'website',
+ locale: 'en_US',
+ url: 'https://goodgo.com',
+ siteName: 'GoodGo Platform',
+ title: 'GoodGo Platform - Enterprise Microservices',
+ description: 'Build, deploy, and scale microservices with confidence',
+ },
+
+ // EN: Twitter Card metadata / VI: Twitter Card metadata
+ twitter: {
+ card: 'summary_large_image',
+ title: 'GoodGo Platform',
+ description: 'Enterprise Microservices Platform',
+ },
+
+ // EN: PWA manifest / VI: PWA manifest
+ manifest: '/manifest.json',
+
+ // EN: Viewport configuration / VI: Cấu hình viewport
+ viewport: {
+ width: 'device-width',
+ initialScale: 1,
+ maximumScale: 5,
+ },
};
/**
diff --git a/apps/web-client/src/app/page.tsx b/apps/web-client/src/app/page.tsx
index 211327a3..e210bd72 100644
--- a/apps/web-client/src/app/page.tsx
+++ b/apps/web-client/src/app/page.tsx
@@ -3,10 +3,12 @@
import { useAuthStore } from '@/stores/auth-store';
import { useEffect, useState } from 'react';
import { useTranslation } from '@/hooks/use-translation';
+import { BrandLogo } from '@/components/ui/brand-logo';
+import { Button } from '@/components/ui/button';
/**
- * EN: Home page component - main application entry point
- * VI: Component trang chủ - điểm vào chính của ứng dụng
+ * EN: Home page component - main application entry point with brand elements
+ * VI: Component trang chủ - điểm vào chính với brand elements
*/
export default function Home() {
// EN: Translation hook / VI: Hook translation
@@ -46,21 +48,38 @@ export default function Home() {
// EN: Show loading state while checking authentication
// VI: Hiển thị trạng thái loading trong khi kiểm tra xác thực
if (isLoading) {
- return
{t('common.loading')}
;
+ return (
+
+ {t('common.loading')}
+
+ );
}
return (
- // EN: Main content area with centered layout for minimal aesthetic
- // VI: Khu vực nội dung chính với layout căn giữa cho thẩm mỹ tối giản
-
-
+ // 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 */}
+
+
+
+
+