0
# Navigation Components
1
2
Navigation elements including app bars, drawers, menus, tabs, and breadcrumbs for application structure.
3
4
## Capabilities
5
6
### AppBar
7
8
Application bar component for navigation and branding, typically positioned at the top of the application.
9
10
```typescript { .api }
11
/**
12
* Application bar for navigation and branding
13
* @param props - AppBar configuration
14
* @returns AppBar component
15
*/
16
function AppBar(props: AppBarProps): JSX.Element;
17
18
interface AppBarProps extends CommonProps {
19
/** The positioning type */
20
position?: 'fixed' | 'absolute' | 'sticky' | 'static' | 'relative';
21
/** The color of the component */
22
color?: 'default' | 'inherit' | 'primary' | 'secondary' | 'transparent';
23
/** If true, the color prop is applied in dark mode */
24
enableColorOnDark?: boolean;
25
/** The component used for the root node */
26
component?: React.ElementType;
27
children?: React.ReactNode;
28
}
29
```
30
31
### Toolbar
32
33
Flexible toolbar component, often used within AppBar for organizing navigation elements.
34
35
```typescript { .api }
36
/**
37
* Flexible toolbar component
38
* @param props - Toolbar configuration
39
* @returns Toolbar component
40
*/
41
function Toolbar(props: ToolbarProps): JSX.Element;
42
43
interface ToolbarProps extends CommonProps {
44
/** The variant to use */
45
variant?: 'regular' | 'dense';
46
/** If true, the left and right padding is removed */
47
disableGutters?: boolean;
48
/** The component used for the root node */
49
component?: React.ElementType;
50
children?: React.ReactNode;
51
}
52
```
53
54
**Usage Examples:**
55
56
```typescript
57
import { AppBar, Toolbar, Typography, Button, IconButton } from "@mui/material";
58
import MenuIcon from "@mui/icons-material/Menu";
59
60
// Basic app bar
61
<AppBar position="static">
62
<Toolbar>
63
<IconButton edge="start" color="inherit" aria-label="menu">
64
<MenuIcon />
65
</IconButton>
66
<Typography variant="h6" sx={{ flexGrow: 1 }}>
67
My Application
68
</Typography>
69
<Button color="inherit">Login</Button>
70
</Toolbar>
71
</AppBar>
72
73
// Fixed app bar with elevation
74
<AppBar position="fixed" elevation={4}>
75
<Toolbar>
76
<Typography variant="h6" component="div" sx={{ flexGrow: 1 }}>
77
Fixed Header
78
</Typography>
79
</Toolbar>
80
</AppBar>
81
```
82
83
### Drawer
84
85
Navigation drawer panel that slides in from the side of the screen.
86
87
```typescript { .api }
88
/**
89
* Navigation drawer panel
90
* @param props - Drawer configuration
91
* @returns Drawer component
92
*/
93
function Drawer(props: DrawerProps): JSX.Element;
94
95
interface DrawerProps extends CommonProps {
96
/** Side from which the drawer will appear */
97
anchor?: 'left' | 'top' | 'right' | 'bottom';
98
/** If true, the drawer is open */
99
open?: boolean;
100
/** The variant to use */
101
variant?: 'permanent' | 'persistent' | 'temporary';
102
/** Callback fired when the component requests to be closed */
103
onClose?: (event: React.SyntheticEvent) => void;
104
/** Props applied to the Modal element */
105
ModalProps?: Partial<ModalProps>;
106
/** Props applied to the Paper element */
107
PaperProps?: Partial<PaperProps>;
108
/** Props applied to the Slide transition element */
109
SlideProps?: Partial<SlideProps>;
110
children?: React.ReactNode;
111
}
112
```
113
114
**Usage Examples:**
115
116
```typescript
117
import { Drawer, List, ListItem, ListItemText, Divider } from "@mui/material";
118
119
// Temporary drawer
120
<Drawer
121
anchor="left"
122
open={drawerOpen}
123
onClose={handleDrawerClose}
124
>
125
<List>
126
<ListItem button>
127
<ListItemText primary="Home" />
128
</ListItem>
129
<ListItem button>
130
<ListItemText primary="About" />
131
</ListItem>
132
<Divider />
133
<ListItem button>
134
<ListItemText primary="Contact" />
135
</ListItem>
136
</List>
137
</Drawer>
138
139
// Permanent drawer
140
<Drawer
141
variant="permanent"
142
sx={{
143
width: 240,
144
flexShrink: 0,
145
'& .MuiDrawer-paper': {
146
width: 240,
147
boxSizing: 'border-box',
148
},
149
}}
150
>
151
<Toolbar />
152
<List>
153
<ListItem button>
154
<ListItemText primary="Dashboard" />
155
</ListItem>
156
<ListItem button>
157
<ListItemText primary="Settings" />
158
</ListItem>
159
</List>
160
</Drawer>
161
```
162
163
### Tabs
164
165
Tab navigation component for organizing content into separate views.
166
167
```typescript { .api }
168
/**
169
* Tab navigation component
170
* @param props - Tabs configuration
171
* @returns Tabs component
172
*/
173
function Tabs(props: TabsProps): JSX.Element;
174
175
/**
176
* Individual tab component
177
* @param props - Tab configuration
178
* @returns Tab component
179
*/
180
function Tab(props: TabProps): JSX.Element;
181
182
interface TabsProps extends CommonProps {
183
/** Callback fired when the value changes */
184
onChange?: (event: React.SyntheticEvent, value: any) => void;
185
/** The value of the currently selected Tab */
186
value?: any;
187
/** The tabs orientation */
188
orientation?: 'horizontal' | 'vertical';
189
/** The component orientation */
190
variant?: 'standard' | 'scrollable' | 'fullWidth';
191
/** Determines the color of the indicator */
192
indicatorColor?: 'primary' | 'secondary';
193
/** Determines the color of the Tab */
194
textColor?: 'primary' | 'secondary' | 'inherit';
195
/** If true, the tabs are centered */
196
centered?: boolean;
197
/** Determine behavior of scroll buttons when tabs are set to scroll */
198
scrollButtons?: 'auto' | 'desktop' | 'on' | 'off';
199
/** If true, the scrollbar is visible */
200
visibleScrollbar?: boolean;
201
/** If true, keyboard focus will wrap around */
202
allowScrollButtonsMobile?: boolean;
203
children?: React.ReactNode;
204
}
205
206
interface TabProps extends CommonProps {
207
/** The label element */
208
label?: React.ReactNode;
209
/** The icon element */
210
icon?: React.ReactNode;
211
/** The position of the icon relative to the label */
212
iconPosition?: 'start' | 'end' | 'top' | 'bottom';
213
/** If true, the tab is disabled */
214
disabled?: boolean;
215
/** You can wrap a string in an object with the 'wrapped' property to make the Tab fit */
216
wrapped?: boolean;
217
/** The value to associate with the tab */
218
value?: any;
219
/** Tab index value */
220
tabIndex?: number;
221
/** If true, the ripple effect is disabled */
222
disableRipple?: boolean;
223
/** If true, the focus ripple is disabled */
224
disableFocusRipple?: boolean;
225
/** The component used for the root node */
226
component?: React.ElementType;
227
}
228
```
229
230
**Usage Examples:**
231
232
```typescript
233
import { Tabs, Tab, TabPanel, Box } from "@mui/material";
234
235
function TabPanel({ children, value, index, ...other }: TabPanelProps) {
236
return (
237
<div
238
role="tabpanel"
239
hidden={value !== index}
240
id={`tabpanel-${index}`}
241
aria-labelledby={`tab-${index}`}
242
{...other}
243
>
244
{value === index && <Box sx={{ p: 3 }}>{children}</Box>}
245
</div>
246
);
247
}
248
249
// Basic tabs
250
<Box sx={{ width: '100%' }}>
251
<Tabs value={tabValue} onChange={handleTabChange}>
252
<Tab label="Overview" />
253
<Tab label="Details" />
254
<Tab label="Settings" />
255
</Tabs>
256
257
<TabPanel value={tabValue} index={0}>
258
Overview content
259
</TabPanel>
260
<TabPanel value={tabValue} index={1}>
261
Details content
262
</TabPanel>
263
<TabPanel value={tabValue} index={2}>
264
Settings content
265
</TabPanel>
266
</Box>
267
268
// Tabs with icons
269
<Tabs value={tabValue} onChange={handleTabChange}>
270
<Tab icon={<HomeIcon />} label="Home" />
271
<Tab icon={<FavoriteIcon />} label="Favorites" />
272
<Tab icon={<PersonIcon />} label="Profile" />
273
</Tabs>
274
```
275
276
### Menu
277
278
Menu component for displaying a list of choices to the user.
279
280
```typescript { .api }
281
/**
282
* Menu component for displaying choices
283
* @param props - Menu configuration
284
* @returns Menu component
285
*/
286
function Menu(props: MenuProps): JSX.Element;
287
288
/**
289
* Individual menu item
290
* @param props - MenuItem configuration
291
* @returns MenuItem component
292
*/
293
function MenuItem(props: MenuItemProps): JSX.Element;
294
295
interface MenuProps extends CommonProps {
296
/** An HTML element, or a function that returns one */
297
anchorEl?: null | Element | ((element: Element) => Element);
298
/** The anchor reference type */
299
anchorReference?: 'anchorEl' | 'anchorPosition' | 'none';
300
/** The anchor position */
301
anchorPosition?: { top?: number; left?: number };
302
/** This is the point on the anchor where the popover's anchorEl will attach to */
303
anchorOrigin?: PopoverOrigin;
304
/** If true, the menu will be focused on open */
305
autoFocus?: boolean;
306
/** Menu contents, normally MenuItems */
307
children?: React.ReactNode;
308
/** Props applied to the MenuList element */
309
MenuListProps?: Partial<MenuListProps>;
310
/** Callback fired when the component requests to be closed */
311
onClose?: (event: React.SyntheticEvent) => void;
312
/** If true, the menu is visible */
313
open: boolean;
314
/** This is the point on the popover which will attach to the anchor's origin */
315
transformOrigin?: PopoverOrigin;
316
/** The variant to use */
317
variant?: 'menu' | 'selectedMenu';
318
}
319
320
interface MenuItemProps extends CommonProps {
321
/** If true, the menu item will be auto-focused when the menu opens */
322
autoFocus?: boolean;
323
/** The component used for the root node */
324
component?: React.ElementType;
325
/** If true, compact vertical padding designed for keyboard and mouse input is used */
326
dense?: boolean;
327
/** If true, the left and right padding is removed */
328
disableGutters?: boolean;
329
/** If true, the menu item is disabled */
330
disabled?: boolean;
331
/** If true, a 1px light border is added to the bottom of the menu item */
332
divider?: boolean;
333
/** This prop can help identify which element has keyboard focus */
334
focusVisibleClassName?: string;
335
/** If true, the menu item is selected */
336
selected?: boolean;
337
children?: React.ReactNode;
338
}
339
```
340
341
**Usage Examples:**
342
343
```typescript
344
import { Menu, MenuItem, IconButton } from "@mui/material";
345
import MoreVertIcon from "@mui/icons-material/MoreVert";
346
347
function DropdownMenu() {
348
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
349
const open = Boolean(anchorEl);
350
351
const handleClick = (event: React.MouseEvent<HTMLElement>) => {
352
setAnchorEl(event.currentTarget);
353
};
354
355
const handleClose = () => {
356
setAnchorEl(null);
357
};
358
359
return (
360
<>
361
<IconButton onClick={handleClick}>
362
<MoreVertIcon />
363
</IconButton>
364
<Menu
365
anchorEl={anchorEl}
366
open={open}
367
onClose={handleClose}
368
anchorOrigin={{
369
vertical: 'bottom',
370
horizontal: 'right',
371
}}
372
transformOrigin={{
373
vertical: 'top',
374
horizontal: 'right',
375
}}
376
>
377
<MenuItem onClick={handleClose}>Profile</MenuItem>
378
<MenuItem onClick={handleClose}>Settings</MenuItem>
379
<MenuItem onClick={handleClose}>Logout</MenuItem>
380
</Menu>
381
</>
382
);
383
}
384
```
385
386
### Breadcrumbs
387
388
Navigation breadcrumbs component showing the current page's location within a hierarchy.
389
390
```typescript { .api }
391
/**
392
* Navigation breadcrumbs component
393
* @param props - Breadcrumbs configuration
394
* @returns Breadcrumbs component
395
*/
396
function Breadcrumbs(props: BreadcrumbsProps): JSX.Element;
397
398
interface BreadcrumbsProps extends CommonProps {
399
/** The breadcrumb children */
400
children?: React.ReactNode;
401
/** Custom separator for the breadcrumbs */
402
separator?: React.ReactNode;
403
/** Specifies the maximum number of breadcrumbs to display */
404
maxItems?: number;
405
/** The number of items to show before the ellipsis */
406
itemsBeforeCollapse?: number;
407
/** The number of items to show after the ellipsis */
408
itemsAfterCollapse?: number;
409
/** Override the default label for the expand button */
410
expandText?: string;
411
}
412
```
413
414
**Usage Examples:**
415
416
```typescript
417
import { Breadcrumbs, Link, Typography } from "@mui/material";
418
import NavigateNextIcon from "@mui/icons-material/NavigateNext";
419
420
// Basic breadcrumbs
421
<Breadcrumbs aria-label="breadcrumb">
422
<Link color="inherit" href="/">
423
Home
424
</Link>
425
<Link color="inherit" href="/products">
426
Products
427
</Link>
428
<Typography color="text.primary">Electronics</Typography>
429
</Breadcrumbs>
430
431
// Custom separator
432
<Breadcrumbs separator={<NavigateNextIcon fontSize="small" />}>
433
<Link color="inherit" href="/">
434
Home
435
</Link>
436
<Link color="inherit" href="/category">
437
Category
438
</Link>
439
<Typography color="text.primary">Current Page</Typography>
440
</Breadcrumbs>
441
```
442
443
### Stepper
444
445
Multi-step navigation components for wizards and process flows.
446
447
```typescript { .api }
448
/**
449
* Container for step navigation
450
* @param props - Stepper configuration
451
* @returns Stepper component
452
*/
453
function Stepper(props: StepperProps): JSX.Element;
454
455
/**
456
* Individual step in a stepper
457
* @param props - Step configuration
458
* @returns Step component
459
*/
460
function Step(props: StepProps): JSX.Element;
461
462
/**
463
* Label and optional icon for a step
464
* @param props - StepLabel configuration
465
* @returns StepLabel component
466
*/
467
function StepLabel(props: StepLabelProps): JSX.Element;
468
469
/**
470
* Content area for a step
471
* @param props - StepContent configuration
472
* @returns StepContent component
473
*/
474
function StepContent(props: StepContentProps): JSX.Element;
475
476
interface StepperProps extends CommonProps {
477
/** Set the active step (zero based index) */
478
activeStep?: number;
479
/** If set to 'true' and orientation is horizontal, the linear stepper will allow the user to navigate between steps in any order */
480
nonLinear?: boolean;
481
/** The component orientation */
482
orientation?: 'horizontal' | 'vertical';
483
children?: React.ReactNode;
484
}
485
486
interface StepProps extends CommonProps {
487
/** Sets the step as active */
488
active?: boolean;
489
/** Mark the step as completed */
490
completed?: boolean;
491
/** If true, the step is disabled */
492
disabled?: boolean;
493
/** The optional node to display */
494
optional?: React.ReactNode;
495
children?: React.ReactNode;
496
}
497
498
interface StepLabelProps extends CommonProps {
499
/** In most cases will simply be a string containing a title for the label */
500
children?: React.ReactNode;
501
/** The props used for the error icon */
502
error?: boolean;
503
/** Override the default label of the step icon */
504
icon?: React.ReactNode;
505
/** The optional node to display */
506
optional?: React.ReactNode;
507
/** The component to render in place of the StepIcon */
508
StepIconComponent?: React.ElementType;
509
/** Props applied to the StepIcon element */
510
StepIconProps?: object;
511
}
512
513
interface StepContentProps extends CommonProps {
514
/** The content of the component */
515
children?: React.ReactNode;
516
/** The component used for the transition */
517
TransitionComponent?: React.ComponentType<any>;
518
/** Props applied to the transition element */
519
TransitionProps?: object;
520
}
521
```
522
523
### MobileStepper
524
525
Compact stepper designed for mobile interfaces.
526
527
```typescript { .api }
528
/**
529
* Compact stepper for mobile interfaces
530
* @param props - MobileStepper configuration
531
* @returns MobileStepper component
532
*/
533
function MobileStepper(props: MobileStepperProps): JSX.Element;
534
535
interface MobileStepperProps extends CommonProps {
536
/** Set the active step (zero based index) */
537
activeStep: number;
538
/** A back button element */
539
backButton: React.ReactNode;
540
/** A next button element */
541
nextButton: React.ReactNode;
542
/** The total steps */
543
steps: number;
544
/** The variant to use */
545
variant?: 'text' | 'dots' | 'progress';
546
/** Props applied to the LinearProgress element */
547
LinearProgressProps?: object;
548
/** The positioning type */
549
position?: 'bottom' | 'static' | 'top';
550
}
551
```
552
553
### Pagination
554
555
Pagination component for navigating through multiple pages of content.
556
557
```typescript { .api }
558
/**
559
* Pagination component for page navigation
560
* @param props - Pagination configuration
561
* @returns Pagination component
562
*/
563
function Pagination(props: PaginationProps): JSX.Element;
564
565
/**
566
* Individual pagination item
567
* @param props - PaginationItem configuration
568
* @returns PaginationItem component
569
*/
570
function PaginationItem(props: PaginationItemProps): JSX.Element;
571
572
interface PaginationProps extends CommonProps {
573
/** Number of always visible pages at the beginning and end */
574
boundaryCount?: number;
575
/** The active page */
576
page?: number;
577
/** The total number of pages */
578
count?: number;
579
/** The default page selected */
580
defaultPage?: number;
581
/** If true, the component is disabled */
582
disabled?: boolean;
583
/** If true, hide the next-page button */
584
hideNextButton?: boolean;
585
/** If true, hide the previous-page button */
586
hidePrevButton?: boolean;
587
/** Callback fired when the page is changed */
588
onChange?: (event: React.ChangeEvent<unknown>, page: number) => void;
589
/** Render the item */
590
renderItem?: (item: PaginationRenderItemParams) => React.ReactNode;
591
/** The shape of the pagination items */
592
shape?: 'circular' | 'rounded';
593
/** Number of always visible pages before and after the current page */
594
siblingCount?: number;
595
/** The size of the component */
596
size?: 'small' | 'medium' | 'large';
597
/** The variant to use */
598
variant?: 'outlined' | 'text';
599
}
600
601
interface PaginationItemProps extends CommonProps {
602
/** The current page number */
603
page?: number;
604
/** If true, the item is selected */
605
selected?: boolean;
606
/** The shape of the pagination item */
607
shape?: 'circular' | 'rounded';
608
/** The size of the component */
609
size?: 'small' | 'medium' | 'large';
610
/** The type of pagination item */
611
type?: 'page' | 'first' | 'last' | 'next' | 'previous' | 'start-ellipsis' | 'end-ellipsis';
612
/** The variant to use */
613
variant?: 'outlined' | 'text';
614
}
615
```
616
617
**Usage Examples:**
618
619
```typescript
620
import {
621
Stepper,
622
Step,
623
StepLabel,
624
StepContent,
625
MobileStepper,
626
Pagination,
627
Button,
628
Typography,
629
Box
630
} from "@mui/material";
631
import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft";
632
import KeyboardArrowRight from "@mui/icons-material/KeyboardArrowRight";
633
634
const steps = ['Select campaign settings', 'Create an ad group', 'Create an ad'];
635
636
// Horizontal stepper
637
<Stepper activeStep={1}>
638
{steps.map((label, index) => (
639
<Step key={label}>
640
<StepLabel>{label}</StepLabel>
641
</Step>
642
))}
643
</Stepper>
644
645
// Vertical stepper with content
646
<Stepper orientation="vertical" activeStep={1}>
647
{steps.map((label, index) => (
648
<Step key={label}>
649
<StepLabel>{label}</StepLabel>
650
<StepContent>
651
<Typography>Content for {label}</Typography>
652
<Box sx={{ mb: 2 }}>
653
<Button variant="contained" sx={{ mt: 1, mr: 1 }}>
654
Continue
655
</Button>
656
<Button disabled={index === 0} sx={{ mt: 1, mr: 1 }}>
657
Back
658
</Button>
659
</Box>
660
</StepContent>
661
</Step>
662
))}
663
</Stepper>
664
665
// Mobile stepper
666
<MobileStepper
667
steps={6}
668
position="static"
669
activeStep={activeStep}
670
nextButton={
671
<Button size="small" onClick={handleNext} disabled={activeStep === 5}>
672
Next
673
<KeyboardArrowRight />
674
</Button>
675
}
676
backButton={
677
<Button size="small" onClick={handleBack} disabled={activeStep === 0}>
678
<KeyboardArrowLeft />
679
Back
680
</Button>
681
}
682
/>
683
684
// Pagination
685
<Pagination
686
count={10}
687
page={page}
688
onChange={handleChange}
689
color="primary"
690
/>
691
```
692
693
## Navigation Layout Patterns
694
695
### App Shell with Navigation
696
697
```typescript
698
import {
699
AppBar,
700
Toolbar,
701
Drawer,
702
List,
703
ListItem,
704
ListItemIcon,
705
ListItemText,
706
Typography,
707
IconButton,
708
Box
709
} from "@mui/material";
710
import {
711
Menu as MenuIcon,
712
Home as HomeIcon,
713
Settings as SettingsIcon,
714
Person as PersonIcon
715
} from "@mui/icons-material";
716
717
const drawerWidth = 240;
718
719
function AppShell({ children }: { children: React.ReactNode }) {
720
const [mobileOpen, setMobileOpen] = useState(false);
721
722
const handleDrawerToggle = () => {
723
setMobileOpen(!mobileOpen);
724
};
725
726
const drawer = (
727
<Box>
728
<Toolbar />
729
<List>
730
<ListItem button>
731
<ListItemIcon>
732
<HomeIcon />
733
</ListItemIcon>
734
<ListItemText primary="Home" />
735
</ListItem>
736
<ListItem button>
737
<ListItemIcon>
738
<PersonIcon />
739
</ListItemIcon>
740
<ListItemText primary="Profile" />
741
</ListItem>
742
<ListItem button>
743
<ListItemIcon>
744
<SettingsIcon />
745
</ListItemIcon>
746
<ListItemText primary="Settings" />
747
</ListItem>
748
</List>
749
</Box>
750
);
751
752
return (
753
<Box sx={{ display: 'flex' }}>
754
<AppBar
755
position="fixed"
756
sx={{
757
width: { sm: `calc(100% - ${drawerWidth}px)` },
758
ml: { sm: `${drawerWidth}px` },
759
}}
760
>
761
<Toolbar>
762
<IconButton
763
color="inherit"
764
aria-label="open drawer"
765
edge="start"
766
onClick={handleDrawerToggle}
767
sx={{ mr: 2, display: { sm: 'none' } }}
768
>
769
<MenuIcon />
770
</IconButton>
771
<Typography variant="h6" noWrap component="div">
772
My Application
773
</Typography>
774
</Toolbar>
775
</AppBar>
776
777
<Box
778
component="nav"
779
sx={{ width: { sm: drawerWidth }, flexShrink: { sm: 0 } }}
780
>
781
<Drawer
782
variant="temporary"
783
open={mobileOpen}
784
onClose={handleDrawerToggle}
785
ModalProps={{
786
keepMounted: true, // Better open performance on mobile.
787
}}
788
sx={{
789
display: { xs: 'block', sm: 'none' },
790
'& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
791
}}
792
>
793
{drawer}
794
</Drawer>
795
<Drawer
796
variant="permanent"
797
sx={{
798
display: { xs: 'none', sm: 'block' },
799
'& .MuiDrawer-paper': { boxSizing: 'border-box', width: drawerWidth },
800
}}
801
open
802
>
803
{drawer}
804
</Drawer>
805
</Box>
806
807
<Box
808
component="main"
809
sx={{
810
flexGrow: 1,
811
p: 3,
812
width: { sm: `calc(100% - ${drawerWidth}px)` }
813
}}
814
>
815
<Toolbar />
816
{children}
817
</Box>
818
</Box>
819
);
820
}
821
```
822
823
### Link
824
825
Component for navigation links with Material-UI styling and router integration.
826
827
```typescript { .api }
828
/**
829
* Component for navigation links with Material-UI styling and router integration
830
* @param props - Link configuration
831
* @returns Link component
832
*/
833
function Link(props: LinkProps): JSX.Element;
834
835
interface LinkProps extends CommonProps {
836
/** The color of the link */
837
color?: 'inherit' | 'primary' | 'secondary' | 'textPrimary' | 'textSecondary' | 'error';
838
/** Controls when the link should have an underline */
839
underline?: 'none' | 'hover' | 'always';
840
/** The variant to use */
841
variant?: 'inherit' | 'body1' | 'body2' | 'button' | 'caption' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'overline' | 'subtitle1' | 'subtitle2';
842
/** The URL to link to */
843
href?: string;
844
/** The content of the link */
845
children?: React.ReactNode;
846
/** The component used for the root node */
847
component?: React.ElementType;
848
/** Callback fired when the link is clicked */
849
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
850
}
851
```
852
853
**Usage Examples:**
854
855
```typescript
856
import { Link, Typography } from "@mui/material";
857
858
// Basic link
859
<Link href="/about">About Us</Link>
860
861
// Link with different colors
862
<Link href="/contact" color="secondary">
863
Contact
864
</Link>
865
866
// Link without underline
867
<Link href="/services" underline="none">
868
Services
869
</Link>
870
871
// Link with typography variant
872
<Link href="/blog" variant="h6">
873
Blog
874
</Link>
875
876
// Link as button component
877
<Link component="button" onClick={() => console.log('clicked')}>
878
Click me
879
</Link>
880
```
881
882
### MenuList
883
884
Component for displaying a list of menu items with keyboard navigation.
885
886
```typescript { .api }
887
/**
888
* Component for displaying a list of menu items with keyboard navigation
889
* @param props - MenuList configuration
890
* @returns MenuList component
891
*/
892
function MenuList(props: MenuListProps): JSX.Element;
893
894
interface MenuListProps extends CommonProps {
895
/** If true, will focus the first item if autoFocus is true */
896
autoFocus?: boolean;
897
/** If true, will focus the first item */
898
autoFocusItem?: boolean;
899
/** If true, will not apply focus outline */
900
disabledItemsFocusable?: boolean;
901
/** If true, will disable list item focus on keyboard navigation */
902
disableListWrap?: boolean;
903
/** MenuList contents */
904
children?: React.ReactNode;
905
/** The variant to use */
906
variant?: 'menu' | 'selectedMenu';
907
}
908
```
909
910
**Usage Examples:**
911
912
```typescript
913
import { MenuList, MenuItem, ListItemText, ListItemIcon, Divider } from "@mui/material";
914
import { Send, Drafts, Inbox } from "@mui/icons-material";
915
916
// Basic menu list
917
<MenuList>
918
<MenuItem>
919
<ListItemIcon>
920
<Send fontSize="small" />
921
</ListItemIcon>
922
<ListItemText>Sent mail</ListItemText>
923
</MenuItem>
924
<MenuItem>
925
<ListItemIcon>
926
<Drafts fontSize="small" />
927
</ListItemIcon>
928
<ListItemText>Drafts</ListItemText>
929
</MenuItem>
930
<Divider />
931
<MenuItem>
932
<ListItemIcon>
933
<Inbox fontSize="small" />
934
</ListItemIcon>
935
<ListItemText>Inbox</ListItemText>
936
</MenuItem>
937
</MenuList>
938
939
// Menu list with auto focus
940
<MenuList autoFocusItem>
941
<MenuItem>Profile</MenuItem>
942
<MenuItem>My account</MenuItem>
943
<MenuItem>Logout</MenuItem>
944
</MenuList>
945
```
946
947
### BottomNavigation
948
949
Navigation component for mobile interfaces with action buttons at the bottom.
950
951
```typescript { .api }
952
/**
953
* Navigation component for mobile interfaces with action buttons at the bottom
954
* @param props - BottomNavigation configuration
955
* @returns BottomNavigation component
956
*/
957
function BottomNavigation(props: BottomNavigationProps): JSX.Element;
958
959
interface BottomNavigationProps extends CommonProps {
960
/** Callback fired when the value changes */
961
onChange?: (event: React.SyntheticEvent, value: any) => void;
962
/** If true, all BottomNavigationActions will show their labels */
963
showLabels?: boolean;
964
/** The value of the currently selected BottomNavigationAction */
965
value?: any;
966
/** The content of the component */
967
children?: React.ReactNode;
968
}
969
```
970
971
### BottomNavigationAction
972
973
Individual action component for BottomNavigation.
974
975
```typescript { .api }
976
/**
977
* Individual action component for BottomNavigation
978
* @param props - BottomNavigationAction configuration
979
* @returns BottomNavigationAction component
980
*/
981
function BottomNavigationAction(props: BottomNavigationActionProps): JSX.Element;
982
983
interface BottomNavigationActionProps extends CommonProps {
984
/** The icon to display */
985
icon?: React.ReactNode;
986
/** The label element */
987
label?: React.ReactNode;
988
/** If true, the BottomNavigationAction will show its label */
989
showLabel?: boolean;
990
/** You can provide your own value */
991
value?: any;
992
}
993
```
994
995
**Usage Examples:**
996
997
```typescript
998
import { BottomNavigation, BottomNavigationAction } from "@mui/material";
999
import { Restore, Favorite, LocationOn } from "@mui/icons-material";
1000
1001
const [value, setValue] = React.useState(0);
1002
1003
<BottomNavigation
1004
value={value}
1005
onChange={(event, newValue) => {
1006
setValue(newValue);
1007
}}
1008
showLabels
1009
>
1010
<BottomNavigationAction label="Recents" icon={<Restore />} />
1011
<BottomNavigationAction label="Favorites" icon={<Favorite />} />
1012
<BottomNavigationAction label="Nearby" icon={<LocationOn />} />
1013
</BottomNavigation>
1014
```