diff --git a/packages/react/src/SubNav/SubNav.features.stories.tsx b/packages/react/src/SubNav/SubNav.features.stories.tsx index 0f45a323e..8abb9646e 100644 --- a/packages/react/src/SubNav/SubNav.features.stories.tsx +++ b/packages/react/src/SubNav/SubNav.features.stories.tsx @@ -4,8 +4,6 @@ import {INITIAL_VIEWPORTS} from '@storybook/addon-viewport' import {linkTo} from '@storybook/addon-links' import {SubNav} from './SubNav' -import bgPath from '../fixtures/images/background-stars.png' -import {ThemeProvider} from '../ThemeProvider' import {Box} from '../Box' import {Hero} from '../Hero' import {Grid} from '../Grid' @@ -63,15 +61,6 @@ export const DropdownVariant = ({hasShadow, ...args}) => ( DropdownVariant.parameters = { layout: 'fullscreen', } -DropdownVariant.decorators = [ - Story => ( - -
- -
-
- ), -] export const NarrowDropdownVariant = args => NarrowDropdownVariant.parameters = { @@ -81,26 +70,8 @@ NarrowDropdownVariant.parameters = { }, } -NarrowDropdownVariant.decorators = [ - Story => ( - -
- -
-
- ), -] - export const NarrowDropdownVariantMenuOpen = args => -NarrowDropdownVariantMenuOpen.decorators = [ - Story => ( - -
- -
-
- ), -] + NarrowDropdownVariantMenuOpen.parameters = { layout: 'fullscreen', viewport: { @@ -228,11 +199,22 @@ AnchorNavVariant.parameters = { layout: 'fullscreen', } +const customViewports = { + Narrow: { + name: 'Narrow', + styles: { + width: '280px', + height: '600px', + }, + }, +} + export const NarrowAnchorNavVariant = args => NarrowAnchorNavVariant.parameters = { layout: 'fullscreen', viewport: { - defaultViewport: 'iphonex', + viewports: customViewports, + defaultViewport: 'Narrow', }, } @@ -240,7 +222,8 @@ export const NarrowAnchorNavVariantMenuOpen = args => { diff --git a/packages/react/src/SubNav/SubNav.tsx b/packages/react/src/SubNav/SubNav.tsx index db1d74872..91af44b05 100644 --- a/packages/react/src/SubNav/SubNav.tsx +++ b/packages/react/src/SubNav/SubNav.tsx @@ -62,9 +62,6 @@ const testIds = { type SubNavContextType = { portalRef: RefObject - isOpenAtNarrow: boolean - portalMounted: boolean - closeMenu: () => void } const SubNavContext = createContext(undefined) @@ -77,40 +74,14 @@ export const useSubNavContext = () => { return context } -export type SubNavProps = { - hasShadow?: boolean - /** - * Allows the SubNav to be used at full width, - * removing any internal padding and guttering. - */ - fullWidth?: boolean - 'data-testid'?: string -} & PropsWithChildren> - function SubNavProvider({children}: {children: React.ReactNode}) { const anchoredNavPortalRef = React.useRef(null) - const [portalMounted, setPortalMounted] = useState(false) - - const [isOpenAtNarrow, setIsOpenAtNarrow] = useState(false) - - const closeMenuCallback = useCallback(() => { - setIsOpenAtNarrow(false) - }, []) - - useEffect(() => { - if (anchoredNavPortalRef.current) { - setPortalMounted(true) - } - }, []) const value = useMemo( () => ({ portalRef: anchoredNavPortalRef, - portalMounted, - isOpenAtNarrow, - closeMenu: closeMenuCallback, }), - [portalMounted, isOpenAtNarrow, closeMenuCallback], + [], ) useEffect(() => { @@ -138,13 +109,23 @@ function SubNavProvider({children}: {children: React.ReactNode}) { {children} -
-
+
+
) } +export type SubNavProps = { + hasShadow?: boolean + /** + * Allows the SubNav to be used at full width, + * removing any internal padding and guttering. + */ + fullWidth?: boolean + 'data-testid'?: string +} & PropsWithChildren> + const _SubNavRoot = memo(({id, children, className, 'data-testid': testId, fullWidth, hasShadow}: SubNavProps) => { const rootRef = React.useRef(null) const navRef = React.useRef(null) @@ -172,12 +153,12 @@ const _SubNavRoot = memo(({id, children, className, 'data-testid': testId, fullW useFocusTrap({containerRef: overlayRef, restoreFocusOnCleanUp: true, disabled: !isOpenAtNarrow}) useEffect(() => { - if (isOpenAtNarrow) { + if (isOpenAtNarrow && !isLarge) { document.body.style.overflow = 'hidden' } else { document.body.style.overflow = 'auto' } - }, [isOpenAtNarrow]) + }, [isOpenAtNarrow, isLarge]) const activeLink = memoizedChildren.find(child => { if (isValidElement(child)) { @@ -570,12 +551,14 @@ function _SubMenu({children, className, variant = 'dropdown', ...props}: SubMenu context.portalRef.current, ) } else { + const Tag = isLarge ? ThemeProvider : React.Fragment + return ( - +
    {children}
-
+ ) } } diff --git a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-e0f45-en-SubNav-Narrow-Dropdown-Variant-Menu-Open-1-linux.png b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-e0f45-en-SubNav-Narrow-Dropdown-Variant-Menu-Open-1-linux.png index 1d87fb274..b1a58939d 100644 Binary files a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-e0f45-en-SubNav-Narrow-Dropdown-Variant-Menu-Open-1-linux.png and b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-e0f45-en-SubNav-Narrow-Dropdown-Variant-Menu-Open-1-linux.png differ diff --git a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-ec549-down-Variant-SubNav-Narrow-Dropdown-Variant-1-linux.png b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-ec549-down-Variant-SubNav-Narrow-Dropdown-Variant-1-linux.png index 3650594f8..ed5f85b05 100644 Binary files a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-ec549-down-Variant-SubNav-Narrow-Dropdown-Variant-1-linux.png and b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-Mobile-viewport-test-ec549-down-Variant-SubNav-Narrow-Dropdown-Variant-1-linux.png differ diff --git a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-SubNav-Dropdown-Variant-1-linux.png b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-SubNav-Dropdown-Variant-1-linux.png index c8f1928b8..af5e5d353 100644 Binary files a/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-SubNav-Dropdown-Variant-1-linux.png and b/packages/react/src/SubNav/SubNav.visual.spec.ts-snapshots/Visual-Comparison-SubNav-SubNav-Dropdown-Variant-1-linux.png differ