## toaster (`poetry_toaster`)

The region that stacks and manages toast notifications.

Class: Poetry::Ui::Toaster::Component - BEM block `poetry-ui-toaster`.
- `position:` (symbol) - one of top-left|top-center|top-right|bottom-left|bottom-center|bottom-right, default "bottom-right", required - The stack's corner - set here, not per toast; each toast's slide direction follows it.
- `hotkey:` (string) - default "F8" - The keyboard shortcut that focuses the most recent toast.
- `limit:` (integer) - default 3 - The maximum visible toasts; overflow queues hidden with timers held.
- PART `toaster` - The toast viewport itself (<ol>, role=region, data-turbo-permanent) - the corner geometry and the Turbo Stream append target ride here | states: data-position=top-left|top-center|top-right|bottom-left|bottom-center|bottom-right (always - the corner; each toast's slide direction keys off it via group/toaster); data-poetry-top-layer (always - the dismissal layer exempts presses here, so clicking a toast never dismisses the overlay under it)
- WIRING root: `poetry--core--toaster` registers; values hotkey, limit, position
- RULE: Exactly ONE poetry_toaster per layout; it is data-turbo-permanent.
- RULE: Server-side toasts go through turbo_stream.poetry_toast / the flash recipe - never hand-append into #poetry-toaster.
- RULE: Client-side (no round-trip) toasts go through poetry_toast_trigger(template:) + a <template> holding the rendered poetry_toast - the trigger stamps it into the region.
- RULE: Do not announce() toast content yourself - the toast controller already does; double-announcing is a regression.
