## sheet (`poetry_sheet`)

A dialog that slides in from a screen edge.

Class: Poetry::Ui::Sheet::Component - BEM block `poetry-ui-sheet`.
Slot REQUIRED: with_title (the accessible name) - a call without it raises.
- `side:` (symbol) - one of top|right|bottom|left, default "right", required - The edge the sheet slides in from - a physical direction (right stays right in RTL).
- `content_class:` (string) - Extra classes merged onto the <dialog> panel (e.g. "max-h-[50vh]" caps a top/bottom sheet).
- `dismissible:` (boolean) - default true - Backdrop clicks close the dialog; false keeps confirmations from being dismissed accidentally (Esc still closes).
- `show_close_button:` (boolean) - default true - Renders the corner X; false forces a deliberate footer choice (footer actions and Esc remain). Sheet inherits this.
Slots: trigger (The trigger is a poetry Button wired to open the dialog - agents pass Button props: with_trigger(variant: :outline) { "Open" }.; takes poetry_button props, not a block; with_trigger yields NOTHING to the block - no |param|, write content directly), title (The heading - the dialog's accessible name; required.), description (Muted copy under the title, wired to aria-describedby.), footer (The action row at the bottom of the panel.).
- PART `sheet` - Root wrapper around the trigger and the <dialog> element
- PART `sheet-content` - The <dialog> panel, anchored to a screen edge - the slide animation and the open state ride here | states: data-open (panel is open (the controller flips the pair at runtime)); data-closed (panel is closed or animating out (the server-rendered state; the presence-hold close rides the closed slide-out)); data-side=top|right|bottom|left (always - the edge the sheet slides in from)
- PART `sheet-header` - Title block at the top of the panel
- PART `sheet-title` - The heading - the sheet's accessible name (required slot)
- PART `sheet-description` - Muted copy under the title, wired to aria-describedby
- PART `sheet-footer` - Action row pinned to the bottom of the panel
- WIRING root: `poetry--core--sheet` registers; values dismissible
- WIRING content: `poetry--core--sheet` actions close on cancel, backdropClose on click; targets dialog
- WIRING trigger: `poetry--core--sheet` actions open
- WIRING close: `poetry--core--sheet` actions close
- tool open (mutating) - Open the dialog. [opt in with webmcp: "name" on the call; dispatches poetry--core--sheet#open]
- tool close (mutating) - Close the dialog. [opt in with webmcp: "name" on the call; dispatches poetry--core--sheet#close]
- RULE: Open sheets with with_trigger(...) - never a hand-wired button.
- RULE: with_title is REQUIRED (the accessible name) - the inherited Dialog rule.
- RULE: Pick side by content: navigation left, detail/edit right, pickers bottom.
- RULE: Do not put must-not-lose confirmations in a Sheet - that is AlertDialog.
- RULE: Do not rebuild a centered Dialog with a Sheet; use Dialog.
