UNPKG

sgod-library-frontend

Version:
200 lines (159 loc) 6.7 kB
# Thư viện Component UI Thư viện component UI được thiết kế cho microfrontend sgod ## Cài đặt ```bash npm install sgod-library-frontend # hoặc sử dụng yarn yarn add sgod-library-frontend ``` ## Cấu trúc thư viện Thư viện được tổ chức theo phương pháp Atomic Design: ``` src/ ├── components/ │ ├── atoms/ # Các component cơ bản, không thể chia nhỏ hơn │ ├── molecules/ # Các component được tạo từ nhiều atoms │ ├── organisms/ # Các component phức tạp, kết hợp nhiều molecules │ ├── templates/ # Bố cục trang với vị trí các component │ └── pages/ # Các trang hoàn chỉnh ├── hooks/ # Custom React hooks ├── utils/ # Các tiện ích │ ├── eventBus.ts # Event bus cho giao tiếp giữa micro-frontends │ └── constants.ts # Các hằng số và sự kiện └── styles/ # CSS và các styles └── tokens.ts # Design tokens cho hệ thống thiết kế ``` ## Design System Thư viện này tuân theo các nguyên tắc thiết kế UI/UX cho hệ thống Micro Front End: ### 1. Tính nhất quán (Consistency) #### Hệ thống màu sắc - **Màu chính (Primary)**: Sử dụng cho các thành phần tương tác chính - **Màu phụ (Secondary)**: Sử dụng cho các thành phần tương tác thứ yếu - **Màu ngữ nghĩa (Semantic)**: Success, Warning, Error, Info - Mỗi màu có 9 sắc độ (50-900) cho các trạng thái khác nhau - Mẫu sử dụng: `color.primary.500`, `color.error.100`... #### Typography - Font chữ: Inter (cho cả tiêu đề và nội dung) - Hệ thống kích thước font: xs(12px), sm(14px), base(16px), lg(18px), xl(20px), ... - Font weight: Regular(400), Medium(500), Bold(700) - Line height: Tight(1.25) cho tiêu đề, Normal(1.5) cho nội dung #### Spacing - Hệ thống spacing nhất quán: 0.25rem(4px), 0.5rem(8px), 0.75rem(12px), ... - Grid system: 12 cột, gutter tùy chỉnh - Padding và margin tuân thủ theo spacing scale #### Border radius - Nhỏ: 0.25rem(4px) cho buttons, inputs - Trung bình: 0.5rem(8px) cho cards, panels - Lớn: 1rem(16px) cho modals, dialogs #### Shadow - xs: Cho hover states - sm: Cho cards, dropdowns nhỏ - md, lg, xl: Cho cards, dialogs, modals theo mức độ nổi #### Iconography - Bộ icons nhất quán với 2 variants: outline và solid - Kích thước: xs(12px), sm(16px), md(20px), lg(24px), xl(32px) ### 2. Nguyên tắc thiết kế #### Thời gian phản hồi - Mỗi component đều có trạng thái loading/skeleton để hiển thị trong khi chờ dữ liệu - Spinner, progress bar và shimmer effect được sử dụng để báo hiệu quá trình loading #### Gesture và Motion - Các animation và transition nhất quán giữa các component - Sử dụng Tailwind để đảm bảo tính nhất quán #### Tính module hoá - Mỗi component được thiết kế để có thể sử dụng độc lập - Sử dụng CSS Module và Tailwind JIT để đảm bảo CSS không bị xung đột - Isolation giữa các component giúp chúng không ảnh hưởng lẫn nhau #### Giao tiếp giữa các micro-frontend - Sử dụng Event Bus (dựa trên mitt) để phát và nhận sự kiện - Hook `useEventBus` giúp dễ dàng lắng nghe và phát sự kiện #### Trạng thái và phản hồi người dùng - Empty state: Hiển thị trạng thái trống với hướng dẫn hành động - Error state: Hiển thị lỗi với khả năng thử lại - Skeleton UI: Hiển thị khung sườn khi loading ## Cách sử dụng ### Setup Tailwind CSS Thư viện này sử dụng Tailwind CSS. Bạn cần đảm bảo dự án của bạn đã được cấu hình Tailwind CSS: ```js // tailwind.config.js module.exports = { content: [ "./src/**/*.{js,jsx,ts,tsx}", "./node_modules/sgod-library-frontend/**/*.{js,jsx,ts,tsx}" ], theme: { extend: { // ... các theme mở rộng của bạn }, }, plugins: [], } ``` ### Import và sử dụng component ```jsx import { Button, Card, EmptyState, Typography, Grid, Icon } from 'sgod-library-frontend'; import 'sgod-library-frontend/dist/index.css'; // Import CSS function App() { return ( <Card title="Thẻ ví dụ"> <Typography variant="h3" color="primary">Tiêu đề</Typography> <Typography variant="body1">Nội dung thẻ</Typography> <Grid container cols={2} spacing={4}> <Grid item> <Button variant="primary" leftIcon={<Icon name="check" />} > Đồng ý </Button> </Grid> <Grid item> <Button variant="outline">Hủy bỏ</Button> </Grid> </Grid> </Card> ); } ``` ### Sử dụng Event Bus ```jsx import { useEffect } from 'react'; import { eventBus, EVENTS, useEventBus } from 'sgod-library-frontend'; function UserProfile() { // Lắng nghe sự kiện USER.UPDATED_PROFILE và gọi hàm handleProfileUpdate khi có sự kiện const emitProfileUpdated = useEventBus(EVENTS.USER.UPDATED_PROFILE, handleProfileUpdate); function handleProfileUpdate(data) { console.log('Hồ sơ đã được cập nhật:', data); } function updateProfile() { // Cập nhật hồ sơ... // Sau đó phát sự kiện để thông báo cho các micro-frontend khác emitProfileUpdated({ name: 'Nguyễn Văn A', email: 'a@example.com' }); } return ( <Button onClick={updateProfile}>Cập nhật hồ sơ</Button> ); } ``` ## Các Components có sẵn ### Atoms - **Button**: Nút bấm với nhiều variants, sizes và states - **Input**: Trường nhập liệu với validation - **Skeleton**: Hiệu ứng loading cho components - **Grid**: Hệ thống lưới linh hoạt - **Icon**: Biểu tượng với nhiều kích thước và variants - **Typography**: Định dạng văn bản nhất quán ### Molecules - **Card**: Thẻ hiển thị nội dung với header và footer tùy chọn - **EmptyState**: Hiển thị khi không có dữ liệu - **ErrorState**: Hiển thị khi có lỗi - **FormField**: Trường form với label và validation - **Alert**: Thông báo với các trạng thái khác nhau ### Organisms - **DataTable**: Bảng dữ liệu với sorting, pagination - **Form**: Form với validation ## Tiêu chuẩn kỹ thuật - React 17+ hoặc 18+ - TypeScript - Tailwind CSS - Module CSS cho styling - Mitt cho Event Bus