Browser support
| Browser | Spring easing | Compositor-driven backdrop dim + --scrollsheet-progress |
|---|---|---|
| Chrome / Edge | 113+ | 115+ |
| Safari | 17.2+ | 26+ |
| Firefox | 112+ | behind a flag, see below |
Without <dialog>
Section titled “Without <dialog>”| ~4% of browsers (Opera Mini, old in-app WebViews, iOS ≤15.3) | |
|---|---|
| You get | A fixed-position modal: backdrop, tap-to-close, Escape, focus moved into the panel on open and restored to the trigger on close, body scroll locked. Panel sizes to content up to 85% of the viewport, then scrolls internally |
| Gone | Detents, drag, the enter/exit animation, the top layer (panel portals to <body> with a max z-index instead of a guarantee), the native focus trap. Sheet.Handle renders nothing |
| Still works | Every --scrollsheet-* theming variable (-bg, -fg, -radius, -shadow, -backdrop, safe-area) resolves the same way. isSupported() reports which path a browser takes |
The trade against libraries that portal a plain <div> (vaul, react-modal-sheet): their full
gesture experience reaches these browsers and ours does not, on the bet that the top layer is
worth more on the 96% than the gestures are on the 4%.
API referenceFull prop reference for Sheet.Root, the styling hooks on Sheet.Content, and every other named export.