shared-design-system 1.2.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.
Files changed (78) hide show
  1. package/README.md +258 -0
  2. package/dist/components/Alert.d.ts +9 -0
  3. package/dist/components/Alert.js +58 -0
  4. package/dist/components/Alert.js.map +1 -0
  5. package/dist/components/Avatar.d.ts +8 -0
  6. package/dist/components/Avatar.js +43 -0
  7. package/dist/components/Avatar.js.map +1 -0
  8. package/dist/components/Badge.d.ts +5 -0
  9. package/dist/components/Badge.js +55 -0
  10. package/dist/components/Badge.js.map +1 -0
  11. package/dist/components/Breadcrumbs.d.ts +10 -0
  12. package/dist/components/Breadcrumbs.js +31 -0
  13. package/dist/components/Breadcrumbs.js.map +1 -0
  14. package/dist/components/Button.d.ts +7 -0
  15. package/dist/components/Button.js +77 -0
  16. package/dist/components/Button.js.map +1 -0
  17. package/dist/components/Card.d.ts +8 -0
  18. package/dist/components/Card.js +39 -0
  19. package/dist/components/Card.js.map +1 -0
  20. package/dist/components/ConfirmModal.d.ts +12 -0
  21. package/dist/components/ConfirmModal.js +53 -0
  22. package/dist/components/ConfirmModal.js.map +1 -0
  23. package/dist/components/Divider.d.ts +6 -0
  24. package/dist/components/Divider.js +35 -0
  25. package/dist/components/Divider.js.map +1 -0
  26. package/dist/components/InputComponents.d.ts +23 -0
  27. package/dist/components/InputComponents.js +83 -0
  28. package/dist/components/InputComponents.js.map +1 -0
  29. package/dist/components/ListComponents.d.ts +13 -0
  30. package/dist/components/ListComponents.js +28 -0
  31. package/dist/components/ListComponents.js.map +1 -0
  32. package/dist/components/LoadingSpinner.d.ts +7 -0
  33. package/dist/components/LoadingSpinner.js +21 -0
  34. package/dist/components/LoadingSpinner.js.map +1 -0
  35. package/dist/components/Progress.d.ts +9 -0
  36. package/dist/components/Progress.js +43 -0
  37. package/dist/components/Progress.js.map +1 -0
  38. package/dist/components/Radio.d.ts +21 -0
  39. package/dist/components/Radio.js +51 -0
  40. package/dist/components/Radio.js.map +1 -0
  41. package/dist/components/ReadOnlyField.d.ts +6 -0
  42. package/dist/components/ReadOnlyField.js +21 -0
  43. package/dist/components/ReadOnlyField.js.map +1 -0
  44. package/dist/components/Skeleton.d.ts +7 -0
  45. package/dist/components/Skeleton.js +28 -0
  46. package/dist/components/Skeleton.js.map +1 -0
  47. package/dist/components/Stack.d.ts +9 -0
  48. package/dist/components/Stack.js +28 -0
  49. package/dist/components/Stack.js.map +1 -0
  50. package/dist/components/Steps.d.ts +14 -0
  51. package/dist/components/Steps.js +84 -0
  52. package/dist/components/Steps.js.map +1 -0
  53. package/dist/components/Switch.d.ts +5 -0
  54. package/dist/components/Switch.js +39 -0
  55. package/dist/components/Switch.js.map +1 -0
  56. package/dist/components/Table.d.ts +31 -0
  57. package/dist/components/Table.js +54 -0
  58. package/dist/components/Table.js.map +1 -0
  59. package/dist/components/Tabs.d.ts +15 -0
  60. package/dist/components/Tabs.js +42 -0
  61. package/dist/components/Tabs.js.map +1 -0
  62. package/dist/components/Tag.d.ts +7 -0
  63. package/dist/components/Tag.js +43 -0
  64. package/dist/components/Tag.js.map +1 -0
  65. package/dist/components/Tooltip.d.ts +6 -0
  66. package/dist/components/Tooltip.js +43 -0
  67. package/dist/components/Tooltip.js.map +1 -0
  68. package/dist/components/Typography.d.ts +16 -0
  69. package/dist/components/Typography.js +68 -0
  70. package/dist/components/Typography.js.map +1 -0
  71. package/dist/index.d.ts +48 -0
  72. package/dist/index.js +29 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/tokens.d.ts +69 -0
  75. package/dist/tokens.js +69 -0
  76. package/dist/tokens.js.map +1 -0
  77. package/package.json +45 -0
  78. package/tailwind.preset.js +23 -0
package/README.md ADDED
@@ -0,0 +1,258 @@
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.4.0** — Toàn bộ 21 component đã được migrate sang **TypeScript** với strict prop interfaces và full IntelliSense support.
6
+
7
+ ## 🚀 Cài đặt
8
+
9
+ Thư viện này được quản lý như một package nội bộ trong monorepo. Các MFE có thể sử dụng bằng cách import trực tiếp:
10
+
11
+ ```typescript
12
+ // Import component + type
13
+ import { Button, type ButtonProps } from '@tonght3/shared-design-system';
14
+ import { Card, Badge, tokens } from '@tonght3/shared-design-system';
15
+ ```
16
+
17
+ ## 🎨 Design Tokens
18
+
19
+ Thư viện sử dụng hệ thống Design Tokens tập trung tại `src/tokens.ts`. Bạn nên sử dụng các token này thay vì mã màu hardcode để đảm bảo tính nhất quán.
20
+
21
+ ```typescript
22
+ import { tokens, type DesignTokens } from '@tonght3/shared-design-system';
23
+
24
+ const myStyle = {
25
+ color: tokens.color.primary,
26
+ padding: tokens.spacing['4'],
27
+ borderRadius: tokens.radius.md
28
+ };
29
+ ```
30
+
31
+ ## 🧱 Các thành phần chính
32
+
33
+ ### 1. Button
34
+ Thành phần nút bấm đa năng với các biến thể: `primary`, `secondary`, `danger`, `ghost`.
35
+
36
+ ```jsx
37
+ <Button variant="primary" onClick={handleClick}>Xác nhận</Button>
38
+ <Button variant="ghost" size="sm">Hủy</Button>
39
+ ```
40
+
41
+ ### 2. Badge
42
+ Dùng để hiển thị trạng thái hoặc nhãn dán. Các variant: `success`, `warning`, `danger`, `info`, `slate`.
43
+
44
+ ```jsx
45
+ <Badge variant="success">Hoàn thành</Badge>
46
+ <Badge variant="warning">Chờ duyệt</Badge>
47
+ ```
48
+
49
+ ### 3. Form Components
50
+ Bộ công cụ nhập liệu đồng bộ: `Input`, `Textarea`, `Select`, `Checkbox`.
51
+
52
+ ```jsx
53
+ <Input label="Họ và tên" placeholder="Nhập tên..." required />
54
+ <Select label="Phòng ban">
55
+ <option value="IT">Công nghệ thông tin</option>
56
+ <option value="HR">Nhân sự</option>
57
+ </Select>
58
+ ```
59
+
60
+ ### 4. Card
61
+ Thành phần container dùng để nhóm nội dung. Hỗ trợ `title`, `subtitle` và `footer`.
62
+
63
+ ```jsx
64
+ <Card title="Thông tin cá nhân" subtitle="Chi tiết hồ sơ nhân viên">
65
+ <Text>Thông tin bên trong card...</Text>
66
+ </Card>
67
+ ```
68
+
69
+ ### 5. Typography
70
+ Enforce font types và hierarchy: `Heading`, `Text`, `SectionHeader`.
71
+
72
+ ```jsx
73
+ <Heading level={2}>Tiêu đề lớn</Heading>
74
+ <Text size="sm" color="muted">Ghi chú nhỏ</Text>
75
+ <SectionHeader title="Thông tin nghiệp vụ" />
76
+ ```
77
+
78
+ ### 6. ReadOnlyField
79
+ Sử dụng trong các màn hình chi tiết để hiển thị dữ liệu ở chế độ chỉ đọc một cách chuyên nghiệp.
80
+
81
+ ```jsx
82
+ <ReadOnlyField label="Mã yêu cầu" value="RQ-2024-001" />
83
+ ```
84
+
85
+ ### 7. LoadingSpinner
86
+ Animation quay đều sử dụng màu thương hiệu để biểu thị trạng thái đang tải.
87
+
88
+ ```jsx
89
+ <LoadingSpinner size="md" />
90
+ ```
91
+
92
+ ---
93
+
94
+ ## 🌟 Thành phần nâng cao (Phase 2 - Cảm hứng từ MUI)
95
+
96
+ ### 8. Avatar
97
+ Hiển thị ảnh đại diện hoặc chữ cái đầu. Hỗ trợ nhiều kích thước (`xs` đến `xl`) và hình dạng (`circle`, `rounded`, `square`).
98
+
99
+ ```jsx
100
+ <Avatar src="/path/to/img.jpg" size="lg" />
101
+ <Avatar variant="rounded">JD</Avatar>
102
+ ```
103
+
104
+ ### 9. Switch
105
+ Nút gạt bật/tắt hiện đại thay thế cho Checkbox.
106
+
107
+ ```jsx
108
+ <Switch checked={isActive} onChange={toggle} label="Kích hoạt tính năng" />
109
+ ```
110
+
111
+ ### 10. Tabs & Tab
112
+ Hệ thống chuyển đổi nội dung dạng tab. Hỗ trợ variant `standard` và `pills`.
113
+
114
+ ```jsx
115
+ <Tabs value={tabIndex} onChange={setTabIndex}>
116
+ <Tab value={0} label="Tổng quan" icon={<HomeIcon />} />
117
+ <Tab value={1} label="Lịch sử" />
118
+ </Tabs>
119
+ ```
120
+
121
+ ### 11. Breadcrumbs
122
+ Định vị vị trí trong cấu trúc trang.
123
+
124
+ ```jsx
125
+ <Breadcrumbs items={[
126
+ { label: 'Trang chủ', onClick: goHome },
127
+ { label: 'Cài đặt', onClick: goSettings },
128
+ { label: 'Thông tin cá nhân' }
129
+ ]} />
130
+ ```
131
+
132
+ ### 12. Skeleton
133
+ Hiệu ứng placeholder khi đang tải dữ liệu.
134
+
135
+ ```jsx
136
+ <Skeleton variant="circle" width="40px" height="40px" />
137
+ <Skeleton variant="rectangular" height="200px" />
138
+ <Skeleton variant="text" width="60%" />
139
+ ```
140
+
141
+ ### 13. Tooltip
142
+ Hiển thị chú thích khi di chuột. Hỗ trợ 4 hướng: `top`, `bottom`, `left`, `right`.
143
+
144
+ ```jsx
145
+ <Tooltip title="Xóa bản ghi này" position="top">
146
+ <Button variant="danger">Xóa</Button>
147
+ </Tooltip>
148
+ ```
149
+
150
+ ### 14. Divider
151
+ Đường kẻ phân tách nội dung.
152
+
153
+ ```jsx
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.
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
+ severity?: 'success' | 'warning' | 'error' | 'info';
4
+ title?: string;
5
+ variant?: 'standard';
6
+ icon?: React.ReactNode;
7
+ onClose?: () => void;
8
+ }
9
+ export declare const Alert: React.FC<AlertProps>;
@@ -0,0 +1,58 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { tokens } from '../tokens';
3
+ const getIcon = (severity, icon) => {
4
+ if (icon)
5
+ return icon;
6
+ switch (severity) {
7
+ case 'success':
8
+ return (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [_jsx("path", { d: "M22 11.08V12a10 10 0 11-5.93-9.14" }), _jsx("path", { d: "M22 4L12 14.01l-3-3" })] }));
9
+ case 'warning':
10
+ return (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [_jsx("path", { d: "M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z" }), _jsx("line", { x1: "12", y1: "9", x2: "12", y2: "13" }), _jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })] }));
11
+ case 'error':
12
+ return (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "15", y1: "9", x2: "9", y2: "15" }), _jsx("line", { x1: "9", y1: "9", x2: "15", y2: "15" })] }));
13
+ case 'info':
14
+ default:
15
+ return (_jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "16", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })] }));
16
+ }
17
+ };
18
+ const getSeverityStyles = (severity) => {
19
+ switch (severity) {
20
+ case 'success':
21
+ return { bg: tokens.color.successBg, border: 'rgba(16, 185, 129, 0.2)', text: tokens.color.success, darkText: '#065f46' };
22
+ case 'warning':
23
+ return { bg: tokens.color.warningBg, border: 'rgba(245, 158, 11, 0.2)', text: tokens.color.warning, darkText: '#92400e' };
24
+ case 'error':
25
+ return { bg: tokens.color.dangerBg, border: 'rgba(239, 68, 68, 0.2)', text: tokens.color.danger, darkText: '#991b1b' };
26
+ case 'info':
27
+ default:
28
+ return { bg: tokens.color.infoBg, border: 'rgba(59, 130, 246, 0.2)', text: tokens.color.info, darkText: '#1e40af' };
29
+ }
30
+ };
31
+ export const Alert = ({ severity = 'info', title, children, className = '', style = {}, variant = 'standard', icon, onClose, ...props }) => {
32
+ const s = getSeverityStyles(severity);
33
+ const baseStyle = {
34
+ display: 'flex',
35
+ gap: tokens.spacing['3'],
36
+ padding: tokens.spacing['4'],
37
+ borderRadius: tokens.radius.lg,
38
+ border: `1px solid ${s.border}`,
39
+ backgroundColor: s.bg,
40
+ color: s.darkText,
41
+ fontSize: tokens.font.sm,
42
+ lineHeight: 1.5,
43
+ position: 'relative',
44
+ ...style,
45
+ };
46
+ return (_jsxs("div", { style: baseStyle, className: className, ...props, children: [_jsx("div", { style: { color: s.text, flexShrink: 0, marginTop: '2px' }, children: getIcon(severity, icon) }), _jsxs("div", { style: { flex: 1 }, children: [title && _jsx("div", { style: { fontWeight: tokens.font.weightSemibold, marginBottom: '2px' }, children: title }), _jsx("div", { style: { opacity: 0.9 }, children: children })] }), onClose && (_jsx("button", { onClick: onClose, style: {
47
+ background: 'none',
48
+ border: 'none',
49
+ cursor: 'pointer',
50
+ padding: tokens.spacing['1'],
51
+ color: 'inherit',
52
+ opacity: 0.5,
53
+ display: 'flex',
54
+ alignItems: 'center',
55
+ justifyContent: 'center',
56
+ }, children: _jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M18 6L6 18M6 6l12 12" }) }) }))] }));
57
+ };
58
+ //# sourceMappingURL=Alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.js","sourceRoot":"","sources":["../../src/components/Alert.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface AvatarProps extends React.HTMLAttributes<HTMLElement> {
3
+ src?: string;
4
+ alt?: string;
5
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
6
+ variant?: 'circle' | 'rounded' | 'square';
7
+ }
8
+ export declare const Avatar: React.FC<AvatarProps>;
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { tokens } from '../tokens';
3
+ export const Avatar = ({ src, alt, children, size = 'md', variant = 'circle', className = '', style = {}, ...props }) => {
4
+ const getDims = () => {
5
+ switch (size) {
6
+ case 'xs': return '24px';
7
+ case 'sm': return '32px';
8
+ case 'lg': return '48px';
9
+ case 'xl': return '64px';
10
+ case 'md':
11
+ default: return '40px';
12
+ }
13
+ };
14
+ const getRadius = () => {
15
+ if (variant === 'rounded')
16
+ return tokens.radius.md;
17
+ if (variant === 'square')
18
+ return '0';
19
+ return '50%';
20
+ };
21
+ const dims = getDims();
22
+ const baseStyle = {
23
+ width: dims,
24
+ height: dims,
25
+ borderRadius: getRadius(),
26
+ display: 'inline-flex',
27
+ alignItems: 'center',
28
+ justifyContent: 'center',
29
+ backgroundColor: tokens.color.surfaceAlt,
30
+ color: tokens.color.textMuted,
31
+ fontSize: `calc(${dims} / 2.2)`,
32
+ fontWeight: tokens.font.weightBold,
33
+ overflow: 'hidden',
34
+ userSelect: 'none',
35
+ border: `1px solid ${tokens.color.border}`,
36
+ ...style
37
+ };
38
+ if (src) {
39
+ return (_jsx("img", { src: src, alt: alt || 'Avatar', style: baseStyle, className: className, ...props }));
40
+ }
41
+ return (_jsx("div", { style: baseStyle, className: className, ...props, children: children }));
42
+ };
43
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../src/components/Avatar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AASnC,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAC5C,GAAG,EACH,GAAG,EACH,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,QAAQ,EAClB,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,EACV,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,QAAO,IAAI,EAAE,CAAC;YACZ,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC;YACzB,KAAK,IAAI,CAAC;YACV,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,SAAS,GAAwB;QACrC,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,SAAS,EAAE;QACzB,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;QACxB,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;QACxC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;QAC7B,QAAQ,EAAE,QAAQ,IAAI,SAAS;QAC/B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;QAClC,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,MAAe;QAC3B,MAAM,EAAE,aAAa,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QAC1C,GAAG,KAAK;KACT,CAAC;IAEF,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,IAAI,QAAQ,EACpB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,SAAS,KAChB,KAAK,GACT,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,KAAM,KAA6C,YAC3F,QAAQ,GACL,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
3
+ variant?: 'success' | 'warning' | 'danger' | 'info' | 'slate';
4
+ }
5
+ export declare const Badge: React.FC<BadgeProps>;
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { tokens } from '../tokens';
3
+ export const Badge = ({ children, variant = 'slate', className = '', style = {}, ...props }) => {
4
+ const getVariantStyles = () => {
5
+ switch (variant) {
6
+ case 'success':
7
+ return {
8
+ backgroundColor: tokens.color.successBg,
9
+ color: tokens.color.success,
10
+ borderColor: 'rgba(16, 185, 129, 0.2)'
11
+ };
12
+ case 'warning':
13
+ return {
14
+ backgroundColor: tokens.color.warningBg,
15
+ color: tokens.color.warning,
16
+ borderColor: 'rgba(245, 158, 11, 0.2)'
17
+ };
18
+ case 'danger':
19
+ return {
20
+ backgroundColor: tokens.color.dangerBg,
21
+ color: tokens.color.danger,
22
+ borderColor: 'rgba(239, 68, 68, 0.2)'
23
+ };
24
+ case 'info':
25
+ return {
26
+ backgroundColor: tokens.color.infoBg,
27
+ color: tokens.color.info,
28
+ borderColor: 'rgba(59, 130, 246, 0.2)'
29
+ };
30
+ case 'slate':
31
+ default:
32
+ return {
33
+ backgroundColor: tokens.color.surfaceAlt,
34
+ color: tokens.color.textMuted,
35
+ borderColor: tokens.color.border
36
+ };
37
+ }
38
+ };
39
+ const vStyles = getVariantStyles();
40
+ const baseStyle = {
41
+ display: 'inline-flex',
42
+ alignItems: 'center',
43
+ padding: `${tokens.spacing[1]} ${tokens.spacing[3]}`,
44
+ borderRadius: tokens.radius.full,
45
+ fontSize: tokens.font.xs,
46
+ fontWeight: tokens.font.weightBold,
47
+ textTransform: 'uppercase',
48
+ letterSpacing: '0.05em',
49
+ border: '1px solid transparent',
50
+ ...vStyles,
51
+ ...style
52
+ };
53
+ return (_jsx("span", { style: baseStyle, className: className, ...props, children: children }));
54
+ };
55
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","sourceRoot":"","sources":["../../src/components/Badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAMnC,MAAM,CAAC,MAAM,KAAK,GAAyB,CAAC,EAC1C,QAAQ,EACR,OAAO,GAAG,OAAO,EACjB,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,EACV,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,SAAS;gBACZ,OAAO;oBACL,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC3B,WAAW,EAAE,yBAAyB;iBACvC,CAAC;YACJ,KAAK,SAAS;gBACZ,OAAO;oBACL,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC3B,WAAW,EAAE,yBAAyB;iBACvC,CAAC;YACJ,KAAK,QAAQ;gBACX,OAAO;oBACL,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;oBACtC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBAC1B,WAAW,EAAE,wBAAwB;iBACtC,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;oBACpC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACxB,WAAW,EAAE,yBAAyB;iBACvC,CAAC;YACJ,KAAK,OAAO,CAAC;YACb;gBACE,OAAO;oBACL,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;oBACxC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;oBAC7B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;iBACjC,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,MAAM,SAAS,GAAwB;QACrC,OAAO,EAAE,aAAa;QACtB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACpD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QAChC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;QACxB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;QAClC,aAAa,EAAE,WAAoB;QACnC,aAAa,EAAE,QAAQ;QACvB,MAAM,EAAE,uBAAuB;QAC/B,GAAG,OAAO;QACV,GAAG,KAAK;KACT,CAAC;IAEF,OAAO,CACL,eAAM,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,KAAM,KAAK,YACpD,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface BreadcrumbItem {
3
+ label: string;
4
+ onClick?: () => void;
5
+ }
6
+ export interface BreadcrumbsProps extends React.HTMLAttributes<HTMLElement> {
7
+ items: BreadcrumbItem[];
8
+ separator?: React.ReactNode;
9
+ }
10
+ export declare const Breadcrumbs: React.FC<BreadcrumbsProps>;
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { tokens } from '../tokens';
3
+ export const Breadcrumbs = ({ items = [], separator = '/', className = '', style = {} }) => {
4
+ const containerStyle = {
5
+ display: 'flex',
6
+ alignItems: 'center',
7
+ gap: tokens.spacing[2],
8
+ fontSize: tokens.font.xs,
9
+ color: tokens.color.textMuted,
10
+ listStyle: 'none',
11
+ padding: 0,
12
+ margin: 0,
13
+ ...style
14
+ };
15
+ const itemStyle = {
16
+ display: 'flex',
17
+ alignItems: 'center',
18
+ gap: tokens.spacing[2],
19
+ };
20
+ const linkStyle = {
21
+ color: 'inherit',
22
+ textDecoration: 'none',
23
+ cursor: 'pointer',
24
+ transition: tokens.transition.fast,
25
+ };
26
+ return (_jsx("nav", { "aria-label": "Breadcrumb", className: className, children: _jsx("ol", { style: containerStyle, children: items.map((item, index) => {
27
+ const isLast = index === items.length - 1;
28
+ return (_jsx("li", { style: itemStyle, children: isLast ? (_jsx("span", { style: { fontWeight: tokens.font.weightBold, color: tokens.color.text }, children: item.label })) : (_jsxs(_Fragment, { children: [_jsx("span", { style: linkStyle, onClick: item.onClick, onMouseEnter: (e) => e.currentTarget.style.color = tokens.color.primary, onMouseLeave: (e) => e.currentTarget.style.color = 'inherit', children: item.label }), _jsx("span", { style: { opacity: 0.5, userSelect: 'none' }, children: separator })] })) }, index));
29
+ }) }) }));
30
+ };
31
+ //# sourceMappingURL=Breadcrumbs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.js","sourceRoot":"","sources":["../../src/components/Breadcrumbs.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAYnC,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,KAAK,GAAG,EAAE,EACV,SAAS,GAAG,GAAG,EACf,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,EACX,EAAE,EAAE;IACH,MAAM,cAAc,GAAwB;QAC1C,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;QAC7B,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,GAAG,KAAK;KACT,CAAC;IAEF,MAAM,SAAS,GAAwB;QACrC,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;KACvB,CAAC;IAEF,MAAM,SAAS,GAAwB;QACrC,KAAK,EAAE,SAAS;QAChB,cAAc,EAAE,MAAM;QACtB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;KACnC,CAAC;IAEF,OAAO,CACL,4BAAgB,YAAY,EAAC,SAAS,EAAE,SAAS,YAC/C,aAAI,KAAK,EAAE,cAAc,YACtB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAE1C,OAAO,CACL,aAAgB,KAAK,EAAE,SAAS,YAC7B,MAAM,CAAC,CAAC,CAAC,CACR,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,YAC1E,IAAI,CAAC,KAAK,GACN,CACR,CAAC,CAAC,CAAC,CACF,8BACE,eACE,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,aAA6B,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EACxF,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,aAA6B,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,YAE5E,IAAI,CAAC,KAAK,GACN,EACP,eAAM,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAe,EAAE,YAAG,SAAS,GAAQ,IAC7E,CACJ,IAjBM,KAAK,CAkBT,CACN,CAAC;YACJ,CAAC,CAAC,GACC,GACD,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
4
+ size?: 'sm' | 'md' | 'lg';
5
+ isActive?: boolean;
6
+ }
7
+ export declare const Button: React.FC<ButtonProps>;
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { tokens } from '../tokens';
4
+ export const Button = ({ children, variant = 'primary', size = 'md', disabled = false, onClick, style = {}, className = '', isActive = false, ...props }) => {
5
+ const [isHovered, setIsHovered] = React.useState(false);
6
+ const getVariantStyles = () => {
7
+ switch (variant) {
8
+ case 'secondary':
9
+ return {
10
+ backgroundColor: tokens.color.surfaceAlt,
11
+ color: tokens.color.text,
12
+ border: `1px solid ${tokens.color.border}`,
13
+ boxShadow: tokens.shadow.sm,
14
+ hoverBg: tokens.color.border,
15
+ };
16
+ case 'danger':
17
+ return {
18
+ backgroundColor: tokens.color.danger,
19
+ color: 'white',
20
+ border: '1px solid transparent',
21
+ boxShadow: tokens.shadow.sm,
22
+ hoverBg: '#dc2626',
23
+ };
24
+ case 'ghost':
25
+ return {
26
+ backgroundColor: 'transparent',
27
+ color: tokens.color.textMuted,
28
+ border: '1px solid transparent',
29
+ boxShadow: 'none',
30
+ hoverBg: tokens.color.surfaceAlt,
31
+ };
32
+ case 'primary':
33
+ default:
34
+ return {
35
+ backgroundColor: tokens.color.primary,
36
+ color: 'white',
37
+ border: '1px solid transparent',
38
+ boxShadow: tokens.shadow.sm,
39
+ hoverBg: tokens.color.primaryDark,
40
+ };
41
+ }
42
+ };
43
+ const getSizeStyles = () => {
44
+ switch (size) {
45
+ case 'sm':
46
+ return { padding: `${tokens.spacing[1]} ${tokens.spacing[3]}`, fontSize: tokens.font.xs };
47
+ case 'lg':
48
+ return { padding: `${tokens.spacing[3]} ${tokens.spacing[6]}`, fontSize: tokens.font.md };
49
+ case 'md':
50
+ default:
51
+ return { padding: `${tokens.spacing[2]} ${tokens.spacing[4]}`, fontSize: tokens.font.sm };
52
+ }
53
+ };
54
+ const vStyles = getVariantStyles();
55
+ const sStyles = getSizeStyles();
56
+ const baseStyle = {
57
+ fontFamily: tokens.font.family,
58
+ fontWeight: tokens.font.weightBold,
59
+ borderRadius: tokens.radius.md,
60
+ cursor: disabled ? 'not-allowed' : 'pointer',
61
+ transition: tokens.transition.fast,
62
+ display: 'inline-flex',
63
+ alignItems: 'center',
64
+ justifyContent: 'center',
65
+ gap: tokens.spacing[2],
66
+ outline: 'none',
67
+ opacity: disabled ? 0.6 : 1,
68
+ backgroundColor: disabled ? vStyles.backgroundColor : (isActive ? vStyles.hoverBg : (isHovered ? vStyles.hoverBg : vStyles.backgroundColor)),
69
+ color: vStyles.color,
70
+ border: vStyles.border,
71
+ boxShadow: vStyles.boxShadow,
72
+ ...sStyles,
73
+ ...style,
74
+ };
75
+ return (_jsx("button", { style: baseStyle, className: className, disabled: disabled, onClick: disabled ? undefined : onClick, onMouseEnter: () => !disabled && setIsHovered(true), onMouseLeave: () => !disabled && setIsHovered(false), ...props, children: children }));
76
+ };
77
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../src/components/Button.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
3
+ title?: React.ReactNode;
4
+ subtitle?: React.ReactNode;
5
+ footer?: React.ReactNode;
6
+ padding?: 'sm' | 'md' | 'lg';
7
+ }
8
+ export declare const Card: React.FC<CardProps>;
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { tokens } from '../tokens';
3
+ export const Card = ({ children, title, subtitle, footer, className = '', style = {}, padding = 'md', ...props }) => {
4
+ const getPadding = () => {
5
+ switch (padding) {
6
+ case 'sm': return tokens.spacing[4];
7
+ case 'lg': return tokens.spacing[8];
8
+ case 'md':
9
+ default: return tokens.spacing[6];
10
+ }
11
+ };
12
+ const containerStyle = {
13
+ backgroundColor: tokens.color.surface,
14
+ borderRadius: tokens.radius.xl,
15
+ border: `1px solid ${tokens.color.border}`,
16
+ boxShadow: tokens.shadow.sm,
17
+ overflow: 'hidden',
18
+ display: 'flex',
19
+ flexDirection: 'column',
20
+ ...style
21
+ };
22
+ const bodyStyle = {
23
+ padding: getPadding(),
24
+ flex: 1
25
+ };
26
+ const headerStyle = {
27
+ padding: `${tokens.spacing[4]} ${getPadding()}`,
28
+ borderBottom: `1px solid ${tokens.color.surfaceAlt}`,
29
+ backgroundColor: tokens.color.surfaceAlt,
30
+ borderTop: `4px solid ${tokens.color.primary}`,
31
+ };
32
+ const footerStyle = {
33
+ padding: `${tokens.spacing[4]} ${getPadding()}`,
34
+ borderTop: `1px solid ${tokens.color.border}`,
35
+ backgroundColor: tokens.color.surfaceAlt,
36
+ };
37
+ return (_jsxs("div", { style: containerStyle, className: className, ...props, children: [(title || subtitle) && (_jsxs("div", { style: headerStyle, children: [title && _jsx("h3", { style: { margin: 0, fontSize: tokens.font.md, fontWeight: tokens.font.weightBold, color: tokens.color.text }, children: title }), subtitle && _jsx("p", { style: { margin: `${tokens.spacing[1]} 0 0 0`, fontSize: tokens.font.xs, color: tokens.color.textMuted }, children: subtitle })] })), _jsx("div", { style: bodyStyle, children: children }), footer && (_jsx("div", { style: footerStyle, children: footer }))] }));
38
+ };
39
+ //# sourceMappingURL=Card.js.map