diff --git a/packages/odyssey-react-mui/src/labs/NavAccordion.tsx b/packages/odyssey-react-mui/src/labs/NavAccordion.tsx index 9f50368f8f..b7c1faa7f0 100644 --- a/packages/odyssey-react-mui/src/labs/NavAccordion.tsx +++ b/packages/odyssey-react-mui/src/labs/NavAccordion.tsx @@ -120,7 +120,7 @@ const NavAccordion = ({ {startIcon && startIcon} {label} diff --git a/packages/odyssey-react-mui/src/labs/SideNav.tsx b/packages/odyssey-react-mui/src/labs/SideNav.tsx index 22793ae814..9b949986d3 100644 --- a/packages/odyssey-react-mui/src/labs/SideNav.tsx +++ b/packages/odyssey-react-mui/src/labs/SideNav.tsx @@ -19,6 +19,7 @@ import { ReactElement, ReactNode, useCallback, + KeyboardEvent, } from "react"; import { Box } from "../Box"; @@ -73,6 +74,9 @@ export type SideNavItem = { * The label to display inside the status */ statusLabel?: string; + /** + * The link target prop. e.g., "_blank" + */ target?: string; } & ( | { @@ -85,9 +89,12 @@ export type SideNavItem = { } | { isSectionHeader?: false; + /** + * href link of the nav item + */ href: string; /** - * An array of side nav items + * An array of side nav items to be displayed as children of an Accordion */ children?: SideNavItem[]; } @@ -99,6 +106,29 @@ export type SideNavFooterItem = { label: string; }; +export type SideNavProps = { + /** + * Side Nav header text that is usually reserved to show the App name + */ + navHeaderText: string; + /** + * Determines whether the side nav is collapsible + */ + isCollapsible?: boolean; + /** + * Footer items in the side nav + */ + footerItems?: SideNavFooterItem[]; + /** + * Triggers when the side nav is collapsed + */ + onCollapse?(): void; + /** + * Nav items in the side nav + */ + sideNavItems: SideNavItem[]; +} & Pick; + const SideNavCollapsedContainer = styled("div", { shouldForwardProp: (prop) => prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed", @@ -122,7 +152,7 @@ const SideNavCollapsedContainer = styled("div", { }), ); -const SideNavContainer = styled("div", { +const SideNavExpandContainer = styled("div", { shouldForwardProp: (prop) => prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed", })( @@ -159,16 +189,20 @@ const SideNavHeaderContainer = styled("div", { const CollapseIcon = ({ onClick }: { onClick?(): void }): ReactElement => { const odysseyDesignTokens = useOdysseyDesignTokens(); + + const collapseButtonStyles = useMemo( + () => ({ + "& > button": { + height: "32px", + width: "32px", + color: odysseyDesignTokens.HueNeutral400, + }, + }), + [odysseyDesignTokens], + ); + return ( - button": { - height: "32px", - width: "32px", - color: odysseyDesignTokens.HueNeutral400, - }, - }} - > +