¡Claro que sí! Aquí tienes un “cheatsheet” completo y bien estructurado de Material UI (@mui/material), diseñado para ser conciso y fácil de digerir para una IA conversacional, facilitando la generación de respuestas precisas sobre esta popular librería.
🎨 Material UI (@mui/material) Cheatsheet Completo 🎨
Material UI (ahora parte de MUI) es una biblioteca de componentes de React que implementa las directrices de Material Design de Google. Proporciona componentes de UI prediseñados y altamente personalizables para construir interfaces de usuario rápidas y consistentes.
1. 🌟 Conceptos Clave
- Material Design: Un sistema de diseño desarrollado por Google que enfatiza la usabilidad y la coherencia visual.
- Componentes: Bloques de construcción pre-hechos (Botones, Textfields, Cards, etc.) que puedes usar directamente.
- Temas (Theming): Mecanismo para personalizar globalmente el estilo de tus componentes (colores, tipografía, espaciado).
sxProp: La forma más común y flexible de aplicar estilos personalizados directamente a cualquier componente de MUI. Permite usar valores del tema, CSS responsive, etc.- Estilización con
styled: Utilidad para crear componentes con estilos personalizados reutilizables, similar astyled-components.
2. 🛠️ Configuración Inicial
-
Instalación:
npm install @mui/material @emotion/react @emotion/styled # o yarn add @mui/material @emotion/react @emotion/styled@emotion/reacty@emotion/styledson los motores de estilización de MUI por defecto.
-
Importación de la Fuente de Iconos (Opcional pero recomendado):
- En
index.html(o similar):<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" /> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
- En
-
Configuración del Tema y
CssBaseline:- En tu componente raíz (ej.
App.jsomain.jsx):// src/App.js import React from 'react'; import { createTheme, ThemeProvider, CssBaseline } from '@mui/material'; const darkTheme = createTheme({ palette: { mode: 'dark', // 'light' o 'dark' primary: { main: '#90caf9', // Un azul claro para el modo oscuro }, secondary: { main: '#f48fb1', // Un rosa para el modo oscuro }, }, typography: { fontFamily: 'Roboto, sans-serif', }, components: { MuiButton: { styleOverrides: { root: { borderRadius: 8, // Ejemplo: Botones con bordes más redondeados }, }, }, }, }); function App() { return ( <ThemeProvider theme={darkTheme}> <CssBaseline /> {/* Normaliza CSS y aplica estilos base de Material Design */} {/* Tu aplicación aquí */} <h1>Mi Aplicación Material UI</h1> <p>Hola, mundo!</p> </ThemeProvider> ); } export default App; CssBaseline: Esencial para establecer una base consistente en los estilos entre navegadores y aplicar un fondo y color de texto por defecto según el tema.
- En tu componente raíz (ej.
3. 🧩 Componentes Comunes (Cheatsheet Rápido)
Layout y Contenedores
Box: El componente más fundamental para envolver otros componentes y aplicar estilos de forma rápida. Equivalente a undivcon acceso asxprop.import { Box } from '@mui/material'; <Box sx={{ width: 300, height: 200, bgcolor: 'primary.main', p: 2 }}> Contenido </Box>Container: Centra tu contenido horizontalmente y aplica padding.import { Container, Typography } from '@mui/material'; <Container maxWidth="md"> {/* 'xs', 'sm', 'md', 'lg', 'xl' */} <Typography variant="h4">Título Centrado</Typography> </Container>Grid: Un potente sistema de layout responsivo basado en flexbox (12 columnas).import { Grid, Paper } from '@mui/material'; <Grid container spacing={2}> {/* `spacing` entre items */} <Grid item xs={12} sm={6} md={4}> {/* Ocupa 12 columnas en xs, 6 en sm, 4 en md */} <Paper sx={{ p: 2 }}>Item 1</Paper> </Grid> <Grid item xs={12} sm={6} md={8}> <Paper sx={{ p: 2 }}>Item 2</Paper> </Grid> </Grid>Stack: Para gestionar layouts unidimensionales (filas o columnas).import { Stack, Button } from '@mui/material'; <Stack direction="row" spacing={1} sx={{ mt: 2 }}> {/* 'row' o 'column' */} <Button variant="contained">Botón 1</Button> <Button variant="outlined">Botón 2</Button> </Stack>
Entradas y Controles
Button: Botones interactivos.import { Button } from '@mui/material'; <Button variant="contained" color="primary" onClick={() => alert('Clicked!')}> Click Me </Button> <Button variant="outlined" startIcon={<DeleteIcon />}> Eliminar </Button>TextField: Campos de entrada de texto.import { TextField } from '@mui/material'; <TextField label="Nombre de usuario" variant="outlined" // 'filled', 'standard' defaultValue="John Doe" helperText="Introduce tu nombre completo" error={false} />Checkbox: Casillas de verificación.import { Checkbox, FormControlLabel } from '@mui/material'; <FormControlLabel control={<Checkbox defaultChecked />} label="Aceptar términos" />Radio/RadioGroup: Botones de radio para selección única.import { Radio, RadioGroup, FormControlLabel, FormControl, FormLabel } from '@mui/material'; <FormControl> <FormLabel>Género</FormLabel> <RadioGroup row defaultValue="female"> <FormControlLabel value="female" control={<Radio />} label="Femenino" /> <FormControlLabel value="male" control={<Radio />} label="Masculino" /> </RadioGroup> </FormControl>Select: Menú desplegable para selección.import { Select, MenuItem, FormControl, InputLabel } from '@mui/material'; <FormControl sx={{ minWidth: 120 }}> <InputLabel>Edad</InputLabel> <Select value={10} label="Edad"> <MenuItem value={10}>Diez</MenuItem> <MenuItem value={20}>Veinte</MenuItem> </Select> </FormControl>
Visualización de Datos
Typography: Para mostrar texto con estilos predefinidos.import { Typography } from '@mui/material'; <Typography variant="h1">Título H1</Typography> <Typography variant="body1" component="p">Párrafo de texto.</Typography>Paper: Un fondo para elevar visualmente el contenido.import { Paper } from '@mui/material'; <Paper elevation={3} sx={{ p: 2 }}> Este es un contenido dentro de un Paper. </Paper>Card: Un contenedor flexible y extensible para mostrar información relacionada.import { Card, CardContent, CardActions, Button, Typography } from '@mui/material'; <Card sx={{ minWidth: 275 }}> <CardContent> <Typography variant="h5" component="div">Título de la Tarjeta</Typography> <Typography sx={{ mb: 1.5 }} color="text.secondary">Subtítulo</Typography> <Typography variant="body2"> Contenido de la tarjeta. </Typography> </CardContent> <CardActions> <Button size="small">Leer Más</Button> </CardActions> </Card>List/ListItem: Para mostrar listas de elementos.import { List, ListItem, ListItemText, Divider } from '@mui/material'; <List> <ListItem><ListItemText primary="Item 1" /></ListItem> <Divider /> <ListItem><ListItemText primary="Item 2" /></ListItem> </List>
Feedback y Estado
Snackbar: Mensajes temporales (notificaciones) en la pantalla.import React from 'react'; import { Button, Snackbar, Alert } from '@mui/material'; function MySnackbar() { const [open, setOpen] = React.useState(false); const handleClose = () => setOpen(false); return ( <> <Button onClick={() => setOpen(true)}>Mostrar Mensaje</Button> <Snackbar open={open} autoHideDuration={6000} onClose={handleClose}> <Alert onClose={handleClose} severity="success" sx={{ width: '100%' }}> ¡Operación exitosa! </Alert> </Snackbar> </> ); }Alert: Para mostrar mensajes importantes.import { Alert, AlertTitle } from '@mui/material'; <Alert severity="error"> <AlertTitle>Error</AlertTitle> Ha ocurrido un <strong>error crítico</strong>. </Alert> <Alert severity="warning">Advertencia: Datos incompletos.</Alert>CircularProgress/LinearProgress: Indicadores de carga.import { CircularProgress } from '@mui/material'; <CircularProgress />Skeleton: Componente de carga para mostrar un “placeholder” de contenido.import { Skeleton } from '@mui/material'; {isLoading ? <Skeleton variant="rectangular" width={210} height={118} /> : <img src="..." />}
Navegación
AppBar: Barra de aplicaciones (header) en la parte superior.import { AppBar, Toolbar, Typography, Button } from '@mui/material'; <AppBar position="static"> {/* 'fixed', 'absolute', 'sticky', 'static' */} <Toolbar> <Typography variant="h6" component="div" sx={{ flexGrow: 1 }}> Mi App </Typography> <Button color="inherit">Login</Button> </Toolbar> </AppBar>Drawer: Panel lateral deslizante (sidebar).import React from 'react'; import { Drawer, List, ListItem, ListItemText, Button } from '@mui/material'; function MyDrawer() { const [open, setOpen] = React.useState(false); return ( <> <Button onClick={() => setOpen(true)}>Abrir Menú</Button> <Drawer anchor="left" open={open} onClose={() => setOpen(false)}> <List> <ListItem button><ListItemText primary="Home" /></ListItem> <ListItem button><ListItemText primary="Acerca" /></ListItem> </List> </Drawer> </> ); }Tabs/Tab: Navegación por pestañas.import React from 'react'; import { Tabs, Tab, Box, Typography } from '@mui/material'; function MyTabs() { const [value, setValue] = React.useState(0); return ( <Box sx={{ width: '100%' }}> <Tabs value={value} onChange={(e, newValue) => setValue(newValue)}> <Tab label="Ítem Uno" /> <Tab label="Ítem Dos" /> </Tabs> {value === 0 && <Typography sx={{ p: 2 }}>Contenido de Ítem Uno</Typography>} {value === 1 && <Typography sx={{ p: 2 }}>Contenido de Ítem Dos</Typography>} </Box> ); }
Overlays y Modales
Dialog: Ventanas modales para interacciones importantes.import React from 'react'; import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@mui/material'; function MyDialog() { const [open, setOpen] = React.useState(false); return ( <> <Button onClick={() => setOpen(true)}>Abrir Diálogo</Button> <Dialog open={open} onClose={() => setOpen(false)}> <DialogTitle>Título del Diálogo</DialogTitle> <DialogContent> <Typography>Contenido del diálogo aquí.</Typography> </DialogContent> <DialogActions> <Button onClick={() => setOpen(false)}>Cancelar</Button> <Button onClick={() => setOpen(false)} autoFocus>Aceptar</Button> </DialogActions> </Dialog> </> ); }Menu/MenuItem: Menús contextuales o de navegación.import React from 'react'; import { Button, Menu, MenuItem } from '@mui/material'; function MyMenu() { const [anchorEl, setAnchorEl] = React.useState(null); const open = Boolean(anchorEl); const handleClick = (event) => setAnchorEl(event.currentTarget); const handleClose = () => setAnchorEl(null); return ( <div> <Button onClick={handleClick}>Abrir Menú</Button> <Menu anchorEl={anchorEl} open={open} onClose={handleClose}> <MenuItem onClick={handleClose}>Perfil</MenuItem> <MenuItem onClick={handleClose}>Cerrar Sesión</MenuItem> </Menu> </div> ); }
4. 💅 Estilización
Material UI ofrece varias formas de estilizar tus componentes.
1. sx Prop (Recomendado)
- La forma más moderna y potente para aplicar estilos directamente a cualquier componente de MUI (y muchos de tus propios componentes si se configuran correctamente).
- Soporta valores del tema, atajos (ej.
mparamargin,pparapadding), y breakpoints responsivos.<Button sx={{ backgroundColor: 'blue', color: 'white', '&:hover': { backgroundColor: 'darkblue', }, fontSize: { xs: '0.8rem', sm: '1rem', md: '1.2rem', }, p: 2, // padding: theme.spacing(2) mt: 3, // margin-top: theme.spacing(3) borderRadius: '16px', border: '1px solid', borderColor: 'primary.main', // Accede al color primario del tema }} > Botón Estilizado </Button>
2. styled() Utility
- Para crear componentes personalizados con estilos reutilizables. Utiliza el motor Emotion.
import { styled } from '@mui/material/styles'; import Button from '@mui/material/Button'; const MyStyledButton = styled(Button)(({ theme }) => ({ backgroundColor: theme.palette.secondary.main, color: theme.palette.secondary.contrastText, padding: theme.spacing(1, 4), borderRadius: '50px', '&:hover': { backgroundColor: theme.palette.secondary.dark, }, })); // Uso: <MyStyledButton>Mi Botón</MyStyledButton>
3. Sobrescribir Componentes Globalmente (en el tema)
- Modificar los estilos por defecto de todos los componentes de un tipo.
const theme = createTheme({ components: { MuiButton: { styleOverrides: { root: { textTransform: 'none', // Todos los botones sin mayúsculas boxShadow: 'none', // Sin sombra por defecto }, contained: { // Solo para variantes 'contained' '&:hover': { boxShadow: 'rgba(0, 0, 0, 0.2) 0px 3px 5px -1px', }, }, }, defaultProps: { // Valores de props por defecto para todos los MuiButton disableElevation: true, // Desactiva la elevación por defecto }, }, MuiTextField: { defaultProps: { variant: 'filled', // Todos los TextFields son 'filled' por defecto }, }, }, });
5. 🎨 Theming
La personalización global de tu aplicación.
import { createTheme } from '@mui/material/styles';
const myCustomTheme = createTheme({
palette: {
mode: 'light', // 'light' (por defecto) o 'dark'
primary: {
main: '#1976d2', // Azul estándar
light: '#42a5f5',
dark: '#1565c0',
contrastText: '#fff',
},
secondary: {
main: '#9c27b0', // Morado estándar
},
error: {
main: '#d32f2f',
},
background: {
default: '#f4f6f8', // Color de fondo global de la página
paper: '#ffffff', // Color de fondo para componentes como Paper, Card
},
text: {
primary: 'rgba(0, 0, 0, 0.87)',
secondary: 'rgba(0, 0, 0, 0.6)',
disabled: 'rgba(0, 0, 0, 0.38)',
},
},
typography: {
fontFamily: ['"Roboto"', 'sans-serif'].join(','),
h1: {
fontSize: '3rem',
fontWeight: 500,
},
button: {
fontWeight: 600,
},
},
spacing: 8, // Valor base para el espaciado (e.g., theme.spacing(1) = 8px)
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 900,
lg: 1200,
xl: 1536,
},
},
// Más personalizaciones en `components`, `shadows`, `shape` etc.
});
- Acceder al Tema: Usa el hook
useThemedentro de un componente.import { useTheme } from '@mui/material/styles'; function MyComponent() { const theme = useTheme(); return <div style={{ color: theme.palette.primary.main }}>Texto con color del tema</div>; }
6. 🖼️ Iconos
Material UI usa Material Icons.
- Instalar:
npm install @mui/icons-material - Importar y Usar:
import HomeIcon from '@mui/icons-material/Home'; import DeleteIcon from '@mui/icons-material/Delete'; import { Button } from '@mui/material'; <HomeIcon color="primary" sx={{ fontSize: 40 }} /> <Button startIcon={<DeleteIcon />}>Borrar</Button>
7. 📱 Diseño Responsivo
GridSystem: Ya cubierto, utiliza las propsxs,sm,md,lg,xl.sxprop Breakpoints: Permite aplicar estilos diferentes para cada tamaño de pantalla.<Box sx={{ width: { xs: 100, // width de 100px para pantallas extra pequeñas sm: 200, // width de 200px para pantallas pequeñas md: 300, // width de 300px para pantallas medianas }, height: 50, bgcolor: 'warning.main', }} />useMediaQueryHook: Para aplicar lógica condicional basada en el tamaño de la pantalla.import useMediaQuery from '@mui/material/useMediaQuery'; import { useTheme } from '@mui/material/styles'; function MyResponsiveComponent() { const theme = useTheme(); const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); // true si la pantalla es menor que 'sm' (600px) return ( <div> {isSmallScreen ? <p>Vista para móviles</p> : <p>Vista para escritorio</p>} </div> ); }
8. ♿ Accesibilidad (A11y)
Material UI se esfuerza por ser accesible:
- Atributos ARIA: Muchos componentes ya incluyen los atributos ARIA necesarios.
- Manejo del Foco y Teclado: La navegación con el teclado y la gestión del foco están integradas.
- Semántica: Usa los elementos HTML semánticos apropiados (ej.
buttonpara<Button>). - Personaliza con precaución: Al aplicar estilos personalizados, asegúrate de no romper la accesibilidad (ej. contraste de color).
9. 💡 Buenas Prácticas y Consejos
- Empieza con
ThemeProvideryCssBaseline: Son la base para una aplicación MUI consistente. - Usa la
sxprop para estilos ad-hoc: Es la forma más rápida y flexible para aplicar estilos directamente en los componentes. - Usa
styled()para estilos reutilizables complejos: Cuando necesites un componente con un conjunto de estilos específico que usarás en muchos lugares. - Define tu Tema Primero: Centraliza tus colores, tipografías y espaciados para mantener la coherencia.
- No sobreejes
GridconBoxoStack: Combina inteligentemente.Grides para layouts de 2D,Stackpara 1D.Boxes el comodín. - Explora las Props de los Componentes: Cada componente tiene muchas props para personalización (ej.
size,color,variant). Consulta la documentación. - Aprovecha
defaultPropsen el tema: Para cambiar el comportamiento por defecto de todos los componentes de un tipo (ej. todos los botones sondisableElevation). - Prioriza los valores del tema: En lugar de
color: 'red', usacolor: 'error.main'para que se adapte al tema. - Herramientas de Desarrollo: Utiliza la extensión de React Devtools en tu navegador para inspeccionar los componentes de MUI.
Este cheatsheet te ofrece una vista completa de los aspectos más importantes de Material UI. Es lo suficientemente detallado como para proporcionar una base sólida y referencias rápidas para la construcción de interfaces de usuario con esta librería.