Getting StartedComponentsDesign TokensThemingTheme SynthesizerFrameworksAccessibilityUtilitiesServer RenderingBrowser SupportContributingChangelogApp ShellAspect GridAuth ShellCenterContainerDashboard GridFloat BarInsetMasonryPage HeaderPage LayoutResizableResponsive SwitcherSectionSettings LayoutSplit PaneStatus BarStickyToolbarAnchor NavBottom NavBreadcrumbBreadcrumb MenuCommand BarDrawerFooterLinkMenubarNavigation MenuPage IndicatorPaginationRailScroll IndicatorScroll SpyScroll To TopSidebarSkip LinkStepper NavTabsTop BarTree ViewAccordionAspect RatioAvatarAvatar GroupCardCarouselCollapsibleColor SwatchCTA BannerDividerEmpty StateFeature CardIconImageImage CompareImage HotspotsInfinite ScrollLightboxMarqueeQR CodeScroll AreaSkeletonSpinnerStackVideoVirtual ListActivity HeatmapAnimated NumberBadgeBar ListChartClockComparisonCountdown TimerData GridDescription ListDiffGaugeJSON TreeKanbanLevel MeterListMeterSparklineStatStepperTagTimelineUptimeValue CardWaveformBlockquoteCode BlockCode GroupGradient TextHighlightKbdKeyboard MapMarkdownNumber FormatProseTerminalTextTime AgoTruncateTypewriterButtonButton GroupCalendarCheckboxChipColor PickerComboboxCopy ButtonDate PickerDate Range PickerField ListFieldsetFile UploadFormHotkeyIcon ButtonImage CropperInline EditInputInput GroupKnobLabelMasked InputMulti SelectNumber InputPassword InputPin InputRadio GroupRange SliderRatingSearchSegmented ControlSelectSignature PadSliderSortable ListSwitch GroupTag InputTextareaTheme ToggleTime PickerToggleTransfer ListTree SelectAlertAnnouncementBannerCommand PaletteConfirmConnection StatusContext MenuConversationDialogDropdown MenuHover CardLoading OverlayNotification PanelPopoverProgressSheetToastTooltip
ARC UIARC Radiant Components
v4.9DocsComponentsTokensSynthesizer
Getting StartedFrameworksServer RenderingDesign TokensThemingTheme SynthesizerTypographyUtilitiesAll ComponentsAccessibilityBrowser SupportChangelogContributingStatsApp ShellAspect GridAuth ShellCenterContainerDashboard GridFloat BarInsetMasonryPage HeaderPage LayoutResizableResponsive SwitcherSectionSettings LayoutSplit PaneStatus BarStickyToolbarAnchor NavBottom NavBreadcrumbBreadcrumb MenuCommand BarDrawerFooterLinkMenubarNavigation MenuPage IndicatorPaginationRailScroll IndicatorScroll SpyScroll To TopSidebarSkip LinkStepper NavTabsTop BarTree ViewAccordionAspect RatioAvatarAvatar GroupCardCarouselCollapsibleColor SwatchCTA BannerDividerEmpty StateFeature CardIconImageImage CompareImage HotspotsInfinite ScrollLightboxMarqueeQR CodeScroll AreaSkeletonSpinnerStackVideoVirtual ListActivity HeatmapAnimated NumberBadgeBar ListChartClockComparisonCountdown TimerData GridDescription ListDiffGaugeJSON TreeKanbanLevel MeterListMeterSparklineStatStepperTagTimelineUptimeValue CardWaveformBlockquoteCode BlockCode GroupGradient TextHighlightKbdKeyboard MapMarkdownNumber FormatProseTerminalTextTime AgoTruncateTypewriterButtonButton GroupCalendarCheckboxChipColor PickerComboboxCopy ButtonDate PickerDate Range PickerField ListFieldsetFile UploadFormHotkeyIcon ButtonImage CropperInline EditInputInput GroupKnobLabelMasked InputMulti SelectNumber InputPassword InputPin InputRadio GroupRange SliderRatingSearchSegmented ControlSelectSignature PadSliderSortable ListSwitch GroupTag InputTextareaTheme ToggleTime PickerToggleTransfer ListTree SelectAlertAnnouncementBannerCommand PaletteConfirmConnection StatusContext MenuConversationDialogDropdown MenuHover CardLoading OverlayNotification PanelPopoverProgressSheetToastTooltip

App Shell

Full-page layout scaffold that composes a TopBar, Sidebar, and scrollable content area into an application frame. Handles responsive collapse, sidebar toggling, and an optional table-of-contents rail.

ComponentsApp Shell
layouthybrid
<arc-app-shell>

Overview

AppShell is the outermost structural component for any ARC UI application. It establishes the three-zone layout (a fixed top bar, a collapsible sidebar, and a flexible main content area) so every page in your app shares the same chrome without duplicating layout logic. The component manages responsive behavior automatically. On screens narrower than 768 px the sidebar collapses out of view and can be toggled back with the `sidebar-open` attribute, so it suits both desktop dashboards and mobile-first admin panels. A fourth optional slot, `toc`, provides a right-hand rail for table-of-contents or contextual widgets; it hides below 1280 px to keep the content area readable. Because AppShell is slot-based, it composes with other ARC UI primitives. Put an `arc-top-bar` into the `topbar` slot, an `arc-sidebar` (or any nav markup) into `sidebar`, and your page content into the default slot. The shell handles the flex math, scroll containment, and z-index layering, so you only decide what goes inside each zone.

Guidelines

When to use

  • Use one AppShell as the root layout wrapper for each page or route
  • Place an arc-top-bar in the "topbar" slot for a consistent fixed header
  • Provide a sidebar toggle button in the top bar that sets sidebar-open on mobile
  • Use the "toc" slot for table-of-contents navigation on documentation pages
  • Combine with Container or Section components inside the default slot for consistent content widths

When not to use

  • Do not nest one AppShell inside another; it is a singleton page frame
  • Do not put scrollable content directly in the sidebar slot without its own overflow handling
  • Do not rely on the toc slot for critical navigation; it hides on narrower viewports
  • Do not override min-height: 100vh on the host unless you are embedding a preview or iframe
  • Do not use AppShell for simple marketing pages that do not need a persistent sidebar or top bar

Features

  • Three-zone layout: fixed top bar, collapsible sidebar, scrollable main content
  • Optional fourth "toc" slot for a right-hand table-of-contents rail
  • Responsive sidebar collapse at 768 px with toggle via sidebar-open attribute
  • Table-of-contents rail auto-hides below 1280 px
  • Slot-based composition works with any TopBar, Sidebar, or custom markup
  • Full-viewport min-height so the shell always fills the screen
  • CSS custom property integration for consistent spacing and color tokens
  • Exposed CSS parts (shell, body, sidebar, main, content, toc) for deep style overrides

Preview

Welcome back

Here is what happened while you were away.

Revenue
$48.2k
Users
1,247
Uptime
99.9%

Usage

Layout and styling work without JavaScript via the HTML/CSS versions. Interactive features like events and state management require the Web Component or a framework wrapper.

<script type="module" src="@arclux/arc-ui"></script>

<arc-app-shell>
  <arc-top-bar slot="topbar" heading="Dashboard"></arc-top-bar>
  <nav slot="sidebar" style="width: 200px; padding: 16px;">
    <a href="/overview">Overview</a>
    <a href="/analytics">Analytics</a>
    <a href="/settings">Settings</a>
  </nav>
  <main>
    <h1>Welcome back</h1>
    <p>Here is what happened while you were away.</p>
  </main>
</arc-app-shell>

API

breakpointnumber
Viewport width in pixels at which the layout switches between mobile and desktop modes.
sidebarOpenbooleanfalse
Controls whether the sidebar is visible on mobile viewports (below 768 px). On desktop the sidebar is always shown regardless of this attribute. Toggle it from a hamburger button in your TopBar to give mobile users access to navigation.
embeddedbooleanfalse
Fills the container instead of the viewport. The shell takes the height you give it (height: 100% of a bounded parent, or any length), its content area becomes the scroll context rather than the page, and the sidebar rail is stretched by the body rather than sized from the screen, since a sticky rail has nothing to stick against once the page is not what scrolls. Use it for a shell inside a card, a dashboard cell, a split pane, or a documentation preview; leave it off for the full-page layout, which is what the component is for.

Events

arc-sidebar-toggledetail:{ value: boolean }
Fired when the shell itself opens or closes the mobile sidebar: on a backdrop click, on Escape, on navigation, or when the viewport widens past the breakpoint and the drawer stops existing. Listened to by arc-top-bar so its hamburger stays in step, and by any wrapper binding sidebarOpen. Not fired for a toggle the shell merely received, so the two cannot echo each other.

See Also