Layout
The structural skeleton every page in this product follows.
The page skeleton
A page is always two pieces, top to bottom: PageNav (the sticky breadcrumb bar) followed by PageContainer (the centered body, max-w-6xl wide). Every page in this product renders both, in this order, with nothing else at that outer level.
What goes inside PageContainer
The skeleton is fixed; its content is not. The default slot of PageContainer takes whatever the page needs:
- A PageHeader for the page's title, description, and primary actions. Almost every page has exactly one, immediately inside
PageContainer. - One or more PageSection blocks below it, when the content breaks into titled groups, like the separate cards on a settings page.
- Plain content, when the body is a single composition (a table or a form) with nothing further to label.
Guidelines
- Always pair them.
PageContainerassumesPageNavrendered the breadcrumb above it and never repeats page-level chrome. - Do not add horizontal padding or a max-width around
PageContainer. It already owns both. - Do not use
PageSectionto wrap a single block. Go straight to content when there is nothing to title.
Example
Full skeleton
Automations / Nightly dependency bump
Nightly dependency bump
Summary
What changed and why.
Section content
<template> <PageNav :breadcrumb="crumbs" /> <PageContainer> <div class="flex flex-col gap-10"> <PageHeader title="Nightly dependency bump"> <template #actions> <Button variant="outline">Re-run</Button> </template> </PageHeader> <PageSection title="Summary" description="What changed and why."> <!-- section content --> </PageSection> </div> </PageContainer></template>