I was working on Material-UI ExpansionPanel and had come across a task where I had to set focus on tabbing through them using keyboard. So when you press space on Focus, the Panel would open/close.
The ExpansionPanel sample implementation would be as below inside render:
return(
<div>
<div className={classes.root}>
{this.state.panelTypes.map((item) => (
<ExpansionPanel key={item.userType} expanded={this.state.expanded === item.userType} onChange={this.handleChange(item.userType)}>
<ExpansionPanelSummary
expandIcon={<ExpandMoreIcon />}
aria-controls="panel1bh-content"
id="panel1bh-header"
style={{backgroundColor: "#e6e6e6", border: '1px solid silver'}}
className={classes.heading}
>
<Typography className={classes.heading}>Heading</Typography>
</ExpansionPanelSummary>
<ExpansionPanelDetails>
... display data here...
</ExpansionPanelDetails>
</ExpansionPanel>
))}
</div>
</div>
);
The above code is mapping through an array of PanelTypes for creating multiple ExpansionPanels.
The class would require the pseudo-class :focus to be used for tabbing through the Expansion Panel heading:
const styles = (theme) => ({
//There might be other classes here..
heading: {
fontSize: theme.typography.pxToRem(15),
flexBasis: '33.33%',
flexShrink: 0,
fontFamily: "Verdana,Arial,sans-serif",
'&:focus': {
outline: "-webkit-focus-ring-color auto 1px"
}
}
});
Similarly, other pseudo-classes can be used inside the styles e.g. ::after, ::before etc. as per their own usage.