# Kế hoạch dự án IPV6 (Next.js App Router) — Tạo mới & Chuyển đổi từ HTML ## 1) Mục tiêu & phạm vi - **Mục tiêu**: Tạo project frontend mới tên **IPV6** dựa trên “format sẵn” của codebase Next.js hiện tại, chuyển các trang HTML tĩnh sang Next.js (TypeScript/TSX), tách component, tách static data (JSON), và chuẩn hoá routing theo nghiệp vụ doanh nghiệp. - **Phạm vi**: Frontend בלבד (chưa làm backend). Các API gọi ra ngoài/CMS (nếu có trong codebase cũ) sẽ **loại bỏ hoặc chuyển thành static JSON** cho đúng scope. - **Yêu cầu chung**: - **Ngôn ngữ UI mặc định**: English (có thể để song ngữ EN/VI như UI toggle, nhưng content/label phải chuẩn hoá). - **Design system thống nhất**: màu sắc, font chữ, spacing, width/height chuẩn (không lệch giữa trang). - **Responsive**: hiển thị tốt trên desktop/tablet/mobile, kiểm tra layout với các breakpoint phổ biến. ## 2) Hiện trạng codebase (để bám “format sẵn”) - Đang dùng **Next.js App Router**: có thư mục `app/`. - Có layout sẵn `app/layout.tsx` đang import CSS global và render `Header` + `Footer`. - Có nhiều phần liên quan LAMS (metadata, service/api, pages/route cũ…). - Các file HTML nguồn cho IPV6 đang nằm ở root: - `test.html` (Trang chủ) - `registration.html` (Form đăng ký) - `feedback.html` (Form feedback) - `sponsor.html` (Kêu gọi đóng góp) - `admin.html` (Trang quản lý request — nội bộ coder) ## 3) Outcome mong muốn (cấu trúc thư mục đề xuất) > Mục tiêu: rõ ràng, tách bạch component/page/data/styles; dễ maintain; đúng App Router. Đề xuất skeleton (có thể điều chỉnh theo format hiện tại): - `app/` - `(site)/` - `layout.tsx` (site shell: Header/Footer dùng cho public pages) - `page.tsx` (**Home** từ `test.html`) - `registration/page.tsx` - `feedback/page.tsx` - `sponsor/page.tsx` - `(internal)/admin/` - `page.tsx` (**Admin** từ `admin.html`, route group để tách nội bộ) - `globals.css` (CSS global/tokens) - `not-found.tsx` (tuỳ chọn) - `app/components/` - `layout/` (`Header`, `Footer`, `Container`, `Section`, `Nav`, …) - `home/` (các section của home) - `forms/` (shared form fields/validation UI) - `ui/` (Button, Input, Card, Modal, Badge…) - `app/data/` (static JSON) - `site.json` (brand, links, footer) - `home.json` (hero, agenda, speakers, stats, venue, …) - `sponsor.json` - `registration.json` (copy text, options) - `feedback.json` - `admin.json` (cột bảng, status mapping…) - `public/` - `assets/` (img/icons/fonts nếu có) ## 4) Quy ước routing (đảm bảo nghiệp vụ doanh nghiệp) ### 4.1 Public pages (khách truy cập) - `/` → **Home** (từ `test.html`) - `/registration` → **Registration form** (từ `registration.html`) - `/feedback` → **Feedback form** (từ `feedback.html`) - `/sponsor` → **Sponsor/Donate** (từ `sponsor.html`) ### 4.2 Internal pages (chỉ coder nội bộ) - `/(internal)/admin` → **Admin request management** (từ `admin.html`) - Yêu cầu “chỉ nội bộ”: vì không có backend, sẽ dùng **cơ chế chặn tối thiểu** (xem mục 9). ## 5) Chuyển đổi Component (HTML → TSX) ### 5.1 Nguyên tắc tách component - Tách theo **layout shell** (Header/Footer) và theo **section** của từng page. - Mỗi component: - Props typed (TypeScript). - Không hardcode text/data nếu có thể đưa vào JSON. - Không nhúng `