Sheet
@sushindustries/uiThe dialog docked to an edge, for content tall enough that centring it would mean scrolling a floating box.
Examples are the tab where the component is shown doing a job, not demonstrating a prop. The API tab already lists the props.
tanstacktanstack add https://adamjurek.com/r/tanstack/sheet.jsonpnpm dlx shadcn@latest add https://adamjurek.com/r/shadcn/sheet.jsonPress Compare. The frames are real viewports, so a layout that breaks at 320 breaks here too rather than in somebody's hands.
In a page
import { Sheet } from "@sushindustries/ui";
import { useState } from "react";
export function ProductCard() {
const [open, setOpen] = useState(false);
return (
<>
<div className="card p-4">
<h3 className="h4 m-0">Reveal</h3>
<button type="button" onClick={() => setOpen(true)}>
Quick view
</button>
</div>
<Sheet
open={open}
onClose={() => setOpen(false)}
title="Reveal"
side="right"
>
<p>Fades and rises its children the first time they reach the viewport.</p>
</Sheet>
</>
);
}tsx