AppShell
Responsive shell for your application with header, navbar, aside and footer
Source
Docs
Package
Examples
This page includes only documentation. All associated AppShell
components have a fixed
position; examples are included in a separate documentation section.
Usage
AppShell
is a layout component that can be used to implement a common Header / Navbar / Footer / Aside
layout pattern. All AppShell
components have position: fixed
style, so they do not scroll with
the page.
Basic AppShell example with header and navbar. The navbar is hidden on mobile by default and toggled with the burger button.
AppShell components
AppShell
– root component that wraps all other sections and configures the overall layout.AppShell.Header
– fixed header at the top, controlled by theheader
prop.AppShell.Navbar
– fixed navbar on the left, controlled by thenavbar
prop.AppShell.Aside
– fixed aside on the right, controlled by theaside
prop.AppShell.Footer
– fixed footer at the bottom, controlled by thefooter
prop.AppShell.Main
– main content area, statically positioned and offset by the other sections.AppShell.Section
– utility for grouping content insideAppShell.Navbar
orAppShell.Aside
, useful for scrollable areas.
Configuration
The AppShell
component accepts header
, footer
, navbar
, and aside
props to configure the corresponding sections.
You must set these props if you want to use the associated components.
For example, to use the AppShell.Header
component, you need to set the header
prop on the AppShell
component.
header
and footer
configuration objects share the same type:
navbar
and aside
configuration objects type:
layout prop
layout
prop controls how AppShell.Header
/AppShell.Footer
and AppShell.Navbar
/AppShell.Aside
are positioned relative to each other. It accepts alt
and default
values:
alt
–AppShell.Navbar
/AppShell.Aside
extends the full viewport height, whileAppShell.Header
/AppShell.Footer
width equals the viewport width minus the width ofAppShell.Navbar
andAppShell.Aside
(example)default
–AppShell.Navbar
/AppShell.Aside
height equals the viewport height minusAppShell.Header
/AppShell.Footer
height, andAppShell.Header
/AppShell.Footer
spans the full viewport width (example)
Height configuration
height
property in header
and footer
configuration objects works the following way:
- If you pass a number, the value will be converted to rem and used as height at all viewport sizes.
- To change height based on viewport width, use an object with breakpoints as keys and height as values. This works the same way as style props.
Example with height as a number: height
is converted to rem,
height
is the same at all viewport sizes:
Example with height as an object with breakpoints:
height
is 48 when viewport width is <theme.breakpoints.sm
height
is 60 when viewport width is >=theme.breakpoints.sm
and <theme.breakpoints.lg
height
is 76 when viewport width is >=theme.breakpoints.lg
Width configuration
width
property in navbar
and aside
configuration objects works the following way:
- If you pass a number, the value will be converted to rem and used as
width when the viewport is larger than
breakpoint
. - To change width based on viewport width, use an object with breakpoints as keys and width as
values. This works the same way as style props.
Note that width is always 100% when the viewport is smaller than
breakpoint
.
Example with width as a number: width
is converted to rem,
width
is the same at viewport sizes larger than breakpoint
,
width
is 100% when viewport width is less than breakpoint
:
Example with width as an object with breakpoints:
width
is 100% when viewport width is <theme.breakpoints.sm
width
is 200 when viewport width is >=theme.breakpoints.sm
and <theme.breakpoints.lg
width
is 300 when viewport width is >=theme.breakpoints.lg
padding prop
The padding
prop controls the padding of the AppShell.Main
component. It's important to use this prop
instead of setting padding directly on AppShell.Main
because this padding is also used to offset
the AppShell.Header
, AppShell.Navbar
, AppShell.Aside
, and AppShell.Footer
components.
The padding
prop works the same way as style props and
accepts numbers, strings, and objects with breakpoints as keys and padding values. You can
reference theme.spacing
values or use any valid CSS values.
Example with static padding
prop:
Example with responsive padding
prop:
padding
is 10 when viewport width is <theme.breakpoints.sm
padding
is 15 when viewport width is >=theme.breakpoints.sm
and <theme.breakpoints.lg
padding
istheme.spacing.xl
when viewport width is >=theme.breakpoints.lg
Header offset configuration
The header
prop includes an offset
property that allows you to control
whether the AppShell.Main
component is offset by the header's height.
This is particularly useful when you want to collapse the AppShell.Header
based on scroll position. For example, you can use the use-headroom
hook to hide the header when the user scrolls down and show it when
scrolling up (example).
Collapsed navbar/aside configuration
The navbar
and aside
props include a collapsed
property that accepts an object with the format { mobile: boolean; desktop: boolean }
.
This allows you to configure the collapsed state differently based on viewport width.
Example with separate collapsed states for mobile and desktop:
withBorder prop
The withBorder
prop is available on AppShell
and associated sections: AppShell.Header
, AppShell.Navbar
, AppShell.Aside
and AppShell.Footer
.
By default, withBorder
prop is true
– all components have a border on the side that is adjacent to the AppShell.Main
component.
For example, AppShell.Header
is located at the top of the page – it has a border on the bottom side,
AppShell.Navbar
is located on the left side of the page – it has a border on the right side.
To remove the border from all components, set withBorder={false}
on the AppShell
:
To remove the border from a specific component, set withBorder={false}
on that component:
zIndex prop
The zIndex
prop is available on AppShell
and its associated sections: AppShell.Header
, AppShell.Navbar
, AppShell.Aside
, and AppShell.Footer
.
By default, all sections have a z-index
of 100
.
To change the z-index
of all sections, set the zIndex
prop on the AppShell
component:
To change z-index
of a specific section, set zIndex
prop on that section:
Control transitions
Use the transitionDuration
and transitionTimingFunction
props on the AppShell
component to control section animations:
disabled prop
Set the disabled
prop on the AppShell
component to prevent all sections except AppShell.Main
from rendering.
This is useful when you want to hide the shell on certain pages of your application.
AppShell.Section component
AppShell.Section
is used to create organized areas within AppShell.Navbar
and AppShell.Aside
.
Since these components are flexbox containers with flex-direction: column
, the AppShell.Section
component with the grow
prop will expand to fill available space and can be made scrollable by setting
component={ScrollArea}
.
In the following example:
- The first and last sections (header and footer) take only the space needed for their content
- The middle section with
grow
takes all remaining space and becomes scrollable when content exceeds the available height
Semantic elements
Important: do not use <main>
inside AppShell.Main
, it is allowed
to use only one <main>
element per page.
CSS variables
Example of using CSS variables in styles: