@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,513 @@
|
|
|
1
|
+
# TableHeader
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
A semantic container component that wraps the header section of a table. TableHeader provides proper HTML structure for table headers and ensures accessibility compliance by creating the `<thead>` element that groups header content together.
|
|
6
|
+
|
|
7
|
+
## Aliases
|
|
8
|
+
|
|
9
|
+
- TableHeader
|
|
10
|
+
- TableHead
|
|
11
|
+
- THead
|
|
12
|
+
- HeaderSection
|
|
13
|
+
- TableHeaderGroup
|
|
14
|
+
|
|
15
|
+
## Props Breakdown
|
|
16
|
+
|
|
17
|
+
**Extends:** `HTMLAttributes<HTMLTableSectionElement>`
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Required | Description |
|
|
20
|
+
|------|------|---------|----------|-------------|
|
|
21
|
+
| `children` | `ReactNode` | - | Yes | Table header content, typically TableRow components containing TableHeaderCell elements |
|
|
22
|
+
|
|
23
|
+
Plus all standard HTML table section attributes (id, className, style, role, etc.).
|
|
24
|
+
|
|
25
|
+
## Examples
|
|
26
|
+
|
|
27
|
+
### Basic Table Header
|
|
28
|
+
```tsx
|
|
29
|
+
import { Table, TableHeader, TableBody, TableRow, TableHeaderCell, TableCell } from '@delightui/components';
|
|
30
|
+
|
|
31
|
+
function BasicHeaderExample() {
|
|
32
|
+
return (
|
|
33
|
+
<Table>
|
|
34
|
+
<TableHeader>
|
|
35
|
+
<TableRow>
|
|
36
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
37
|
+
<TableHeaderCell>Email</TableHeaderCell>
|
|
38
|
+
<TableHeaderCell>Role</TableHeaderCell>
|
|
39
|
+
</TableRow>
|
|
40
|
+
</TableHeader>
|
|
41
|
+
<TableBody>
|
|
42
|
+
<TableRow>
|
|
43
|
+
<TableCell>John Doe</TableCell>
|
|
44
|
+
<TableCell>john@example.com</TableCell>
|
|
45
|
+
<TableCell>Admin</TableCell>
|
|
46
|
+
</TableRow>
|
|
47
|
+
</TableBody>
|
|
48
|
+
</Table>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Multi-Row Header
|
|
54
|
+
```tsx
|
|
55
|
+
function MultiRowHeaderExample() {
|
|
56
|
+
return (
|
|
57
|
+
<Table>
|
|
58
|
+
<TableHeader>
|
|
59
|
+
<TableRow>
|
|
60
|
+
<TableHeaderCell rowSpan={2}>Employee</TableHeaderCell>
|
|
61
|
+
<TableHeaderCell colSpan={2}>Contact Info</TableHeaderCell>
|
|
62
|
+
<TableHeaderCell colSpan={2}>Employment</TableHeaderCell>
|
|
63
|
+
</TableRow>
|
|
64
|
+
<TableRow>
|
|
65
|
+
<TableHeaderCell>Email</TableHeaderCell>
|
|
66
|
+
<TableHeaderCell>Phone</TableHeaderCell>
|
|
67
|
+
<TableHeaderCell>Department</TableHeaderCell>
|
|
68
|
+
<TableHeaderCell>Start Date</TableHeaderCell>
|
|
69
|
+
</TableRow>
|
|
70
|
+
</TableHeader>
|
|
71
|
+
<TableBody>
|
|
72
|
+
<TableRow>
|
|
73
|
+
<TableCell>John Doe</TableCell>
|
|
74
|
+
<TableCell>john@example.com</TableCell>
|
|
75
|
+
<TableCell>+1-555-0123</TableCell>
|
|
76
|
+
<TableCell>Engineering</TableCell>
|
|
77
|
+
<TableCell>2023-01-15</TableCell>
|
|
78
|
+
</TableRow>
|
|
79
|
+
</TableBody>
|
|
80
|
+
</Table>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Sortable Header
|
|
86
|
+
```tsx
|
|
87
|
+
function SortableHeaderExample() {
|
|
88
|
+
const [sortConfig, setSortConfig] = useState({ key: null, direction: 'asc' });
|
|
89
|
+
|
|
90
|
+
const handleSort = (key) => {
|
|
91
|
+
let direction = 'asc';
|
|
92
|
+
if (sortConfig.key === key && sortConfig.direction === 'asc') {
|
|
93
|
+
direction = 'desc';
|
|
94
|
+
}
|
|
95
|
+
setSortConfig({ key, direction });
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const getSortIcon = (columnKey) => {
|
|
99
|
+
if (sortConfig.key !== columnKey) {
|
|
100
|
+
return <Icon icon="Sort" size="Small" />;
|
|
101
|
+
}
|
|
102
|
+
return sortConfig.direction === 'asc'
|
|
103
|
+
? <Icon icon="ArrowUp" size="Small" />
|
|
104
|
+
: <Icon icon="ArrowDown" size="Small" />;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<Table>
|
|
109
|
+
<TableHeader>
|
|
110
|
+
<TableRow>
|
|
111
|
+
<TableHeaderCell
|
|
112
|
+
onClick={() => handleSort('name')}
|
|
113
|
+
className="sortable-header"
|
|
114
|
+
>
|
|
115
|
+
<div className="header-content">
|
|
116
|
+
Name
|
|
117
|
+
{getSortIcon('name')}
|
|
118
|
+
</div>
|
|
119
|
+
</TableHeaderCell>
|
|
120
|
+
<TableHeaderCell
|
|
121
|
+
onClick={() => handleSort('department')}
|
|
122
|
+
className="sortable-header"
|
|
123
|
+
>
|
|
124
|
+
<div className="header-content">
|
|
125
|
+
Department
|
|
126
|
+
{getSortIcon('department')}
|
|
127
|
+
</div>
|
|
128
|
+
</TableHeaderCell>
|
|
129
|
+
<TableHeaderCell
|
|
130
|
+
onClick={() => handleSort('salary')}
|
|
131
|
+
className="sortable-header"
|
|
132
|
+
>
|
|
133
|
+
<div className="header-content">
|
|
134
|
+
Salary
|
|
135
|
+
{getSortIcon('salary')}
|
|
136
|
+
</div>
|
|
137
|
+
</TableHeaderCell>
|
|
138
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
139
|
+
</TableRow>
|
|
140
|
+
</TableHeader>
|
|
141
|
+
<TableBody>
|
|
142
|
+
<TableRow>
|
|
143
|
+
<TableCell>Alice Johnson</TableCell>
|
|
144
|
+
<TableCell>Engineering</TableCell>
|
|
145
|
+
<TableCell>$95,000</TableCell>
|
|
146
|
+
<TableCell>
|
|
147
|
+
<Button size="Small" type="Ghost">Edit</Button>
|
|
148
|
+
</TableCell>
|
|
149
|
+
</TableRow>
|
|
150
|
+
</TableBody>
|
|
151
|
+
</Table>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Header with Filters
|
|
157
|
+
```tsx
|
|
158
|
+
function FilterHeaderExample() {
|
|
159
|
+
const [filters, setFilters] = useState({
|
|
160
|
+
status: '',
|
|
161
|
+
priority: '',
|
|
162
|
+
assignee: ''
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
const handleFilterChange = (field, value) => {
|
|
166
|
+
setFilters(prev => ({ ...prev, [field]: value }));
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
return (
|
|
170
|
+
<Table>
|
|
171
|
+
<TableHeader>
|
|
172
|
+
<TableRow>
|
|
173
|
+
<TableHeaderCell>
|
|
174
|
+
<div className="header-with-filter">
|
|
175
|
+
<Text type="BodyMedium">Task Title</Text>
|
|
176
|
+
</div>
|
|
177
|
+
</TableHeaderCell>
|
|
178
|
+
<TableHeaderCell>
|
|
179
|
+
<div className="header-with-filter">
|
|
180
|
+
<Text type="BodyMedium">Status</Text>
|
|
181
|
+
<Select
|
|
182
|
+
value={filters.status}
|
|
183
|
+
onChange={(value) => handleFilterChange('status', value)}
|
|
184
|
+
size="Small"
|
|
185
|
+
>
|
|
186
|
+
<Option value="">All</Option>
|
|
187
|
+
<Option value="todo">Todo</Option>
|
|
188
|
+
<Option value="progress">In Progress</Option>
|
|
189
|
+
<Option value="done">Done</Option>
|
|
190
|
+
</Select>
|
|
191
|
+
</div>
|
|
192
|
+
</TableHeaderCell>
|
|
193
|
+
<TableHeaderCell>
|
|
194
|
+
<div className="header-with-filter">
|
|
195
|
+
<Text type="BodyMedium">Priority</Text>
|
|
196
|
+
<Select
|
|
197
|
+
value={filters.priority}
|
|
198
|
+
onChange={(value) => handleFilterChange('priority', value)}
|
|
199
|
+
size="Small"
|
|
200
|
+
>
|
|
201
|
+
<Option value="">All</Option>
|
|
202
|
+
<Option value="low">Low</Option>
|
|
203
|
+
<Option value="medium">Medium</Option>
|
|
204
|
+
<Option value="high">High</Option>
|
|
205
|
+
<Option value="critical">Critical</Option>
|
|
206
|
+
</Select>
|
|
207
|
+
</div>
|
|
208
|
+
</TableHeaderCell>
|
|
209
|
+
<TableHeaderCell>
|
|
210
|
+
<div className="header-with-filter">
|
|
211
|
+
<Text type="BodyMedium">Assignee</Text>
|
|
212
|
+
<Input
|
|
213
|
+
placeholder="Filter by name..."
|
|
214
|
+
value={filters.assignee}
|
|
215
|
+
onChange={(e) => handleFilterChange('assignee', e.target.value)}
|
|
216
|
+
size="Small"
|
|
217
|
+
/>
|
|
218
|
+
</div>
|
|
219
|
+
</TableHeaderCell>
|
|
220
|
+
</TableRow>
|
|
221
|
+
</TableHeader>
|
|
222
|
+
<TableBody>
|
|
223
|
+
<TableRow>
|
|
224
|
+
<TableCell>Implement new feature</TableCell>
|
|
225
|
+
<TableCell>
|
|
226
|
+
<Chip style="Warning">In Progress</Chip>
|
|
227
|
+
</TableCell>
|
|
228
|
+
<TableCell>
|
|
229
|
+
<Chip style="Error">High</Chip>
|
|
230
|
+
</TableCell>
|
|
231
|
+
<TableCell>John Doe</TableCell>
|
|
232
|
+
</TableRow>
|
|
233
|
+
</TableBody>
|
|
234
|
+
</Table>
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Header with Selection Controls
|
|
240
|
+
```tsx
|
|
241
|
+
function SelectionHeaderExample() {
|
|
242
|
+
const [selectedAll, setSelectedAll] = useState(false);
|
|
243
|
+
const [selectedItems, setSelectedItems] = useState(new Set());
|
|
244
|
+
const [showBulkActions, setShowBulkActions] = useState(false);
|
|
245
|
+
|
|
246
|
+
const items = [
|
|
247
|
+
{ id: 1, name: 'Item 1' },
|
|
248
|
+
{ id: 2, name: 'Item 2' },
|
|
249
|
+
{ id: 3, name: 'Item 3' }
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
const handleSelectAll = (checked) => {
|
|
253
|
+
setSelectedAll(checked);
|
|
254
|
+
if (checked) {
|
|
255
|
+
setSelectedItems(new Set(items.map(item => item.id)));
|
|
256
|
+
} else {
|
|
257
|
+
setSelectedItems(new Set());
|
|
258
|
+
}
|
|
259
|
+
setShowBulkActions(checked);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<div>
|
|
264
|
+
{showBulkActions && (
|
|
265
|
+
<div className="bulk-actions-bar">
|
|
266
|
+
<Text>{selectedItems.size} items selected</Text>
|
|
267
|
+
<div className="bulk-actions">
|
|
268
|
+
<Button size="Small" type="Outlined">Delete</Button>
|
|
269
|
+
<Button size="Small" type="Outlined">Archive</Button>
|
|
270
|
+
<Button size="Small" type="Outlined">Export</Button>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
)}
|
|
274
|
+
|
|
275
|
+
<Table>
|
|
276
|
+
<TableHeader>
|
|
277
|
+
<TableRow>
|
|
278
|
+
<TableHeaderCell>
|
|
279
|
+
<Checkbox
|
|
280
|
+
checked={selectedAll}
|
|
281
|
+
indeterminate={selectedItems.size > 0 && selectedItems.size < items.length}
|
|
282
|
+
onChange={(e) => handleSelectAll(e.target.checked)}
|
|
283
|
+
/>
|
|
284
|
+
</TableHeaderCell>
|
|
285
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
286
|
+
<TableHeaderCell>Status</TableHeaderCell>
|
|
287
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
288
|
+
</TableRow>
|
|
289
|
+
</TableHeader>
|
|
290
|
+
<TableBody>
|
|
291
|
+
{items.map(item => (
|
|
292
|
+
<TableRow key={item.id}>
|
|
293
|
+
<TableCell>
|
|
294
|
+
<Checkbox checked={selectedItems.has(item.id)} />
|
|
295
|
+
</TableCell>
|
|
296
|
+
<TableCell>{item.name}</TableCell>
|
|
297
|
+
<TableCell>Active</TableCell>
|
|
298
|
+
<TableCell>
|
|
299
|
+
<Button size="Small" type="Ghost">Edit</Button>
|
|
300
|
+
</TableCell>
|
|
301
|
+
</TableRow>
|
|
302
|
+
))}
|
|
303
|
+
</TableBody>
|
|
304
|
+
</Table>
|
|
305
|
+
</div>
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Grouped Column Headers
|
|
311
|
+
```tsx
|
|
312
|
+
function GroupedHeaderExample() {
|
|
313
|
+
return (
|
|
314
|
+
<Table>
|
|
315
|
+
<TableHeader>
|
|
316
|
+
<TableRow>
|
|
317
|
+
<TableHeaderCell rowSpan={2}>Product</TableHeaderCell>
|
|
318
|
+
<TableHeaderCell colSpan={3}>Q1 Sales</TableHeaderCell>
|
|
319
|
+
<TableHeaderCell colSpan={3}>Q2 Sales</TableHeaderCell>
|
|
320
|
+
<TableHeaderCell rowSpan={2}>Total</TableHeaderCell>
|
|
321
|
+
</TableRow>
|
|
322
|
+
<TableRow>
|
|
323
|
+
<TableHeaderCell>Jan</TableHeaderCell>
|
|
324
|
+
<TableHeaderCell>Feb</TableHeaderCell>
|
|
325
|
+
<TableHeaderCell>Mar</TableHeaderCell>
|
|
326
|
+
<TableHeaderCell>Apr</TableHeaderCell>
|
|
327
|
+
<TableHeaderCell>May</TableHeaderCell>
|
|
328
|
+
<TableHeaderCell>Jun</TableHeaderCell>
|
|
329
|
+
</TableRow>
|
|
330
|
+
</TableHeader>
|
|
331
|
+
<TableBody>
|
|
332
|
+
<TableRow>
|
|
333
|
+
<TableCell>Product A</TableCell>
|
|
334
|
+
<TableCell>$12,000</TableCell>
|
|
335
|
+
<TableCell>$15,000</TableCell>
|
|
336
|
+
<TableCell>$18,000</TableCell>
|
|
337
|
+
<TableCell>$20,000</TableCell>
|
|
338
|
+
<TableCell>$22,000</TableCell>
|
|
339
|
+
<TableCell>$25,000</TableCell>
|
|
340
|
+
<TableCell>$112,000</TableCell>
|
|
341
|
+
</TableRow>
|
|
342
|
+
</TableBody>
|
|
343
|
+
</Table>
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Sticky Header with Actions
|
|
349
|
+
```tsx
|
|
350
|
+
function StickyHeaderActionsExample() {
|
|
351
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
352
|
+
|
|
353
|
+
return (
|
|
354
|
+
<div className="table-container" style={{ height: '400px', overflow: 'auto' }}>
|
|
355
|
+
<Table stickyHeader>
|
|
356
|
+
<TableHeader className="sticky-header-with-actions">
|
|
357
|
+
<TableRow>
|
|
358
|
+
<TableHeaderCell colSpan={4}>
|
|
359
|
+
<div className="header-actions-bar">
|
|
360
|
+
<div className="header-title">
|
|
361
|
+
<Text type="Heading5">User Management</Text>
|
|
362
|
+
<Text type="BodySmall">Manage your team members</Text>
|
|
363
|
+
</div>
|
|
364
|
+
<div className="header-actions">
|
|
365
|
+
<Input
|
|
366
|
+
placeholder="Search users..."
|
|
367
|
+
value={searchTerm}
|
|
368
|
+
onChange={(e) => setSearchTerm(e.target.value)}
|
|
369
|
+
leadingIcon={<Icon icon="Search" />}
|
|
370
|
+
size="Small"
|
|
371
|
+
/>
|
|
372
|
+
<Button size="Small">Add User</Button>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
</TableHeaderCell>
|
|
376
|
+
</TableRow>
|
|
377
|
+
<TableRow>
|
|
378
|
+
<TableHeaderCell>Name</TableHeaderCell>
|
|
379
|
+
<TableHeaderCell>Email</TableHeaderCell>
|
|
380
|
+
<TableHeaderCell>Role</TableHeaderCell>
|
|
381
|
+
<TableHeaderCell>Actions</TableHeaderCell>
|
|
382
|
+
</TableRow>
|
|
383
|
+
</TableHeader>
|
|
384
|
+
<TableBody>
|
|
385
|
+
{Array.from({ length: 20 }, (_, i) => (
|
|
386
|
+
<TableRow key={i}>
|
|
387
|
+
<TableCell>User {i + 1}</TableCell>
|
|
388
|
+
<TableCell>user{i + 1}@example.com</TableCell>
|
|
389
|
+
<TableCell>Member</TableCell>
|
|
390
|
+
<TableCell>
|
|
391
|
+
<Button size="Small" type="Ghost">Edit</Button>
|
|
392
|
+
</TableCell>
|
|
393
|
+
</TableRow>
|
|
394
|
+
))}
|
|
395
|
+
</TableBody>
|
|
396
|
+
</Table>
|
|
397
|
+
</div>
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Header with Custom Styling
|
|
403
|
+
```tsx
|
|
404
|
+
function CustomStyledHeaderExample() {
|
|
405
|
+
return (
|
|
406
|
+
<Table>
|
|
407
|
+
<TableHeader className="custom-header-theme">
|
|
408
|
+
<TableRow>
|
|
409
|
+
<TableHeaderCell className="header-primary">
|
|
410
|
+
<div className="header-cell-content">
|
|
411
|
+
<Icon icon="Person" size="Small" />
|
|
412
|
+
<Text type="BodyMedium">User</Text>
|
|
413
|
+
</div>
|
|
414
|
+
</TableHeaderCell>
|
|
415
|
+
<TableHeaderCell className="header-secondary">
|
|
416
|
+
<div className="header-cell-content">
|
|
417
|
+
<Icon icon="Email" size="Small" />
|
|
418
|
+
<Text type="BodyMedium">Contact</Text>
|
|
419
|
+
</div>
|
|
420
|
+
</TableHeaderCell>
|
|
421
|
+
<TableHeaderCell className="header-accent">
|
|
422
|
+
<div className="header-cell-content">
|
|
423
|
+
<Icon icon="Badge" size="Small" />
|
|
424
|
+
<Text type="BodyMedium">Role</Text>
|
|
425
|
+
</div>
|
|
426
|
+
</TableHeaderCell>
|
|
427
|
+
<TableHeaderCell className="header-neutral">
|
|
428
|
+
<div className="header-cell-content">
|
|
429
|
+
<Icon icon="Settings" size="Small" />
|
|
430
|
+
<Text type="BodyMedium">Actions</Text>
|
|
431
|
+
</div>
|
|
432
|
+
</TableHeaderCell>
|
|
433
|
+
</TableRow>
|
|
434
|
+
</TableHeader>
|
|
435
|
+
<TableBody>
|
|
436
|
+
<TableRow>
|
|
437
|
+
<TableCell>John Doe</TableCell>
|
|
438
|
+
<TableCell>john@example.com</TableCell>
|
|
439
|
+
<TableCell>Administrator</TableCell>
|
|
440
|
+
<TableCell>
|
|
441
|
+
<Button size="Small" type="Ghost">
|
|
442
|
+
<Icon icon="MoreVert" size="Small" />
|
|
443
|
+
</Button>
|
|
444
|
+
</TableCell>
|
|
445
|
+
</TableRow>
|
|
446
|
+
</TableBody>
|
|
447
|
+
</Table>
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Responsive Header
|
|
453
|
+
```tsx
|
|
454
|
+
function ResponsiveHeaderExample() {
|
|
455
|
+
return (
|
|
456
|
+
<Table className="responsive-table">
|
|
457
|
+
<TableHeader>
|
|
458
|
+
<TableRow>
|
|
459
|
+
<TableHeaderCell>
|
|
460
|
+
<div className="responsive-header-content">
|
|
461
|
+
<Text type="BodyMedium">Transaction</Text>
|
|
462
|
+
<Text type="BodySmall" className="header-subtitle">
|
|
463
|
+
ID & Details
|
|
464
|
+
</Text>
|
|
465
|
+
</div>
|
|
466
|
+
</TableHeaderCell>
|
|
467
|
+
<TableHeaderCell className="hide-mobile">
|
|
468
|
+
<div className="responsive-header-content">
|
|
469
|
+
<Text type="BodyMedium">Amount</Text>
|
|
470
|
+
<Text type="BodySmall" className="header-subtitle">
|
|
471
|
+
USD
|
|
472
|
+
</Text>
|
|
473
|
+
</div>
|
|
474
|
+
</TableHeaderCell>
|
|
475
|
+
<TableHeaderCell className="hide-tablet">
|
|
476
|
+
<div className="responsive-header-content">
|
|
477
|
+
<Text type="BodyMedium">Date</Text>
|
|
478
|
+
<Text type="BodySmall" className="header-subtitle">
|
|
479
|
+
Transaction Date
|
|
480
|
+
</Text>
|
|
481
|
+
</div>
|
|
482
|
+
</TableHeaderCell>
|
|
483
|
+
<TableHeaderCell>
|
|
484
|
+
<div className="responsive-header-content">
|
|
485
|
+
<Text type="BodyMedium">Status</Text>
|
|
486
|
+
<Text type="BodySmall" className="header-subtitle">
|
|
487
|
+
Current State
|
|
488
|
+
</Text>
|
|
489
|
+
</div>
|
|
490
|
+
</TableHeaderCell>
|
|
491
|
+
</TableRow>
|
|
492
|
+
</TableHeader>
|
|
493
|
+
<TableBody>
|
|
494
|
+
<TableRow>
|
|
495
|
+
<TableCell>
|
|
496
|
+
<div className="transaction-cell">
|
|
497
|
+
<Text type="BodyMedium">#TX001</Text>
|
|
498
|
+
<Text type="BodySmall" className="show-mobile">
|
|
499
|
+
$99.99 • 2023-10-15
|
|
500
|
+
</Text>
|
|
501
|
+
</div>
|
|
502
|
+
</TableCell>
|
|
503
|
+
<TableCell className="hide-mobile">$99.99</TableCell>
|
|
504
|
+
<TableCell className="hide-tablet">2023-10-15</TableCell>
|
|
505
|
+
<TableCell>
|
|
506
|
+
<Chip style="Success">Completed</Chip>
|
|
507
|
+
</TableCell>
|
|
508
|
+
</TableRow>
|
|
509
|
+
</TableBody>
|
|
510
|
+
</Table>
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
```
|