## time_field (`poetry_time_field`)

A segmented input for typing a time one part at a time.

Class: Poetry::Ui::TimeField::Component - BEM block `poetry-ui-time_field`.
- `described_by:` (string) - Ids for aria-describedby (hint or error text).
- `disabled:` (boolean) - default false - Disables the field; the segment group dims and goes inert.
- `hour_cycle:` (string) - Pins the hour cycle (h12/h23/h11/h24) instead of the locale's.
- `id:` (string) - The native input's DOM id - the Field label target.
- `invalid:` (boolean) - default false - Paints the destructive border/ring and sets aria-invalid.
- `label:` (string) - Standalone accessible name; inside a form the Field label wires ids instead. Segments announce it themselves.
- `locale:` (string) - Pins the field to a locale other than the page's.
- `max:` () - The latest allowed date (Date or ISO string) - rides native constraint validation.
- `min:` () - The earliest allowed date (Date or ISO string) - rides native constraint validation.
- `name:` (string) - required - The form field name - required; the value posts as ISO yyyy-mm-dd with or without JS.
- `placeholder_value:` () - What the first arrow press on an empty segment lands on; defaults to today.
- `readonly:` (boolean) - default false - The value shows but cannot be edited.
- `required:` (boolean) - default false - Marks the native input required.
- `seconds:` (boolean) - default false - Adds the seconds segment; the wire format becomes HH:MM:SS.
- `value:` () - Date, or an ISO yyyy-mm-dd string; nil renders empty.
- PART `time-field` - Root - the controller and the enhanced/disabled surface ride here (segments inside share the date-field-* vocabulary) | states: data-enhanced (the controller connected and built segments (no JS = the native input, visible and styled)); data-disabled (disabled: is set); data-invalid (invalid: is set (the group wears the destructive ring))
- PART `time-field-group` - The bordered segment row - hidden until enhancement, then the editing surface (cn-input chrome, focus-within ring) | states: data-disabled (disabled: is set (chrome dims, pointer events off)); data-invalid (invalid: is set (destructive border + ring))
- PART `time-field-input` - The native <input type=time> - THE form value in both modes; tabindex -1 + aria-hidden once segments exist
- WIRING root: `poetry--core--date-field` registers; values locale (if), placeholder, labels, placeholders | `poetry--core--date-field` values seconds (if seconds), hour_cycle (if)
- WIRING group: `poetry--core--date-field` actions focusGap on click, settle on focusout; targets group
- WIRING input: `poetry--core--date-field` targets input
- RULE: Time entry is a TimeField (poetry_time_field / form.time_field) - never a masked Input or a pair of selects; params[<name>] is HH:MM (HH:MM:SS with seconds:).
- RULE: 12- vs 24-hour follows the user's locale automatically (the dayPeriod segment appears only under twelve-hour cycles); hour_cycle: pins it when a product must.
- RULE: For a date AND a time, use a DateTimeField (poetry_date_time_field / form.datetime_field): one control, one datetime-local value.
