Skip to content

Bộ công cụ Giao diện Quản trị (Admin UI Kit)

1. Kiểm soát Tài liệu

Thuộc tínhGiá trị
Gói@nx-app/admin-ui-kit
Phiên bản0.0.0
LoạiThư viện Thành phần (Component Library)
Dựa trênShadcn/UI, Radix UI
RuntimeReact 19

2. Phạm vi & Mục tiêu

2.1. Phạm vi

Gói này là nguồn chân lý duy nhất cho các thành phần giao diện người dùng (UI components) trong hệ sinh thái BANA. Nó xuất các thành phần phi trạng thái (stateless), dễ tiếp cận (accessible) và có kiểu dáng (styled) được sử dụng bởi Back Office Client và ứng dụng Back Office (BO).

2.2. Mục tiêu

  • Nhất quán về Hình ảnh: Nhận diện thương hiệu giống hệt nhau (màu sắc, kiểu chữ, khoảng cách) trên các ứng dụng.
  • Khả năng tiếp cận (a11y): Có thể điều hướng bằng bàn phím và thân thiện với trình đọc màn hình (WAI-ARIA thông qua Radix).
  • Hiệu quả: Các khối xây dựng sẵn sàng sử dụng để phát triển nhanh chóng.
  • Tree-Shaking: Xuất theo tên (Named exports) để tối ưu kích thước gói (bundle size).

3. Ngăn xếp Công nghệ (Technology Stack)

3.1. Các phụ thuộc Cốt lõi (Core Dependencies)

Công nghệPhiên bảnMục đích
React^19.0.0UI Framework (peer)
Tailwind CSS>=4.0.0Styling (peer)
TypeScript^5An toàn kiểu dữ liệu (Type Safety)

3.2. Tiện ích Kiểu dáng (Styling Utilities)

Công nghệPhiên bảnMục đích
class-variance-authority^0.7.1Biến thể thành phần (Component Variants)
clsx^2.1.1Kết hợp Class (Class Composition)
tailwind-merge^3.4.0Gộp Class (Class Merging)
tw-animate-css^1.4.0Các lớp Hoạt hình (Animation Classes)

3.3. Radix UI Primitives

Thành phầnPhiên bảnMục đích
@radix-ui/react-accordion^1.2.12Phần mở rộng được (Expandable Sections)
@radix-ui/react-alert-dialog^1.1.15Hộp thoại xác nhận
@radix-ui/react-avatar^1.1.11Ảnh đại diện người dùng
@radix-ui/react-checkbox^1.3.3Ô đánh dấu (Checkboxes)
@radix-ui/react-collapsible^1.1.12Bảng có thể thu gọn
@radix-ui/react-context-menu^2.2.16Menu chuột phải
@radix-ui/react-dialog^1.1.15Hộp thoại Modal
@radix-ui/react-dropdown-menu^2.1.16Menu thả xuống
@radix-ui/react-label^2.1.8Nhãn biểu mẫu (Form Labels)
@radix-ui/react-popover^1.1.15Bảng nổi (Floating Panels)
@radix-ui/react-radio-group^1.3.8Nút radio
@radix-ui/react-scroll-area^1.2.10Thanh cuộn tùy chỉnh
@radix-ui/react-select^2.2.6Danh sách thả xuống (Dropdowns)
@radix-ui/react-separator^1.1.8Dải phân cách trực quan
@radix-ui/react-slot^1.2.4Khe thành phần (Component Slots)
@radix-ui/react-switch^1.2.6Nút chuyển đổi (Toggle Switches)
@radix-ui/react-tabs^1.1.13Điều hướng Tab
@radix-ui/react-tooltip^1.2.8Chú thích công cụ (Tooltips)

3.4. Các thành phần Bổ sung

Công nghệPhiên bảnMục đích
lucide-react^0.562.0Thư viện Biểu tượng (Icon Library)
vaul^1.1.2Thành phần Ngăn kéo (Drawer Component)
sonner^2.0.7Thông báo Toast
react-day-picker^9.11.1Lịch/Chọn ngày
cmdk^1.1.1Bảng lệnh (Command Palette)

3.5. Công cụ Phát triển

Công nghệPhiên bảnMục đích
shadcn^3.5.1CLI Thành phần
tsc-alias^1.8.16Phân giải Path Alias
@venizia/dev-configs^0.0.5-0Cấu hình ESLint/Prettier chung

4. Cấu trúc Dự án

apps/admin-ui-kit/
├── src/
│   ├── components/                 # Mã nguồn Thành phần
│   │   ├── core/                   # Các thành phần Cốt lõi
│   │   │   ├── backdrop/           # Lớp phủ nền (backdrop)
│   │   │   └── common/             # Các thành phần chung
│   │   ├── icons/                  # Biểu tượng Tùy chỉnh
│   │   └── shadcn/                 # Các thành phần shadcn/ui (38 files)
│   │       ├── accordion.tsx
│   │       ├── alert-dialog.tsx
│   │       ├── avatar.tsx
│   │       ├── badge.tsx
│   │       ├── breadcrumb.tsx
│   │       ├── button-group.tsx
│   │       ├── button.tsx
│   │       ├── calendar.tsx
│   │       ├── card.tsx
│   │       ├── checkbox.tsx
│   │       ├── collapsible.tsx
│   │       ├── command.tsx
│   │       ├── context-menu.tsx
│   │       ├── dialog.tsx
│   │       ├── drawer.tsx
│   │       ├── dropdown-menu.tsx
│   │       ├── empty.tsx
│   │       ├── field.tsx
│   │       ├── input-group.tsx
│   │       ├── input.tsx
│   │       ├── kbd.tsx
│   │       ├── label.tsx
│   │       ├── popover.tsx
│   │       ├── radio-group.tsx
│   │       ├── scroll-area.tsx
│   │       ├── select.tsx
│   │       ├── separator.tsx
│   │       ├── sheet.tsx
│   │       ├── sidebar.tsx
│   │       ├── skeleton.tsx
│   │       ├── spinner.tsx
│   │       ├── switch.tsx
│   │       ├── table.tsx
│   │       ├── tabs.tsx
│   │       ├── textarea.tsx
│   │       └── tooltip.tsx
│   ├── hooks/                      # Custom Hooks
│   │   └── use-mobile.ts           # Phát hiện thiết bị di động
│   ├── styles/                     # CSS Exports
│   ├── utilities/                  # Các hàm Tiện ích
│   │   └── tw.utility.ts           # Tiện ích gộp Tailwind
│   ├── generate-index.ts           # Script tạo file index
│   └── index.ts                    # Exports của gói
├── scripts/                        # Các script build
├── dist/                           # Đầu ra build
└── package.json

5. Danh mục Thành phần

5.1. Atoms (Thành phần Cơ sở)

Thành phầnMô tảBiến thể (Variants)
ButtonNút tương tácdefault, destructive, outline, secondary, ghost, link
InputTrường nhập văn bản-
LabelNhãn biểu mẫu-
BadgeChỉ báo trạng tháiNhiều biến thể màu sắc
CheckboxLựa chọn Boolean-
SwitchĐiều khiển chuyển đổi-
SeparatorPhân cách trực quanhorizontal, vertical
SkeletonTrình giữ chỗ khi đang tải-
SpinnerChỉ báo đang tải-

5.2. Molecules (Thành phần Tổng hợp)

Thành phầnMô tảTính năng
CardContainer nội dungHeader, content, footer slots
Alert DialogModal xác nhậnNút Action/Cancel
DialogLớp phủ ModalTiêu đề, mô tả, đóng
PopoverNội dung nổiĐịnh vị dựa trên trigger
TooltipThông tin khi di chuộtĐộ trễ, định vị
Dropdown MenuMenu hành độngItems, separators, sub-menus
SelectLựa chọn thả xuốngTìm kiếm, nhóm, đa chọn
TabsĐiều hướng TabCác bảng nội dung
AccordionCác phần mở rộng đượcMở rộng đơn/đa

5.3. Organisms (Thành phần Phức tạp)

Thành phầnMô tảTính năng
CalendarBộ chọn ngàyChọn khoảng, điều hướng
CommandBảng lệnhTìm kiếm, phím tắt
SidebarThanh bên điều hướngCó thể thu gọn, nhóm
TableBảng dữ liệuHeaders, rows, cells
SheetBảng trượt raĐịnh vị bên cạnh
DrawerNgăn kéo dưới cùngCử chỉ vuốt

5.4. Thành phần Tùy chỉnh (Custom Components)

Thành phầnMô tả
BackdropLớp phủ nền
ComingSoonThành phần giữ chỗ
ButtonGroupNhóm nút
InputGroupĐầu vào kèm addons
FieldBao bọc trường biểu mẫu
EmptyHiển thị trạng thái trống
KbdHiển thị phím tắt

6. Mẫu Triển khai Thành phần

6.1. Hệ thống Biến thể (Variant System)

Các thành phần sử dụng class-variance-authority (CVA) để quản lý biến thể:

typescript
const buttonVariants = cva(
  "inline-flex items-center justify-center ...",
  {
    variants: {
      variant: {
        default: 'bg-primary text-primary-foreground hover:bg-primary/90',
        destructive: 'bg-destructive text-white hover:bg-destructive/90',
        outline: 'border bg-background shadow-xs hover:bg-accent',
        secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
        ghost: 'hover:bg-accent hover:text-accent-foreground',
        link: 'text-primary underline-offset-4 hover:underline',
      },
      size: {
        default: 'h-9 px-4 py-2',
        lg: 'h-10 rounded-md px-6',
        sm: 'h-8 rounded-md gap-1.5 py-1.5 px-2.5',
        xs: 'h-7 rounded-md gap-1.5 px-1.5 py-1',
        icon: 'size-9',
      },
    },
    defaultVariants: {
      variant: 'default',
      size: 'default',
    },
  },
);

6.2. Tiện ích Class

Tiện ích cn gộp các class Tailwind một cách thông minh:

typescript
import clsx, { ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';

export const cn = (...inputs: ClassValue[]) => {
  return twMerge(clsx(inputs));
};

6.3. Cấu trúc Thành phần

typescript
function Button({
  className,
  variant,
  size,
  asChild = false,
  ...props
}: React.ComponentProps<'button'> &
  VariantProps<typeof buttonVariants> & {
    asChild?: boolean;
  }) {
  const Comp = asChild ? Slot : 'button';

  return (
    <Comp
      data-slot="button"
      className={cn(buttonVariants({ variant, size, className }))}
      {...props}
    />
  );
}

7. Biến thể Nút (Button Variants)

7.1. Biến thể Hình ảnh

Biến thểKiểu dángTrường hợp sử dụng
defaultNền chính (Primary background)Hành động chính
destructiveMàu đỏ/nguy hiểmXóa, gỡ bỏ
outlineChỉ viềnHành động phụ
secondaryNền mờ (Muted background)Hành động thay thế
ghostKhông nềnHành động tinh tế
linkChỉ văn bảnLiên kết điều hướng
default-activeActive primaryTrạng thái đã chọn

7.2. Biến thể Kích thước

Kích thướcChiều caoTrường hợp sử dụng
default36px (h-9)Nút tiêu chuẩn
lg40px (h-10)Nút nổi bật
sm32px (h-8)Nút nhỏ gọn
xs28px (h-7)Nút rất nhỏ gọn
icon36x36pxNút chỉ có icon
icon-sm32x32pxNút icon nhỏ
icon-lg40x40pxNút icon lớn
icon-xs28x28pxNút icon rất nhỏ
icon-xxs20x20pxNút icon tối thiểu

8. Hooks

8.1. useMobile

Phát hiện khung nhìn di động cho hành vi phản hồi (responsive):

typescript
import { useMobile } from '@nx-app/admin-ui-kit';

const isMobile = useMobile();

9. Sử dụng

9.1. Cài đặt

Gói được liên kết qua giao thức workspace của Bun:

json
{
  "dependencies": {
    "@nx-app/admin-ui-kit": "workspace:*"
  }
}

9.2. Mẫu Import

Các export được đặt tên hỗ trợ tree-shaking:

tsx
import {
  Button,
  Card,
  CardContent,
  CardHeader,
  Dialog,
  DialogContent,
  DialogTrigger,
} from '@nx-app/admin-ui-kit';

9.3. Tùy chỉnh

Các thành phần chấp nhận className để ghi đè Tailwind:

tsx
<Button className="bg-red-500 hover:bg-red-600">
  Hành động Quan trọng
</Button>

9.4. Kết hợp với Radix Slot

Sử dụng asChild để kết hợp thành phần:

tsx
<Button asChild>
  <Link href="/dashboard">Đi đến Bảng điều khiển</Link>
</Button>

10. Design Tokens

10.1. Hệ thống Màu sắc

TokenMục đích
primaryMàu thương hiệu
primary-foregroundVăn bản trên nền primary
secondaryHành động phụ
secondary-foregroundVăn bản trên nền secondary
destructiveHành động nguy hiểm/xóa
mutedNền tinh tế
muted-foregroundVăn bản tinh tế
accentĐiểm nhấn
accent-foregroundVăn bản trên nền accent
backgroundNền trang
foregroundVăn bản chính
cardNền thẻ
card-foregroundVăn bản thẻ
popoverNền popover
popover-foregroundVăn bản popover
borderMàu viền
inputViền đầu vào
ringVòng focus

10.2. Khoảng cách & Bán kính

TokenGiá trịSử dụng
radiusCó thể cấu hìnhBán kính viền (Border radius)

11. Xuất (Exports)

11.1. Gói Exports

json
{
  "exports": {
    ".": {
      "import": "./dist/index.js",
      "types": "./dist/index.d.ts"
    },
    "./styles/*": "./src/styles/*"
  }
}

11.2. Tác dụng phụ (Side Effects)

Các tệp CSS được đánh dấu là có tác dụng phụ để đóng gói đúng cách:

json
{
  "sideEffects": ["**/*.css"]
}

12. Build & Scripts

12.1. Các Script có sẵn

ScriptLệnhMục đích
gen:indexbun ./src/generate-index.tsTự động tạo index.ts
buildsh ./scripts/build.shBuild sản xuất
rebuildbun run gen:index && sh ./scripts/rebuild.shBuild lại toàn bộ
cleansh ./scripts/clean.shDọn dẹp thư mục dist
lintbun run eslint && bun run prettier:cliChạy linters
lint:fixFix lint issuesTự động sửa lỗi lint

12.2. Tạo Index

Các thành phần được tự động xuất thông qua generate-index.ts:

typescript
// 🚀 AUTO GENERATE - DON'T EDIT THIS FILE

// Exports from components
export * from "./components/shadcn/button";
export * from "./components/shadcn/card";
// ... more exports

// Exports from hooks
export * from "./hooks/use-mobile";

// Exports from utilities
export * from "./utilities/tw.utility";

13. Người tiêu dùng (Consumers)

13.1. Các ứng dụng sử dụng Admin UI Kit

Ứng dụngSử dụng
client (Back Office)Thư viện thành phần đầy đủ
bo (Back Office Internal)Thư viện thành phần đầy đủ

13.2. Không được sử dụng trong

Ứng dụngLý do
sale-renderer (POS UI)Có các thành phần shadcn riêng

14. Thống kê Mã nguồn

Chỉ sốSố lượng
Tệp Thành phần40+
Thành phần shadcn38
Thành phần Tùy chỉnh4
Icons2
Hooks1
Utilities1
Radix Primitives18

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.