## search_field (`poetry_search_field`)

A search input with clear and search affordances.

Class: Poetry::Ui::SearchField::Component - BEM block `poetry-ui-search_field`.
- `described_by:` (string) - aria-describedby on the input - Field hint/error wiring.
- `disabled:` (boolean) - default false - Disables the input and hides the clear affordance.
- `id:` (string) - The input's DOM id - what a Field label's for: must reference.
- `invalid:` (boolean) - default false - aria-invalid on the input - set by Field/FormBuilder from model errors.
- `label:` (string) - The accessible name (aria-label) for standalone use - or pair with a Label/Field instead.
- `name:` (string) - required - The form field name on the search input.
- `placeholder:` (string) - Hint text shown while the field is empty.
- `readonly:` (boolean) - default false - The query can be read but not edited; the clear affordance hides.
- `required:` (boolean) - default false - Marks the input required for native constraint validation.
- `value:` (string) - The pre-filled query; presence unhides the clear affordance.
- PART `search-field` - Root - the controller and the emptiness state ride here | states: data-empty (the input holds no text (server-set, controller-kept; hides the clear affordance))
- PART `input-group-addon` - The leading search-glyph cell - InputGroup's addon vocabulary (the NumberField precedent) | states: data-align=inline-start|inline-end (always - inline-start holds the glyph, inline-end the clear button)
- PART `search-field-group` - The bordered field surface - InputGroup's chrome, focus ring keyed on the control inside
- PART `input-group-control` - The native <input type=search> - InputGroup's control slot (the themes' focus-ring hook); WebKit's own cancel affordance suppressed
- WIRING root: `poetry--core--search-field` registers
- WIRING input: `poetry--core--search-field` actions changed on input, keydown on keydown; targets input
- WIRING clear: `poetry--core--search-field` actions holdFocus on pointerdown, clear on click; targets clear
- RULE: Search inputs are a SearchField (poetry_search_field) - never a bare Input with a hand-rolled clear button; Escape-clears and focus retention ride the controller.
- RULE: Enter submits the surrounding form natively - wrap it in a form/turbo-frame for live search; listen for poetry:search-field:clear to reset results.
- RULE: Pair with a Label/Field for the accessible name, or pass label: standalone.
