## command_dialog (`poetry_command_dialog`)

The command palette in a modal dialog, summonable from anywhere.

Class: Poetry::Ui::Command::DialogComponent - BEM block `poetry-ui-command-dialog`.
- `description:` (string) - default "dynamic" - The sr-only description wired to aria-describedby (localized default).
- `dismissible:` (boolean) - default true - Backdrop clicks close the palette; false keeps it open.
- `filter:` (boolean) - default true - Passed through to the embedded Command: client-side filtering.
- `hotkey:` (string) - A global shortcut ("meta+k") that toggles the palette from anywhere; an accelerator, not the only way in.
- `id:` (string) - Passed through: the embedded palette's base DOM id.
- `list_label:` (string) - Passed through: the listbox's accessible name.
- `loop:` (boolean) - default false - Passed through: wraps arrow-key highlight movement at the ends.
- `placeholder:` (string) - Passed through: the filter input's placeholder text.
- `show_close_button:` (boolean) - default "dynamic" - The close X, seated in the input row. Off by default while backdrop clicks close the palette (Esc, the backdrop, or picking an item all close it); on when dismissible: false so a pointer has a way out. Pass true to always show it.
- `title:` (string) - default "dynamic" - The dialog's sr-only accessible name (localized default) - override rather than remove.
- `value:` (string) - Passed through: seats the initial highlight on this item value.
Slots: trigger (The trigger is a poetry Button wired to open - the Dialog pattern: with_trigger(variant: :outline) { "Open palette" }.; with_trigger yields NOTHING to the block - no |param|, write content directly).
- PART `command-dialog` - Root wrapper around the trigger and the <dialog> - the palette's own chrome; the embedded Command inside carries its own part contract
- PART `dialog-content` - The <dialog> panel (Dialog's chrome retuned to overflow-hidden p-0) - positioning, animation, and the open state ride here | states: data-open (panel is open (the dialog controller flips the pair at runtime)); data-closed (panel is closed or animating out (the server-rendered state))
- PART `dialog-header` - Dialog's title block, sr-only here - the palette owns the visible surface
- PART `dialog-title` - The sr-only heading - the dialog's accessible name (defaults to the source string)
- PART `dialog-description` - The sr-only description wired to aria-describedby
- WIRING root: `poetry--core--dialog` registers; values dismissible, hotkey (if)
- WIRING content: `poetry--core--dialog` actions close on cancel, backdropClose on click; targets dialog
- WIRING trigger: `poetry--core--dialog` actions open
- WIRING close: `poetry--core--dialog` actions close
- RULE: App-wide palettes use poetry_command_dialog with hotkey: ('meta+k') - never a hand-wired window keydown listener around poetry_dialog.
- RULE: Open it with with_trigger(...) too - the hotkey is an accelerator, not the only way in.
- RULE: The sr-only title/description default to the source strings - override title:/description: rather than removing them (they are the dialog's accessible name).
- RULE: Item wiring is Command's: act on poetry:command:select; close the dialog in the listener if the action should dismiss the palette.
- RULE: The close X is off by default (keyboard-first: Esc, the backdrop, or picking an item closes it) and appears with dismissible: false; show_close_button: true forces it - it seats in the input row, never over it.
