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.1-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 trong hệ sinh thái BANA. Nó xuất ra các thành phần phi trạng thái, dễ tiếp cận và đã được tạo kiểu, dùng cho 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 mọi ứng dụng.
  • Khả năng tiếp cận (a11y): Điều hướng được 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 dựng sẵn dùng được ngay để phát triển nhanh chóng.
  • Tree-Shaking: Xuất theo tên để tối ưu kích thước bundle.

3. Ngăn xếp Công nghệ

3.1. Các phụ thuộc Cốt lõi

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

3.2. Tiện ích Tạo kiểu

Công nghệPhiên bảnMục đích
class-variance-authority^0.7.1Quản lý biến thể thành phần
clsx^2.1.1Kết hợp class
tailwind-merge^3.4.0Gộp class
tw-animate-css^1.4.0Các lớp hoạt hình

3.3. Radix UI Primitives

Bộ công cụ phụ thuộc vào gói hợp nhất radix-ui (một điểm vào duy nhất tái xuất tất cả primitive), không phải các gói @radix-ui/react-* riêng lẻ.

Công nghệPhiên bảnMục đích
radix-ui^1.4.3Primitive hỗ trợ truy cập hợp nhất (accordion, dialog, popover, select, tabs, tooltip, v.v.)

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
vaul^1.1.2Thành phần ngăn kéo
sonner^2.0.7Thông báo Toast
react-day-picker^9.13.0Lịch/chọn ngày
cmdk^1.1.1Bảng lệnh

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

Công nghệPhiên bảnMục đích
shadcn^3.8.4CLI quản lý thành phần
tsc-alias^1.8.16Phân giải path alias
@venizia/dev-configs^0.0.7Cấ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 (43 files)
│   │       ├── accordion.tsx
│   │       ├── alert-dialog.tsx
│   │       ├── alert.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-otp.tsx
│   │       ├── input.tsx
│   │       ├── item.tsx
│   │       ├── kbd.tsx
│   │       ├── label.tsx
│   │       ├── popover.tsx
│   │       ├── progress.tsx
│   │       ├── radio-group.tsx
│   │       ├── resizable.tsx
│   │       ├── scroll-area.tsx
│   │       ├── select.tsx
│   │       ├── separator.tsx
│   │       ├── sheet.tsx
│   │       ├── sidebar.tsx
│   │       ├── skeleton.tsx
│   │       ├── slider.tsx
│   │       ├── sonner.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ể
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
CardVùng chứa nội dungKhe header, content, footer
Alert DialogModal xác nhậnNút hành động/hủy
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 độngMục, dải phân cách, menu con
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ệuTiêu đề, hàng, ô
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

Thành phầnMô tả
BackdropLớp phủ nền
ComingSoonThành phần giữ chỗ
ButtonGroupNhóm nút
InputGroupÔ nhập kèm phần bổ trợ
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ể

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

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

Biến thểKiểu dángTrường hợp sử dụng
defaultNền màu chínhHành động chính
destructiveMàu đỏ/nguy hiểmXóa, gỡ bỏ
outlineChỉ viềnHành động phụ
secondaryNền mờ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-activeNền màu chính khi đang chọnTrạ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 để xử lý giao diện 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. Exports của Gói

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ó side effect để đó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 shadcn43
Thành phần Tùy chỉnh4
Icons2
Hooks2
Utilities1
Radix PrimitivesHợp nhất radix-ui (^1.4.3)

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