in packages/eui/src/components/side_nav/side_nav.tsx [158:264]
render() {
const {
className,
items,
toggleOpenOnMobile,
isOpenOnMobile,
mobileTitle,
mobileBreakpoints,
// Extract this one out so it isn't passed to <nav>
renderItem,
truncate,
heading,
headingProps,
theme,
...rest
} = this.props;
const classes = classNames('euiSideNav', className, {
'euiSideNav-isOpenMobile': isOpenOnMobile,
});
const styles = euiSideNavMobileStyles(theme);
const contentClasses = classNames('euiSideNav__content');
const sideNavContentId = this.generateId('content');
const mobileContentStyles = [
styles.content.euiSideNav__mobileContent,
isOpenOnMobile ? styles.content.open : styles.content.hidden,
];
const hasMobileVersion = mobileBreakpoints && mobileBreakpoints.length > 0;
const mobileToggleText = mobileTitle || heading;
const mobileHeadingUnset = {
marginBlockEnd: 0,
label: 'mobile',
};
const headingId = headingProps?.id || this.generateId('heading');
const headingScreenReaderOnly = !!headingProps?.screenReaderOnly;
return (
<>
{hasMobileVersion && (
<EuiShowFor sizes={mobileBreakpoints || 'none'}>
<nav aria-labelledby={headingId} className={classes} {...rest}>
<EuiSideNavHeading
id={headingId}
{...headingProps}
screenReaderOnly={false}
css={mobileHeadingUnset}
>
<EuiI18n
token="euiSideNav.mobileToggleAriaLabel"
default="Toggle navigation"
>
{(mobileToggleAriaLabel: string) => (
<EuiButtonEmpty
className="euiSideNav__mobileToggle"
css={styles.euiSideNav__mobileToggle}
contentProps={{
className: 'euiSideNav__mobileToggleContent',
css: styles.euiSideNav__mobileToggleContent,
}}
onClick={toggleOpenOnMobile}
iconType="apps"
iconSide="right"
aria-controls={sideNavContentId}
aria-expanded={isOpenOnMobile}
aria-label={
!mobileToggleText || headingScreenReaderOnly
? mobileToggleAriaLabel
: undefined
}
>
{!headingScreenReaderOnly && mobileToggleText}
</EuiButtonEmpty>
)}
</EuiI18n>
</EuiSideNavHeading>
<div
id={sideNavContentId}
className={contentClasses}
css={mobileContentStyles}
>
{this.renderTree(items)}
</div>
</nav>
</EuiShowFor>
)}
<EuiHideFor sizes={mobileBreakpoints || 'none'}>
<nav
aria-labelledby={heading ? headingId : undefined}
className={classes}
{...rest}
>
{heading && (
<EuiSideNavHeading id={headingId} {...headingProps}>
{heading}
</EuiSideNavHeading>
)}
<div id={sideNavContentId} className={contentClasses}>
{this.renderTree(items)}
</div>
</nav>
</EuiHideFor>
</>
);
}