## field (`poetry_field`)

Wraps a form control with its label, hint, and validation message.

Class: Poetry::Ui::Field::Component - BEM block `poetry-ui-field`.
- `orientation:` (symbol) - one of vertical|horizontal|setting|responsive, default "vertical", required - The layout axis. :horizontal is the boolean-control pattern: the control lands in the first grid column, label + hint/error stack in the second, and the control row-centers against the label line.
- `error:` (string) - The error line (typically from model errors) - presence flips the invalid skin and leads the control's aria-describedby.
- `group:` (boolean) - default false - group: the control is a role-bearing <div> (RadioGroup, Slider) - label[for] would be inert (Chrome flags it), so the label drops for=, carries label_id, and control_attributes names the group via aria-labelledby (the visible label, i18n-proof).
- `hint:` (string) - Plain-text guidance under the control (escaped wholesale); use with_hint for authored markup.
- `hint_position:` (symbol) - default "below" - Where the hint renders relative to the control - :above puts guidance before a tall control. aria-describedby is identical either way; this is visual order only.
- `id:` (string) - required - The control's DOM id - the hint/error/label ids derive from it.
- `invalid:` (boolean) - default false - Flips the invalid skin (data-invalid + aria-invalid) WITHOUT an error line. error: implies it; use invalid: alone when the hint copy IS the requirement.
- `label_text:` (string) - The visible label text, associated with the control via for=.
- `required:` (boolean) - default false - Marks the control required via aria-required only - never the native required attribute.
- PART `field` - The quartet's grid root - label, control, hint, and error stack inside | states: data-invalid=true|false (always - true when error: is present or invalid: is set, else false); data-orientation=vertical|horizontal|setting|responsive (always - the resolved orientation (horizontal is the boolean-control layout))
- PART `field-label` - The Label (composed) wearing the source's field-label slot - names the control
- PART `field-description` - The hint <p> (the source's description) - its id lands in the control's aria-describedby
- PART `field-error` - The error <p> - present only when error: is set; its id leads the control's aria-describedby
- PART `checkbox-input` - A nested Checkbox's hidden native input - the toggle renders as a wrapper-free fragment, so its sibling form store sits directly in the field's DOM (the horizontal boolean-control layout)
- PART `switch-input` - A nested Switch's hidden native input - the same wrapper-free fragment escape as checkbox-input (the setting-row layout)
- RULE: Wire the control with field.control_attributes - never hand-write aria-describedby.
- RULE: Error text arrives via error: (from model errors upstream) - never a bare red <p>.
- RULE: hint: (escaped string) for pure data; with_hint { } for authored markup (links) - call it BEFORE the control so the hint id lands in aria-describedby.
- RULE: orientation: :horizontal is the boolean-control layout (checkbox/switch left, label + hint stacked right) - text inputs and groups stay vertical.
- RULE: orientation: :responsive stacks by default and flips label-left / control-right once its poetry_field_group container passes the md mark - the settings-page recipe (it needs that FieldGroup ancestor to measure against).
