Sheet

Bottom sheet on a native <dialog> (Material BottomSheet equivalent): a bottom-anchored glass surface — full-width to 640px, centered, top corners rounded, max-height 60vh (90vh with .sheet-tall) — sliding up over a blanket backdrop. Use for mobile-friendly action lists, share targets, and quick forms. Open declaratively with <button commandfor="id" command="show-modal"> and close with command="close" or a <form method="dialog">; no JavaScript involved.

Root: .sheet on <dialog>

Examples

Example 1

Share board

Choose a destination…

<dialog class="sheet" id="share-sheet" aria-labelledby="share-sheet-title"><div class="sheet-handle"></div><div class="sheet-header"><h4 class="sheet-title" id="share-sheet-title">Share board</h4></div><div class="sheet-body"><p>Choose a destination…</p></div><form method="dialog" class="sheet-footer"><button class="btn btn-subtle" value="cancel">Cancel</button></form></dialog>
Example 2

Filter controls…

<dialog class="sheet sheet-tall" id="filter-sheet" aria-label="Filters"><div class="sheet-handle"></div><div class="sheet-body"><p>Filter controls…</p></div></dialog>

Contract

Variants & modifiers

ClassAxisRules
sheet-tallmodifieroptional

Structure

SelectorRequiredDescription
.sheet-handleoptional32×4 rounded pill (var(--lz-sys-track)) centered at the top — the grab affordance. Purely decorative; keep it an empty div.
.sheet-headeroptionalTitle strip below the handle: .sheet-title (h600 scale), space-between for an optional trailing control.
.sheet-bodyrequiredThe scrolling content region (flex:1, overflow-y:auto, 24px inline padding).
.sheet-footeroptionalEnd-aligned action row, usually a <form method="dialog"> so buttons close the sheet natively.

Accessibility

OnAttributeLevelWhen
.sheetaria-labelledbyrequiredThe sheet has a visible .sheet-title — point aria-labelledby at its id; otherwise label the dialog directly with aria-label.

The native <dialog> supplies focus trapping, Esc-to-close, and top-layer stacking — never re-implement them. Give the dialog an accessible name (aria-labelledby → .sheet-title id, or aria-label). The sheet is a glass surface: never nest another glass surface (modal, drawer, flag, another sheet) inside it. The .sheet-handle is decorative only — there is no built-in drag-to-dismiss; Esc, backdrop behavior, and explicit close buttons do that work. Entrance slide uses motion tokens and is collapsed by the framework-wide prefers-reduced-motion rule.

Nesting

Allowed in:

  • directly under <body> (the dialog renders in the top layer regardless of DOM position)

Never inside (or containing):

  • .sheet
  • dialog.modal
  • .drawer
  • .flag

Subcomponents