Layout

Layout components define a page's structure and the areas for navigation and content.

Props

Root

The root component of the navigation system, wrapping the entire view.

children

Required
Description

For rendering the layout areas, e.g. TopNav, SideNav, Main. They should be rendered as immediate children.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

defaultSideNavCollapsed

Description

Whether the side nav should be collapsed by default on desktop screens.

It is always collapsed by default for mobile screens.

This value is used when the side nav is first mounted, but you should continuously update your persisted state using the onCollapse and onExpand callbacks, to ensure it is up to date when the app is reloaded.

Note: When provided, the defaultCollapsed props on SideNav and SideNavToggleButton will be ignored.

Typeboolean

isSideNavShortcutEnabled

Description

Controls whether the side nav toggle shortcut is enabled. This will be used to bind the keyboard event listener, and to display the keyboard shortcuts in the appropriate tooltips (SideNavToggleButton, SideNavPanelSplitter).

The shortcut key is Ctrl + [.

The shortcut is not enabled by default.

The shortcut will also be ignored if there are any open ADS modal dialogs (@atlaskit/modal-dialog).

SideNav has another prop canToggleWithShortcut() that can be used to run additional checks after the shortcut is pressed, before the SideNav is toggled. You can use this to conditionally disable the shortcut based on your your own custom checks, e.g. if there is a legacy dialog open.

The built-in keyboard shortcut is available whenever this prop is enabled.

Defaultfalse
Typeboolean

skipLinksLabel

Description

The header text for the skip links container element.

Defaultfg('platform_dst_nav4_skip_link_a11y_1') ? 'Skip to' : 'Skip to:'
Typestring

skipLinksTriggerLabel

Description

The label for the skip links button that opens the skip links popup.

Default"Skip to"
Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

UNSAFE_dangerouslyHoistSlotSizes

Description

Note: This prop is only supported for legacy purposes in Jira and Confluence, and is subject to be removed without notice in the future.

Whether to dangerously hoist the layout slot sizes to the document root element, to support some legacy use cases. Do not use this prop for new code.

Defaultfalse
Typeboolean

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

The banner layout area. It will always be displayed at the top of the screen.

children

Required
Description

The content of the layout area. Should include a Banner component from @atlaskit/banner.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

height

Description

The height of the layout area.

Defaults to 48px.

Default48
Typenumber

id

Description

The id attribute of the slot. Used to connect the layout slot's skip link to the layout element. If not provided, a unique ID will be generated.

Typestring

skipLinkLabel

Description

The label for this slot's skip link. Defaults to the slot's label value.

Default"Banner"
Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

TopNav

The top nav layout area. It will display at the top of the screen, below the banner if one is present.

children

Required
Description

The content of the layout area. Should include TopNavStart, TopNavMiddle, and TopNavEnd.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

customTheme

Description

Custom theme for the top navigation. This is a port of Nav 3 functionality, and not recommended for new usage, as it does not align with our future vision.

Type{ backgroundColor: string | RGB; highlightColor: string | RGB; }

height

Description

Not intended for long term use. This is added to support the migration to the new page layout. We may replace this prop in a future release.

Typenumber

id

Description

The id attribute of the slot. Used to connect the layout slot's skip link to the layout element. If not provided, a unique ID will be generated.

Typestring

skipLinkLabel

Description

The label for this slot's skip link. Defaults to the slot's label value.

Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

TopNavStart

Wrapper for the top navigation actions on the inline-start (left) side of the top navigation.

children

Required
Description

The content of the layout area.

Should contain SideNavToggleButton, AppSwitcher, and AppLogo/CustomLogo components.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

sideNavToggleButton

Required
Description

Slot for the side nav toggle button.

You should only render <SideNavToggleButton> inside this slot, not as a child.

Consumers that do not need a toggle button can explicitly pass null.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

TopNavMiddle

Wrapper for the actions in the middle of the top navigation.

children

Required
Description

The content of the layout area.

The first child should be the search bar. If it is not, you might see unexpected layout behavior.

Should also contain the Create button.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

TopNavEnd

Wrapper for the top navigation actions on the inline-end (right) side of the top navigation.

children

Required
Description

The content of the layout area.

Should contain top nav end item components like Notifications, Help, LogIn etc.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

label

Description

Provide an accessible label, often used by screen readers.

Default"Actions"
Typestring

persistentItems

Description

Actions at the inline end, after the other actions or their overflow button, that stay in the top nav at every viewport size outside the overflow popup. Separated from the other actions by 8px; spacing within those actions remains 4px. Items stay mounted when the viewport changes. Consumers must ensure that this content fits on small screens. Supply complete accessible groups (lists containing list items), and hide each group at its outermost element so hidden or absent actions do not leave empty lists or spacing behind. Enabled behind platform-dst-chat-panel-layout.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

showMoreButtonLabel

Description

The label for the show more button.

Default"Show more"
Typestring

SideNav

Use the SideNav area to render side navigation items. It will show on the left (inline start) of the screen.

canToggleWithShortcut

Description

Whether the side nav should be toggled in response to the built-in keyboard shortcut. Use this callback to conditionally disable the shortcut based on your own custom checks, e.g. if there is a legacy dialog open.

This prop will do nothing if isSideNavShortcutEnabled on Root is not set to true, as the keyboard event listener is only binded if isSideNavShortcutEnabled is true.

The shortcut key is Ctrl + [.

Type() => boolean

children

Required
Description

The content of the layout area. Should include side nav layout areas as required: SideNavHeader, SideNavBody, SideNavFooter. Within these, you can use side nav menu items.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

defaultCollapsed

Deprecated
Description

This prop is being replaced by defaultSideNavCollapsed on the Root element, and will be removed in the future.


Whether the side nav should be collapsed by default on desktop screens.

It is always collapsed by default for mobile screens.

This value is used when the side nav is first mounted, but you should continuously update your persisted state using the onCollapse and onExpand callbacks, to ensure it is up to date when the app is reloaded.

Note: If using this prop, ensure that it is also provided to the SideNavToggleButton. This is to ensure the state is in sync before post-SSR hydration.

Typeboolean

defaultWidth

Description

The default width of the side nav layout area.

It should be an integer greater than or equal to the minimum width.

It is only used when the side nav is first mounted, but you should continuously update your persisted state using the onResizeEnd callback of PanelSplitter, to ensure it is up to date when the app is reloaded.

Default320
Typenumber

id

Description

The id attribute of the slot. Used to connect the layout slot's skip link to the layout element. If not provided, a unique ID will be generated.

Typestring

label

Description

The accessible name of the slot, announced by screen readers.

Typestring

maxWidth

Description

Optional maximum width for both inline and overlay resizing.

Type`${number}px` | `${number}vw`

minWidth

Description

Minimum width used when fitting the side nav inline.

Type`${number}px` | `${number}vw`

onCollapse

Description

Called when the side nav is collapsed.

Type(args: { screen: "mobile" | "desktop"; trigger?: SideNavTrigger; }) => void

onExpand

Description

Called when the side nav is expanded.

Type(args: { screen: "mobile" | "desktop"; trigger?: SideNavTrigger; }) => void

onPeekEnd

Description

Called when the side nav stops peeking / flyout.

Type(args: { trigger: "mouse-leave" | "side-nav-expand"; }) => void

onPeekStart

Description

Called when the side nav begins peeking / flyout.

Type() => void

skipLinkLabel

Description

The label for this slot's skip link. Defaults to the slot's label value.

Defaultlabel
Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

SideNavHeader

The top part of the side nav.

children

Required
Description

The content of the layout area.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal

SideNavBody

The main content of the side nav, filling up the middle section. It acts as a scroll container.

children

Required
Description

The content of the layout area. Should contain side nav menu items.

Typestring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal

ref

Description

Allows getting a ref to the component instance. Once the component unmounts, React will set ref.current to null (or call the ref with null if you passed a callback ref).

@see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs}

Typestring | Ref<HTMLDivElement>

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

SideNavFooter

The bottom part of the side nav.

children

Required
Description

The content of the layout area.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

Main

Use the Main area for the main page content.

children

Required
Description

The content of the layout area. This is where you should put the main content of your page.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

id

Description

The id attribute of the slot. Used to connect the layout slot's skip link to the layout element. If not provided, a unique ID will be generated.

Typestring

minWidth

Description

Minimum width used by the layout allocation system.

Default320
Typenumber

skipLinkLabel

Description

The label for this slot's skip link. Defaults to the slot's label value.

Defaultfg('platform_dst_nav4_skip_link_a11y_1') ? 'Main content' : 'Main Content'
Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

MainStickyHeader

The sticky header of the main layout area.

children

Description

The content of the layout area.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

PanelLayout

Use PanelLayout to render a local panel beside page content inside Main. It manages responsive inline and overlay positioning, sizing, and pointer and keyboard resizing. The caller supplies the panel content and controls whether it is open; no panel-system provider is required.

import { PanelLayout } from '@atlaskit/navigation-system/layout/panel-layout';

Mount one local-panel host per navigation Root, including closed PanelLayout and LayoutWithPanel instances. Keep the host mounted and use isPanelOpen to open or close it so that resized widths are retained. Switch content through the same host using panel and panelKey.

Use defaultPanelWidth for an initial width, or pair panelWidth with onPanelWidthChange to control it. Available space can constrain the rendered width. Use onResizeEnd for persistence or analytics after a completed resize, and provide localized panelLabel and resizeLabel values.

PanelLayout contains the layout and resizing responsibilities extracted from @atlassian/panel-system. That package's LayoutWithPanel remains an adapter that connects panel state and routed content to PanelLayout.

The separate Panel component is a layout area rendered alongside Main under Root. PanelLayout wraps content inside Main and includes its own resize control.

children

Required
Description

Main content. Mount PanelLayout inside navigation's Main, alongside ChatPanel in Root.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

compactDefaultPanelWidth

Description

Default at compact viewport sizes. Defaults to 320, or an explicitly supplied defaultPanelWidth. Used only until a controlled width or user resize supplies a preference.

Typenumber

defaultPanelWidth

Description

Initial preferred width in pixels; subsequent changes are ignored. Defaults to 365, or 400 with chat layout enabled. After a user resize, one preferred width is retained across inline and overlay modes. Available space can constrain the rendered width without overwriting that preference.

Typenumber

isPanelOpen

Required
Description
No description.
Typeboolean

onPanelWidthChange

Description

Called after user resizing, with the effective width. Accept this value to control panelWidth.

Type(width: number) => void

onResizeEnd

Description

One callback per completed pointer/keyboard resize, for persistence and analytics.

Type(event: PanelResizeEnd) => void

panel

Required
Description

Caller-owned panel content; no Panel System provider or renderer is required.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

panelKey

Description

Optional content identity, used to reset scrolling and animate content replacement.

Typestring | number | bigint

panelLabel

Description

Accessible region and splitter labels; pass localized values in products.

Typestring

panelMaxWidth

Description

Optional maximum width in pixels.

Typenumber

panelMinWidth

Description

Minimum width in pixels. Defaults to 320; overlays can be smaller in a narrower container.

Typenumber

panelWidth

Description

Controlled preferred width in pixels. Allocation may constrain it without changing the request.

Typenumber

resizeLabel

Description
No description.
Typestring

testId

Description
No description.
Typestring

Panel

The Panel layout area is rendered to the right (inline end) of the Main area. On small viewports, the Panel slot will become an overlay.

children

Required
Description

The content of the layout area.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

contentKey

Description

Identifies the content currently displayed in the panel. Changing this value animates the previous content out before animating the next content in. When omitted, content updates immediately.

Typestring | number | bigint

defaultWidth

Description

The default width of the layout area.

It should be an integer between the resize bounds - the minimum is 120px and the maximum is 50% of the viewport width.

This value is also used as the minimum resizing width, except when the defaultWidth is greater then 400px, in which case 400px will be used as the minimum resizing width instead.

Typenumber

hasBorder

Deprecated
Description

Whether or not the slot has its own border. On small screens this becomes a shadow.

Defaults to true. Will be removed in the future (and disabling the border will not be supported).

Defaulttrue
Typeboolean

id

Description

The id attribute of the slot. Used to connect the layout slot's skip link to the layout element. If not provided, a unique ID will be generated.

Typestring

label

Description

The accessible name of the slot, announced by screen readers.

Default"Panel"
Typestring

maxWidth

Description

Opt-in override for the maximum width the panel can be resized to, applied to both the rendered width and the resize bounds (mouse and keyboard).

When omitted, the panel defaults to half the viewport width (after removing the sidebar width), which keeps it from growing larger than the page content. Provide a vw or px value (e.g. '70vw') to allow a wider panel.

This is currently used by Jira's Issue Navigator native issue preview panel; other consumers should leave it unset to keep the default cap.

Type`${number}px` | `${number}vw`

skipLinkLabel

Description

The label for this slot's skip link. Defaults to the slot's label value.

Defaultlabel
Typestring

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

xcss

Description

Bounded style overrides.

Typefalse | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; })

Panel splitter

A component that allows the user to resize a layout area.

label

Required
Description

The accessible label for the panel splitter. It is visually hidden, but is required for accessibility.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal

onResizeEnd

Description

Called when the user finishes resizing the panel.

Type({ initialWidth, finalWidth, }: { initialWidth: number; finalWidth: number; }) => void

onResizeStart

Description

Called when the user begins resizing the panel. Intended for analytics.

Type({ initialWidth }: { initialWidth: number; }) => void

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring

tooltipContent

Description

Displays a tooltip with the provided content.

The tooltipContent will not be announced by screen readers because it pertains to the draggable element, which lacks keyboard functionality. Use the label prop to provide accessible information about the panel splitter.

TypeReactNode | (({ update }: { update?: () => void; }) => ReactNode)

SideNavToggleButton

Button for toggling the side nav. It should be used in the top bar.

collapseLabel

Required
Description

The label when the toggle button will collapse the side nav.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

defaultCollapsed

Deprecated
Description

This prop is being replaced by defaultSideNavCollapsed on the Root element, and will be removed in the future.


Whether the side nav should be collapsed by default on desktop screens.

It is always collapsed by default for mobile screens.

Note: If using this prop, ensure that it is also provided to the SideNav slot. This is to ensure the state is in sync before post-SSR hydration.

Defaultfalse
Typeboolean

expandLabel

Required
Description

The label when the toggle button will expand the side nav.

Typestring | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal

interactionName

Description
Typestring

onClick

Description

The callback function that is called when the toggle button is clicked.

Type(e: React.MouseEvent<HTMLElement, MouseEvent>, analyticsEvent: UIAnalyticsEvent, attributes?: SideNavVisibilityChangeAnalyticsAttributes) => void

testId

Description

A unique string that appears as data attribute data-testid in the rendered code, serving as a hook for automated tests.

Typestring
Was this page helpful?
We use this feedback to improve our documentation.
© 2026 AtlassianTrademark, (opens new window)Privacy, (opens new window)License