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.
- package/README.md +258 -0
- package/dist/components/Alert.d.ts +9 -0
- package/dist/components/Alert.js +58 -0
- package/dist/components/Alert.js.map +1 -0
- package/dist/components/Avatar.d.ts +8 -0
- package/dist/components/Avatar.js +43 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.d.ts +5 -0
- package/dist/components/Badge.js +55 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Breadcrumbs.d.ts +10 -0
- package/dist/components/Breadcrumbs.js +31 -0
- package/dist/components/Breadcrumbs.js.map +1 -0
- package/dist/components/Button.d.ts +7 -0
- package/dist/components/Button.js +77 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.d.ts +8 -0
- package/dist/components/Card.js +39 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/ConfirmModal.d.ts +12 -0
- package/dist/components/ConfirmModal.js +53 -0
- package/dist/components/ConfirmModal.js.map +1 -0
- package/dist/components/Divider.d.ts +6 -0
- package/dist/components/Divider.js +35 -0
- package/dist/components/Divider.js.map +1 -0
- package/dist/components/InputComponents.d.ts +23 -0
- package/dist/components/InputComponents.js +83 -0
- package/dist/components/InputComponents.js.map +1 -0
- package/dist/components/ListComponents.d.ts +13 -0
- package/dist/components/ListComponents.js +28 -0
- package/dist/components/ListComponents.js.map +1 -0
- package/dist/components/LoadingSpinner.d.ts +7 -0
- package/dist/components/LoadingSpinner.js +21 -0
- package/dist/components/LoadingSpinner.js.map +1 -0
- package/dist/components/Progress.d.ts +9 -0
- package/dist/components/Progress.js +43 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/Radio.d.ts +21 -0
- package/dist/components/Radio.js +51 -0
- package/dist/components/Radio.js.map +1 -0
- package/dist/components/ReadOnlyField.d.ts +6 -0
- package/dist/components/ReadOnlyField.js +21 -0
- package/dist/components/ReadOnlyField.js.map +1 -0
- package/dist/components/Skeleton.d.ts +7 -0
- package/dist/components/Skeleton.js +28 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/Stack.d.ts +9 -0
- package/dist/components/Stack.js +28 -0
- package/dist/components/Stack.js.map +1 -0
- package/dist/components/Steps.d.ts +14 -0
- package/dist/components/Steps.js +84 -0
- package/dist/components/Steps.js.map +1 -0
- package/dist/components/Switch.d.ts +5 -0
- package/dist/components/Switch.js +39 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Table.d.ts +31 -0
- package/dist/components/Table.js +54 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.d.ts +15 -0
- package/dist/components/Tabs.js +42 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Tag.d.ts +7 -0
- package/dist/components/Tag.js +43 -0
- package/dist/components/Tag.js.map +1 -0
- package/dist/components/Tooltip.d.ts +6 -0
- package/dist/components/Tooltip.js +43 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/Typography.d.ts +16 -0
- package/dist/components/Typography.js +68 -0
- package/dist/components/Typography.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens.d.ts +69 -0
- package/dist/tokens.js +69 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +45 -0
- 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,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
|