From 60b5233e95a70b00912a5b3b78e64a5878ce615c Mon Sep 17 00:00:00 2001
From: TaNguyenThanhQuy
Date: Fri, 17 Apr 2026 06:28:43 +0000
Subject: [PATCH] feat: add pages (#33)
Co-authored-by: Thanh Quy - wolf <524H0124@student.tdtu.edu.vn>
Co-authored-by: Thanh Quy- wolf <524H0124@student.tdtu.edu.vn>
Reviewed-on: https://git.demonkernel.io.vn/FoodSurf/frontend/pulls/33
Co-authored-by: TaNguyenThanhQuy
Co-committed-by: TaNguyenThanhQuy
---
.blackboxrules | 5 -
.../skills/frontend-atomic-design/SKILL.md | 487 +++++++++++
.../frontend-atomic-design/manifest.json | 7 +
.claude/skills/prompt-optimizer/SKILL.md | 88 ++
.claude/skills/ui-ux-testing/SKILL.md | 274 +++++++
.../website-creation-automation/SKILL.md | 224 +++++
Atomic.md | 762 ------------------
README.md | 52 +-
app/(main)/login/page.tsx | 4 +-
app/(main)/page.tsx | 18 +-
app/(main)/payment/page.tsx | 15 +-
components/COMPONENTS.md | 67 +-
components/atoms/ATOMS.md | 19 -
components/atoms/buttons/Button.tsx | 3 +-
components/atoms/buttons/Button.types.ts | 1 +
components/atoms/inputs/SearchInput.tsx | 2 +
.../molecules/cards/PaymentSummaryCard.tsx | 11 +-
components/molecules/cards/ProductCard.tsx | 2 +-
components/molecules/search-bar/SearchBar.tsx | 1 +
components/organisms/analytics/BarChart.tsx | 10 +-
components/organisms/analytics/LineChart.tsx | 122 +--
components/organisms/analytics/PieChart.tsx | 2 +-
components/organisms/forms/LoginForm.tsx | 2 +-
components/organisms/manager/ProductsTab.tsx | 5 +-
.../organisms/navigation/CategorySidebar.tsx | 1 +
layouts/header.tsx | 2 +
package.json | 1 +
register-shift-feature-prompt.md | 156 ----
28 files changed, 1194 insertions(+), 1149 deletions(-)
delete mode 100644 .blackboxrules
create mode 100644 .claude/skills/frontend-atomic-design/SKILL.md
create mode 100644 .claude/skills/frontend-atomic-design/manifest.json
create mode 100644 .claude/skills/prompt-optimizer/SKILL.md
create mode 100644 .claude/skills/ui-ux-testing/SKILL.md
create mode 100644 .claude/skills/website-creation-automation/SKILL.md
delete mode 100644 Atomic.md
delete mode 100644 register-shift-feature-prompt.md
diff --git a/.blackboxrules b/.blackboxrules
deleted file mode 100644
index 274a1d7..0000000
--- a/.blackboxrules
+++ /dev/null
@@ -1,5 +0,0 @@
-## Rules:
- - Khi làm một tính năng mới, trước khi hoàn thành phải update các file mark down mà thư mục đó được update.
- - Khi có từ khóa "Yêu cầu" và một list các yêu cầu thì phải hoàn thành ĐÚNG yêu cầu, không thêm không bớt.
- - Sử dụng thư viện tailwind CSS để code css cho project.
- - Mỗi feature được update đều phải được responsive với các kích cỡ màn hình như smartphone, tablet, desktop.
\ No newline at end of file
diff --git a/.claude/skills/frontend-atomic-design/SKILL.md b/.claude/skills/frontend-atomic-design/SKILL.md
new file mode 100644
index 0000000..aaafd8e
--- /dev/null
+++ b/.claude/skills/frontend-atomic-design/SKILL.md
@@ -0,0 +1,487 @@
+---
+name: frontend-atomic-design
+description: Create modern, responsive frontend components and layouts using atomic design methodology with Tailwind CSS. Use this skill whenever building React components, designing UI layouts, creating responsive pages, or working with atomic design principles. Triggers include: component development, page design, responsive design requests, Tailwind CSS styling, creating design systems, building reusable UI elements, or designing for multiple screen sizes (desktop, tablet, mobile). This skill emphasizes reusable variables, modern aesthetics, and responsive design across all viewport sizes.
+---
+
+# Atomic Design Frontend System with Tailwind CSS
+
+A comprehensive guide for building modern, responsive frontend applications using atomic design principles and Tailwind CSS.
+
+## Core Principles
+
+### 1. Atomic Design Hierarchy
+
+Atomic Design breaks UI into five distinct levels:
+
+#### **Atoms**
+Smallest, indivisible UI elements that cannot be broken down without losing functionality.
+- Buttons, input fields, labels, icons, text styles
+- Color variables, spacing units, typography scales
+- Simple, pure, reusable building blocks
+
+```jsx
+// Example: Button Atom
+
+```
+
+#### **Molecules**
+Groups of atoms bonded together, forming simple functional units.
+- Search bars (input + button + icon)
+- Form fields (label + input + error message)
+- Card headers (avatar + title + subtitle)
+- Navigation items with icons and labels
+
+```jsx
+// Example: Search Molecule
+
+
+
+
+```
+
+#### **Organisms**
+Complex functional units made of groups of molecules and/or atoms.
+- Header/Navigation bars
+- Form sections (multiple form molecules)
+- Card layouts with multiple sections
+- Modals with title, content, and actions
+- Data tables with headers, rows, and pagination
+
+```jsx
+// Example: Product Card Organism
+
);
diff --git a/components/organisms/analytics/PieChart.tsx b/components/organisms/analytics/PieChart.tsx
index e096084..726a7b3 100644
--- a/components/organisms/analytics/PieChart.tsx
+++ b/components/organisms/analytics/PieChart.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useMemo, useState } from "react";
+import { useState, useMemo } from "react";
export interface PieSlice {
label: string;
diff --git a/components/organisms/forms/LoginForm.tsx b/components/organisms/forms/LoginForm.tsx
index 28606a8..b9eaddc 100644
--- a/components/organisms/forms/LoginForm.tsx
+++ b/components/organisms/forms/LoginForm.tsx
@@ -1,10 +1,10 @@
-import Button from "@/components/atoms/buttons/Button";
import ErrorMessageLogin from "@/components/atoms/errors/ErrorMessageLogin";
import LoginInput from "@/components/atoms/inputs/LoginInput";
import { useAuth } from "@/lib/auth-context";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { FormEvent, useState } from "react";
+import Button from "@/components/atoms/buttons/Button";
export default function LoginForm() {
const router = useRouter();
diff --git a/components/organisms/manager/ProductsTab.tsx b/components/organisms/manager/ProductsTab.tsx
index 12f7fbf..9d5c27c 100644
--- a/components/organisms/manager/ProductsTab.tsx
+++ b/components/organisms/manager/ProductsTab.tsx
@@ -152,10 +152,7 @@ export default function ProductsTab() {
) : (
filtered.map((p) => (
-
+
{p.name}
diff --git a/components/organisms/navigation/CategorySidebar.tsx b/components/organisms/navigation/CategorySidebar.tsx
index ab97b35..9bbc27e 100644
--- a/components/organisms/navigation/CategorySidebar.tsx
+++ b/components/organisms/navigation/CategorySidebar.tsx
@@ -47,6 +47,7 @@ export default function CategorySidebar({
@@ -109,6 +110,7 @@ export default function Header() {
{/* Avatar circle */}
diff --git a/package.json b/package.json
index 1f2b5a6..1bcd383 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
"@types/node": "^20.19.39",
"@types/react": "^19.2.14",
"next": "16.1.7",
+ "nextjs": "^0.0.3",
"react": "19.2.3",
"react-dom": "19.2.3",
"tailwind": "^4.0.0",
diff --git a/register-shift-feature-prompt.md b/register-shift-feature-prompt.md
deleted file mode 100644
index 56c77ad..0000000
--- a/register-shift-feature-prompt.md
+++ /dev/null
@@ -1,156 +0,0 @@
-# Feature Prompt: Register Shift (Đăng Ký Ca Làm)
-
-## Tổng Quan
-
-Xây dựng tính năng **Register Shift** cho phép nhân viên xem và đăng ký ca làm
-việc theo khung thời gian do quản lý tạo ra. Tính năng hỗ trợ cả hai vai trò:
-**Manager** và **Staff**, với giao diện responsive thích ứng theo kích thước màn
-hình.
-
----
-
-## Mục Đích
-
-- Cho phép nhân viên xem danh sách các khung thời gian ca làm khả dụng và đăng
- ký vào ca mà họ muốn làm.
-- Quản lý (Manager) có toàn quyền tạo, chỉnh sửa và xóa các khung thời gian ca
- làm.
-- Nhân viên có thể thấy ca làm của đồng nghiệp để tránh xung đột hoặc điều chỉnh
- lịch phù hợp.
-- Cả Manager và Staff đều có thể chỉnh sửa hoặc hủy ca đã đăng ký của nhân viên.
-
----
-
-## Vai Trò & Phân Quyền
-
-### Manager
-
-- Tạo, chỉnh sửa, xóa khung thời gian ca làm (shift slots).
-- Xem lịch làm việc của toàn bộ nhân viên theo tuần hoặc tháng.
-- Phê duyệt hoặc từ chối yêu cầu đăng ký ca.
-- Xóa hoặc thay đổi ca làm của bất kỳ nhân viên nào.
-- Gán ca làm cho nhân viên cụ thể nếu cần.
-
-### Staff (Nhân Viên)
-
-- Xem danh sách ca làm khả dụng trong tuần hoặc tháng.
-- Đăng ký vào ca mà mình muốn làm.
-- Xem ca đã được đăng ký bởi các nhân viên khác.
-- Hủy hoặc chỉnh sửa ca đã đăng ký của bản thân (trong giới hạn thời gian cho
- phép).
-
----
-
-## Yêu Cầu Giao Diện
-
-### Desktop (≥ 1024px) — Dạng Bảng Lịch Tuần/Tháng
-
-- Hiển thị lịch làm việc dạng **table theo tuần** (mặc định), với khả năng
- chuyển sang **xem theo tháng**.
-- Mỗi cột đại diện cho một ngày trong tuần (Mon–Sun).
-- Mỗi hàng đại diện cho một nhân viên hoặc một khung giờ.
-- Các ca làm được hiển thị dưới dạng **card màu** trong ô tương ứng, gồm:
- - Tên ca / Khung giờ (ví dụ: `08:00 – 12:00`)
- - Số giờ làm & mức lương dự kiến (ví dụ: `4h · 120k`)
- - Trạng thái: `Available`, `Registered`, `Approved Leave`, `Absent`
-- **Bộ lọc tuần/tháng** ở góc trên, cho phép điều hướng qua lại giữa các
- tuần/tháng.
-- Hiển thị **tổng ngân sách tuần** (Weekly Budget) ở đầu bảng.
-- Nhóm nhân viên theo **department/role** (ví dụ: Bar Staff, Janitors,...).
-- Mỗi ca làm có thể click để xem chi tiết, chỉnh sửa hoặc xóa.
-
-#### Chế Độ Xem Theo Tháng (Month View)
-
-- Hiển thị dạng **calendar grid** (lưới 7 cột × ~5 hàng).
-- Mỗi ô ngày hiển thị số ca đã đăng ký hoặc dấu chấm màu trạng thái (tương tự
- ảnh tham khảo).
-- Cho phép nhân viên và manager tính toán ngày có thể nghỉ hoặc đăng ký ca xa
- hơn trong tháng.
-
----
-
-### Mobile (< 768px) — Dạng Lịch Dọc + Dot Indicator
-
-- Hiển thị **calendar theo tháng dạng nhỏ gọn** (compact calendar) ở đầu màn
- hình.
- - Các ngày có ca làm được đánh dấu bằng **dot màu** phía dưới số ngày:
- - 🟡 Vàng: Ca đang mở / khả dụng
- - 🟢 Xanh lá: Ca đã được đăng ký
- - ⚫ Xám: Không có ca
- - Ngày hiện tại được highlight bằng vòng tròn (dark circle).
-- Khi chọn một ngày, hiển thị danh sách ca làm của ngày đó bên dưới.
-- Mỗi ca làm hiển thị dưới dạng **card dọc**:
- - Khung giờ, số giờ, mức lương
- - Tên nhân viên đã đăng ký (nếu có)
- - Nút **Đăng ký** hoặc **Hủy đăng ký**
-- Điều hướng tháng bằng nút `<` và `>` ở hai bên tiêu đề tháng.
-
----
-
-## Trạng Thái Ca Làm (Shift Status)
-
-| Trạng Thái | Màu | Mô Tả |
-| -------------- | --------------- | --------------------------------- |
-| Available | Xanh dương nhạt | Ca đang mở, chưa có ai đăng ký |
-| Registered | Xanh dương đậm | Nhân viên đã đăng ký ca này |
-| Approved Leave | Tím/Lavender | Nhân viên đã được duyệt nghỉ phép |
-| Absent | Đỏ/Hồng | Nhân viên vắng mặt không có lý do |
-
----
-
-## Luồng Chức Năng Chính
-
-### Staff — Đăng Ký Ca
-
-1. Truy cập màn hình Register Shift.
-2. Chọn tuần hoặc tháng muốn xem.
-3. Xem các ca làm khả dụng (Available).
-4. Click vào ca → Xem thông tin chi tiết (giờ, lương, số người đã đăng ký).
-5. Nhấn **Register** để đăng ký ca.
-6. Ca chuyển sang trạng thái **Registered**.
-
-### Manager — Tạo Ca Làm Mới
-
-1. Vào giao diện dashboard của manager.
-2. Vào giao diện lịch của nhóm/department.
-3. Click vào ô ngày muốn tạo ca.
-4. Nhập thông tin: Khung giờ bắt đầu – kết thúc, số lượng nhân viên cần, mức
- lương.
-5. Lưu → Ca hiển thị trên lịch với trạng thái **Available**.
-
-### Xóa / Chỉnh Sửa Ca
-
-- **Manager**: Có thể chỉnh sửa hoặc xóa bất kỳ ca nào của bất kỳ nhân viên nào.
-- **Staff**: Chỉ có thể hủy ca của bản thân, trong phạm vi thời gian cho phép
- (ví dụ: trước 24h so với giờ bắt đầu ca).
-
----
-
-## Dữ Liệu & Logic
-
-### Shift Slot Object
-
-```json
-{
- "id": "shift_001",
- "date": "2025-04-22",
- "startTime": "08:00",
- "endTime": "12:00",
- "durationHours": 3.5,
- "wage": 80,
- "department": "Bar Staff",
- "maxStaff": 2,
- "registeredStaff": [{ "id": "staff_01", "name": "Carol Saragosa" }],
- "status": "registered"
-}
-```
-
----
-
-## Ghi Chú Bổ Sung
-
-- Nhân viên **không được đăng ký 2 ca trùng giờ** trong cùng một ngày.
-- Hệ thống cần hiển thị **cảnh báo xung đột** khi nhân viên cố đăng ký ca bị
- trùng lịch.
-- Cần hỗ trợ **thông báo (notification)** khi ca làm bị thay đổi hoặc bị hủy bởi
- manager.