shared-design-system 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -258
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,258 +1,153 @@
|
|
|
1
|
-
# Shared Design System
|
|
2
|
-
|
|
3
|
-
Bộ thư viện thành phần giao diện dùng chung (Common Components) dành cho kiến trúc Microfrontend Portal.
|
|
4
|
-
|
|
5
|
-
> **v1.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
###
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
<Divider orientation="horizontal" margin="lg" />
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## 🚀 Tính năng mở rộng (Phase 3 - Robust System)
|
|
160
|
-
|
|
161
|
-
### 15. Stack
|
|
162
|
-
Công cụ quản lý bố cục và khoảng cách tự động.
|
|
163
|
-
|
|
164
|
-
```jsx
|
|
165
|
-
<Stack direction="row" spacing="md" align="center">
|
|
166
|
-
<Button>Lưu</Button>
|
|
167
|
-
<Button variant="ghost">Hủy</Button>
|
|
168
|
-
</Stack>
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### 16. Alert
|
|
172
|
-
Thanh thông báo theo mức độ nghiêm trọng: `success`, `info`, `warning`, `error`.
|
|
173
|
-
|
|
174
|
-
```jsx
|
|
175
|
-
<Alert severity="success" title="Thành công">Dữ liệu đã được lưu.</Alert>
|
|
176
|
-
<Alert severity="error">Có lỗi xảy ra, vui lòng thử lại.</Alert>
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### 17. Tag/Chip
|
|
180
|
-
Nhãn dán cho dữ liệu, hỗ trợ nút đóng (close).
|
|
181
|
-
|
|
182
|
-
```jsx
|
|
183
|
-
<Tag color="primary" variant="solid">Mới</Tag>
|
|
184
|
-
<Tag color="danger" onClose={handleDelete}>Hết hạn</Tag>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### 18. Progress
|
|
188
|
-
Thanh tiến trình dạng đường thẳng (Linear Progress).
|
|
189
|
-
|
|
190
|
-
```jsx
|
|
191
|
-
<Progress value={75} showLabel color="success" />
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### 19. Steps
|
|
195
|
-
Thanh điều hướng quy trình (Workflow). Hỗ trợ chiều dọc và chiều ngang.
|
|
196
|
-
|
|
197
|
-
```jsx
|
|
198
|
-
<Steps
|
|
199
|
-
current={1}
|
|
200
|
-
items={[
|
|
201
|
-
{ title: 'Khởi tạo', description: 'User gửi yêu cầu' },
|
|
202
|
-
{ title: 'Phê duyệt', description: 'Đang chờ quản lý' },
|
|
203
|
-
{ title: 'Hoàn tất' }
|
|
204
|
-
]}
|
|
205
|
-
/>
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### 20. Table (Styled)
|
|
209
|
-
Bộ thành phần xây dựng bảng dữ liệu chuyên nghiệp.
|
|
210
|
-
|
|
211
|
-
```jsx
|
|
212
|
-
<TableContainer>
|
|
213
|
-
<THead>
|
|
214
|
-
<TR>
|
|
215
|
-
<TH>Họ Tên</TH>
|
|
216
|
-
<TH>Trạng Thái</TH>
|
|
217
|
-
</TR>
|
|
218
|
-
</THead>
|
|
219
|
-
<TBody>
|
|
220
|
-
<TR>
|
|
221
|
-
<TD>Nguyễn Văn A</TD>
|
|
222
|
-
<TD><Badge variant="success">Active</Badge></TD>
|
|
223
|
-
</TR>
|
|
224
|
-
</TBody>
|
|
225
|
-
</TableContainer>
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### 21. Radio & RadioGroup
|
|
229
|
-
Lựa chọn duy nhất trong danh sách.
|
|
230
|
-
|
|
231
|
-
```jsx
|
|
232
|
-
<RadioGroup direction="row">
|
|
233
|
-
<Radio name="gender" value="male" label="Nam" checked />
|
|
234
|
-
<Radio name="gender" value="female" label="Nữ" />
|
|
235
|
-
</RadioGroup>
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
## 🛠 Nguyên tắc phát triển
|
|
239
|
-
|
|
240
|
-
1. **Tokens First**: Luôn kiểm tra `src/tokens.ts` trước khi thêm giá trị mới.
|
|
241
|
-
2. **Stateless**: Giữ component đơn giản nhất có thể, chỉ xử lý UI và nhận data qua props.
|
|
242
|
-
3. **Prefixing**: Khi kết hợp với Tailwind trong từng MFE, hãy sử dụng prefix tương ứng của MFE đó để tránh xung đột style với Portal.
|
|
243
|
-
4. **Type-safe**: Mỗi component có Props interface riêng. Luôn import type khi chỉ cần dùng cho annotation.
|
|
244
|
-
|
|
245
|
-
## 📦 Build & Publish
|
|
246
|
-
|
|
247
|
-
```bash
|
|
248
|
-
# Type-check
|
|
249
|
-
npm run typecheck
|
|
250
|
-
|
|
251
|
-
# Build ra dist/ (tự động chạy khi publish)
|
|
252
|
-
npm run build
|
|
253
|
-
|
|
254
|
-
# Publish (tự động chạy typecheck + build trước)
|
|
255
|
-
npm publish
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
> **Lưu ý:** File `dist/` được generate tự động, không commit vào git.
|
|
1
|
+
# Shared Design System
|
|
2
|
+
|
|
3
|
+
Bộ thư viện thành phần giao diện dùng chung (Common Components) và hệ thống Design Tokens dành cho kiến trúc Microfrontend Portal.
|
|
4
|
+
|
|
5
|
+
> **Current Version: v1.7.0** — Hệ thống đã được nâng cấp toàn diện với TypeScript, Tailwind Preset và 23+ components sẵn sàng cho sản xuất.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🚀 Cài đặt
|
|
10
|
+
|
|
11
|
+
Thư viện này được quản lý như một package nội bộ trong monorepo. Bạn có thể sử dụng trực tiếp trong các ứng dụng MFE:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Trong package.json của MFE
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"shared-design-system": "workspace:*"
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Dùng trong code:
|
|
21
|
+
```typescript
|
|
22
|
+
import { Button, Card, tokens } from 'shared-design-system';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🎨 Tích hợp Tailwind CSS
|
|
28
|
+
|
|
29
|
+
Thư viện cung cấp một Tailwind Preset để đồng bộ hóa bảng màu và cấu hình font.
|
|
30
|
+
|
|
31
|
+
### 1. Cấu hình `tailwind.config.ts`
|
|
32
|
+
Trong project MFE của bạn, hãy import và sử dụng preset:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import type { Config } from 'tailwindcss';
|
|
36
|
+
import sharedPreset from 'shared-design-system/tailwind.preset';
|
|
37
|
+
|
|
38
|
+
const config: Config = {
|
|
39
|
+
presets: [sharedPreset],
|
|
40
|
+
content: [
|
|
41
|
+
"./src/**/*.{js,ts,jsx,tsx}",
|
|
42
|
+
// Quan trọng: Thêm đường dẫn tới file source của shared-design-system để Tailwind scan classes
|
|
43
|
+
"./node_modules/shared-design-system/src/components/**/*.{js,ts,jsx,tsx}"
|
|
44
|
+
],
|
|
45
|
+
theme: {
|
|
46
|
+
extend: {
|
|
47
|
+
// Các tùy chỉnh riêng cho MFE của bạn
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
plugins: [],
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export default config;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 🧱 Hệ thống Thành phần (Components)
|
|
59
|
+
|
|
60
|
+
### 🔹 Cơ bản (Basic Elements)
|
|
61
|
+
* **Button**: Nút bấm đa năng (`primary`, `secondary`, `danger`, `ghost`).
|
|
62
|
+
* **Badge**: Nhãn trạng thái (`success`, `warning`, `danger`, `info`).
|
|
63
|
+
* **Typography**: Hệ thống phân cấp chữ (`Heading`, `Text`, `SectionHeader`).
|
|
64
|
+
* **LoadingSpinner**: Hiệu ứng xoay khi đang tải dữ liệu.
|
|
65
|
+
* **Divider**: Đường kẻ phân tách nội dung.
|
|
66
|
+
* **Progress**: Thanh tiến trình (Linear Progress).
|
|
67
|
+
|
|
68
|
+
### 🔹 Nhập liệu (Form & Inputs)
|
|
69
|
+
* **Input / Textarea**: Ô nhập văn bản hỗ trợ label và validation state.
|
|
70
|
+
* **Select**: Menu lựa chọn dropdown.
|
|
71
|
+
* **Checkbox / Radio**: Lựa chọn đơn hoặc nhiều.
|
|
72
|
+
* **Switch**: Nút gạt bật/tắt hiện đại.
|
|
73
|
+
|
|
74
|
+
### 🔹 Điều hướng & Cấu trúc (Navigation & Layout)
|
|
75
|
+
* **Breadcrumbs**: Chỉ dẫn vị trí trang.
|
|
76
|
+
* **Tabs**: Hệ thống chuyển đổi nội dung.
|
|
77
|
+
* **Steps**: Quy trình thực hiện (Workflow).
|
|
78
|
+
* **Stack**: Quản lý khoảng cách tự động giữa các phần tử.
|
|
79
|
+
* **Card**: Container bọc nội dung cao cấp.
|
|
80
|
+
|
|
81
|
+
### 🔹 Dữ liệu & Danh sách (Data Display)
|
|
82
|
+
* **Table**: Bộ component xây dựng bảng dữ liệu chuyên nghiệp.
|
|
83
|
+
* **List & ListItem**:
|
|
84
|
+
```jsx
|
|
85
|
+
import { List, ListItem } from 'shared-design-system';
|
|
86
|
+
|
|
87
|
+
<List>
|
|
88
|
+
<ListItem icon={<UserIcon />}>Thông tin người dùng</ListItem>
|
|
89
|
+
<ListItem action={<Button size="sm">Sửa</Button>}>Cài đặt hệ thống</ListItem>
|
|
90
|
+
</List>
|
|
91
|
+
```
|
|
92
|
+
* **Tag/Chip**: Nhãn dán hỗ trợ nút đóng (close).
|
|
93
|
+
* **Avatar**: Ảnh đại diện hoặc tên viết tắt.
|
|
94
|
+
* **ReadOnlyField**: Hiển thị dữ liệu ở chế độ chỉ đọc.
|
|
95
|
+
* **Skeleton**: Placeholder khi đang tải.
|
|
96
|
+
|
|
97
|
+
### 🔹 Tương tác (Feedback & Overlays)
|
|
98
|
+
* **Alert**: Thông báo mức độ nghiêm trọng (`success`, `error`, etc.).
|
|
99
|
+
* **Tooltip**: Chú thích khi di chuột.
|
|
100
|
+
* **ConfirmModal**:
|
|
101
|
+
```jsx
|
|
102
|
+
<ConfirmModal
|
|
103
|
+
isOpen={showModal}
|
|
104
|
+
title="Xác nhận xóa"
|
|
105
|
+
message="Bạn có chắc chắn muốn xóa bản ghi này?"
|
|
106
|
+
variant="danger"
|
|
107
|
+
onConfirm={handleDelete}
|
|
108
|
+
onCancel={() => setShowModal(false)}
|
|
109
|
+
/>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 🔧 Design Tokens
|
|
115
|
+
|
|
116
|
+
Tránh sử dụng mã màu hardcoded. Hãy sử dụng hệ thống tokens để đảm bảo tính nhất quán và hỗ trợ Theming trong tương lai.
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { tokens } from 'shared-design-system';
|
|
120
|
+
|
|
121
|
+
const style = {
|
|
122
|
+
backgroundColor: tokens.color.surfaceAlt,
|
|
123
|
+
padding: tokens.spacing[4],
|
|
124
|
+
borderRadius: tokens.radius.lg,
|
|
125
|
+
boxShadow: tokens.shadow.md
|
|
126
|
+
};
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 🛠 Nguyên tắc phát triển
|
|
132
|
+
|
|
133
|
+
1. **Strict Typing**: Tất cả components phải có Props interface được export rõ ràng.
|
|
134
|
+
2. **Stateless First**: Ưu tiên logic xử lý ở phía ứng dụng, component chỉ tập trung vào hiển thị (UI).
|
|
135
|
+
3. **Semantic HTML**: Sử dụng đúng các thẻ HTML (button, nav, section) để tối ưu SEO và Accessibility.
|
|
136
|
+
4. **Composition Over Inheritance**: Tận dụng `children` prop để tạo ra các layout linh hoạt.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 📦 Quy trình Build
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Kiểm tra lỗi Type
|
|
144
|
+
npm run typecheck
|
|
145
|
+
|
|
146
|
+
# Build ra thư mục dist/
|
|
147
|
+
npm run build
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
> **Lưu ý:** Thư mục `dist/` sẽ chứa mã JS đã transpose và các file `.d.ts`. Luôn chạy build trước khi tích hợp vào Portal.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
© 2024 Portal Design System Team.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shared-design-system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Shared Tailwind Design System & UI Tokens for all Micro Frontends",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"module": "dist/src/index.js",
|
|
@@ -40,14 +40,14 @@
|
|
|
40
40
|
"access": "public"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"react": "^
|
|
44
|
-
"react-dom": "^
|
|
43
|
+
"react": "^19.0.0",
|
|
44
|
+
"react-dom": "^19.0.0",
|
|
45
45
|
"tailwindcss": "^3.0.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"typescript": "^5.
|
|
49
|
-
"@types/react": "^
|
|
50
|
-
"@types/react-dom": "^
|
|
48
|
+
"typescript": "^5.6.3",
|
|
49
|
+
"@types/react": "^19.0.0",
|
|
50
|
+
"@types/react-dom": "^19.0.0",
|
|
51
51
|
"@types/node": "^20.11.0"
|
|
52
52
|
}
|
|
53
53
|
}
|