Page

The frame of an app page: header and content share one column, a line comes as the content scrolls, and on a phone the header becomes a floating glass bar.

import { Page } from "@plexui/ui/components/Page";

Examples

Overview

Orders

Order 1024Paid
Order 1025Paid
Order 1026Paid
Order 1027Paid
Order 1028Paid
Order 1029Paid
Order 1030Paid
Order 1031Paid
Order 1032Paid
Order 1033Paid
Order 1034Paid
Order 1035Paid
Order 1036Paid
Order 1037Paid
Order 1038Paid
Order 1039Paid
Order 1040Paid
Order 1041Paid
Order 1042Paid
Order 1043Paid
Order 1044Paid
Order 1045Paid
Order 1046Paid
Order 1047Paid

Widths

Settings

Order 1024Paid
Order 1025Paid
Order 1026Paid
Order 1027Paid
Order 1028Paid
Order 1029Paid
Order 1030Paid
Order 1031Paid
Order 1032Paid
Order 1033Paid
Order 1034Paid
Order 1035Paid
Order 1036Paid
Order 1037Paid
Order 1038Paid
Order 1039Paid
Order 1040Paid
Order 1041Paid
Order 1042Paid
Order 1043Paid
Order 1044Paid
Order 1045Paid
Order 1046Paid
Order 1047Paid

Heading

Menu

Draft

Saved a minute ago

Order 1024Paid
Order 1025Paid
Order 1026Paid
Order 1027Paid
Order 1028Paid
Order 1029Paid
Order 1030Paid
Order 1031Paid
Order 1032Paid
Order 1033Paid
Order 1034Paid
Order 1035Paid
Order 1036Paid
Order 1037Paid
Order 1038Paid
Order 1039Paid
Order 1040Paid
Order 1041Paid
Order 1042Paid
Order 1043Paid
Order 1044Paid
Order 1045Paid
Order 1046Paid
Order 1047Paid

Fill

Orders

Order 1024Paid
Order 1025Paid
Order 1026Paid
Order 1027Paid
Order 1028Paid
Order 1029Paid
Order 1030Paid
Order 1031Paid
Order 1032Paid
Order 1033Paid
Order 1034Paid
Order 1035Paid
Order 1036Paid
Order 1037Paid
Order 1038Paid
Order 1039Paid
Order 1040Paid
Order 1041Paid
Order 1042Paid
Order 1043Paid
Order 1044Paid
Order 1045Paid
Order 1046Paid
Order 1047Paid

Phone

Under 768px the header is one row of 44px over the page. It floats: at rest nothing shows, and content scrolled under it turns it to glass with a hairline. The content keeps its place through --page-top, the top inset and the bar together, also for anything else that has to start below the bar, such as a banner.

Keep the row to a title and one group of actions. The bar has no room for a second row, so anything set under Page.Bar, such as a search field, belongs at the top of Page.Content on a phone. useBreakpoint("md") tells which one to render. The first column of the bar stays free for the menu button of a sidebar.

Use it inside SidebarInset for a whole app, see the app sidebar.

API

Page

PropTypeDefaultDescription
width"full" | "wide" | "column""full"Column that header and content share: edge to edge, 1280px or 768px, centred
classNamestring—Applied to the root element

All other <div> attributes are forwarded to the root.

PropTypeDefaultDescription
dividerbooleantrueShows the line, and the glass on a phone, once the content has scrolled under the header
classNamestring—Applied to the band

Children stand in the shared column. All other <div> attributes are forwarded to the band.

Page.Content

PropTypeDefaultDescription
fillbooleanfalseThe content fills the page and scrolls inside itself, from 768px up
onScrollUIEventHandler—Called on every scroll, after the page has read the position
classNamestring—Applied to the element that scrolls

Children stand in the shared column. All other <div> attributes and ref go to the element that scrolls.

Compound parts

PartElementPurpose
Page.Bar<div>Row of the title and the actions
Page.Heading<div>Title with what stands beside it
Page.Title<h1>Page heading
Page.Subtitle<p>Status of the page
Page.Actions<div>Buttons on the trailing side of the bar

Styling

Page reads these component tokens. Override them at any scope to restyle it:

  • --page-background: background (default var(--color-surface))
  • --page-bar-gap: gap between title and actions (default 24px)
  • --page-bar-height: bar height (default 36px)
  • --page-bar-height-phone: bar height on a phone (default 44px)
  • --page-bar-line: hairline of the glass bar (default light-dark(rgb(0 0 0 / 10%), var(--color-border)))
  • --page-bar-veil: fill of the glass bar (default light-dark(rgb(255 255 255 / 72%), rgb(0 0 0 / 60%)))
  • --page-content-padding-bottom: bottom of the content (default 48px)
  • --page-content-padding-top: top of the content on a phone (default 16px)
  • --page-gutter: side gutter on a phone (default 16px)
  • --page-gutter-wide: side gutter and top of the content from 768px up (default 24px)
  • --page-header-padding-bottom: gap between the bar and the line (default 12px)
  • --page-header-padding-top: top of the header (default 12px)
  • --page-title-font-size: title font size (default 20px)
  • --page-title-line-height: title line height (default 26px)
  • --page-width: width of the column, any value
  • --page-width-column: column width (default 768px)
  • --page-width-wide: wide width (default 1280px)