@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,572 @@
|
|
|
1
|
+
# NavItem
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
A navigation item component that serves as a semantic wrapper for individual navigation elements. Provides proper list item structure for navigation menus and ensures accessibility compliance when used within navigation containers.
|
|
6
|
+
|
|
7
|
+
## Aliases
|
|
8
|
+
|
|
9
|
+
- NavItem
|
|
10
|
+
- NavigationItem
|
|
11
|
+
- NavListItem
|
|
12
|
+
- MenuItem
|
|
13
|
+
- NavElement
|
|
14
|
+
|
|
15
|
+
## Props Breakdown
|
|
16
|
+
|
|
17
|
+
**Extends:** `LiHTMLAttributes<HTMLElement>`
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Required | Description |
|
|
20
|
+
|------|------|---------|----------|-------------|
|
|
21
|
+
| `children` | `ReactNode` | - | Yes | Content to render inside the navigation item |
|
|
22
|
+
| `className` | `string` | - | No | Additional CSS class names for custom styling |
|
|
23
|
+
| `role` | `string` | `'menuitem'` | No | ARIA role for accessibility |
|
|
24
|
+
| `tabIndex` | `number` | - | No | Tab order for keyboard navigation |
|
|
25
|
+
|
|
26
|
+
Plus all standard HTML list item attributes (`id`, `style`, `onClick`, etc.).
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
### Basic Usage
|
|
31
|
+
```tsx
|
|
32
|
+
import { Nav, NavItem, NavLink } from '@delightui/components';
|
|
33
|
+
|
|
34
|
+
function BasicExample() {
|
|
35
|
+
return (
|
|
36
|
+
<Nav>
|
|
37
|
+
<NavItem>
|
|
38
|
+
<NavLink to="/home">Home</NavLink>
|
|
39
|
+
</NavItem>
|
|
40
|
+
<NavItem>
|
|
41
|
+
<NavLink to="/about">About</NavLink>
|
|
42
|
+
</NavItem>
|
|
43
|
+
<NavItem>
|
|
44
|
+
<NavLink to="/contact">Contact</NavLink>
|
|
45
|
+
</NavItem>
|
|
46
|
+
</Nav>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Navigation Items with Icons
|
|
52
|
+
```tsx
|
|
53
|
+
function IconNavItemsExample() {
|
|
54
|
+
return (
|
|
55
|
+
<Nav className="icon-nav">
|
|
56
|
+
<NavItem>
|
|
57
|
+
<NavLink to="/dashboard" leadingIcon={<Icon icon="Dashboard" />}>
|
|
58
|
+
Dashboard
|
|
59
|
+
</NavLink>
|
|
60
|
+
</NavItem>
|
|
61
|
+
|
|
62
|
+
<NavItem>
|
|
63
|
+
<NavLink to="/projects" leadingIcon={<Icon icon="Folder" />}>
|
|
64
|
+
Projects
|
|
65
|
+
</NavLink>
|
|
66
|
+
</NavItem>
|
|
67
|
+
|
|
68
|
+
<NavItem>
|
|
69
|
+
<NavLink to="/team" leadingIcon={<Icon icon="People" />}>
|
|
70
|
+
Team Members
|
|
71
|
+
</NavLink>
|
|
72
|
+
</NavItem>
|
|
73
|
+
|
|
74
|
+
<NavItem>
|
|
75
|
+
<NavLink
|
|
76
|
+
to="/settings"
|
|
77
|
+
leadingIcon={<Icon icon="Settings" />}
|
|
78
|
+
trailingIcon={<Icon icon="ChevronRight" />}
|
|
79
|
+
>
|
|
80
|
+
Settings
|
|
81
|
+
</NavLink>
|
|
82
|
+
</NavItem>
|
|
83
|
+
</Nav>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Interactive Navigation Items
|
|
89
|
+
```tsx
|
|
90
|
+
function InteractiveNavItemsExample() {
|
|
91
|
+
const [activeItem, setActiveItem] = useState('dashboard');
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<Nav>
|
|
95
|
+
<NavItem
|
|
96
|
+
className={activeItem === 'dashboard' ? 'active' : ''}
|
|
97
|
+
onClick={() => setActiveItem('dashboard')}
|
|
98
|
+
>
|
|
99
|
+
<NavLink to="/dashboard">
|
|
100
|
+
<Icon icon="Dashboard" />
|
|
101
|
+
<Text>Dashboard</Text>
|
|
102
|
+
</NavLink>
|
|
103
|
+
</NavItem>
|
|
104
|
+
|
|
105
|
+
<NavItem
|
|
106
|
+
className={activeItem === 'analytics' ? 'active' : ''}
|
|
107
|
+
onClick={() => setActiveItem('analytics')}
|
|
108
|
+
>
|
|
109
|
+
<NavLink to="/analytics">
|
|
110
|
+
<Icon icon="BarChart" />
|
|
111
|
+
<Text>Analytics</Text>
|
|
112
|
+
<Chip size="Small" style="Success">New</Chip>
|
|
113
|
+
</NavLink>
|
|
114
|
+
</NavItem>
|
|
115
|
+
|
|
116
|
+
<NavItem
|
|
117
|
+
className={activeItem === 'reports' ? 'active' : ''}
|
|
118
|
+
onClick={() => setActiveItem('reports')}
|
|
119
|
+
>
|
|
120
|
+
<NavLink to="/reports">
|
|
121
|
+
<Icon icon="Description" />
|
|
122
|
+
<Text>Reports</Text>
|
|
123
|
+
<Text type="BodySmall" className="item-count">12</Text>
|
|
124
|
+
</NavLink>
|
|
125
|
+
</NavItem>
|
|
126
|
+
</Nav>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Navigation Items with Buttons
|
|
132
|
+
```tsx
|
|
133
|
+
function ButtonNavItemsExample() {
|
|
134
|
+
const [notifications, setNotifications] = useState(3);
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<Nav className="header-nav">
|
|
138
|
+
<NavItem>
|
|
139
|
+
<Button type="Ghost" leadingIcon={<Icon icon="Search" />}>
|
|
140
|
+
Search
|
|
141
|
+
</Button>
|
|
142
|
+
</NavItem>
|
|
143
|
+
|
|
144
|
+
<NavItem>
|
|
145
|
+
<Button
|
|
146
|
+
type="Ghost"
|
|
147
|
+
leadingIcon={<Icon icon="Notifications" />}
|
|
148
|
+
trailingIcon={
|
|
149
|
+
notifications > 0 && (
|
|
150
|
+
<Chip size="Small" style="Danger">
|
|
151
|
+
{notifications}
|
|
152
|
+
</Chip>
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
>
|
|
156
|
+
Notifications
|
|
157
|
+
</Button>
|
|
158
|
+
</NavItem>
|
|
159
|
+
|
|
160
|
+
<NavItem>
|
|
161
|
+
<Button type="Ghost" leadingIcon={<Icon icon="Help" />}>
|
|
162
|
+
Help
|
|
163
|
+
</Button>
|
|
164
|
+
</NavItem>
|
|
165
|
+
|
|
166
|
+
<NavItem>
|
|
167
|
+
<Button type="Filled" leadingIcon={<Icon icon="Add" />}>
|
|
168
|
+
New Project
|
|
169
|
+
</Button>
|
|
170
|
+
</NavItem>
|
|
171
|
+
</Nav>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Disabled Navigation Items
|
|
177
|
+
```tsx
|
|
178
|
+
function DisabledNavItemsExample() {
|
|
179
|
+
const [userPermissions, setUserPermissions] = useState({
|
|
180
|
+
canViewReports: false,
|
|
181
|
+
canManageUsers: false,
|
|
182
|
+
canAccessSettings: true
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<Nav>
|
|
187
|
+
<NavItem>
|
|
188
|
+
<NavLink to="/dashboard">Dashboard</NavLink>
|
|
189
|
+
</NavItem>
|
|
190
|
+
|
|
191
|
+
<NavItem className={!userPermissions.canViewReports ? 'disabled' : ''}>
|
|
192
|
+
<NavLink
|
|
193
|
+
to="/reports"
|
|
194
|
+
style={{
|
|
195
|
+
opacity: userPermissions.canViewReports ? 1 : 0.5,
|
|
196
|
+
pointerEvents: userPermissions.canViewReports ? 'auto' : 'none'
|
|
197
|
+
}}
|
|
198
|
+
>
|
|
199
|
+
Reports
|
|
200
|
+
{!userPermissions.canViewReports && (
|
|
201
|
+
<Icon icon="Lock" className="disabled-icon" />
|
|
202
|
+
)}
|
|
203
|
+
</NavLink>
|
|
204
|
+
</NavItem>
|
|
205
|
+
|
|
206
|
+
<NavItem className={!userPermissions.canManageUsers ? 'disabled' : ''}>
|
|
207
|
+
<NavLink
|
|
208
|
+
to="/users"
|
|
209
|
+
style={{
|
|
210
|
+
opacity: userPermissions.canManageUsers ? 1 : 0.5,
|
|
211
|
+
pointerEvents: userPermissions.canManageUsers ? 'auto' : 'none'
|
|
212
|
+
}}
|
|
213
|
+
>
|
|
214
|
+
User Management
|
|
215
|
+
{!userPermissions.canManageUsers && (
|
|
216
|
+
<Icon icon="Lock" className="disabled-icon" />
|
|
217
|
+
)}
|
|
218
|
+
</NavLink>
|
|
219
|
+
</NavItem>
|
|
220
|
+
|
|
221
|
+
<NavItem>
|
|
222
|
+
<NavLink to="/settings">Settings</NavLink>
|
|
223
|
+
</NavItem>
|
|
224
|
+
</Nav>
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Navigation Items with Context Menus
|
|
230
|
+
```tsx
|
|
231
|
+
function ContextMenuNavItemsExample() {
|
|
232
|
+
return (
|
|
233
|
+
<Nav>
|
|
234
|
+
<NavItem>
|
|
235
|
+
<NavLink to="/dashboard">Dashboard</NavLink>
|
|
236
|
+
</NavItem>
|
|
237
|
+
|
|
238
|
+
<NavItem>
|
|
239
|
+
<ContextMenu
|
|
240
|
+
trigger={
|
|
241
|
+
<NavLink to="/projects">
|
|
242
|
+
Projects
|
|
243
|
+
<Icon icon="ExpandMore" />
|
|
244
|
+
</NavLink>
|
|
245
|
+
}
|
|
246
|
+
>
|
|
247
|
+
<NavLink to="/projects/active">Active Projects</NavLink>
|
|
248
|
+
<NavLink to="/projects/completed">Completed</NavLink>
|
|
249
|
+
<NavLink to="/projects/archived">Archived</NavLink>
|
|
250
|
+
<hr />
|
|
251
|
+
<NavLink to="/projects/new">Create New Project</NavLink>
|
|
252
|
+
</ContextMenu>
|
|
253
|
+
</NavItem>
|
|
254
|
+
|
|
255
|
+
<NavItem>
|
|
256
|
+
<ContextMenu
|
|
257
|
+
trigger={
|
|
258
|
+
<NavLink to="/team">
|
|
259
|
+
Team
|
|
260
|
+
<Icon icon="ExpandMore" />
|
|
261
|
+
</NavLink>
|
|
262
|
+
}
|
|
263
|
+
>
|
|
264
|
+
<NavLink to="/team/members">Team Members</NavLink>
|
|
265
|
+
<NavLink to="/team/roles">Roles & Permissions</NavLink>
|
|
266
|
+
<NavLink to="/team/invitations">Pending Invitations</NavLink>
|
|
267
|
+
<hr />
|
|
268
|
+
<NavLink to="/team/invite">Invite Member</NavLink>
|
|
269
|
+
</ContextMenu>
|
|
270
|
+
</NavItem>
|
|
271
|
+
</Nav>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Grouped Navigation Items
|
|
277
|
+
```tsx
|
|
278
|
+
function GroupedNavItemsExample() {
|
|
279
|
+
return (
|
|
280
|
+
<Nav className="grouped-nav">
|
|
281
|
+
<div className="nav-group">
|
|
282
|
+
<Text type="BodySmall" className="group-label">MAIN</Text>
|
|
283
|
+
|
|
284
|
+
<NavItem>
|
|
285
|
+
<NavLink to="/dashboard" leadingIcon={<Icon icon="Dashboard" />}>
|
|
286
|
+
Dashboard
|
|
287
|
+
</NavLink>
|
|
288
|
+
</NavItem>
|
|
289
|
+
|
|
290
|
+
<NavItem>
|
|
291
|
+
<NavLink to="/projects" leadingIcon={<Icon icon="Folder" />}>
|
|
292
|
+
Projects
|
|
293
|
+
</NavLink>
|
|
294
|
+
</NavItem>
|
|
295
|
+
|
|
296
|
+
<NavItem>
|
|
297
|
+
<NavLink to="/tasks" leadingIcon={<Icon icon="CheckBox" />}>
|
|
298
|
+
Tasks
|
|
299
|
+
</NavLink>
|
|
300
|
+
</NavItem>
|
|
301
|
+
</div>
|
|
302
|
+
|
|
303
|
+
<div className="nav-group">
|
|
304
|
+
<Text type="BodySmall" className="group-label">MANAGEMENT</Text>
|
|
305
|
+
|
|
306
|
+
<NavItem>
|
|
307
|
+
<NavLink to="/team" leadingIcon={<Icon icon="People" />}>
|
|
308
|
+
Team
|
|
309
|
+
</NavLink>
|
|
310
|
+
</NavItem>
|
|
311
|
+
|
|
312
|
+
<NavItem>
|
|
313
|
+
<NavLink to="/analytics" leadingIcon={<Icon icon="Analytics" />}>
|
|
314
|
+
Analytics
|
|
315
|
+
</NavLink>
|
|
316
|
+
</NavItem>
|
|
317
|
+
|
|
318
|
+
<NavItem>
|
|
319
|
+
<NavLink to="/reports" leadingIcon={<Icon icon="Description" />}>
|
|
320
|
+
Reports
|
|
321
|
+
</NavLink>
|
|
322
|
+
</NavItem>
|
|
323
|
+
</div>
|
|
324
|
+
|
|
325
|
+
<div className="nav-group">
|
|
326
|
+
<Text type="BodySmall" className="group-label">SETTINGS</Text>
|
|
327
|
+
|
|
328
|
+
<NavItem>
|
|
329
|
+
<NavLink to="/preferences" leadingIcon={<Icon icon="Settings" />}>
|
|
330
|
+
Preferences
|
|
331
|
+
</NavLink>
|
|
332
|
+
</NavItem>
|
|
333
|
+
|
|
334
|
+
<NavItem>
|
|
335
|
+
<NavLink to="/billing" leadingIcon={<Icon icon="CreditCard" />}>
|
|
336
|
+
Billing
|
|
337
|
+
</NavLink>
|
|
338
|
+
</NavItem>
|
|
339
|
+
</div>
|
|
340
|
+
</Nav>
|
|
341
|
+
);
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Navigation Items with Custom Content
|
|
346
|
+
```tsx
|
|
347
|
+
function CustomContentNavItemsExample() {
|
|
348
|
+
const [unreadCount, setUnreadCount] = useState(5);
|
|
349
|
+
const [storageUsed, setStorageUsed] = useState(78);
|
|
350
|
+
|
|
351
|
+
return (
|
|
352
|
+
<Nav className="custom-content-nav">
|
|
353
|
+
<NavItem>
|
|
354
|
+
<NavLink to="/inbox" className="inbox-item">
|
|
355
|
+
<div className="item-content">
|
|
356
|
+
<div className="item-header">
|
|
357
|
+
<Icon icon="Mail" />
|
|
358
|
+
<Text>Inbox</Text>
|
|
359
|
+
</div>
|
|
360
|
+
{unreadCount > 0 && (
|
|
361
|
+
<Chip size="Small" style="Primary">
|
|
362
|
+
{unreadCount}
|
|
363
|
+
</Chip>
|
|
364
|
+
)}
|
|
365
|
+
</div>
|
|
366
|
+
</NavLink>
|
|
367
|
+
</NavItem>
|
|
368
|
+
|
|
369
|
+
<NavItem>
|
|
370
|
+
<NavLink to="/storage" className="storage-item">
|
|
371
|
+
<div className="item-content">
|
|
372
|
+
<div className="item-header">
|
|
373
|
+
<Icon icon="Storage" />
|
|
374
|
+
<Text>Storage</Text>
|
|
375
|
+
</div>
|
|
376
|
+
<div className="storage-info">
|
|
377
|
+
<ProgressBar value={storageUsed} max={100} size="Small" />
|
|
378
|
+
<Text type="BodySmall">{storageUsed}% used</Text>
|
|
379
|
+
</div>
|
|
380
|
+
</div>
|
|
381
|
+
</NavLink>
|
|
382
|
+
</NavItem>
|
|
383
|
+
|
|
384
|
+
<NavItem>
|
|
385
|
+
<NavLink to="/activity" className="activity-item">
|
|
386
|
+
<div className="item-content">
|
|
387
|
+
<div className="item-header">
|
|
388
|
+
<Icon icon="Timeline" />
|
|
389
|
+
<Text>Recent Activity</Text>
|
|
390
|
+
</div>
|
|
391
|
+
<Text type="BodySmall" className="activity-time">
|
|
392
|
+
2 minutes ago
|
|
393
|
+
</Text>
|
|
394
|
+
</div>
|
|
395
|
+
</NavLink>
|
|
396
|
+
</NavItem>
|
|
397
|
+
</Nav>
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Mobile Navigation Items
|
|
403
|
+
```tsx
|
|
404
|
+
function MobileNavItemsExample() {
|
|
405
|
+
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
406
|
+
|
|
407
|
+
return (
|
|
408
|
+
<>
|
|
409
|
+
<Button
|
|
410
|
+
className="mobile-menu-toggle"
|
|
411
|
+
onClick={() => setIsMenuOpen(!isMenuOpen)}
|
|
412
|
+
>
|
|
413
|
+
<Icon icon="Menu" />
|
|
414
|
+
</Button>
|
|
415
|
+
|
|
416
|
+
<Nav className={`mobile-nav ${isMenuOpen ? 'open' : ''}`}>
|
|
417
|
+
<NavItem className="mobile-nav-item">
|
|
418
|
+
<NavLink
|
|
419
|
+
to="/home"
|
|
420
|
+
onClick={() => setIsMenuOpen(false)}
|
|
421
|
+
className="mobile-nav-link"
|
|
422
|
+
>
|
|
423
|
+
<Icon icon="Home" />
|
|
424
|
+
<Text>Home</Text>
|
|
425
|
+
</NavLink>
|
|
426
|
+
</NavItem>
|
|
427
|
+
|
|
428
|
+
<NavItem className="mobile-nav-item">
|
|
429
|
+
<NavLink
|
|
430
|
+
to="/profile"
|
|
431
|
+
onClick={() => setIsMenuOpen(false)}
|
|
432
|
+
className="mobile-nav-link"
|
|
433
|
+
>
|
|
434
|
+
<Icon icon="Person" />
|
|
435
|
+
<Text>Profile</Text>
|
|
436
|
+
</NavLink>
|
|
437
|
+
</NavItem>
|
|
438
|
+
|
|
439
|
+
<NavItem className="mobile-nav-item">
|
|
440
|
+
<NavLink
|
|
441
|
+
to="/messages"
|
|
442
|
+
onClick={() => setIsMenuOpen(false)}
|
|
443
|
+
className="mobile-nav-link"
|
|
444
|
+
>
|
|
445
|
+
<Icon icon="Message" />
|
|
446
|
+
<Text>Messages</Text>
|
|
447
|
+
<Chip size="Small" style="Danger">3</Chip>
|
|
448
|
+
</NavLink>
|
|
449
|
+
</NavItem>
|
|
450
|
+
|
|
451
|
+
<NavItem className="mobile-nav-item">
|
|
452
|
+
<NavLink
|
|
453
|
+
to="/settings"
|
|
454
|
+
onClick={() => setIsMenuOpen(false)}
|
|
455
|
+
className="mobile-nav-link"
|
|
456
|
+
>
|
|
457
|
+
<Icon icon="Settings" />
|
|
458
|
+
<Text>Settings</Text>
|
|
459
|
+
</NavLink>
|
|
460
|
+
</NavItem>
|
|
461
|
+
</Nav>
|
|
462
|
+
</>
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
### Navigation Items with Keyboard Navigation
|
|
468
|
+
```tsx
|
|
469
|
+
function KeyboardNavItemsExample() {
|
|
470
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
471
|
+
const navItems = [
|
|
472
|
+
{ to: '/dashboard', label: 'Dashboard', icon: 'Dashboard' },
|
|
473
|
+
{ to: '/projects', label: 'Projects', icon: 'Folder' },
|
|
474
|
+
{ to: '/team', label: 'Team', icon: 'People' },
|
|
475
|
+
{ to: '/settings', label: 'Settings', icon: 'Settings' }
|
|
476
|
+
];
|
|
477
|
+
|
|
478
|
+
const handleKeyDown = (event, index) => {
|
|
479
|
+
switch (event.key) {
|
|
480
|
+
case 'ArrowDown':
|
|
481
|
+
event.preventDefault();
|
|
482
|
+
setFocusedIndex((prev) => (prev + 1) % navItems.length);
|
|
483
|
+
break;
|
|
484
|
+
case 'ArrowUp':
|
|
485
|
+
event.preventDefault();
|
|
486
|
+
setFocusedIndex((prev) => (prev - 1 + navItems.length) % navItems.length);
|
|
487
|
+
break;
|
|
488
|
+
case 'Home':
|
|
489
|
+
event.preventDefault();
|
|
490
|
+
setFocusedIndex(0);
|
|
491
|
+
break;
|
|
492
|
+
case 'End':
|
|
493
|
+
event.preventDefault();
|
|
494
|
+
setFocusedIndex(navItems.length - 1);
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
return (
|
|
500
|
+
<Nav className="keyboard-nav" role="menubar">
|
|
501
|
+
{navItems.map((item, index) => (
|
|
502
|
+
<NavItem
|
|
503
|
+
key={item.to}
|
|
504
|
+
role="none"
|
|
505
|
+
className={focusedIndex === index ? 'focused' : ''}
|
|
506
|
+
>
|
|
507
|
+
<NavLink
|
|
508
|
+
to={item.to}
|
|
509
|
+
role="menuitem"
|
|
510
|
+
tabIndex={focusedIndex === index ? 0 : -1}
|
|
511
|
+
onKeyDown={(e) => handleKeyDown(e, index)}
|
|
512
|
+
onFocus={() => setFocusedIndex(index)}
|
|
513
|
+
leadingIcon={<Icon icon={item.icon} />}
|
|
514
|
+
>
|
|
515
|
+
{item.label}
|
|
516
|
+
</NavLink>
|
|
517
|
+
</NavItem>
|
|
518
|
+
))}
|
|
519
|
+
</Nav>
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
### Dynamic Navigation Items
|
|
525
|
+
```tsx
|
|
526
|
+
function DynamicNavItemsExample() {
|
|
527
|
+
const [userRole, setUserRole] = useState('admin');
|
|
528
|
+
const [navigationItems, setNavigationItems] = useState([]);
|
|
529
|
+
|
|
530
|
+
useEffect(() => {
|
|
531
|
+
const baseItems = [
|
|
532
|
+
{ id: 'dashboard', label: 'Dashboard', to: '/dashboard', icon: 'Dashboard', roles: ['user', 'admin', 'moderator'] },
|
|
533
|
+
{ id: 'projects', label: 'Projects', to: '/projects', icon: 'Folder', roles: ['user', 'admin', 'moderator'] },
|
|
534
|
+
{ id: 'analytics', label: 'Analytics', to: '/analytics', icon: 'Analytics', roles: ['admin', 'moderator'] },
|
|
535
|
+
{ id: 'users', label: 'User Management', to: '/users', icon: 'People', roles: ['admin'] },
|
|
536
|
+
{ id: 'settings', label: 'Settings', to: '/settings', icon: 'Settings', roles: ['admin'] }
|
|
537
|
+
];
|
|
538
|
+
|
|
539
|
+
const filteredItems = baseItems.filter(item =>
|
|
540
|
+
item.roles.includes(userRole)
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
setNavigationItems(filteredItems);
|
|
544
|
+
}, [userRole]);
|
|
545
|
+
|
|
546
|
+
return (
|
|
547
|
+
<div className="dynamic-nav-example">
|
|
548
|
+
<div className="role-selector">
|
|
549
|
+
<Text>Current Role:</Text>
|
|
550
|
+
<Select value={userRole} onValueChange={setUserRole}>
|
|
551
|
+
<Option value="user">User</Option>
|
|
552
|
+
<Option value="moderator">Moderator</Option>
|
|
553
|
+
<Option value="admin">Admin</Option>
|
|
554
|
+
</Select>
|
|
555
|
+
</div>
|
|
556
|
+
|
|
557
|
+
<Nav className="dynamic-nav">
|
|
558
|
+
{navigationItems.map(item => (
|
|
559
|
+
<NavItem key={item.id}>
|
|
560
|
+
<NavLink
|
|
561
|
+
to={item.to}
|
|
562
|
+
leadingIcon={<Icon icon={item.icon} />}
|
|
563
|
+
>
|
|
564
|
+
{item.label}
|
|
565
|
+
</NavLink>
|
|
566
|
+
</NavItem>
|
|
567
|
+
))}
|
|
568
|
+
</Nav>
|
|
569
|
+
</div>
|
|
570
|
+
);
|
|
571
|
+
}
|
|
572
|
+
```
|