'use client' // React Imports import { forwardRef } from 'react' import type { ForwardRefRenderFunction, CSSProperties, ReactElement, ReactNode } from 'react' // Third-party Imports import classnames from 'classnames' import type { CSSObject } from '@emotion/styled' // Type Imports import type { MenuSectionStyles } from './Menu' import type { ChildrenType, RootStylesType } from '../../types' // Hook Imports import useVerticalNav from '../../hooks/useVerticalNav' import useVerticalMenu from '../../hooks/useVerticalMenu' // Util Imports import { menuClasses } from '../../utils/menuClasses' // Styled Component Imports import StyledMenuIcon from '../../styles/StyledMenuIcon' import StyledMenuPrefix from '../../styles/StyledMenuPrefix' import StyledMenuSuffix from '../../styles/StyledMenuSuffix' import StyledMenuSectionLabel from '../../styles/StyledMenuSectionLabel' import StyledVerticalMenuSection from '../../styles/vertical/StyledVerticalMenuSection' export type MenuSectionProps = Partial & RootStylesType & { label: ReactNode icon?: ReactElement prefix?: ReactNode suffix?: ReactNode /** * @ignore */ className?: string } type MenuSectionElement = keyof MenuSectionStyles const menuSectionWrapperStyles: CSSProperties = { display: 'inline-block', inlineSize: '100%', position: 'relative', listStyle: 'none', padding: 0, overflow: 'hidden' } const menuSectionContentStyles: CSSProperties = { display: 'flex', alignItems: 'center', inlineSize: '100%', position: 'relative', paddingBlock: '0.75rem', paddingInline: '1.25rem', overflow: 'hidden' } const MenuSection: ForwardRefRenderFunction = (props, ref) => { // Props const { children, icon, className, prefix, suffix, label, rootStyles, ...rest } = props // Hooks const { isCollapsed, isHovered } = useVerticalNav() const { menuSectionStyles, collapsedMenuSectionLabel, textTruncate } = useVerticalMenu() const getMenuSectionStyles = (element: MenuSectionElement): CSSObject | undefined => { // If the menuSectionStyles prop is provided, get the styles for the element from the prop if (menuSectionStyles) { return menuSectionStyles[element] } } return ( // eslint-disable-next-line lines-around-comment // Menu Section {/* Menu Section Content Wrapper */}
    {/* Menu Section Content */}
  • {icon && ( {icon} )} {prefix && ( {prefix} )} {collapsedMenuSectionLabel && isCollapsed && !isHovered ? ( {collapsedMenuSectionLabel} ) : ( label && ( {label} ) )} {suffix && ( {suffix} )}
  • {/* Render Child */} {children}
) } export default forwardRef(MenuSection)