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.
| Description | For rendering the layout areas, e.g. TopNav, SideNav, Main. They should be rendered as immediate children. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | The header text for the skip links container element. |
|---|---|
| Default | fg('platform_dst_nav4_skip_link_a11y_1') ? 'Skip to' : 'Skip to:' |
| Type | string |
| Description | The label for the skip links button that opens the skip links popup. |
|---|---|
| Default | "Skip to" |
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| 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. |
|---|---|
| Default | false |
| Type | boolean |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
The banner layout area. It will always be displayed at the top of the screen.
| Description | The content of the layout area.
Should include a Banner component from |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | The height of the layout area. Defaults to 48px. |
|---|---|
| Default | 48 |
| Type | number |
| Description | The |
|---|---|
| Type | string |
| Description | The label for this slot's skip link. Defaults to the slot's |
|---|---|
| Default | "Banner" |
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
The top nav layout area. It will display at the top of the screen, below the banner if one is present.
| Description | The content of the layout area.
Should include |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| 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; } |
| 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. |
|---|---|
| Type | number |
| Description | The |
|---|---|
| Type | string |
| Description | The label for this slot's skip link. Defaults to the slot's |
|---|---|
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
Wrapper for the top navigation actions on the inline-start (left) side of the top navigation.
| Description | The content of the layout area. Should contain |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
Wrapper for the actions in the middle of the top navigation.
| 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. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
Wrapper for the top navigation actions on the inline-end (right) side of the top navigation.
| Description | The content of the layout area. Should contain top nav end item components like |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | Provide an accessible label, often used by screen readers. |
|---|---|
| Default | "Actions" |
| Type | string |
| 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 |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | The label for the show more button. |
|---|---|
| Default | "Show more" |
| Type | string |
Use the SideNav area to render side navigation items. It will show on the left (inline start) of the screen.
| 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 The shortcut key is |
|---|---|
| Type | () => boolean |
| Description | The content of the layout area.
Should include side nav layout areas as required: |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | This prop is being replaced by 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 Note: If using this prop, ensure that it is also provided to the |
|---|---|
| Type | boolean |
| 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 |
|---|---|
| Default | 320 |
| Type | number |
| Description | The |
|---|---|
| Type | string |
| Description | The accessible name of the slot, announced by screen readers. |
|---|---|
| Type | string |
| Description | Optional maximum width for both inline and overlay resizing. |
|---|---|
| Type | `${number}px` | `${number}vw` |
| Description | Minimum width used when fitting the side nav inline. |
|---|---|
| Type | `${number}px` | `${number}vw` |
| Description | Called when the side nav is collapsed. |
|---|---|
| Type | (args: { screen: "mobile" | "desktop"; trigger?: SideNavTrigger; }) => void |
| Description | Called when the side nav is expanded. |
|---|---|
| Type | (args: { screen: "mobile" | "desktop"; trigger?: SideNavTrigger; }) => void |
| Description | Called when the side nav stops peeking / flyout. |
|---|---|
| Type | (args: { trigger: "mouse-leave" | "side-nav-expand"; }) => void |
| Description | Called when the side nav begins peeking / flyout. |
|---|---|
| Type | () => void |
| Description | The label for this slot's skip link. Defaults to the slot's |
|---|---|
| Default | label |
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
The top part of the side nav.
| Description | The content of the layout area. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal |
The main content of the side nav, filling up the middle section. It acts as a scroll container.
| Description | The content of the layout area. Should contain side nav menu items. |
|---|---|
| Type | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal |
| Description | Allows getting a ref to the component instance.
Once the component unmounts, React will set @see {@link https://react.dev/learn/referencing-values-with-refs#refs-and-the-dom React Docs} |
|---|---|
| Type | string | Ref<HTMLDivElement> |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
The bottom part of the side nav.
| Description | The content of the layout area. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
Main
Use the Main area for the main page content.
| Description | The content of the layout area. This is where you should put the main content of your page. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | The |
|---|---|
| Type | string |
| Description | Minimum width used by the layout allocation system. |
|---|---|
| Default | 320 |
| Type | number |
| Description | The label for this slot's skip link. Defaults to the slot's |
|---|---|
| Default | fg('platform_dst_nav4_skip_link_a11y_1') ? 'Main content' : 'Main Content' |
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
MainStickyHeader
The sticky header of the main layout area.
| Description | The content of the layout area. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (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.
| Description | Main content. Mount PanelLayout inside navigation's Main, alongside ChatPanel in Root. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| 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. |
|---|---|
| Type | number |
| 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. |
|---|---|
| Type | number |
| Description | No description. |
|---|---|
| Type | boolean |
| Description | Called after user resizing, with the effective width. Accept this value to control panelWidth. |
|---|---|
| Type | (width: number) => void |
| Description | One callback per completed pointer/keyboard resize, for persistence and analytics. |
|---|---|
| Type | (event: PanelResizeEnd) => void |
| Description | Caller-owned panel content; no Panel System provider or renderer is required. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | Optional content identity, used to reset scrolling and animate content replacement. |
|---|---|
| Type | string | number | bigint |
| Description | Accessible region and splitter labels; pass localized values in products. |
|---|---|
| Type | string |
| Description | Optional maximum width in pixels. |
|---|---|
| Type | number |
| Description | Minimum width in pixels. Defaults to 320; overlays can be smaller in a narrower container. |
|---|---|
| Type | number |
| Description | Controlled preferred width in pixels. Allocation may constrain it without changing the request. |
|---|---|
| Type | number |
| Description | No description. |
|---|---|
| Type | string |
| Description | No description. |
|---|---|
| Type | string |
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.
| Description | The content of the layout area. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| 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. |
|---|---|
| Type | string | number | bigint |
| 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 |
|---|---|
| Type | number |
| 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). |
|---|---|
| Default | true |
| Type | boolean |
| Description | The |
|---|---|
| Type | string |
| Description | The accessible name of the slot, announced by screen readers. |
|---|---|
| Default | "Panel" |
| Type | string |
| 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 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` |
| Description | The label for this slot's skip link. Defaults to the slot's |
|---|---|
| Default | label |
| Type | string |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Bounded style overrides. |
|---|---|
| Type | false | (XCSSValue<"backgroundColor", DesignTokenStyles, ""> & {} & XCSSPseudo<"backgroundColor", never, never, DesignTokenStyles> & XCSSMediaQuery<...> & { ...; } & { ...; }) |
Panel splitter
A component that allows the user to resize a layout area.
| Description | The accessible label for the panel splitter. It is visually hidden, but is required for accessibility. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<ReactNode> | React.ReactPortal |
| Description | Called when the user finishes resizing the panel. |
|---|---|
| Type | ({ initialWidth, finalWidth, }: { initialWidth: number; finalWidth: number; }) => void |
| Description | Called when the user begins resizing the panel. Intended for analytics. |
|---|---|
| Type | ({ initialWidth }: { initialWidth: number; }) => void |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |
| Description | Displays a tooltip with the provided content. The |
|---|---|
| Type | ReactNode | (({ update }: { update?: () => void; }) => ReactNode) |
Button for toggling the side nav. It should be used in the top bar.
| Description | The label when the toggle button will collapse the side nav. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | This prop is being replaced by 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 |
|---|---|
| Default | false |
| Type | boolean |
| Description | The label when the toggle button will expand the side nav. |
|---|---|
| Type | string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal |
| Description | An optional name used to identify events for React UFO (Unified Frontend Observability) press interactions. For more information, see React UFO integration into Design System components. |
|---|---|
| Type | string |
| Description | The callback function that is called when the toggle button is clicked. |
|---|---|
| Type | (e: React.MouseEvent<HTMLElement, MouseEvent>, analyticsEvent: UIAnalyticsEvent, attributes?: SideNavVisibilityChangeAnalyticsAttributes) => void |
| Description | A unique string that appears as data attribute |
|---|---|
| Type | string |