Skip to content
Flow-UILive

Bottom sheets

The SheetModel contract: the same widgets, different chrome.

A sheet reuses the whole widget system. The header and footer stay fixed while sections scroll between them.

SheetModeljson
{
  "sheet": {
    "id": "confirm",
    "config": {
      "detents": ["medium", "large", 0.4],
      "grabber": true,
      "dismissible": true,
      "corner_radius": 24
    },
    "header": { "widgets": [] },
    "sections": [],
    "footer": { "widgets": [] }
  }
}

config#

FieldTypeDefaultDescription
detents[String | Number][medium, large]Named detents or height fractions such as 0.4.
grabberBooltrueShows the drag indicator.
dismissibleBooltruefalse blocks interactive dismissal; provide a dismiss action instead.
corner_radiusDoubleTop corner rounding of the sheet.

Presenting#

Inline sheets ride inside an open_bottom_sheet action under the sheet key. Sheets that need a network round trip are a host concern: register a handler for your own action type, fetch the sheet JSON, then present it.

A dismiss action inside a sheet closes that sheet, which is how footer Done buttons work with zero code.