@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,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
+ ```