@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,482 @@
|
|
|
1
|
+
# TableCell
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
A table cell component that represents individual data cells within table rows. TableCell provides a standardized way to display content in table structures with consistent styling and accessibility features. It extends the standard HTML table cell element with additional functionality for data presentation.
|
|
6
|
+
|
|
7
|
+
## Aliases
|
|
8
|
+
|
|
9
|
+
- TableCell
|
|
10
|
+
- Data Cell
|
|
11
|
+
- Table Data
|
|
12
|
+
- TD Cell
|
|
13
|
+
|
|
14
|
+
## Props Breakdown
|
|
15
|
+
|
|
16
|
+
**Extends:** `TdHTMLAttributes<HTMLTableCellElement>`
|
|
17
|
+
|
|
18
|
+
| Prop | Type | Default | Required | Description |
|
|
19
|
+
|------|------|---------|----------|-------------|
|
|
20
|
+
| `children` | `ReactNode` | - | No | Content to display in the cell |
|
|
21
|
+
| `className` | `string` | - | No | Additional CSS class names |
|
|
22
|
+
|
|
23
|
+
Plus all standard HTML td attributes (scope, headers, colSpan, rowSpan, etc.).
|
|
24
|
+
|
|
25
|
+
## Examples
|
|
26
|
+
|
|
27
|
+
### Basic Table Cell
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell } from '@delightui/components';
|
|
31
|
+
|
|
32
|
+
function BasicTableCellExample() {
|
|
33
|
+
const data = [
|
|
34
|
+
{ name: 'John Doe', email: 'john@example.com', role: 'Admin' },
|
|
35
|
+
{ name: 'Jane Smith', email: 'jane@example.com', role: 'User' },
|
|
36
|
+
{ name: 'Bob Johnson', email: 'bob@example.com', role: 'Moderator' }
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Table>
|
|
41
|
+
<TableHeader>
|
|
42
|
+
<TableRow>
|
|
43
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
44
|
+
<TableHeaderCell>Email</TableHeaderCell>
|
|
45
|
+
<TableHeaderCell>Role</TableHeaderCell>
|
|
46
|
+
</TableRow>
|
|
47
|
+
</TableHeader>
|
|
48
|
+
<TableBody>
|
|
49
|
+
{data.map((user, index) => (
|
|
50
|
+
<TableRow key={index}>
|
|
51
|
+
<TableCell>{user.name}</TableCell>
|
|
52
|
+
<TableCell>{user.email}</TableCell>
|
|
53
|
+
<TableCell>{user.role}</TableCell>
|
|
54
|
+
</TableRow>
|
|
55
|
+
))}
|
|
56
|
+
</TableBody>
|
|
57
|
+
</Table>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Table with Different Data Types
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell, Button, Chip } from '@delightui/components';
|
|
66
|
+
|
|
67
|
+
function DataTypesTableExample() {
|
|
68
|
+
const orders = [
|
|
69
|
+
{ id: 1001, customer: 'Alice Brown', amount: 299.99, status: 'Completed', date: '2024-01-15' },
|
|
70
|
+
{ id: 1002, customer: 'Charlie Davis', amount: 156.50, status: 'Pending', date: '2024-01-16' },
|
|
71
|
+
{ id: 1003, customer: 'Diana Evans', amount: 89.99, status: 'Cancelled', date: '2024-01-17' }
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
const getStatusColor = (status: string) => {
|
|
75
|
+
switch (status) {
|
|
76
|
+
case 'Completed': return 'success';
|
|
77
|
+
case 'Pending': return 'warning';
|
|
78
|
+
case 'Cancelled': return 'error';
|
|
79
|
+
default: return 'neutral';
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<Table>
|
|
85
|
+
<TableHeader>
|
|
86
|
+
<TableRow>
|
|
87
|
+
<TableHeaderCell>Order ID</TableHeaderCell>
|
|
88
|
+
<TableHeaderCell>Customer</TableHeaderCell>
|
|
89
|
+
<TableHeaderCell>Amount</TableHeaderCell>
|
|
90
|
+
<TableHeaderCell>Status</TableHeaderCell>
|
|
91
|
+
<TableHeaderCell>Date</TableHeaderCell>
|
|
92
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
93
|
+
</TableRow>
|
|
94
|
+
</TableHeader>
|
|
95
|
+
<TableBody>
|
|
96
|
+
{orders.map(order => (
|
|
97
|
+
<TableRow key={order.id}>
|
|
98
|
+
<TableCell>
|
|
99
|
+
<strong>#{order.id}</strong>
|
|
100
|
+
</TableCell>
|
|
101
|
+
<TableCell>{order.customer}</TableCell>
|
|
102
|
+
<TableCell>${order.amount.toFixed(2)}</TableCell>
|
|
103
|
+
<TableCell>
|
|
104
|
+
<Chip color={getStatusColor(order.status)}>
|
|
105
|
+
{order.status}
|
|
106
|
+
</Chip>
|
|
107
|
+
</TableCell>
|
|
108
|
+
<TableCell>{order.date}</TableCell>
|
|
109
|
+
<TableCell>
|
|
110
|
+
<Button size="Small" type="Outlined">
|
|
111
|
+
View
|
|
112
|
+
</Button>
|
|
113
|
+
</TableCell>
|
|
114
|
+
</TableRow>
|
|
115
|
+
))}
|
|
116
|
+
</TableBody>
|
|
117
|
+
</Table>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Table with Complex Cell Content
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell, Image, Text, Button } from '@delightui/components';
|
|
126
|
+
|
|
127
|
+
function ComplexContentTableExample() {
|
|
128
|
+
const products = [
|
|
129
|
+
{
|
|
130
|
+
id: 1,
|
|
131
|
+
image: '/images/product-1.jpg',
|
|
132
|
+
name: 'Wireless Headphones',
|
|
133
|
+
description: 'High-quality wireless headphones with noise cancellation',
|
|
134
|
+
price: 199.99,
|
|
135
|
+
stock: 25,
|
|
136
|
+
rating: 4.5
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: 2,
|
|
140
|
+
image: '/images/product-2.jpg',
|
|
141
|
+
name: 'Smart Watch',
|
|
142
|
+
description: 'Fitness tracking smartwatch with heart rate monitor',
|
|
143
|
+
price: 299.99,
|
|
144
|
+
stock: 12,
|
|
145
|
+
rating: 4.2
|
|
146
|
+
}
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<Table>
|
|
151
|
+
<TableHeader>
|
|
152
|
+
<TableRow>
|
|
153
|
+
<TableHeaderCell>Product</TableHeaderCell>
|
|
154
|
+
<TableHeaderCell>Price</TableHeaderCell>
|
|
155
|
+
<TableHeaderCell>Stock</TableHeaderCell>
|
|
156
|
+
<TableHeaderCell>Rating</TableHeaderCell>
|
|
157
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
158
|
+
</TableRow>
|
|
159
|
+
</TableHeader>
|
|
160
|
+
<TableBody>
|
|
161
|
+
{products.map(product => (
|
|
162
|
+
<TableRow key={product.id}>
|
|
163
|
+
<TableCell>
|
|
164
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
|
|
165
|
+
<Image
|
|
166
|
+
src={product.image}
|
|
167
|
+
alt={product.name}
|
|
168
|
+
width={50}
|
|
169
|
+
height={50}
|
|
170
|
+
fit="Cover"
|
|
171
|
+
style={{ borderRadius: '4px' }}
|
|
172
|
+
/>
|
|
173
|
+
<div>
|
|
174
|
+
<Text weight="Bold">{product.name}</Text>
|
|
175
|
+
<Text size="Small" color="secondary">
|
|
176
|
+
{product.description}
|
|
177
|
+
</Text>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</TableCell>
|
|
181
|
+
<TableCell>
|
|
182
|
+
<Text weight="Bold">${product.price}</Text>
|
|
183
|
+
</TableCell>
|
|
184
|
+
<TableCell>
|
|
185
|
+
<Text color={product.stock > 20 ? 'success' : product.stock > 10 ? 'warning' : 'error'}>
|
|
186
|
+
{product.stock} units
|
|
187
|
+
</Text>
|
|
188
|
+
</TableCell>
|
|
189
|
+
<TableCell>
|
|
190
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>
|
|
191
|
+
<span>⭐</span>
|
|
192
|
+
<Text>{product.rating}</Text>
|
|
193
|
+
</div>
|
|
194
|
+
</TableCell>
|
|
195
|
+
<TableCell>
|
|
196
|
+
<div style={{ display: 'flex', gap: '8px' }}>
|
|
197
|
+
<Button size="Small" type="Outlined">Edit</Button>
|
|
198
|
+
<Button size="Small" style="Destructive">Delete</Button>
|
|
199
|
+
</div>
|
|
200
|
+
</TableCell>
|
|
201
|
+
</TableRow>
|
|
202
|
+
))}
|
|
203
|
+
</TableBody>
|
|
204
|
+
</Table>
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Responsive Table Cells
|
|
210
|
+
|
|
211
|
+
```tsx
|
|
212
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell, Text } from '@delightui/components';
|
|
213
|
+
|
|
214
|
+
function ResponsiveTableExample() {
|
|
215
|
+
const users = [
|
|
216
|
+
{ name: 'John Doe', email: 'john@example.com', phone: '+1-555-0123', department: 'Engineering' },
|
|
217
|
+
{ name: 'Jane Smith', email: 'jane@example.com', phone: '+1-555-0124', department: 'Marketing' }
|
|
218
|
+
];
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<div style={{ overflowX: 'auto' }}>
|
|
222
|
+
<Table>
|
|
223
|
+
<TableHeader>
|
|
224
|
+
<TableRow>
|
|
225
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
226
|
+
<TableHeaderCell className="hide-mobile">Email</TableHeaderCell>
|
|
227
|
+
<TableHeaderCell className="hide-mobile">Phone</TableHeaderCell>
|
|
228
|
+
<TableHeaderCell>Department</TableHeaderCell>
|
|
229
|
+
</TableRow>
|
|
230
|
+
</TableHeader>
|
|
231
|
+
<TableBody>
|
|
232
|
+
{users.map((user, index) => (
|
|
233
|
+
<TableRow key={index}>
|
|
234
|
+
<TableCell>
|
|
235
|
+
<div>
|
|
236
|
+
<Text weight="Bold">{user.name}</Text>
|
|
237
|
+
<Text size="Small" className="show-mobile-only">
|
|
238
|
+
{user.email}
|
|
239
|
+
</Text>
|
|
240
|
+
</div>
|
|
241
|
+
</TableCell>
|
|
242
|
+
<TableCell className="hide-mobile">{user.email}</TableCell>
|
|
243
|
+
<TableCell className="hide-mobile">{user.phone}</TableCell>
|
|
244
|
+
<TableCell>{user.department}</TableCell>
|
|
245
|
+
</TableRow>
|
|
246
|
+
))}
|
|
247
|
+
</TableBody>
|
|
248
|
+
</Table>
|
|
249
|
+
</div>
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Table with Merged Cells
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell } from '@delightui/components';
|
|
258
|
+
|
|
259
|
+
function MergedCellsExample() {
|
|
260
|
+
return (
|
|
261
|
+
<Table>
|
|
262
|
+
<TableHeader>
|
|
263
|
+
<TableRow>
|
|
264
|
+
<TableHeaderCell>Product</TableHeaderCell>
|
|
265
|
+
<TableHeaderCell colSpan={2}>Pricing</TableHeaderCell>
|
|
266
|
+
<TableHeaderCell>Stock</TableHeaderCell>
|
|
267
|
+
</TableRow>
|
|
268
|
+
<TableRow>
|
|
269
|
+
<TableHeaderCell></TableHeaderCell>
|
|
270
|
+
<TableHeaderCell>Regular</TableHeaderCell>
|
|
271
|
+
<TableHeaderCell>Sale</TableHeaderCell>
|
|
272
|
+
<TableHeaderCell></TableHeaderCell>
|
|
273
|
+
</TableRow>
|
|
274
|
+
</TableHeader>
|
|
275
|
+
<TableBody>
|
|
276
|
+
<TableRow>
|
|
277
|
+
<TableCell rowSpan={2}>Wireless Mouse</TableCell>
|
|
278
|
+
<TableCell>$29.99</TableCell>
|
|
279
|
+
<TableCell>$24.99</TableCell>
|
|
280
|
+
<TableCell>50</TableCell>
|
|
281
|
+
</TableRow>
|
|
282
|
+
<TableRow>
|
|
283
|
+
<TableCell colSpan={2}>
|
|
284
|
+
<Text size="Small" color="secondary">
|
|
285
|
+
Special offer: 15% off until end of month
|
|
286
|
+
</Text>
|
|
287
|
+
</TableCell>
|
|
288
|
+
<TableCell>In Stock</TableCell>
|
|
289
|
+
</TableRow>
|
|
290
|
+
</TableBody>
|
|
291
|
+
</Table>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Editable Table Cells
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell, Input, Button } from '@delightui/components';
|
|
300
|
+
|
|
301
|
+
function EditableTableExample() {
|
|
302
|
+
const [data, setData] = useState([
|
|
303
|
+
{ id: 1, name: 'Item 1', quantity: 5, price: 10.99, editing: false },
|
|
304
|
+
{ id: 2, name: 'Item 2', quantity: 3, price: 15.99, editing: false }
|
|
305
|
+
]);
|
|
306
|
+
|
|
307
|
+
const handleEdit = (id: number) => {
|
|
308
|
+
setData(data.map(item =>
|
|
309
|
+
item.id === id ? { ...item, editing: true } : item
|
|
310
|
+
));
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
const handleSave = (id: number) => {
|
|
314
|
+
setData(data.map(item =>
|
|
315
|
+
item.id === id ? { ...item, editing: false } : item
|
|
316
|
+
));
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
const handleChange = (id: number, field: string, value: any) => {
|
|
320
|
+
setData(data.map(item =>
|
|
321
|
+
item.id === id ? { ...item, [field]: value } : item
|
|
322
|
+
));
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
return (
|
|
326
|
+
<Table>
|
|
327
|
+
<TableHeader>
|
|
328
|
+
<TableRow>
|
|
329
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
330
|
+
<TableHeaderCell>Quantity</TableHeaderCell>
|
|
331
|
+
<TableHeaderCell>Price</TableHeaderCell>
|
|
332
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
333
|
+
</TableRow>
|
|
334
|
+
</TableHeader>
|
|
335
|
+
<TableBody>
|
|
336
|
+
{data.map(item => (
|
|
337
|
+
<TableRow key={item.id}>
|
|
338
|
+
<TableCell>
|
|
339
|
+
{item.editing ? (
|
|
340
|
+
<Input
|
|
341
|
+
value={item.name}
|
|
342
|
+
onValueChange={(value) => handleChange(item.id, 'name', value)}
|
|
343
|
+
/>
|
|
344
|
+
) : (
|
|
345
|
+
item.name
|
|
346
|
+
)}
|
|
347
|
+
</TableCell>
|
|
348
|
+
<TableCell>
|
|
349
|
+
{item.editing ? (
|
|
350
|
+
<Input
|
|
351
|
+
inputType="Number"
|
|
352
|
+
value={item.quantity.toString()}
|
|
353
|
+
onValueChange={(value) => handleChange(item.id, 'quantity', parseInt(value))}
|
|
354
|
+
/>
|
|
355
|
+
) : (
|
|
356
|
+
item.quantity
|
|
357
|
+
)}
|
|
358
|
+
</TableCell>
|
|
359
|
+
<TableCell>
|
|
360
|
+
{item.editing ? (
|
|
361
|
+
<Input
|
|
362
|
+
inputType="Number"
|
|
363
|
+
value={item.price.toString()}
|
|
364
|
+
onValueChange={(value) => handleChange(item.id, 'price', parseFloat(value))}
|
|
365
|
+
/>
|
|
366
|
+
) : (
|
|
367
|
+
`$${item.price.toFixed(2)}`
|
|
368
|
+
)}
|
|
369
|
+
</TableCell>
|
|
370
|
+
<TableCell>
|
|
371
|
+
{item.editing ? (
|
|
372
|
+
<Button size="Small" onClick={() => handleSave(item.id)}>
|
|
373
|
+
Save
|
|
374
|
+
</Button>
|
|
375
|
+
) : (
|
|
376
|
+
<Button size="Small" type="Outlined" onClick={() => handleEdit(item.id)}>
|
|
377
|
+
Edit
|
|
378
|
+
</Button>
|
|
379
|
+
)}
|
|
380
|
+
</TableCell>
|
|
381
|
+
</TableRow>
|
|
382
|
+
))}
|
|
383
|
+
</TableBody>
|
|
384
|
+
</Table>
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Styled Table Cells
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell } from '@delightui/components';
|
|
393
|
+
|
|
394
|
+
function StyledTableCellExample() {
|
|
395
|
+
const financialData = [
|
|
396
|
+
{ metric: 'Revenue', q1: 100000, q2: 120000, q3: 110000, q4: 140000 },
|
|
397
|
+
{ metric: 'Expenses', q1: 80000, q2: 85000, q3: 90000, q4: 95000 },
|
|
398
|
+
{ metric: 'Profit', q1: 20000, q2: 35000, q3: 20000, q4: 45000 }
|
|
399
|
+
];
|
|
400
|
+
|
|
401
|
+
const getCellStyle = (value: number, isProfit: boolean) => {
|
|
402
|
+
if (isProfit) {
|
|
403
|
+
return {
|
|
404
|
+
backgroundColor: value > 30000 ? '#d4edda' : value > 20000 ? '#fff3cd' : '#f8d7da',
|
|
405
|
+
fontWeight: 'bold' as const
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
return {};
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
return (
|
|
412
|
+
<Table>
|
|
413
|
+
<TableHeader>
|
|
414
|
+
<TableRow>
|
|
415
|
+
<TableHeaderCell>Metric</TableHeaderCell>
|
|
416
|
+
<TableHeaderCell>Q1</TableHeaderCell>
|
|
417
|
+
<TableHeaderCell>Q2</TableHeaderCell>
|
|
418
|
+
<TableHeaderCell>Q3</TableHeaderCell>
|
|
419
|
+
<TableHeaderCell>Q4</TableHeaderCell>
|
|
420
|
+
</TableRow>
|
|
421
|
+
</TableHeader>
|
|
422
|
+
<TableBody>
|
|
423
|
+
{financialData.map((row, index) => (
|
|
424
|
+
<TableRow key={index}>
|
|
425
|
+
<TableCell style={{ fontWeight: 'bold' }}>
|
|
426
|
+
{row.metric}
|
|
427
|
+
</TableCell>
|
|
428
|
+
<TableCell style={getCellStyle(row.q1, row.metric === 'Profit')}>
|
|
429
|
+
${row.q1.toLocaleString()}
|
|
430
|
+
</TableCell>
|
|
431
|
+
<TableCell style={getCellStyle(row.q2, row.metric === 'Profit')}>
|
|
432
|
+
${row.q2.toLocaleString()}
|
|
433
|
+
</TableCell>
|
|
434
|
+
<TableCell style={getCellStyle(row.q3, row.metric === 'Profit')}>
|
|
435
|
+
${row.q3.toLocaleString()}
|
|
436
|
+
</TableCell>
|
|
437
|
+
<TableCell style={getCellStyle(row.q4, row.metric === 'Profit')}>
|
|
438
|
+
${row.q4.toLocaleString()}
|
|
439
|
+
</TableCell>
|
|
440
|
+
</TableRow>
|
|
441
|
+
))}
|
|
442
|
+
</TableBody>
|
|
443
|
+
</Table>
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Accessibility Features
|
|
449
|
+
|
|
450
|
+
```tsx
|
|
451
|
+
import { Table, TableBody, TableRow, TableCell, TableHeader, TableHeaderCell } from '@delightui/components';
|
|
452
|
+
|
|
453
|
+
function AccessibleTableExample() {
|
|
454
|
+
return (
|
|
455
|
+
<Table role="table" aria-label="Employee data">
|
|
456
|
+
<TableHeader>
|
|
457
|
+
<TableRow>
|
|
458
|
+
<TableHeaderCell id="name" scope="col">Employee Name</TableHeaderCell>
|
|
459
|
+
<TableHeaderCell id="salary" scope="col">Annual Salary</TableHeaderCell>
|
|
460
|
+
<TableHeaderCell id="department" scope="col">Department</TableHeaderCell>
|
|
461
|
+
</TableRow>
|
|
462
|
+
</TableHeader>
|
|
463
|
+
<TableBody>
|
|
464
|
+
<TableRow>
|
|
465
|
+
<TableCell headers="name">John Smith</TableCell>
|
|
466
|
+
<TableCell headers="salary" aria-label="75,000 dollars">
|
|
467
|
+
$75,000
|
|
468
|
+
</TableCell>
|
|
469
|
+
<TableCell headers="department">Engineering</TableCell>
|
|
470
|
+
</TableRow>
|
|
471
|
+
<TableRow>
|
|
472
|
+
<TableCell headers="name">Sarah Johnson</TableCell>
|
|
473
|
+
<TableCell headers="salary" aria-label="85,000 dollars">
|
|
474
|
+
$85,000
|
|
475
|
+
</TableCell>
|
|
476
|
+
<TableCell headers="department">Marketing</TableCell>
|
|
477
|
+
</TableRow>
|
|
478
|
+
</TableBody>
|
|
479
|
+
</Table>
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
```
|