List
The List component displays a continuous group of text and images in a vertical format. It’s commonly used for navigation menus, settings panels, and data display.
Installation
npm install @naturacosmeticos/natds-web
Usage
import { List, ListItem, ListItemText } from '@naturacosmeticos/natds-web';
function BasicList() {
return (
<List>
<ListItem>
<ListItemText primary="Item 1" />
</ListItem>
<ListItem>
<ListItemText primary="Item 2" />
</ListItem>
<ListItem>
<ListItemText primary="Item 3" />
</ListItem>
</List>
);
}
List Variants
Simple List
Basic list with primary text only:
<List>
<ListItem>
<ListItemText primary="Inbox" />
</ListItem>
<ListItem>
<ListItemText primary="Drafts" />
</ListItem>
<ListItem>
<ListItemText primary="Sent" />
</ListItem>
</List>
List with Icons
Add icons to list items:
import { List, ListItem, ListItemIcon, ListItemText, Icon } from '@naturacosmeticos/natds-web';
<List>
<ListItem>
<ListItemIcon>
<Icon name="outlined-default-mockup" />
</ListItemIcon>
<ListItemText primary="Inbox" />
</ListItem>
<ListItem>
<ListItemIcon>
<Icon name="outlined-default-mockup" />
</ListItemIcon>
<ListItemText primary="Drafts" />
</ListItem>
</List>
List with Avatars
Display avatars in list items:
import { List, ListItem, ListItemAvatar, ListItemText, Avatar } from '@naturacosmeticos/natds-web';
<List>
<ListItem>
<ListItemAvatar>
<Avatar>JD</Avatar>
</ListItemAvatar>
<ListItemText
primary="John Doe"
secondary="Software Engineer"
/>
</ListItem>
<ListItem>
<ListItemAvatar>
<Avatar>JS</Avatar>
</ListItemAvatar>
<ListItemText
primary="Jane Smith"
secondary="Product Designer"
/>
</ListItem>
</List>
List with Secondary Text
Show both primary and secondary text:
<List>
<ListItem>
<ListItemText
primary="Brunch this weekend?"
secondary="I'll be in your neighborhood doing errands this weekend."
/>
</ListItem>
<ListItem>
<ListItemText
primary="Summer BBQ"
secondary="Wish I could come, but I'm out of town this weekend."
/>
</ListItem>
</List>
List with Secondary Actions
Add action buttons to list items:
import {
List,
ListItem,
ListItemText,
ListItemSecondaryAction,
IconButton,
Icon
} from '@naturacosmeticos/natds-web';
<List>
<ListItem>
<ListItemText primary="Notifications" />
<ListItemSecondaryAction>
<IconButton>
<Icon name="outlined-action-settings" />
</IconButton>
</ListItemSecondaryAction>
</ListItem>
<ListItem>
<ListItemText primary="Sound" />
<ListItemSecondaryAction>
<IconButton>
<Icon name="outlined-action-settings" />
</IconButton>
</ListItemSecondaryAction>
</ListItem>
</List>
Interactive List
function InteractiveList() {
const [selectedIndex, setSelectedIndex] = React.useState(0);
const handleClick = (index) => {
setSelectedIndex(index);
};
return (
<List>
{['Inbox', 'Starred', 'Drafts', 'Sent'].map((text, index) => (
<ListItem
button
key={text}
selected={selectedIndex === index}
onClick={() => handleClick(index)}
>
<ListItemText primary={text} />
</ListItem>
))}
</List>
);
}
Nested Lists
import { List, ListItem, ListItemText, Collapse } from '@naturacosmeticos/natds-web';
function NestedList() {
const [open, setOpen] = React.useState(true);
return (
<List>
<ListItem button onClick={() => setOpen(!open)}>
<ListItemText primary="Inbox" />
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List disablePadding>
<ListItem>
<ListItemText primary="Starred" />
</ListItem>
<ListItem>
<ListItemText primary="Drafts" />
</ListItem>
</List>
</Collapse>
</List>
);
}
Dense List
Use dense spacing for compact layouts:
<List dense>
<ListItem>
<ListItemText primary="Item 1" />
</ListItem>
<ListItem>
<ListItemText primary="Item 2" />
</ListItem>
<ListItem>
<ListItemText primary="Item 3" />
</ListItem>
</List>
Props
List
The content of the component, typically ListItem components.
If true, compact vertical padding will be used for the list and list items.
If true, vertical padding will be removed from the list.
The content of the subheader, normally a ListSubheader component.
ListItem
If true, the list item will be a button using ButtonBase.
Use to apply selected styling.
If true, the list item will be disabled.
If true, a 1px light border is added to the bottom of the list item.
If true, compact vertical padding will be used.
Callback fired when the list item is clicked.
ListItemText
The main content element.
The secondary content element.
If true, the children won’t be wrapped by a Typography component.
If true, the children will be indented. Use this when there is no left avatar or icon.
Subcomponents
- ListItem: Individual list item component
- ListItemText: Text content for list items
- ListItemIcon: Icon wrapper for list items
- ListItemAvatar: Avatar wrapper for list items
- ListItemSecondaryAction: Container for secondary actions
- ListSubheader: Subheader component for grouping items
Best Practices
- Use
button prop on ListItem for clickable items
- Limit secondary text to 2-3 lines for readability
- Use ListItemSecondaryAction for actions that don’t affect the entire item
- Consider using dividers between items in long lists
- Use dense lists in compact layouts or when displaying many items
Accessibility
- Set
button prop when ListItem is interactive
- Provide appropriate ARIA labels for icon-only actions
- Use proper heading hierarchy with ListSubheader
- Ensure sufficient color contrast for text
Related Components