From 470eb9139b39e8587e47ca8194aae4f16dd4a28d Mon Sep 17 00:00:00 2001 From: Erin Donehoo <105813956+edonehoo@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:36:00 -0400 Subject: [PATCH] feat(sideNav): Adds support for dividers and header items in the nav. --- .../components/sideNav/sideNav.js | 87 ++++++++++++++++--- 1 file changed, 75 insertions(+), 12 deletions(-) diff --git a/packages/documentation-framework/components/sideNav/sideNav.js b/packages/documentation-framework/components/sideNav/sideNav.js index bf224878c7..01c2bdc244 100644 --- a/packages/documentation-framework/components/sideNav/sideNav.js +++ b/packages/documentation-framework/components/sideNav/sideNav.js @@ -4,14 +4,21 @@ import { Label, Nav, NavList, + NavGroup, NavExpandable, PageContextConsumer, capitalize, Flex, - FlexItem + FlexItem, + Divider } from '@patternfly/react-core'; import { css } from '@patternfly/react-styles'; import { Location } from '@reach/router'; + +const DIVIDER_STYLES = { + marginTop: 'var(--pf-t--global--spacer--md)', + marginBottom: 'var(--pf-t--global--spacer--md)' +}; import { makeSlug } from '../../helpers'; import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_xl'; import { trackEvent } from '../../helpers'; @@ -163,20 +170,76 @@ export const SideNav = ({ groupedRoutes = {}, navItems = [] }) => { } }, []); + const processedItems = React.useMemo(() => { + const result = []; + let currentGroup = null; + let groupItems = []; + + for (let i = 0; i < navItems.length; i++) { + const item = navItems[i]; + + if (item.header) { + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + } + currentGroup = item.header; + groupItems = []; + } else if (item.divider) { + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + currentGroup = null; + groupItems = []; + } + result.push({ type: 'divider', key: item.divider }); + } else { + currentGroup ? groupItems.push(item) : result.push({ type: 'item', ...item }); + } + } + + if (currentGroup) { + result.push({ type: 'group', title: currentGroup, items: groupItems }); + } + + return result; + }, [navItems]); + return ( ); -}; +}; \ No newline at end of file