@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.
Files changed (102) hide show
  1. package/README.md +104 -1
  2. package/dist/cjs/components/molecules/Modal/DemoModal.d.ts +8 -0
  3. package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
  4. package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
  5. package/dist/cjs/components/molecules/Modal/ModalContext/index.d.ts +3 -0
  6. package/dist/cjs/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
  7. package/dist/cjs/components/molecules/Modal/index.d.ts +2 -0
  8. package/dist/cjs/components/molecules/index.d.ts +2 -0
  9. package/dist/cjs/library.css +19 -6
  10. package/dist/cjs/library.js +3 -3
  11. package/dist/cjs/library.js.map +1 -1
  12. package/dist/esm/components/molecules/Modal/DemoModal.d.ts +8 -0
  13. package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
  14. package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
  15. package/dist/esm/components/molecules/Modal/ModalContext/index.d.ts +3 -0
  16. package/dist/esm/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
  17. package/dist/esm/components/molecules/Modal/index.d.ts +2 -0
  18. package/dist/esm/components/molecules/index.d.ts +2 -0
  19. package/dist/esm/library.css +19 -6
  20. package/dist/esm/library.js +3 -3
  21. package/dist/esm/library.js.map +1 -1
  22. package/dist/index.d.ts +108 -2
  23. package/docs/README.md +264 -0
  24. package/docs/components/atoms/ActionImage.md +119 -0
  25. package/docs/components/atoms/Button.md +197 -0
  26. package/docs/components/atoms/Checkbox.md +299 -0
  27. package/docs/components/atoms/CheckboxItem.md +314 -0
  28. package/docs/components/atoms/Chip.md +380 -0
  29. package/docs/components/atoms/CustomToggle.md +270 -0
  30. package/docs/components/atoms/Icon.md +365 -0
  31. package/docs/components/atoms/IconButton.md +407 -0
  32. package/docs/components/atoms/Image.md +448 -0
  33. package/docs/components/atoms/Input.md +430 -0
  34. package/docs/components/atoms/ListItem.md +502 -0
  35. package/docs/components/atoms/Password.md +472 -0
  36. package/docs/components/atoms/RadioButton.md +614 -0
  37. package/docs/components/atoms/RadioButtonItem.md +588 -0
  38. package/docs/components/atoms/ResponsiveComponent.md +612 -0
  39. package/docs/components/atoms/SelectListItem.md +609 -0
  40. package/docs/components/atoms/Slider.md +605 -0
  41. package/docs/components/atoms/Spinner.md +605 -0
  42. package/docs/components/atoms/Text.md +463 -0
  43. package/docs/components/atoms/TextArea.md +670 -0
  44. package/docs/components/atoms/ToastNotification.md +668 -0
  45. package/docs/components/atoms/Toggle.md +737 -0
  46. package/docs/components/atoms/ToggleButton.md +751 -0
  47. package/docs/components/atoms/Tooltip.md +391 -0
  48. package/docs/components/molecules/Accordion.md +440 -0
  49. package/docs/components/molecules/AccordionGroup.md +547 -0
  50. package/docs/components/molecules/ActionCard.md +546 -0
  51. package/docs/components/molecules/Breadcrumb.md +403 -0
  52. package/docs/components/molecules/Breadcrumbs.md +485 -0
  53. package/docs/components/molecules/ButtonGroup.md +383 -0
  54. package/docs/components/molecules/Card.md +298 -0
  55. package/docs/components/molecules/ChipInput.md +646 -0
  56. package/docs/components/molecules/ContextMenu.md +768 -0
  57. package/docs/components/molecules/CustomTimeSelector.md +116 -0
  58. package/docs/components/molecules/DatePicker.md +516 -0
  59. package/docs/components/molecules/DateTimeSelector.md +166 -0
  60. package/docs/components/molecules/FormField.md +312 -0
  61. package/docs/components/molecules/Grid.md +577 -0
  62. package/docs/components/molecules/GridItem.md +834 -0
  63. package/docs/components/molecules/GridList.md +244 -0
  64. package/docs/components/molecules/List.md +485 -0
  65. package/docs/components/molecules/Modal.md +470 -0
  66. package/docs/components/molecules/ModalFooter.md +702 -0
  67. package/docs/components/molecules/ModalHeader.md +756 -0
  68. package/docs/components/molecules/ModalProvider.md +205 -0
  69. package/docs/components/molecules/Nav.md +530 -0
  70. package/docs/components/molecules/NavItem.md +572 -0
  71. package/docs/components/molecules/NavLink.md +499 -0
  72. package/docs/components/molecules/Option.md +521 -0
  73. package/docs/components/molecules/Pagination.md +592 -0
  74. package/docs/components/molecules/PaginationNumberField.md +722 -0
  75. package/docs/components/molecules/Popover.md +516 -0
  76. package/docs/components/molecules/ProgressBar.md +624 -0
  77. package/docs/components/molecules/RadioGroup.md +831 -0
  78. package/docs/components/molecules/RepeaterList.md +185 -0
  79. package/docs/components/molecules/Select.md +402 -0
  80. package/docs/components/molecules/SortableTrigger.md +82 -0
  81. package/docs/components/molecules/useModal.md +379 -0
  82. package/docs/components/organisms/Dropzone.md +346 -0
  83. package/docs/components/organisms/DropzoneClear.md +135 -0
  84. package/docs/components/organisms/DropzoneContent.md +216 -0
  85. package/docs/components/organisms/DropzoneFilename.md +191 -0
  86. package/docs/components/organisms/DropzoneSupportedFormats.md +184 -0
  87. package/docs/components/organisms/DropzoneTrigger.md +209 -0
  88. package/docs/components/organisms/Form.md +533 -0
  89. package/docs/components/organisms/SlideOutPanel.md +662 -0
  90. package/docs/components/organisms/TabContent.md +902 -0
  91. package/docs/components/organisms/TabItem.md +1091 -0
  92. package/docs/components/organisms/Table.md +611 -0
  93. package/docs/components/organisms/TableBody.md +679 -0
  94. package/docs/components/organisms/TableCell.md +482 -0
  95. package/docs/components/organisms/TableHeader.md +513 -0
  96. package/docs/components/organisms/TableHeaderCell.md +661 -0
  97. package/docs/components/organisms/TableRow.md +715 -0
  98. package/docs/components/organisms/Tabs.md +1330 -0
  99. package/docs/components/utils/ConditionalView.md +568 -0
  100. package/docs/components/utils/RenderStateView.md +726 -0
  101. package/docs/components/utils/WrapTextNodes.md +614 -0
  102. 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
+ ```