Mục tiêu bài viết

Sau bài này, bạn sẽ tạo được một dự án Next.js admin dashboard có:
  • Next.js App Router, TypeScript và Tailwind CSS
  • shadcn/ui được cấu hình bằng preset b0
  • Toàn bộ UI components chính thức của shadcn/ui
  • Layout admin gồm sidebar, header, dashboard overview, bảng dữ liệu, form, dialog, chart và settings
  • Prompt rõ ràng để giao Claude Code triển khai từng phần
shadcn/ui không hoạt động như một thư viện UI đóng gói sẵn. CLI sẽ copy mã nguồn component vào dự án của bạn để bạn chỉnh sửa trực tiếp.

Phần 1: Khởi tạo dự án Next.js bằng shadcn CLI

Bạn có hai cách khởi tạo.
Chạy lệnh sau trong thư mục bạn muốn tạo dự án:
npx shadcn@latest init --preset b0 --template next
Lệnh này dùng shadcn CLI để scaffold một dự án Next.js và áp dụng preset b0.
Theo tài liệu shadcn/ui hiện tại, init có thể tạo project mới với --template next, còn --preset dùng để áp dụng cấu hình design system.

Phần 2: Chạy dự án

Sau khi khởi tạo xong, vào thư mục dự án và chạy development server:
  1. Mở VS Code và mở thư mục dự án
  2. Mở terminal trong VS Code
  3. Chạy lệnh sau và nhấn Enter:
npm run dev
Terminal hiển thị, thường là:
http://localhost:3000

Phần 3: Thêm toàn bộ shadcn/ui components

Chạy lệnh sau trong thư mục project:
npx shadcn@latest add --all
Lệnh này thêm toàn bộ component có sẵn từ registry chính thức của shadcn/ui vào dự án.
Không nên chạy add --all cho production app nếu bạn chỉ cần vài component. Với bài thực hành dashboard, lệnh này hữu ích vì bạn muốn có đầy đủ component để Claude Code dùng khi xây giao diện.
Bạn cũng có thể thêm từng nhóm component nếu muốn kiểm soát tốt hơn:
npx shadcn@latest add sidebar breadcrumb navigation-menu menubar tabs pagination separator scroll-area resizable collapsible

Phần 4: Cấu trúc admin dashboard chuẩn

Một admin dashboard nên có các phần sau:
Khu vựcChức năngshadcn/ui components nên dùng
App shellKhung tổng thể của ứng dụngSidebar, Separator, Scroll Area, Resizable
SidebarMenu điều hướng chínhSidebar, Collapsible, Dropdown Menu, Avatar
HeaderSearch, notification, user menuInput, Button, Popover, Dropdown Menu, Avatar
OverviewChỉ số tổng quanCard, Badge, Chart, Progress
Data tableDanh sách users, orders, tasksTable, Data Table, Checkbox, Pagination, Dropdown Menu
FormTạo và sửa dữ liệuField, Input, Textarea, Select, Switch, Calendar
DialogXác nhận, tạo nhanh, chỉnh sửaDialog, Alert Dialog, Sheet, Drawer
FeedbackLoading, empty, toastSkeleton, Spinner, Empty, Alert, Sonner
SettingsCấu hình tài khoản và hệ thốngTabs, Card, Switch, Button Group

Phần 5: Giao Claude Code dựng dashboard từng bước

Thay vì yêu cầu Claude Code tạo tất cả trong một lần, hãy chia dashboard thành các bước nhỏ.
1

Tạo app shell

Trước tiên, thêm block sidebar chuẩn từ shadcn/ui:
npx shadcn@latest add sidebar-07
Sau đó giao Claude Code chuyển sidebar mẫu thành layout dùng chung cho nhóm route private.
Trong dự án Next.js hiện tại, dùng block sidebar-07 vừa cài để tạo admin app shell dùng chung.

Yêu cầu:    
- Đổi file app/dashboard.tsx mà sidebar-07 tạo ra thành app/(private)/layout.tsx.
- Layout này là layout dùng chung cho toàn bộ trang app/(private)/...    
2

Tạo trang overview

Thêm dashboard home page với chỉ số, biểu đồ và activity feed.
Tạo app/(private)/page.tsx làm dashboard mặc định cho nhóm route private.

Yêu cầu:
- 4 stats cards: Total revenue, Active users, New orders, Conversion rate.
- Mỗi card dùng Card, Badge và icon từ lucide-react.
- Thêm chart doanh thu theo tuần bằng shadcn/ui Chart.
- Thêm recent activity list bằng Card, Avatar, Badge.
- Thêm Skeleton loading component nếu cần tách thành client component.
- Dùng dữ liệu mock rõ ràng, dễ thay bằng API sau này.
3

Tạo trang users

Xây trang quản lý người dùng với bảng dữ liệu.
Tạo app/(private)/users/page.tsx.

Yêu cầu:
- Bảng users có columns: name, email, role, status, createdAt, actions.
- Dùng shadcn/ui Table hoặc Data Table.
- Có checkbox chọn nhiều dòng.
- Có search input theo name/email.
- Có role filter bằng Select.
- Có pagination.
- Actions menu gồm View, Edit, Disable.
- Khi danh sách trống, hiển thị Empty component.
4

Tạo form thêm và sửa dữ liệu

Dùng dialog hoặc sheet cho workflow tạo user.
Bổ sung chức năng Add user vào trang users.

Yêu cầu:
- Nút Add user nằm ở góc phải toolbar.
- Khi click, mở Dialog hoặc Sheet.
- Form gồm name, email, role, status, notes.
- Dùng Field, Label, Input, Textarea, Select, Switch, Button.
- Validate dữ liệu cơ bản ở client.
- Sau khi submit, hiển thị Sonner toast.
- Chưa cần kết nối backend, cập nhật mock state trước.
5

Tạo trang analytics

Dùng chart và filter thời gian cho báo cáo.
Tạo app/(private)/analytics/page.tsx.

Yêu cầu:
- Có Tabs cho Revenue, Users, Orders.
- Có Date Picker chọn khoảng thời gian.
- Có chart theo ngày hoặc tuần.
- Có Card hiển thị top metrics.
- Có Alert để báo dữ liệu đang là mock data.
6

Tạo trang settings

Dựng cấu hình tài khoản và hệ thống.
Tạo app/(private)/settings/page.tsx.

Yêu cầu:
- Dùng Tabs: Profile, Security, Notifications, Appearance.
- Profile có form cập nhật display name, email, avatar.
- Security có Input OTP demo và switch bật 2FA.
- Notifications có nhóm Switch.
- Appearance có ToggleGroup hoặc RadioGroup chọn theme.
- Dùng Card để chia từng nhóm setting.

Phần 6: Prompt tổng hợp cho Claude Code

Khi bạn muốn Claude Code thực hiện toàn bộ quy trình từ đầu, dùng prompt này:
Khởi tạo một dự án Next.js admin dashboard mới bằng lệnh:

npx shadcn@latest init --preset b0 --template next

Sau khi init xong:
1. Chạy npx shadcn@latest add --all để thêm toàn bộ shadcn/ui components.
2. Chạy npx shadcn@latest add sidebar-07 để thêm block sidebar chuẩn.
3. Chuyển app/dashboard.tsx hoặc dashboard demo mà sidebar-07 tạo ra thành app/(private)/layout.tsx.
4. Tạo app/(private)/page.tsx làm dashboard overview mặc định.
5. Tạo các trang:
   - app/(private)/users/page.tsx
   - app/(private)/orders/page.tsx
   - app/(private)/analytics/page.tsx
   - app/(private)/settings/page.tsx
6. Dùng các component shadcn/ui phù hợp:
   - Sidebar, Card, Table, Data Table, Chart, Tabs
   - Dialog, Sheet, Dropdown Menu, Popover, Tooltip
   - Field, Input, Textarea, Select, Checkbox, Switch, Calendar
   - Alert, Sonner, Skeleton, Spinner, Empty, Pagination
7. Dùng lucide-react cho icon.
8. Tạo mock data rõ ràng trong src/lib/mock-data.ts.
9. Tạo helper format currency/date trong src/lib/format.ts.
10. Đảm bảo npm run dev chạy không lỗi.
11. Nếu có lỗi TypeScript, import path hoặc component composition, tự kiểm tra và sửa.

Ưu tiên giao diện admin thực dụng: sidebar rõ ràng, bảng dữ liệu dễ scan, form gọn, spacing nhất quán, responsive tốt.

Phần 7: Danh sách shadcn/ui components nên biết

Theo danh sách components chính thức hiện tại, shadcn/ui có các nhóm chính sau.

Hiển thị dữ liệu

ComponentDùng để làm gì
AccordionẨn/hiện nội dung theo từng mục
AlertHiển thị cảnh báo hoặc thông báo
AvatarHiển thị ảnh đại diện
BadgeHiển thị nhãn trạng thái
CardNhóm nội dung trong một khối
ChartHiển thị biểu đồ
Data TableBảng dữ liệu có sorting, filter, pagination
EmptyTrạng thái không có dữ liệu
ProgressHiển thị tiến trình
SkeletonTrạng thái loading
SpinnerTrạng thái đang xử lý
TableBảng dữ liệu đơn giản
TypographyChuẩn hiển thị văn bản

Form và nhập liệu

ComponentDùng để làm gì
ButtonHành động chính và phụ
Button GroupNhóm nhiều nút liên quan
CalendarChọn ngày
CheckboxChọn nhiều lựa chọn
ComboboxChọn từ danh sách có tìm kiếm
Date PickerChọn ngày bằng popover calendar
FieldBọc label, input và message
InputNhập text một dòng
Input GroupGhép input với icon, button hoặc addon
Input OTPNhập mã xác thực
LabelNhãn cho trường nhập liệu
Native SelectSelect gốc của trình duyệt
Radio GroupChọn một trong nhiều lựa chọn
SelectDropdown chọn dữ liệu
SliderChọn giá trị bằng thanh trượt
SwitchBật/tắt một lựa chọn
TextareaNhập text nhiều dòng
ToggleNút có trạng thái bật/tắt
Toggle GroupNhóm toggle

Điều hướng và bố cục

ComponentDùng để làm gì
BreadcrumbHiển thị đường dẫn phân cấp
CollapsibleThu gọn/mở rộng vùng nội dung
CommandCommand palette hoặc search menu
DirectionHỗ trợ hướng giao diện
ItemMẫu item dùng trong list hoặc menu
MenubarMenu ngang kiểu ứng dụng
Navigation MenuMenu điều hướng chính
PaginationChuyển trang
ResizableChia vùng có thể kéo resize
Scroll AreaVùng cuộn tuỳ chỉnh
SeparatorĐường phân cách
SidebarThanh điều hướng bên trái
TabsChia nội dung theo tab

Overlay và phản hồi

ComponentDùng để làm gì
Alert DialogXác nhận hành động nguy hiểm
Context MenuMenu chuột phải
DialogModal ở giữa màn hình
DrawerPanel trượt, thường dùng trên mobile
Dropdown MenuMenu xổ xuống
Hover CardCard hiện khi hover
PopoverNội dung nổi khi click
SheetPanel trượt từ cạnh màn hình
SonnerToast notification hiện đại
ToastToast notification cũ hơn
TooltipChú thích khi hover

Phần 8: Kiểm tra trước khi tiếp tục

Chạy các lệnh sau:
npm run dev
npm run build
Nếu dự án có script lint:
npm run lint
Sau đó kiểm tra thủ công:
  • Sidebar hoạt động trên desktop và mobile
  • Header không đè lên content
  • Bảng users có search, filter và pagination
  • Dialog form submit được và có toast
  • Chart render đúng
  • Empty, loading và error states có giao diện rõ ràng

Tài liệu tham khảo