@delightui/components 0.1.105 → 0.1.107
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 +104 -1
- package/dist/cjs/components/molecules/Modal/DemoModal.d.ts +8 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/index.d.ts +3 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
- package/dist/cjs/components/molecules/Modal/index.d.ts +2 -0
- package/dist/cjs/components/molecules/index.d.ts +2 -0
- package/dist/cjs/library.css +19 -6
- package/dist/cjs/library.js +3 -3
- package/dist/cjs/library.js.map +1 -1
- package/dist/esm/components/molecules/Modal/DemoModal.d.ts +8 -0
- package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
- package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
- package/dist/esm/components/molecules/Modal/ModalContext/index.d.ts +3 -0
- package/dist/esm/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
- package/dist/esm/components/molecules/Modal/index.d.ts +2 -0
- package/dist/esm/components/molecules/index.d.ts +2 -0
- package/dist/esm/library.css +19 -6
- package/dist/esm/library.js +3 -3
- package/dist/esm/library.js.map +1 -1
- package/dist/index.d.ts +108 -2
- package/docs/README.md +264 -0
- package/docs/components/atoms/ActionImage.md +119 -0
- package/docs/components/atoms/Button.md +197 -0
- package/docs/components/atoms/Checkbox.md +299 -0
- package/docs/components/atoms/CheckboxItem.md +314 -0
- package/docs/components/atoms/Chip.md +380 -0
- package/docs/components/atoms/CustomToggle.md +270 -0
- package/docs/components/atoms/Icon.md +365 -0
- package/docs/components/atoms/IconButton.md +407 -0
- package/docs/components/atoms/Image.md +448 -0
- package/docs/components/atoms/Input.md +430 -0
- package/docs/components/atoms/ListItem.md +502 -0
- package/docs/components/atoms/Password.md +472 -0
- package/docs/components/atoms/RadioButton.md +614 -0
- package/docs/components/atoms/RadioButtonItem.md +588 -0
- package/docs/components/atoms/ResponsiveComponent.md +612 -0
- package/docs/components/atoms/SelectListItem.md +609 -0
- package/docs/components/atoms/Slider.md +605 -0
- package/docs/components/atoms/Spinner.md +605 -0
- package/docs/components/atoms/Text.md +463 -0
- package/docs/components/atoms/TextArea.md +670 -0
- package/docs/components/atoms/ToastNotification.md +668 -0
- package/docs/components/atoms/Toggle.md +737 -0
- package/docs/components/atoms/ToggleButton.md +751 -0
- package/docs/components/atoms/Tooltip.md +391 -0
- package/docs/components/molecules/Accordion.md +440 -0
- package/docs/components/molecules/AccordionGroup.md +547 -0
- package/docs/components/molecules/ActionCard.md +546 -0
- package/docs/components/molecules/Breadcrumb.md +403 -0
- package/docs/components/molecules/Breadcrumbs.md +485 -0
- package/docs/components/molecules/ButtonGroup.md +383 -0
- package/docs/components/molecules/Card.md +298 -0
- package/docs/components/molecules/ChipInput.md +646 -0
- package/docs/components/molecules/ContextMenu.md +768 -0
- package/docs/components/molecules/CustomTimeSelector.md +116 -0
- package/docs/components/molecules/DatePicker.md +516 -0
- package/docs/components/molecules/DateTimeSelector.md +166 -0
- package/docs/components/molecules/FormField.md +312 -0
- package/docs/components/molecules/Grid.md +577 -0
- package/docs/components/molecules/GridItem.md +834 -0
- package/docs/components/molecules/GridList.md +244 -0
- package/docs/components/molecules/List.md +485 -0
- package/docs/components/molecules/Modal.md +470 -0
- package/docs/components/molecules/ModalFooter.md +702 -0
- package/docs/components/molecules/ModalHeader.md +756 -0
- package/docs/components/molecules/ModalProvider.md +205 -0
- package/docs/components/molecules/Nav.md +530 -0
- package/docs/components/molecules/NavItem.md +572 -0
- package/docs/components/molecules/NavLink.md +499 -0
- package/docs/components/molecules/Option.md +521 -0
- package/docs/components/molecules/Pagination.md +592 -0
- package/docs/components/molecules/PaginationNumberField.md +722 -0
- package/docs/components/molecules/Popover.md +516 -0
- package/docs/components/molecules/ProgressBar.md +624 -0
- package/docs/components/molecules/RadioGroup.md +831 -0
- package/docs/components/molecules/RepeaterList.md +185 -0
- package/docs/components/molecules/Select.md +402 -0
- package/docs/components/molecules/SortableTrigger.md +82 -0
- package/docs/components/molecules/useModal.md +379 -0
- package/docs/components/organisms/Dropzone.md +346 -0
- package/docs/components/organisms/DropzoneClear.md +135 -0
- package/docs/components/organisms/DropzoneContent.md +216 -0
- package/docs/components/organisms/DropzoneFilename.md +191 -0
- package/docs/components/organisms/DropzoneSupportedFormats.md +184 -0
- package/docs/components/organisms/DropzoneTrigger.md +209 -0
- package/docs/components/organisms/Form.md +533 -0
- package/docs/components/organisms/SlideOutPanel.md +662 -0
- package/docs/components/organisms/TabContent.md +902 -0
- package/docs/components/organisms/TabItem.md +1091 -0
- package/docs/components/organisms/Table.md +611 -0
- package/docs/components/organisms/TableBody.md +679 -0
- package/docs/components/organisms/TableCell.md +482 -0
- package/docs/components/organisms/TableHeader.md +513 -0
- package/docs/components/organisms/TableHeaderCell.md +661 -0
- package/docs/components/organisms/TableRow.md +715 -0
- package/docs/components/organisms/Tabs.md +1330 -0
- package/docs/components/utils/ConditionalView.md +568 -0
- package/docs/components/utils/RenderStateView.md +726 -0
- package/docs/components/utils/WrapTextNodes.md +614 -0
- package/package.json +3 -2
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
# ActionCard
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
An interactive card component that serves as a clickable container for navigation and actions. Combines the visual structure of a card with the functionality of a link or button, supporting both internal routing and external navigation while maintaining accessibility and user experience standards.
|
|
6
|
+
|
|
7
|
+
## Aliases
|
|
8
|
+
|
|
9
|
+
- ActionCard
|
|
10
|
+
- ClickableCard
|
|
11
|
+
- NavigationCard
|
|
12
|
+
- LinkCard
|
|
13
|
+
- InteractiveCard
|
|
14
|
+
|
|
15
|
+
## Props Breakdown
|
|
16
|
+
|
|
17
|
+
**Extends:** `HTMLAttributes<HTMLDivElement>` & `Omit<LinkProps, 'to'>`
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Required | Description |
|
|
20
|
+
|------|------|---------|----------|-------------|
|
|
21
|
+
| `children` | `ReactNode` | - | Yes | The content to be displayed within the action card |
|
|
22
|
+
| `disabled` | `boolean` | `false` | No | Specifies if the action card is disabled |
|
|
23
|
+
| `className` | `string` | - | No | Additional CSS class names |
|
|
24
|
+
| `to` | `string \| -1` | - | No | Destination URL or path for navigation. External URLs (starting with 'https') render as anchor tags, internal paths use router navigation |
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
|
|
28
|
+
### Basic Usage
|
|
29
|
+
```tsx
|
|
30
|
+
import { ActionCard, Text, Icon } from '@delightui/components';
|
|
31
|
+
|
|
32
|
+
function BasicExample() {
|
|
33
|
+
return (
|
|
34
|
+
<ActionCard to="/dashboard">
|
|
35
|
+
<div className="action-card-content">
|
|
36
|
+
<Icon icon="Dashboard" size="Large" />
|
|
37
|
+
<Text type="Heading6">Dashboard</Text>
|
|
38
|
+
<Text type="BodySmall">View your analytics and metrics</Text>
|
|
39
|
+
</div>
|
|
40
|
+
</ActionCard>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Feature Cards Grid
|
|
46
|
+
```tsx
|
|
47
|
+
function FeatureCardsExample() {
|
|
48
|
+
const features = [
|
|
49
|
+
{
|
|
50
|
+
icon: "Analytics",
|
|
51
|
+
title: "Analytics",
|
|
52
|
+
description: "Track your performance metrics",
|
|
53
|
+
path: "/analytics"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
icon: "Settings",
|
|
57
|
+
title: "Settings",
|
|
58
|
+
description: "Manage your preferences",
|
|
59
|
+
path: "/settings"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
icon: "Users",
|
|
63
|
+
title: "Team",
|
|
64
|
+
description: "Collaborate with your team",
|
|
65
|
+
path: "/team"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
icon: "Help",
|
|
69
|
+
title: "Support",
|
|
70
|
+
description: "Get help when you need it",
|
|
71
|
+
path: "/support"
|
|
72
|
+
}
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<div className="feature-grid">
|
|
77
|
+
{features.map((feature, index) => (
|
|
78
|
+
<ActionCard key={index} to={feature.path} className="feature-card">
|
|
79
|
+
<div className="card-icon">
|
|
80
|
+
<Icon icon={feature.icon} size="Large" />
|
|
81
|
+
</div>
|
|
82
|
+
<div className="card-content">
|
|
83
|
+
<Text type="Heading6">{feature.title}</Text>
|
|
84
|
+
<Text type="BodySmall">{feature.description}</Text>
|
|
85
|
+
</div>
|
|
86
|
+
<div className="card-arrow">
|
|
87
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
88
|
+
</div>
|
|
89
|
+
</ActionCard>
|
|
90
|
+
))}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Product Cards
|
|
97
|
+
```tsx
|
|
98
|
+
function ProductCardsExample() {
|
|
99
|
+
const products = [
|
|
100
|
+
{
|
|
101
|
+
id: 1,
|
|
102
|
+
name: "Premium Headphones",
|
|
103
|
+
price: "$299.99",
|
|
104
|
+
image: "/headphones.jpg",
|
|
105
|
+
rating: 4.8,
|
|
106
|
+
inStock: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 2,
|
|
110
|
+
name: "Wireless Speaker",
|
|
111
|
+
price: "$159.99",
|
|
112
|
+
image: "/speaker.jpg",
|
|
113
|
+
rating: 4.6,
|
|
114
|
+
inStock: false
|
|
115
|
+
}
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<div className="product-grid">
|
|
120
|
+
{products.map(product => (
|
|
121
|
+
<ActionCard
|
|
122
|
+
key={product.id}
|
|
123
|
+
to={`/products/${product.id}`}
|
|
124
|
+
disabled={!product.inStock}
|
|
125
|
+
className="product-card"
|
|
126
|
+
>
|
|
127
|
+
<div className="product-image">
|
|
128
|
+
<Image src={product.image} alt={product.name} />
|
|
129
|
+
{!product.inStock && (
|
|
130
|
+
<div className="out-of-stock-overlay">
|
|
131
|
+
<Chip size="Small" style="C">Out of Stock</Chip>
|
|
132
|
+
</div>
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<div className="product-info">
|
|
137
|
+
<Text type="Heading6">{product.name}</Text>
|
|
138
|
+
<div className="product-rating">
|
|
139
|
+
<Icon icon="Star" size="Small" />
|
|
140
|
+
<Text type="BodySmall">{product.rating}</Text>
|
|
141
|
+
</div>
|
|
142
|
+
<Text type="Heading6" className="product-price">
|
|
143
|
+
{product.price}
|
|
144
|
+
</Text>
|
|
145
|
+
</div>
|
|
146
|
+
</ActionCard>
|
|
147
|
+
))}
|
|
148
|
+
</div>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### External Link Cards
|
|
154
|
+
```tsx
|
|
155
|
+
function ExternalLinksExample() {
|
|
156
|
+
const externalResources = [
|
|
157
|
+
{
|
|
158
|
+
title: "GitHub Repository",
|
|
159
|
+
description: "View our open source code",
|
|
160
|
+
url: "https://github.com/company/project",
|
|
161
|
+
icon: "GitHub"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
title: "Documentation",
|
|
165
|
+
description: "Read the full documentation",
|
|
166
|
+
url: "https://docs.company.com",
|
|
167
|
+
icon: "Book"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
title: "Community Forum",
|
|
171
|
+
description: "Join the discussion",
|
|
172
|
+
url: "https://community.company.com",
|
|
173
|
+
icon: "Forum"
|
|
174
|
+
}
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<div className="external-links">
|
|
179
|
+
{externalResources.map((resource, index) => (
|
|
180
|
+
<ActionCard key={index} to={resource.url} className="external-link-card">
|
|
181
|
+
<div className="link-content">
|
|
182
|
+
<div className="link-header">
|
|
183
|
+
<Icon icon={resource.icon} />
|
|
184
|
+
<Text type="Heading6">{resource.title}</Text>
|
|
185
|
+
<Icon icon="ExternalLink" size="Small" />
|
|
186
|
+
</div>
|
|
187
|
+
<Text type="BodySmall">{resource.description}</Text>
|
|
188
|
+
</div>
|
|
189
|
+
</ActionCard>
|
|
190
|
+
))}
|
|
191
|
+
</div>
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Service Cards with Status
|
|
197
|
+
```tsx
|
|
198
|
+
function ServiceCardsExample() {
|
|
199
|
+
const services = [
|
|
200
|
+
{
|
|
201
|
+
name: "API Gateway",
|
|
202
|
+
status: "active",
|
|
203
|
+
uptime: "99.9%",
|
|
204
|
+
path: "/services/api-gateway"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
name: "Database",
|
|
208
|
+
status: "warning",
|
|
209
|
+
uptime: "98.5%",
|
|
210
|
+
path: "/services/database"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: "Message Queue",
|
|
214
|
+
status: "error",
|
|
215
|
+
uptime: "95.2%",
|
|
216
|
+
path: "/services/message-queue"
|
|
217
|
+
}
|
|
218
|
+
];
|
|
219
|
+
|
|
220
|
+
const getStatusColor = (status) => {
|
|
221
|
+
switch (status) {
|
|
222
|
+
case 'active': return 'A';
|
|
223
|
+
case 'warning': return 'B';
|
|
224
|
+
case 'error': return 'C';
|
|
225
|
+
default: return 'B';
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
return (
|
|
230
|
+
<div className="service-cards">
|
|
231
|
+
{services.map((service, index) => (
|
|
232
|
+
<ActionCard key={index} to={service.path} className="service-card">
|
|
233
|
+
<div className="service-header">
|
|
234
|
+
<Text type="Heading6">{service.name}</Text>
|
|
235
|
+
<Chip size="Small" style={getStatusColor(service.status)}>
|
|
236
|
+
{service.status}
|
|
237
|
+
</Chip>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<div className="service-metrics">
|
|
241
|
+
<div className="metric">
|
|
242
|
+
<Text type="BodySmall">Uptime</Text>
|
|
243
|
+
<Text type="Heading6">{service.uptime}</Text>
|
|
244
|
+
</div>
|
|
245
|
+
</div>
|
|
246
|
+
|
|
247
|
+
<div className="service-actions">
|
|
248
|
+
<Text type="BodySmall">Click to view details</Text>
|
|
249
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
250
|
+
</div>
|
|
251
|
+
</ActionCard>
|
|
252
|
+
))}
|
|
253
|
+
</div>
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### User Profile Cards
|
|
259
|
+
```tsx
|
|
260
|
+
function UserProfileCardsExample() {
|
|
261
|
+
const users = [
|
|
262
|
+
{
|
|
263
|
+
id: 1,
|
|
264
|
+
name: "Sarah Johnson",
|
|
265
|
+
role: "Product Manager",
|
|
266
|
+
avatar: "/sarah.jpg",
|
|
267
|
+
online: true,
|
|
268
|
+
projects: 12
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
id: 2,
|
|
272
|
+
name: "Mike Chen",
|
|
273
|
+
role: "Developer",
|
|
274
|
+
avatar: "/mike.jpg",
|
|
275
|
+
online: false,
|
|
276
|
+
projects: 8
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
id: 3,
|
|
280
|
+
name: "Emily Davis",
|
|
281
|
+
role: "Designer",
|
|
282
|
+
avatar: "/emily.jpg",
|
|
283
|
+
online: true,
|
|
284
|
+
projects: 15
|
|
285
|
+
}
|
|
286
|
+
];
|
|
287
|
+
|
|
288
|
+
return (
|
|
289
|
+
<div className="user-cards">
|
|
290
|
+
{users.map(user => (
|
|
291
|
+
<ActionCard key={user.id} to={`/users/${user.id}`} className="user-card">
|
|
292
|
+
<div className="user-avatar">
|
|
293
|
+
<Image src={user.avatar} alt={user.name} className="avatar-image" />
|
|
294
|
+
<div className={`status-indicator ${user.online ? 'online' : 'offline'}`} />
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
<div className="user-info">
|
|
298
|
+
<Text type="Heading6">{user.name}</Text>
|
|
299
|
+
<Text type="BodySmall">{user.role}</Text>
|
|
300
|
+
|
|
301
|
+
<div className="user-stats">
|
|
302
|
+
<Text type="BodySmall">{user.projects} projects</Text>
|
|
303
|
+
<Text type="BodySmall">{user.online ? 'Online' : 'Offline'}</Text>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
|
|
307
|
+
<div className="user-actions">
|
|
308
|
+
<IconButton icon="Message" size="Small" />
|
|
309
|
+
<IconButton icon="MoreVertical" size="Small" />
|
|
310
|
+
</div>
|
|
311
|
+
</ActionCard>
|
|
312
|
+
))}
|
|
313
|
+
</div>
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Quick Actions Dashboard
|
|
319
|
+
```tsx
|
|
320
|
+
function QuickActionsExample() {
|
|
321
|
+
const quickActions = [
|
|
322
|
+
{
|
|
323
|
+
title: "Create New Project",
|
|
324
|
+
description: "Start a new project from template",
|
|
325
|
+
path: "/projects/new",
|
|
326
|
+
icon: "Add",
|
|
327
|
+
color: "primary"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
title: "Import Data",
|
|
331
|
+
description: "Import existing data files",
|
|
332
|
+
path: "/import",
|
|
333
|
+
icon: "Upload",
|
|
334
|
+
color: "secondary"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
title: "Generate Report",
|
|
338
|
+
description: "Create a new analytics report",
|
|
339
|
+
path: "/reports/new",
|
|
340
|
+
icon: "BarChart",
|
|
341
|
+
color: "tertiary"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
title: "Invite Team Member",
|
|
345
|
+
description: "Add someone to your team",
|
|
346
|
+
path: "/team/invite",
|
|
347
|
+
icon: "PersonAdd",
|
|
348
|
+
color: "success"
|
|
349
|
+
}
|
|
350
|
+
];
|
|
351
|
+
|
|
352
|
+
return (
|
|
353
|
+
<div className="quick-actions-grid">
|
|
354
|
+
{quickActions.map((action, index) => (
|
|
355
|
+
<ActionCard
|
|
356
|
+
key={index}
|
|
357
|
+
to={action.path}
|
|
358
|
+
className={`quick-action-card ${action.color}`}
|
|
359
|
+
>
|
|
360
|
+
<div className="action-icon">
|
|
361
|
+
<Icon icon={action.icon} size="Large" />
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
<div className="action-content">
|
|
365
|
+
<Text type="Heading6">{action.title}</Text>
|
|
366
|
+
<Text type="BodySmall">{action.description}</Text>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
<div className="action-indicator">
|
|
370
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
371
|
+
</div>
|
|
372
|
+
</ActionCard>
|
|
373
|
+
))}
|
|
374
|
+
</div>
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### Interactive Dashboard Cards
|
|
380
|
+
```tsx
|
|
381
|
+
function InteractiveDashboardExample() {
|
|
382
|
+
const [cardData, setCardData] = useState({
|
|
383
|
+
revenue: { value: '$24,500', change: '+12%' },
|
|
384
|
+
users: { value: '1,234', change: '+5%' },
|
|
385
|
+
orders: { value: '89', change: '-2%' },
|
|
386
|
+
conversion: { value: '3.4%', change: '+0.8%' }
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
return (
|
|
390
|
+
<div className="dashboard-cards">
|
|
391
|
+
<ActionCard to="/analytics/revenue" className="metric-card revenue">
|
|
392
|
+
<div className="metric-header">
|
|
393
|
+
<Icon icon="TrendingUp" />
|
|
394
|
+
<Text type="BodySmall">Revenue</Text>
|
|
395
|
+
</div>
|
|
396
|
+
|
|
397
|
+
<div className="metric-value">
|
|
398
|
+
<Text type="Heading4">{cardData.revenue.value}</Text>
|
|
399
|
+
<Chip size="Small" style="A">{cardData.revenue.change}</Chip>
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
<div className="metric-footer">
|
|
403
|
+
<Text type="BodySmall">vs last month</Text>
|
|
404
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
405
|
+
</div>
|
|
406
|
+
</ActionCard>
|
|
407
|
+
|
|
408
|
+
<ActionCard to="/analytics/users" className="metric-card users">
|
|
409
|
+
<div className="metric-header">
|
|
410
|
+
<Icon icon="Users" />
|
|
411
|
+
<Text type="BodySmall">Active Users</Text>
|
|
412
|
+
</div>
|
|
413
|
+
|
|
414
|
+
<div className="metric-value">
|
|
415
|
+
<Text type="Heading4">{cardData.users.value}</Text>
|
|
416
|
+
<Chip size="Small" style="A">{cardData.users.change}</Chip>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<div className="metric-footer">
|
|
420
|
+
<Text type="BodySmall">this week</Text>
|
|
421
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
422
|
+
</div>
|
|
423
|
+
</ActionCard>
|
|
424
|
+
|
|
425
|
+
<ActionCard to="/analytics/orders" className="metric-card orders">
|
|
426
|
+
<div className="metric-header">
|
|
427
|
+
<Icon icon="Package" />
|
|
428
|
+
<Text type="BodySmall">Orders</Text>
|
|
429
|
+
</div>
|
|
430
|
+
|
|
431
|
+
<div className="metric-value">
|
|
432
|
+
<Text type="Heading4">{cardData.orders.value}</Text>
|
|
433
|
+
<Chip size="Small" style="C">{cardData.orders.change}</Chip>
|
|
434
|
+
</div>
|
|
435
|
+
|
|
436
|
+
<div className="metric-footer">
|
|
437
|
+
<Text type="BodySmall">today</Text>
|
|
438
|
+
<Icon icon="ArrowForward" size="Small" />
|
|
439
|
+
</div>
|
|
440
|
+
</ActionCard>
|
|
441
|
+
</div>
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### Disabled and Loading States
|
|
447
|
+
```tsx
|
|
448
|
+
function StateVariationsExample() {
|
|
449
|
+
const [loading, setLoading] = useState(false);
|
|
450
|
+
|
|
451
|
+
return (
|
|
452
|
+
<div className="state-cards">
|
|
453
|
+
<ActionCard to="/available" className="available-card">
|
|
454
|
+
<div className="card-content">
|
|
455
|
+
<Icon icon="Check" />
|
|
456
|
+
<Text type="Heading6">Available Action</Text>
|
|
457
|
+
<Text type="BodySmall">This card is interactive</Text>
|
|
458
|
+
</div>
|
|
459
|
+
</ActionCard>
|
|
460
|
+
|
|
461
|
+
<ActionCard disabled className="disabled-card">
|
|
462
|
+
<div className="card-content">
|
|
463
|
+
<Icon icon="Lock" />
|
|
464
|
+
<Text type="Heading6">Disabled Action</Text>
|
|
465
|
+
<Text type="BodySmall">This card is disabled</Text>
|
|
466
|
+
</div>
|
|
467
|
+
</ActionCard>
|
|
468
|
+
|
|
469
|
+
<ActionCard
|
|
470
|
+
to={loading ? undefined : "/action"}
|
|
471
|
+
className="loading-card"
|
|
472
|
+
onClick={() => {
|
|
473
|
+
setLoading(true);
|
|
474
|
+
setTimeout(() => setLoading(false), 2000);
|
|
475
|
+
}}
|
|
476
|
+
>
|
|
477
|
+
<div className="card-content">
|
|
478
|
+
{loading ? (
|
|
479
|
+
<>
|
|
480
|
+
<Spinner size="Small" />
|
|
481
|
+
<Text type="Heading6">Loading...</Text>
|
|
482
|
+
<Text type="BodySmall">Please wait</Text>
|
|
483
|
+
</>
|
|
484
|
+
) : (
|
|
485
|
+
<>
|
|
486
|
+
<Icon icon="Refresh" />
|
|
487
|
+
<Text type="Heading6">Refresh Data</Text>
|
|
488
|
+
<Text type="BodySmall">Click to reload</Text>
|
|
489
|
+
</>
|
|
490
|
+
)}
|
|
491
|
+
</div>
|
|
492
|
+
</ActionCard>
|
|
493
|
+
</div>
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Complex Content Cards
|
|
499
|
+
```tsx
|
|
500
|
+
function ComplexContentExample() {
|
|
501
|
+
return (
|
|
502
|
+
<div className="complex-cards">
|
|
503
|
+
<ActionCard to="/projects/1" className="project-card">
|
|
504
|
+
<div className="project-header">
|
|
505
|
+
<div className="project-info">
|
|
506
|
+
<Text type="Heading5">Website Redesign</Text>
|
|
507
|
+
<Text type="BodySmall">Due: March 15, 2024</Text>
|
|
508
|
+
</div>
|
|
509
|
+
<Chip size="Small" style="B">In Progress</Chip>
|
|
510
|
+
</div>
|
|
511
|
+
|
|
512
|
+
<div className="project-description">
|
|
513
|
+
<Text type="BodyMedium">
|
|
514
|
+
Complete redesign of the company website with modern UI/UX
|
|
515
|
+
and improved performance.
|
|
516
|
+
</Text>
|
|
517
|
+
</div>
|
|
518
|
+
|
|
519
|
+
<div className="project-team">
|
|
520
|
+
<Text type="BodySmall">Team:</Text>
|
|
521
|
+
<div className="team-avatars">
|
|
522
|
+
<Image src="/team1.jpg" alt="Team member" className="team-avatar" />
|
|
523
|
+
<Image src="/team2.jpg" alt="Team member" className="team-avatar" />
|
|
524
|
+
<Image src="/team3.jpg" alt="Team member" className="team-avatar" />
|
|
525
|
+
<div className="team-count">+3</div>
|
|
526
|
+
</div>
|
|
527
|
+
</div>
|
|
528
|
+
|
|
529
|
+
<div className="project-progress">
|
|
530
|
+
<div className="progress-header">
|
|
531
|
+
<Text type="BodySmall">Progress</Text>
|
|
532
|
+
<Text type="BodySmall">68%</Text>
|
|
533
|
+
</div>
|
|
534
|
+
<ProgressBar value={68} />
|
|
535
|
+
</div>
|
|
536
|
+
|
|
537
|
+
<div className="project-tags">
|
|
538
|
+
<Chip size="Small" style="A">Design</Chip>
|
|
539
|
+
<Chip size="Small" style="A">Frontend</Chip>
|
|
540
|
+
<Chip size="Small" style="A">High Priority</Chip>
|
|
541
|
+
</div>
|
|
542
|
+
</ActionCard>
|
|
543
|
+
</div>
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
```
|